]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/rtc/rtc-tps65910.c
Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / drivers / rtc / rtc-tps65910.c
index 932a655aa41ceb28e250fec873b80d6ae61441bc..8bd8115329b51b1e014baf9a2ec064ec01af4865 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;
        int irq;
-       /* To store the list of enabled interrupts */
-       u32 irqstat;
 };
 
 /* Total number of RTC registers needed to set time*/
@@ -268,7 +267,7 @@ 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");
@@ -306,57 +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);
        struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev);
-       u8 alarm = TPS65910_RTC_INTERRUPTS_IT_ALARM;
-       int ret;
 
        if (device_may_wakeup(dev))
                enable_irq_wake(tps_rtc->irq);
-
-       /* Store current list of enabled interrupts*/
-       ret = regmap_read(tps->regmap, TPS65910_RTC_INTERRUPTS,
-               &tps->rtc->irqstat);
-       if (ret < 0)
-               return ret;
-
-       /* Enable RTC ALARM interrupt only */
-       return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS, alarm);
+       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);
 
        if (device_may_wakeup(dev))
                disable_irq_wake(tps_rtc->irq);
-
-       /* Restore list of enabled interrupts before suspend */
-       return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS,
-               tps->rtc->irqstat);
+       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,
        },
 };