input: add suspend wakeup support to sh_keysc
authorMagnus Damm <damm@igel.co.jp>
Tue, 10 Mar 2009 06:24:21 +0000 (06:24 +0000)
committerPaul Mundt <lethal@linux-sh.org>
Tue, 10 Mar 2009 06:28:07 +0000 (15:28 +0900)
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>
drivers/input/keyboard/sh_keysc.c

index 5c8a1bcf7ca7436376223ad6a42a469b47cbf743..bf92178644ab27ff92fdc5a86e89f3691d68305a 100644 (file)
@@ -219,6 +219,8 @@ static int __devinit sh_keysc_probe(struct platform_device *pdev)
                  pdata->scan_timing, priv->iomem_base + KYCR1_OFFS);
        iowrite16(0, priv->iomem_base + KYOUTDR_OFFS);
        iowrite16(KYCR2_IRQ_LEVEL, priv->iomem_base + KYCR2_OFFS);
+
+       device_init_wakeup(&pdev->dev, 1);
        return 0;
  err5:
        free_irq(irq, pdev);
@@ -253,17 +255,36 @@ static int __devexit sh_keysc_remove(struct platform_device *pdev)
        return 0;
 }
 
+static int sh_keysc_suspend(struct device *dev)
+{
+       struct platform_device *pdev;
+       struct sh_keysc_priv *priv;
+       unsigned short value;
+
+       pdev = container_of(dev, struct platform_device, dev);
+       priv = platform_get_drvdata(pdev);
+
+       value = ioread16(priv->iomem_base + KYCR1_OFFS);
 
-#define sh_keysc_suspend NULL
-#define sh_keysc_resume NULL
+       if (device_may_wakeup(dev))
+               value |= 0x80;
+       else
+               value &= ~0x80;
+
+       iowrite16(value, priv->iomem_base + KYCR1_OFFS);
+       return 0;
+}
+
+static struct dev_pm_ops sh_keysc_dev_pm_ops = {
+       .suspend = sh_keysc_suspend,
+};
 
 struct platform_driver sh_keysc_device_driver = {
        .probe          = sh_keysc_probe,
        .remove         = __devexit_p(sh_keysc_remove),
-       .suspend        = sh_keysc_suspend,
-       .resume         = sh_keysc_resume,
        .driver         = {
                .name   = "sh_keysc",
+               .pm     = &sh_keysc_dev_pm_ops,
        }
 };