Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/rtc/rtc-rk808.c: fix rtc time reading issue

After we set the GET_TIME bit, the rtc time can't be read immediately. We
should wait up to 31.25 us, about one cycle of 32khz. Otherwise reading
RTC time will return a old time. If we clear the GET_TIME bit after
setting, the time of i2c transfer is certainly more than 31.25us.

Doug said:

: I think we are safe. At 400kHz (the max speed of this part) each bit can
: be transferred no faster than 2.5us. In order to do a valid i2c
: transaction we need to _at least_ write the address of the device and the
: data onto the bus, which is 16 bits. 16 * 2.5us = 40us. That's above the
: 31.25us

[akpm@linux-foundation.org: tweak comment per review discussion]
Signed-off-by: Chris Zhong <zyw@rock-chips.com>
Reviewed-by: Doug Anderson <dianders@chromium.org>
Cc: Sonny Rao <sonnyrao@chromium.org>
Cc: Heiko Stübner <heiko@sntech.de>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Chris Zhong and committed by
Linus Torvalds
c412c603 1ef2816f

+8 -2
+8 -2
drivers/rtc/rtc-rk808.c
··· 67 67 /* Force an update of the shadowed registers right now */ 68 68 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 69 69 BIT_RTC_CTRL_REG_RTC_GET_TIME, 70 - 0); 70 + BIT_RTC_CTRL_REG_RTC_GET_TIME); 71 71 if (ret) { 72 72 dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret); 73 73 return ret; 74 74 } 75 75 76 + /* 77 + * After we set the GET_TIME bit, the rtc time can't be read 78 + * immediately. So we should wait up to 31.25 us, about one cycle of 79 + * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer 80 + * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency. 81 + */ 76 82 ret = regmap_update_bits(rk808->regmap, RK808_RTC_CTRL_REG, 77 83 BIT_RTC_CTRL_REG_RTC_GET_TIME, 78 - BIT_RTC_CTRL_REG_RTC_GET_TIME); 84 + 0); 79 85 if (ret) { 80 86 dev_err(dev, "Failed to update bits rtc_ctrl: %d\n", ret); 81 87 return ret;