diff options
author | Prashant Gaikwad <pgaikwad@nvidia.com> | 2013-11-11 12:58:32 +0530 |
---|---|---|
committer | Bharat Nihalani <bnihalani@nvidia.com> | 2013-11-11 05:07:33 -0800 |
commit | 13389418002ac854139f482796ef0d60ca1b817f (patch) | |
tree | 40dcfffa985dd8a8639b3fe8f099d84b1203657a /drivers/input/keyboard | |
parent | 70f5664c5c10d14a172e0ea4ee5efde957e35ad9 (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.c | 23 |
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 = { |