Merge branch 'linus' into x86/urgent
[cascardo/linux.git] / drivers / rtc / rtc-twl.c
index d43b4f6..4c2c6df 100644 (file)
@@ -176,6 +176,10 @@ static int set_rtc_irq_bit(unsigned char bit)
        unsigned char val;
        int ret;
 
+       /* if the bit is set, return from here */
+       if (rtc_irq_bits & bit)
+               return 0;
+
        val = rtc_irq_bits | bit;
        val &= ~BIT_RTC_INTERRUPTS_REG_EVERY_M;
        ret = twl_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
@@ -193,6 +197,10 @@ static int mask_rtc_irq_bit(unsigned char bit)
        unsigned char val;
        int ret;
 
+       /* if the bit is clear, return from here */
+       if (!(rtc_irq_bits & bit))
+               return 0;
+
        val = rtc_irq_bits & ~bit;
        ret = twl_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
        if (ret == 0)
@@ -357,7 +365,7 @@ out:
 
 static irqreturn_t twl_rtc_interrupt(int irq, void *rtc)
 {
-       unsigned long events = 0;
+       unsigned long events;
        int ret = IRQ_NONE;
        int res;
        u8 rd_reg;
@@ -372,11 +380,11 @@ static irqreturn_t twl_rtc_interrupt(int irq, void *rtc)
         * by reading RTS_INTERRUPTS_REGISTER[IT_TIMER,IT_ALARM]
         */
        if (rd_reg & BIT_RTC_STATUS_REG_ALARM_M)
-               events |= RTC_IRQF | RTC_AF;
+               events = RTC_IRQF | RTC_AF;
        else
-               events |= RTC_IRQF | RTC_UF;
+               events = RTC_IRQF | RTC_PF;
 
-       res = twl_rtc_write_u8(rd_reg | BIT_RTC_STATUS_REG_ALARM_M,
+       res = twl_rtc_write_u8(BIT_RTC_STATUS_REG_ALARM_M,
                                   REG_RTC_STATUS_REG);
        if (res)
                goto out;
@@ -449,19 +457,11 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev)
                        REG_INT_MSK_STS_A);
        }
 
-       /* Check RTC module status, Enable if it is off */
-       ret = twl_rtc_read_u8(&rd_reg, REG_RTC_CTRL_REG);
+       dev_info(&pdev->dev, "Enabling TWL-RTC\n");
+       ret = twl_rtc_write_u8(BIT_RTC_CTRL_REG_STOP_RTC_M, REG_RTC_CTRL_REG);
        if (ret < 0)
                goto out1;
 
-       if (!(rd_reg & BIT_RTC_CTRL_REG_STOP_RTC_M)) {
-               dev_info(&pdev->dev, "Enabling TWL-RTC.\n");
-               rd_reg = BIT_RTC_CTRL_REG_STOP_RTC_M;
-               ret = twl_rtc_write_u8(rd_reg, REG_RTC_CTRL_REG);
-               if (ret < 0)
-                       goto out1;
-       }
-
        /* init cached IRQ enable bits */
        ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG);
        if (ret < 0)