Skip to contentSkip to conversation

Input: tca6416-keypad: Suspend/Resume wakeup support

PATCH In review Magnus Damm 2 participants 4 messages Mar 16, 2011

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Input: tca6416-keypad: Suspend/Resume wakeup support

From: Magnus Damm <[email protected]>

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.

---

 drivers/input/keyboard/tca6416-keypad.c |   26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
drivers/input/keyboard/tca6416-keypad.c +26 -0
@@ -297,6 +297,7 @@ static int __devinit tca6416_keypad_prob
 	}
 
 	i2c_set_clientdata(client, chip);
+	device_init_wakeup(&client->dev, 1);
 
 	return 0;
 
@@ -326,10 +327,35 @@ static int __devexit tca6416_keypad_remo
 	return 0;
 }
 
+static int tca6416_keypad_suspend(struct device *dev)
+{
+	struct tca6416_keypad_chip *chip = dev_get_drvdata(dev);
+
+	if (device_may_wakeup(dev))
+		enable_irq_wake(chip->irqnum);
+
+	return 0;
+}
+
+static int tca6416_keypad_resume(struct device *dev)
+{
+	struct tca6416_keypad_chip *chip = dev_get_drvdata(dev);
+
+	if (device_may_wakeup(dev))
+		disable_irq_wake(chip->irqnum);
+
+	return 0;
+}
+
+static const struct dev_pm_ops tca6416_keypad_dev_pm_ops = {
+	.suspend = tca6416_keypad_suspend,
+	.resume = 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),
maintainer
#1 lore raw
Quoted 8 lines · Magnus Damm

From: Magnus Damm <[email protected]>

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.

Hi Magnus,

Looks good, but why don't we guard PM code with CONFIG_PM_SLEEP, like below? I also believe we should use bus-specific helpers to access private driver data since it does not have to stay alias for the core data pointer.

Thanks.

Signature · 19 lines
Dmitry


Input: tca6416-keypad - Suspend/Resume wakeup support

From: Magnus Damm <[email protected]>

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 <[email protected]>
Signed-off-by: Dmitry Torokhov <[email protected]>
---

 drivers/input/keyboard/tca6416-keypad.c |   28 ++++++++++++++++++++++++++++
 1 files changed, 28 insertions(+), 0 deletions(-)
drivers/input/keyboard/tca6416-keypad.c +28 -0
index 800fbcc..3afea3f 100644
@@ -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),
#2 lore raw
Quoted 10 lines · Dmitry Torokhov
Quoted 8 lines · Magnus Damm

From: Magnus Damm <[email protected]>

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.

Quoted 6 lines

Hi Magnus,

Looks good, but why don't we guard PM code with CONFIG_PM_SLEEP, like below? I also believe we should use bus-specific helpers to access private driver data since it does not have to stay alias for the core data pointer.

Hi Dmitry,

Thank you for the updated patch, your version looks much better than mine. I tested your version on my Mackerel board a few minutes ago and it is still working as expected. Unless there are any objections, please merge your version of the patch.

Cheers,

/ magnus

maintainer
#3 lore raw
Quoted 19 lines · Magnus Damm
Quoted 10 lines · Dmitry Torokhov
Quoted 8 lines · Magnus Damm

From: Magnus Damm <[email protected]>

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.

Quoted 6 lines

Hi Magnus,

Looks good, but why don't we guard PM code with CONFIG_PM_SLEEP, like below? I also believe we should use bus-specific helpers to access private driver data since it does not have to stay alias for the core data pointer.

Quoted 7 lines

Hi Dmitry,

Thank you for the updated patch, your version looks much better than mine. I tested your version on my Mackerel board a few minutes ago and it is still working as expected. Unless there are any objections, please merge your version of the patch.

Excellent, I'll queue it up.

Thank you for testing the updated patch.

Signature · 1 line
Dmitry