Merge branch 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebieder...
[linux-2.6-microblaze.git] / drivers / rtc / interface.c
index dcb34c7..9a2bd49 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 rc = 0, err;
+       int err;
 
        err = mutex_lock_interruptible(&rtc->ops_lock);
        if (err)
@@ -561,17 +561,21 @@ int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled)
        if (rtc->uie_rtctimer.enabled == enabled)
                goto out;
 
-       if (rtc->uie_unsupported) {
-               err = -EINVAL;
-               goto out;
+       if (rtc->uie_unsupported || !test_bit(RTC_FEATURE_ALARM, rtc->features)) {
+               mutex_unlock(&rtc->ops_lock);
+#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
+               return rtc_dev_update_irq_enable_emul(rtc, enabled);
+#else
+               return -EINVAL;
+#endif
        }
 
        if (enabled) {
                struct rtc_time tm;
                ktime_t now, onesec;
 
-               rc = __rtc_read_time(rtc, &tm);
-               if (rc)
+               err = __rtc_read_time(rtc, &tm);
+               if (err)
                        goto out;
                onesec = ktime_set(1, 0);
                now = rtc_tm_to_ktime(tm);
@@ -585,24 +589,6 @@ 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
-        * been configured without interrupts or they are not available at the
-        * moment.
-        */
-       if (err == -EINVAL)
-               err = rtc_dev_update_irq_enable_emul(rtc, enabled);
-#endif
        return err;
 }
 EXPORT_SYMBOL_GPL(rtc_update_irq_enable);