diff options
Diffstat (limited to 'drivers/rtc/interface.c')
| -rw-r--r-- | drivers/rtc/interface.c | 34 | 
1 files changed, 10 insertions, 24 deletions
| diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index dcb34c73319e..9a2bd4947007 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 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); | 
