The purpose of this option is to allow ARM/etc systems that rely on theSo I'm initially mixed on this, as it feels a little redundant (esp given it may override a higher precision arch-specific function). But from the perspective of this being a generic RTC function, instead of an per-arch implementation, it does seem reasonable.
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.
The option also overrides the call to any platform update_persistent_clock
so that the RTC subsystem completely and generically replaces this
functionality.
Tested on ARM kirkwood and PPC405
Signed-off-by: Jason Gunthorpe <jgunthorpe@xxxxxxxxxxxxxxxxxxxx>Nit: Does this need to depend on RTC_HCTOSYS_DEVICE being set?
---
drivers/rtc/Kconfig | 8 ++++++++
drivers/rtc/Makefile | 1 +
drivers/rtc/systohc.c | 30 ++++++++++++++++++++++++++++++
include/linux/time.h | 1 +
kernel/time/ntp.c | 12 ++++++++++--
5 files changed, 50 insertions(+), 2 deletions(-)
create mode 100644 drivers/rtc/systohc.c
I saw on Google an older version of a similar patch to this, but I
couldn't find any indication what happened to it. So here is a
slightly different take, tested on 3.7.
I've been running basically this idea buried in PPC platform specific
code since 2.6.16..
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 19c03ab..30a866a 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -48,6 +48,14 @@ config RTC_HCTOSYS_DEVICE
sleep states. Do not specify an RTC here unless it stays powered
during all this system's supported sleep states.
+config RTC_SYSTOHC
+ bool "Set the RTC time based on NTP synchronization"
+ default y
+ help
+ If you say yes here, the system time (wall clock) will be stored
+ in the RTC specified by RTC_HCTOSYS_DEVICE approximately every 11
+ minutes if the NTP status is synchronized.
+
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.cAlso, maybe this could be simplified, using a weak function that calls rtc_update_persistent_clock by default?
index 24174b4..f79ab16 100644
--- a/kernel/time/ntp.c
+++ b/kernel/time/ntp.c
@@ -483,7 +483,15 @@ out:
return leap;
}
-#ifdef CONFIG_GENERIC_CMOS_UPDATE
+#if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC)
+
+/* Only do one, if using CONFIG_RTC_SYSTOHC then the platform function
+ * might be mapped to the RTC code already. */
+#ifdef CONFIG_RTC_SYSTOHC
+#define __update_persistent_clock rtc_update_persistent_clock
+#else
+#define __update_persistent_clock update_persistent_clock
+#endif