From 6faf0888c64fb30e495673301087d4905f9e455c Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 24 Sep 2017 11:32:52 +0100 Subject: 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 --- drivers/rtc/rtc-pcf8523.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c index c93acade7205..83e92e8206e4 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c @@ -379,6 +379,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; +} + static const struct rtc_class_ops pcf8523_rtc_ops = { .read_time = pcf8523_rtc_read_time, .set_time = pcf8523_rtc_set_time, @@ -390,6 +400,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 = { -- cgit