rtc: pm8xxx: Attach wake irq to device
authorLoic Poulain <loic.poulain@linaro.org>
Wed, 16 Feb 2022 15:24:42 +0000 (16:24 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 25 Mar 2022 10:37:55 +0000 (11:37 +0100)
Attach the interrupt as a wake-irq to the device, so that:
- A corresponding wakeup source is created (and reported in e.g
  /sys/kernel/debug/wakeup_sources).
- The power subsystem take cares of arming/disarming
  irq-wake automatically on suspend/resume.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/1645025082-6138-1-git-send-email-loic.poulain@linaro.org
drivers/rtc/rtc-pm8xxx.c

index 29a1c65..75954dd 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/rtc.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
+#include <linux/pm_wakeirq.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
@@ -527,40 +528,28 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
                return rc;
        }
 
-       return devm_rtc_register_device(rtc_dd->rtc);
-}
-
-#ifdef CONFIG_PM_SLEEP
-static int pm8xxx_rtc_resume(struct device *dev)
-{
-       struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
+       rc = devm_rtc_register_device(rtc_dd->rtc);
+       if (rc)
+               return rc;
 
-       if (device_may_wakeup(dev))
-               disable_irq_wake(rtc_dd->rtc_alarm_irq);
+       rc = dev_pm_set_wake_irq(&pdev->dev, rtc_dd->rtc_alarm_irq);
+       if (rc)
+               return rc;
 
        return 0;
 }
 
-static int pm8xxx_rtc_suspend(struct device *dev)
+static int pm8xxx_remove(struct platform_device *pdev)
 {
-       struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
-
-       if (device_may_wakeup(dev))
-               enable_irq_wake(rtc_dd->rtc_alarm_irq);
-
+       dev_pm_clear_wake_irq(&pdev->dev);
        return 0;
 }
-#endif
-
-static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops,
-                        pm8xxx_rtc_suspend,
-                        pm8xxx_rtc_resume);
 
 static struct platform_driver pm8xxx_rtc_driver = {
        .probe          = pm8xxx_rtc_probe,
+       .remove         = pm8xxx_remove,
        .driver = {
                .name           = "rtc-pm8xxx",
-               .pm             = &pm8xxx_rtc_pm_ops,
                .of_match_table = pm8xxx_id_table,
        },
 };