Commit dda19a92 authored by Jonas Aaberg's avatar Jonas Aaberg Committed by Dmitry Torokhov

Input: gpio_keys - disable hardware on suspend

Disable hardware if active when suspending if the hw can not
wake the system from suspend.

[Dmitry Torokhov: use input_dev->users instead of a separate flag]
Signed-off-by: default avatarJonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: default avatarPhilippe Langlais <philippe.langlais@linaro.org>
Reviewed-by: default avatarBengt Jonsson <bengt.g.jonsson@stericsson.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 5b76d7b4
...@@ -803,6 +803,7 @@ static int gpio_keys_remove(struct platform_device *pdev) ...@@ -803,6 +803,7 @@ static int gpio_keys_remove(struct platform_device *pdev)
static int gpio_keys_suspend(struct device *dev) static int gpio_keys_suspend(struct device *dev)
{ {
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
struct input_dev *input = ddata->input;
int i; int i;
if (device_may_wakeup(dev)) { if (device_may_wakeup(dev)) {
...@@ -811,6 +812,11 @@ static int gpio_keys_suspend(struct device *dev) ...@@ -811,6 +812,11 @@ static int gpio_keys_suspend(struct device *dev)
if (bdata->button->wakeup) if (bdata->button->wakeup)
enable_irq_wake(bdata->irq); enable_irq_wake(bdata->irq);
} }
} else {
mutex_lock(&input->mutex);
if (input->users)
gpio_keys_close(input);
mutex_unlock(&input->mutex);
} }
return 0; return 0;
...@@ -819,16 +825,27 @@ static int gpio_keys_suspend(struct device *dev) ...@@ -819,16 +825,27 @@ static int gpio_keys_suspend(struct device *dev)
static int gpio_keys_resume(struct device *dev) static int gpio_keys_resume(struct device *dev)
{ {
struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev);
struct input_dev *input = ddata->input;
int error = 0;
int i; int i;
if (device_may_wakeup(dev)) {
for (i = 0; i < ddata->pdata->nbuttons; i++) { for (i = 0; i < ddata->pdata->nbuttons; i++) {
struct gpio_button_data *bdata = &ddata->data[i]; struct gpio_button_data *bdata = &ddata->data[i];
if (bdata->button->wakeup && device_may_wakeup(dev)) if (bdata->button->wakeup)
disable_irq_wake(bdata->irq); disable_irq_wake(bdata->irq);
} }
} else {
mutex_lock(&input->mutex);
if (input->users)
error = gpio_keys_open(input);
mutex_unlock(&input->mutex);
}
gpio_keys_report_state(ddata); if (error)
return error;
gpio_keys_report_state(ddata);
return 0; return 0;
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment