diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2013-02-04 11:03:03 +0100 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2013-02-04 11:03:03 +0100 | 
| commit | 90889a635a9b5488624bccce3ff6b2eec68c007b (patch) | |
| tree | 8ddde1e04060bd65ca2aafb09b38066cb7d69b4d /drivers/rtc/systohc.c | |
| parent | a9037430c6c784165a940a90bcd29f886834c8e7 (diff) | |
| parent | 6f16eebe1ff82176339a0439c98ebec9768b0ee2 (diff) | |
| download | olio-linux-3.10-90889a635a9b5488624bccce3ff6b2eec68c007b.tar.xz olio-linux-3.10-90889a635a9b5488624bccce3ff6b2eec68c007b.zip  | |
Merge branch 'fortglx/3.9/time' of git://git.linaro.org/people/jstultz/linux into timers/core
Trivial conflict in arch/x86/Kconfig
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/rtc/systohc.c')
| -rw-r--r-- | drivers/rtc/systohc.c | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c new file mode 100644 index 00000000000..bf3e242ccc5 --- /dev/null +++ b/drivers/rtc/systohc.c @@ -0,0 +1,44 @@ +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + */ +#include <linux/rtc.h> +#include <linux/time.h> + +/** + * rtc_set_ntp_time - Save NTP synchronized time to the RTC + * @now: Current time of day + * + * Replacement for the NTP platform function update_persistent_clock + * that stores time for later retrieval by rtc_hctosys. + * + * Returns 0 on successful RTC update, -ENODEV if a RTC update is not + * possible at all, and various other -errno for specific temporary failure + * cases. + * + * If temporary failure is indicated the caller should try again 'soon' + */ +int rtc_set_ntp_time(struct timespec now) +{ +	struct rtc_device *rtc; +	struct rtc_time tm; +	int err = -ENODEV; + +	if (now.tv_nsec < (NSEC_PER_SEC >> 1)) +		rtc_time_to_tm(now.tv_sec, &tm); +	else +		rtc_time_to_tm(now.tv_sec + 1, &tm); + +	rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); +	if (rtc) { +		/* rtc_hctosys exclusively uses UTC, so we call set_time here, +		 * not set_mmss. */ +		if (rtc->ops && (rtc->ops->set_time || rtc->ops->set_mmss)) +			err = rtc_set_time(rtc, &tm); +		rtc_class_close(rtc); +	} + +	return err; +}  |