summaryrefslogtreecommitdiff
path: root/drivers/input/keyboard
diff options
context:
space:
mode:
authorPrashant Gaikwad <pgaikwad@nvidia.com>2013-11-11 12:58:32 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2013-11-11 05:07:33 -0800
commit13389418002ac854139f482796ef0d60ca1b817f (patch)
tree40dcfffa985dd8a8639b3fe8f099d84b1203657a /drivers/input/keyboard
parent70f5664c5c10d14a172e0ea4ee5efde957e35ad9 (diff)
keyboard: gpio: handle Tegra PM notifier events
Bug 1254633 Change-Id: I4a1857dcf984ff6ba742382eb9ae632e01ca9667 Signed-off-by: Prashant Gaikwad <pgaikwad@nvidia.com> Reviewed-on: http://git-master/r/309619 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/input/keyboard')
-rw-r--r--drivers/input/keyboard/gpio_keys.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 712225c88166..13d80878362e 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -32,6 +32,7 @@
#include <linux/of_gpio.h>
#include <linux/spinlock.h>
#include <linux/system-wakeup.h>
+#include <linux/tegra-pm.h>
struct gpio_button_data {
const struct gpio_keys_button *button;
@@ -46,6 +47,7 @@ struct gpio_button_data {
};
struct gpio_keys_drvdata {
+ struct notifier_block pm_nb;
const struct gpio_keys_platform_data *pdata;
struct input_dev *input;
struct mutex disable_lock;
@@ -696,6 +698,8 @@ static void gpio_remove_key(struct gpio_button_data *bdata)
if (gpio_is_valid(bdata->button->gpio))
gpio_free(bdata->button->gpio);
}
+static int gpio_keys_pm_notifier(struct notifier_block *nb,
+ unsigned long event, void *data);
static int gpio_keys_probe(struct platform_device *pdev)
{
@@ -772,6 +776,9 @@ static int gpio_keys_probe(struct platform_device *pdev)
device_init_wakeup(&pdev->dev, wakeup);
+ ddata->pm_nb.notifier_call = gpio_keys_pm_notifier;
+ tegra_register_pm_notifier(&ddata->pm_nb);
+
return 0;
fail3:
@@ -901,6 +908,22 @@ static const struct dev_pm_ops gpio_keys_pm_ops = {
.suspend_noirq = gpio_keys_suspend_noirq,
.resume_noirq = gpio_keys_resume_noirq,
};
+
+static int gpio_keys_pm_notifier(struct notifier_block *nb,
+ unsigned long event, void *data)
+{
+ struct gpio_keys_drvdata *ddata =
+ container_of(nb, struct gpio_keys_drvdata, pm_nb);
+ struct device *dev = ddata->input->dev.parent;
+
+ if (event == TEGRA_PM_SUSPEND)
+ gpio_keys_suspend_noirq(dev);
+ else if (event == TEGRA_PM_RESUME)
+ gpio_keys_resume_noirq(dev);
+
+ return NOTIFY_OK;
+}
+
#endif
static struct platform_driver gpio_keys_device_driver = {