diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2017-09-24 11:32:52 +0100 |
---|---|---|
committer | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2025-04-04 15:20:00 +0100 |
commit | cd8d54831870500bbbfe8436e59cee5ec4765a8b (patch) | |
tree | 41d23525eca4d6db51c9bb97114715155e25f542 | |
parent | 8f71d18db68bc53cef19ca5ecc9f2cd6671a8b8b (diff) |
rtc: pcf8523: provide set_offset_nsec
When we set the time, we set the STOP bit, set the time, and then clear
the STOP bit. Concerning the timing, the PCF8523 data sheet says:
"The first increment of the time circuits is between 0.499878s and
0.500000s after STOP is released."
However, practical measurement shows this is not the case - with the I2C
bus speed at 100kHz on iMX6, it takes about 5ms for the rtclib call for
setting the time to complete. However, reading back when the second
actually flips shows that there's an additional 10ms which can't be
accounted for by the read - a read of the RTC takes 1.7 to 1.8 ms.
Practical measurement shows that the first increment occurs about 515ms
after the write, which means we need to set the current second 485ms
after it has started.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | drivers/rtc/rtc-pcf8523.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c index 2c63c0ffd05a..60399532c980 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c @@ -370,6 +370,16 @@ static int pcf8523_rtc_set_offset(struct device *dev, long offset) return regmap_write(pcf8523->regmap, PCF8523_REG_OFFSET, value); } +static void pcf8523_rtc_pre_register(struct rtc_device *rtc) +{ + /* + * "The first increment of the time circuits is between 0.499878s + * and 0.5s after STOP is released. Measurement on iMX6 show that + * -485ms gives a time set within +/- 5ms. + */ + rtc->set_offset_nsec = -495 * NSEC_PER_MSEC; +} + #ifdef CONFIG_PM_SLEEP static int pcf8523_suspend(struct device *dev) { @@ -405,6 +415,7 @@ static const struct rtc_class_ops pcf8523_rtc_ops = { .set_offset = pcf8523_rtc_set_offset, .param_get = pcf8523_param_get, .param_set = pcf8523_param_set, + .pre_register = pcf8523_rtc_pre_register, }; static const struct regmap_config regmap_config = { |