diff options
| -rw-r--r-- | drivers/rtc/class.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/interface.c | 26 | ||||
| -rw-r--r-- | include/linux/rtc.h | 2 | 
3 files changed, 29 insertions, 1 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 09b4437b3e6..39013867cbd 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -171,7 +171,7 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev,  	err = __rtc_read_alarm(rtc, &alrm);  	if (!err && !rtc_valid_tm(&alrm.time)) -		rtc_set_alarm(rtc, &alrm); +		rtc_initialize_alarm(rtc, &alrm);  	strlcpy(rtc->name, name, RTC_DEVICE_NAME_SIZE);  	dev_set_name(&rtc->dev, "rtc%d", id); diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 8ec6b069a7f..b2fea80dfb6 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c @@ -375,6 +375,32 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)  }  EXPORT_SYMBOL_GPL(rtc_set_alarm); +/* Called once per device from rtc_device_register */ +int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) +{ +	int err; + +	err = rtc_valid_tm(&alarm->time); +	if (err != 0) +		return err; + +	err = mutex_lock_interruptible(&rtc->ops_lock); +	if (err) +		return err; + +	rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time); +	rtc->aie_timer.period = ktime_set(0, 0); +	if (alarm->enabled) { +		rtc->aie_timer.enabled = 1; +		timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); +	} +	mutex_unlock(&rtc->ops_lock); +	return err; +} +EXPORT_SYMBOL_GPL(rtc_initialize_alarm); + + +  int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled)  {  	int err = mutex_lock_interruptible(&rtc->ops_lock); diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 2ca7e8a7806..877ece45426 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h @@ -228,6 +228,8 @@ extern int rtc_read_alarm(struct rtc_device *rtc,  			struct rtc_wkalrm *alrm);  extern int rtc_set_alarm(struct rtc_device *rtc,  				struct rtc_wkalrm *alrm); +extern int rtc_initialize_alarm(struct rtc_device *rtc, +				struct rtc_wkalrm *alrm);  extern void rtc_update_irq(struct rtc_device *rtc,  			unsigned long num, unsigned long events);  |