mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
023f333a99
The purpose of this option is to allow ARM/etc systems that rely on the class RTC subsystem to have the same kind of automatic NTP based synchronization that we have on PC platforms. Today ARM does not implement update_persistent_clock and makes extensive use of the class RTC system. When enabled CONFIG_RTC_SYSTOHC will provide a generic rtc_update_persistent_clock that stores the current time in the RTC and is intended complement the existing CONFIG_RTC_HCTOSYS option that loads the RTC at boot. Like with RTC_HCTOSYS the platform's update_persistent_clock is used first, if it works. Platforms with mixed class RTC and non-RTC drivers need to return ENODEV when class RTC should be used. Such an update for PPC is included in this patch. Long term, implementations of update_persistent_clock should migrate to proper class RTC drivers and use CONFIG_RTC_SYSTOHC instead. Tested on ARM kirkwood and PPC405 Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Signed-off-by: John Stultz <john.stultz@linaro.org>
44 lines
1.2 KiB
C
44 lines
1.2 KiB
C
/*
|
|
* 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;
|
|
}
|