Input: tca6416-keypad - suspend/resume wakeup support
authorMagnus Damm <damm@opensource.se>
Wed, 16 Mar 2011 05:32:39 +0000 (22:32 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 16 Mar 2011 06:18:28 +0000 (23:18 -0700)
Extend the tca6416 driver to use enable_irq_wake() and disable_irq_wake()
in the suspend/resume hooks.

This makes it possible to wake up from suspend-to-ram using a tca6416 key
on the sh7372 mackerel board.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/keyboard/tca6416-keypad.c

index 800fbcc..3afea3f 100644 (file)
@@ -297,6 +297,7 @@ static int __devinit tca6416_keypad_probe(struct i2c_client *client,
        }
 
        i2c_set_clientdata(client, chip);
+       device_init_wakeup(&client->dev, 1);
 
        return 0;
 
@@ -326,10 +327,37 @@ static int __devexit tca6416_keypad_remove(struct i2c_client *client)
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int tca6416_keypad_suspend(struct device *dev)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+       struct tca6416_keypad_chip *chip = i2c_get_clientdata(client);
+
+       if (device_may_wakeup(dev))
+               enable_irq_wake(chip->irqnum);
+
+       return 0;
+}
+
+static int tca6416_keypad_resume(struct device *dev)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+       struct tca6416_keypad_chip *chip = i2c_get_clientdata(client);
+
+       if (device_may_wakeup(dev))
+               disable_irq_wake(chip->irqnum);
+
+       return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(tca6416_keypad_dev_pm_ops,
+                        tca6416_keypad_suspend, tca6416_keypad_resume);
 
 static struct i2c_driver tca6416_keypad_driver = {
        .driver = {
                .name   = "tca6416-keypad",
+               .pm     = &tca6416_keypad_dev_pm_ops,
        },
        .probe          = tca6416_keypad_probe,
        .remove         = __devexit_p(tca6416_keypad_remove),