Merge branch 'hpfs' from Mikulas Patocka
[cascardo/linux.git] / drivers / rtc / rtc-twl.c
index b2eab34..02faf3c 100644 (file)
@@ -213,12 +213,24 @@ static int mask_rtc_irq_bit(unsigned char bit)
 
 static int twl_rtc_alarm_irq_enable(struct device *dev, unsigned enabled)
 {
+       struct platform_device *pdev = to_platform_device(dev);
+       int irq = platform_get_irq(pdev, 0);
+       static bool twl_rtc_wake_enabled;
        int ret;
 
-       if (enabled)
+       if (enabled) {
                ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
-       else
+               if (device_can_wakeup(dev) && !twl_rtc_wake_enabled) {
+                       enable_irq_wake(irq);
+                       twl_rtc_wake_enabled = true;
+               }
+       } else {
                ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
+               if (twl_rtc_wake_enabled) {
+                       disable_irq_wake(irq);
+                       twl_rtc_wake_enabled = false;
+               }
+       }
 
        return ret;
 }
@@ -469,6 +481,12 @@ static int twl_rtc_probe(struct platform_device *pdev)
        if (irq <= 0)
                goto out1;
 
+       /* Initialize the register map */
+       if (twl_class_is_4030())
+               rtc_reg_map = (u8 *)twl4030_rtc_reg_map;
+       else
+               rtc_reg_map = (u8 *)twl6030_rtc_reg_map;
+
        ret = twl_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
        if (ret < 0)
                goto out1;
@@ -556,7 +574,6 @@ static int twl_rtc_remove(struct platform_device *pdev)
        free_irq(irq, rtc);
 
        rtc_device_unregister(rtc);
-       platform_set_drvdata(pdev, NULL);
        return 0;
 }
 
@@ -609,22 +626,7 @@ static struct platform_driver twl4030rtc_driver = {
        },
 };
 
-static int __init twl_rtc_init(void)
-{
-       if (twl_class_is_4030())
-               rtc_reg_map = (u8 *) twl4030_rtc_reg_map;
-       else
-               rtc_reg_map = (u8 *) twl6030_rtc_reg_map;
-
-       return platform_driver_register(&twl4030rtc_driver);
-}
-module_init(twl_rtc_init);
-
-static void __exit twl_rtc_exit(void)
-{
-       platform_driver_unregister(&twl4030rtc_driver);
-}
-module_exit(twl_rtc_exit);
+module_platform_driver(twl4030rtc_driver);
 
 MODULE_AUTHOR("Texas Instruments, MontaVista Software");
 MODULE_LICENSE("GPL");