From 30e452a1b0ec649fd253c24c98b0e387f3acedf7 Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Mon, 27 Aug 2018 20:15:27 +0800 Subject: [PATCH] rtc: rtc-rk-timer: Fix 64-bit counter read Following arch_counter_get_cntvct_mem() in arm_arch_timer.c Change-Id: I0d44edcb2cfcf2eb70aceccc57e147fa43eba34d Signed-off-by: Jeffy Chen --- drivers/rtc/rtc-rk-timer.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-rk-timer.c b/drivers/rtc/rtc-rk-timer.c index 171e9a31bb6f..4b516e971f11 100644 --- a/drivers/rtc/rtc-rk-timer.c +++ b/drivers/rtc/rtc-rk-timer.c @@ -105,7 +105,26 @@ static inline int rk_timer_rtc_write64(struct rk_timer_rtc *rk_timer_rtc, static inline int rk_timer_rtc_read64(struct rk_timer_rtc *rk_timer_rtc, u32 reg, u64 *val) { - return regmap_bulk_read(rk_timer_rtc->regmap, reg, val, 2); + u32 val_lo, val_hi, tmp_hi; + int ret; + + do { + ret = regmap_read(rk_timer_rtc->regmap, reg + 4, &val_hi); + if (ret) + return ret; + + ret = regmap_read(rk_timer_rtc->regmap, reg, &val_lo); + if (ret) + return ret; + + ret = regmap_read(rk_timer_rtc->regmap, reg + 4, &tmp_hi); + if (ret) + return ret; + } while (val_hi != tmp_hi); + + *val = ((u64) val_hi << 32) | val_lo; + + return 0; } static inline int rk_timer_rtc_irq_clear(struct rk_timer_rtc *rk_timer_rtc)