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.

Signed-off-by: Alexandre Belloni <alexandre.bell...@bootlin.com>
---
 drivers/rtc/interface.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index f8b7c004d6ec..bd8034b7bc93 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -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
-- 
2.21.0

Reply via email to