Input: ep93xx_keypad - use dev_pm_set_wake_irq()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 12 Oct 2021 01:37:34 +0000 (18:37 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sat, 16 Oct 2021 01:29:43 +0000 (18:29 -0700)
Instead of manually toggling interrupt as wakeup source in suspend/resume
methods, let's declare keypad interrupt and wakeup interrupt and leave the
rest to the PM core.

Acked-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Link: https://lore.kernel.org/r/20211012013735.3523140-3-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/keyboard/ep93xx_keypad.c

index 6be5474..a66cfea 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/slab.h>
 #include <linux/soc/cirrus/ep93xx.h>
 #include <linux/platform_data/keypad-ep93xx.h>
+#include <linux/pm_wakeirq.h>
 
 /*
  * Keypad Interface Register offsets
@@ -191,9 +192,6 @@ static int __maybe_unused ep93xx_keypad_suspend(struct device *dev)
 
        mutex_unlock(&input_dev->mutex);
 
-       if (device_may_wakeup(&pdev->dev))
-               enable_irq_wake(keypad->irq);
-
        return 0;
 }
 
@@ -203,9 +201,6 @@ static int __maybe_unused ep93xx_keypad_resume(struct device *dev)
        struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
        struct input_dev *input_dev = keypad->input_dev;
 
-       if (device_may_wakeup(&pdev->dev))
-               disable_irq_wake(keypad->irq);
-
        mutex_lock(&input_dev->mutex);
 
        if (input_device_enabled(input_dev)) {
@@ -316,7 +311,11 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
                goto failed_free_irq;
 
        platform_set_drvdata(pdev, keypad);
+
        device_init_wakeup(&pdev->dev, 1);
+       err = dev_pm_set_wake_irq(&pdev->dev, keypad->irq);
+       if (err)
+               dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err);
 
        return 0;
 
@@ -342,6 +341,8 @@ static int ep93xx_keypad_remove(struct platform_device *pdev)
        struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
        struct resource *res;
 
+       dev_pm_clear_wake_irq(&pdev->dev);
+
        free_irq(keypad->irq, keypad);
 
        if (keypad->enabled)