Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[cascardo/linux.git] / drivers / rtc / rtc-tps65910.c
index e5fef14..8bd8115 100644 (file)
 #include <linux/rtc.h>
 #include <linux/bcd.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/interrupt.h>
 #include <linux/mfd/tps65910.h>
 
 struct tps65910_rtc {
        struct rtc_device       *rtc;
-       /* To store the list of enabled interrupts */
-       u32 irqstat;
+       int irq;
 };
 
 /* Total number of RTC registers needed to set time*/
@@ -267,13 +267,14 @@ static int tps65910_rtc_probe(struct platform_device *pdev)
        }
 
        ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
-               tps65910_rtc_interrupt, IRQF_TRIGGER_LOW,
+               tps65910_rtc_interrupt, IRQF_TRIGGER_LOW | IRQF_EARLY_RESUME,
                dev_name(&pdev->dev), &pdev->dev);
        if (ret < 0) {
                dev_err(&pdev->dev, "IRQ is not free.\n");
                return ret;
        }
-       device_init_wakeup(&pdev->dev, 1);
+       tps_rtc->irq = irq;
+       device_set_wakeup_capable(&pdev->dev, 1);
 
        tps_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
                &tps65910_rtc_ops, THIS_MODULE);
@@ -304,49 +305,36 @@ static int tps65910_rtc_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-
 static int tps65910_rtc_suspend(struct device *dev)
 {
-       struct tps65910 *tps = dev_get_drvdata(dev->parent);
-       u8 alarm = TPS65910_RTC_INTERRUPTS_IT_ALARM;
-       int ret;
-
-       /* Store current list of enabled interrupts*/
-       ret = regmap_read(tps->regmap, TPS65910_RTC_INTERRUPTS,
-               &tps->rtc->irqstat);
-       if (ret < 0)
-               return ret;
+       struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev);
 
-       /* Enable RTC ALARM interrupt only */
-       return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS, alarm);
+       if (device_may_wakeup(dev))
+               enable_irq_wake(tps_rtc->irq);
+       return 0;
 }
 
 static int tps65910_rtc_resume(struct device *dev)
 {
-       struct tps65910 *tps = dev_get_drvdata(dev->parent);
+       struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev);
 
-       /* Restore list of enabled interrupts before suspend */
-       return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS,
-               tps->rtc->irqstat);
+       if (device_may_wakeup(dev))
+               disable_irq_wake(tps_rtc->irq);
+       return 0;
 }
+#endif
 
 static const struct dev_pm_ops tps65910_rtc_pm_ops = {
-       .suspend        = tps65910_rtc_suspend,
-       .resume         = tps65910_rtc_resume,
+       SET_SYSTEM_SLEEP_PM_OPS(tps65910_rtc_suspend, tps65910_rtc_resume)
 };
 
-#define DEV_PM_OPS     (&tps65910_rtc_pm_ops)
-#else
-#define DEV_PM_OPS     NULL
-#endif
-
 static struct platform_driver tps65910_rtc_driver = {
        .probe          = tps65910_rtc_probe,
        .remove         = tps65910_rtc_remove,
        .driver         = {
                .owner  = THIS_MODULE,
                .name   = "tps65910-rtc",
-               .pm     = DEV_PM_OPS,
+               .pm     = &tps65910_rtc_pm_ops,
        },
 };