]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rtc: pm8xxx: clear alarm register when alarm is not enabled
author韩科才 <hankecai@vivo.com>
Sat, 21 Mar 2020 11:50:17 +0000 (19:50 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Mon, 23 Mar 2020 08:27:17 +0000 (09:27 +0100)
Clear alarm register when alarm is not enabled otherwise the consumer
may still start alarm timer if it find the alarm register is not zero.

Signed-off-by: hankecai <hankecai@vivo.com>
Link: https://lore.kernel.org/r/APoAZgAaCEiRpKG6PlzreaqE.1.1584791417367.Hmail.hankecai@vivo.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-pm8xxx.c

index e3d9abb2134e4dfcebae9e355f43337f09bb3f83..b45ee2cb2c0449cbb9e5a12524864bee6491665a 100644 (file)
@@ -295,6 +295,7 @@ static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
        unsigned int ctrl_reg;
+       u8 value[NUM_8_BIT_RTC_REGS] = {0};
 
        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 
@@ -313,6 +314,16 @@ static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
                goto rtc_rw_fail;
        }
 
+       /* Clear Alarm register */
+       if (!enable) {
+               rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value,
+                                      sizeof(value));
+               if (rc) {
+                       dev_err(dev, "Clear RTC ALARM register failed\n");
+                       goto rtc_rw_fail;
+               }
+       }
+
 rtc_rw_fail:
        spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
        return rc;