rtc: disallow update interrupts when time is invalid
authorAlexandre Belloni <alexandre.belloni@bootlin.com>
Mon, 21 Oct 2019 15:56:31 +0000 (17:56 +0200)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Fri, 8 Nov 2019 15:14:09 +0000 (16:14 +0100)
Never enable update interrupts when the time set on the rtc is invalid.
In that case, also avoid enabling the emulation because it will fail for
the same reason.

Link: https://lore.kernel.org/r/20191021155631.3342-2-alexandre.belloni@bootlin.com
Link: https://lore.kernel.org/r/CA+ASDXMarBG5C1Kz42B9i_iVZ1=i6GgH9Yja2cdmSueKD_As_g@mail.gmail.com
Reported-by: Jeffy Chen <jeffy.chen@rock-chips.com>
Reported-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/interface.c

index f8b7c00..bd8034b 100644 (file)
@@ -545,7 +545,7 @@ EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable);
 
 int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 {
-       int err;
+       int rc = 0, err;
 
        err = mutex_lock_interruptible(&rtc->ops_lock);
        if (err)
@@ -570,7 +570,9 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
                struct rtc_time tm;
                ktime_t now, onesec;
 
-               __rtc_read_time(rtc, &tm);
+               rc = __rtc_read_time(rtc, &tm);
+               if (rc)
+                       goto out;
                onesec = ktime_set(1, 0);
                now = rtc_tm_to_ktime(tm);
                rtc->uie_rtctimer.node.expires = ktime_add(now, onesec);
@@ -582,6 +584,16 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
 
 out:
        mutex_unlock(&rtc->ops_lock);
+
+       /*
+        * __rtc_read_time() failed, this probably means that the RTC time has
+        * never been set or less probably there is a transient error on the
+        * bus. In any case, avoid enabling emulation has this will fail when
+        * reading the time too.
+        */
+       if (rc)
+               return rc;
+
 #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
        /*
         * Enable emulation if the driver returned -EINVAL to signal that it has