diff options
author | Magnus Damm <damm@igel.co.jp> | 2009-03-10 02:24:21 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2009-03-10 02:28:07 -0400 |
commit | a29b99eccecefe5026713b226f66f117c8837ad5 (patch) | |
tree | a71b873f75e87516c54d8f848f1d66bbd2061485 /drivers/input | |
parent | 508407149a7f927c4b65a20e0a08a2a94dc769c6 (diff) |
input: add suspend wakeup support to sh_keysc
This patch adds wakeup support to the sh_keysc driver.
With this feature the ".../power/wakeup" file can be
used to enable and disable if the device takes the
system out of suspend. Default is enabled.
Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/keyboard/sh_keysc.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/input/keyboard/sh_keysc.c b/drivers/input/keyboard/sh_keysc.c index 5c8a1bcf7ca7..bf92178644ab 100644 --- a/drivers/input/keyboard/sh_keysc.c +++ b/drivers/input/keyboard/sh_keysc.c | |||
@@ -219,6 +219,8 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev) | |||
219 | pdata->scan_timing, priv->iomem_base + KYCR1_OFFS); | 219 | pdata->scan_timing, priv->iomem_base + KYCR1_OFFS); |
220 | iowrite16(0, priv->iomem_base + KYOUTDR_OFFS); | 220 | iowrite16(0, priv->iomem_base + KYOUTDR_OFFS); |
221 | iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS); | 221 | iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS); |
222 | |||
223 | device_init_wakeup(&pdev->dev, 1); | ||
222 | return 0; | 224 | return 0; |
223 | err5: | 225 | err5: |
224 | free_irq(irq, pdev); | 226 | free_irq(irq, pdev); |
@@ -253,17 +255,36 @@ static int __devexit sh_keysc_remove(struct platform_device *pdev) | |||
253 | return 0; | 255 | return 0; |
254 | } | 256 | } |
255 | 257 | ||
258 | static int sh_keysc_suspend(struct device *dev) | ||
259 | { | ||
260 | struct platform_device *pdev; | ||
261 | struct sh_keysc_priv *priv; | ||
262 | unsigned short value; | ||
263 | |||
264 | pdev = container_of(dev, struct platform_device, dev); | ||
265 | priv = platform_get_drvdata(pdev); | ||
266 | |||
267 | value = ioread16(priv->iomem_base + KYCR1_OFFS); | ||
256 | 268 | ||
257 | #define sh_keysc_suspend NULL | 269 | if (device_may_wakeup(dev)) |
258 | #define sh_keysc_resume NULL | 270 | value |= 0x80; |
271 | else | ||
272 | value &= ~0x80; | ||
273 | |||
274 | iowrite16(value, priv->iomem_base + KYCR1_OFFS); | ||
275 | return 0; | ||
276 | } | ||
277 | |||
278 | static struct dev_pm_ops sh_keysc_dev_pm_ops = { | ||
279 | .suspend = sh_keysc_suspend, | ||
280 | }; | ||
259 | 281 | ||
260 | struct platform_driver sh_keysc_device_driver = { | 282 | struct platform_driver sh_keysc_device_driver = { |
261 | .probe = sh_keysc_probe, | 283 | .probe = sh_keysc_probe, |
262 | .remove = __devexit_p(sh_keysc_remove), | 284 | .remove = __devexit_p(sh_keysc_remove), |
263 | .suspend = sh_keysc_suspend, | ||
264 | .resume = sh_keysc_resume, | ||
265 | .driver = { | 285 | .driver = { |
266 | .name = "sh_keysc", | 286 | .name = "sh_keysc", |
287 | .pm = &sh_keysc_dev_pm_ops, | ||
267 | } | 288 | } |
268 | }; | 289 | }; |
269 | 290 | ||