diff options
author | Eric Miao <eric.y.miao@gmail.com> | 2008-06-02 19:20:55 +0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-06-02 19:20:55 +0400 |
commit | 39ab9ddeb3e9573a1ea9a17a1431ea5c81681964 (patch) | |
tree | cf5b84c00487e5253369276dc66ea96442a1f43c /drivers/input/keyboard | |
parent | e8ef4347099584b49ecf74144ad2089b724292cf (diff) | |
download | linux-39ab9ddeb3e9573a1ea9a17a1431ea5c81681964.tar.xz |
Input: pxa27x_keypad - add wakeup support
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input/keyboard')
-rw-r--r-- | drivers/input/keyboard/pxa27x_keypad.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index 3dea0c5077a9..c7c9599b315d 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c @@ -105,6 +105,8 @@ struct pxa27x_keypad { struct input_dev *input_dev; void __iomem *mmio_base; + int irq; + /* matrix key code map */ unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM]; @@ -385,6 +387,10 @@ static int pxa27x_keypad_suspend(struct platform_device *pdev, pm_message_t stat struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); clk_disable(keypad->clk); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(keypad->irq); + return 0; } @@ -393,6 +399,9 @@ static int pxa27x_keypad_resume(struct platform_device *pdev) struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); struct input_dev *input_dev = keypad->input_dev; + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(keypad->irq); + mutex_lock(&input_dev->mutex); if (input_dev->users) { @@ -497,6 +506,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) goto failed_free_dev; } + keypad->irq = irq; + /* Register the input device */ error = input_register_device(input_dev); if (error) { @@ -504,6 +515,8 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) goto failed_free_irq; } + device_init_wakeup(&pdev->dev, 1); + return 0; failed_free_irq: @@ -527,7 +540,7 @@ static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); struct resource *res; - free_irq(platform_get_irq(pdev, 0), pdev); + free_irq(keypad->irq, pdev); clk_disable(keypad->clk); clk_put(keypad->clk); |