summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2017-09-23 19:27:37 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2025-09-29 10:27:28 +0100
commitfcf74ab9107d5c7f3367fe170fbed81c404317bd (patch)
treeeba1ed6bfee1faffa29dbae5d4ade0ecde34ed96
parent31580d60159be71c1da546b3d94b9c00e7e4ae8f (diff)
rtc: armada38x: provide set_offset_nsecrtc
Armada 388 resets the prescaler when the time register is written, so it requires the current second as close to the start of that second as possible. The data sheet is a bit unclear, so this has been confirmed on real hardware. Verified on Armada 388 based Clearfog. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/rtc/rtc-armada38x.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-armada38x.c b/drivers/rtc/rtc-armada38x.c
index 713fa0d077cd..1e9fb2876677 100644
--- a/drivers/rtc/rtc-armada38x.c
+++ b/drivers/rtc/rtc-armada38x.c
@@ -447,6 +447,15 @@ static int armada38x_rtc_set_offset(struct device *dev, long offset)
return 0;
}
+static void armada38x_rtc_pre_register(struct rtc_device *rtc)
+{
+ /*
+ * The Armada 388 resets the prescaler when we write the time.
+ * Validated on clearfog.
+ */
+ rtc->set_offset_nsec = 0;
+}
+
static const struct rtc_class_ops armada38x_rtc_ops = {
.read_time = armada38x_rtc_read_time,
.set_time = armada38x_rtc_set_time,
@@ -455,6 +464,7 @@ static const struct rtc_class_ops armada38x_rtc_ops = {
.alarm_irq_enable = armada38x_rtc_alarm_irq_enable,
.read_offset = armada38x_rtc_read_offset,
.set_offset = armada38x_rtc_set_offset,
+ .pre_register = armada38x_rtc_pre_register,
};
static const struct armada38x_rtc_data armada38x_data = {