]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/input/keyboard/sh_keysc.c
Merge git://git.infradead.org/iommu-2.6
[mv-sheeva.git] / drivers / input / keyboard / sh_keysc.c
index 5c8a1bcf7ca7436376223ad6a42a469b47cbf743..e1480fb11de3cfd4c1e62744eaf4a4b2bbe2e003 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,33 @@ static int __devexit sh_keysc_remove(struct platform_device *pdev)
        return 0;
 }
 
+static int sh_keysc_suspend(struct device *dev)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct sh_keysc_priv *priv = platform_get_drvdata(pdev);
+       unsigned short value;
+
+       value = ioread16(priv->iomem_base + KYCR1_OFFS);
+
+       if (device_may_wakeup(dev))
+               value |= 0x80;
+       else
+               value &= ~0x80;
 
-#define sh_keysc_suspend NULL
-#define sh_keysc_resume NULL
+       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,
        }
 };