@@ -65,20 +65,26 @@ int rtc_get(struct rtc_time *tmp)
uchar sec, min, hour, mday, wday, mon, year;
__maybe_unused uchar a_sec, a_min, a_hour, a_date,
a_mon, a_year, a_armed;
+ int have_retried = 0;
/* enable access to RTC registers */
SetRTC_Access(RTC_ENABLE);
/* read RTC registers */
do {
- sec = readb(&rtc->bcdsec);
min = readb(&rtc->bcdmin);
hour = readb(&rtc->bcdhour);
mday = readb(&rtc->bcddate);
wday = readb(&rtc->bcdday);
mon = readb(&rtc->bcdmon);
year = readb(&rtc->bcdyear);
- } while (sec != readb(&rtc->bcdsec));
+ sec = readb(&rtc->bcdsec);
+ /*
+ * The only way to work out whether the RTC was mid-update
+ * when we read it is to check the seconds counter.
+ * If it's zero, then we re-try the entire read.
+ */
+ } while (sec == 0 && !have_retried++);
/* read ALARM registers */
a_sec = readb(&rtc->almsec);
A better approach to avoid reading the RTC during updates, as sugested in the S3C2416 User's Manual. Signed-off-by: José Miguel Gonçalves <jose.goncalves@inov.pt> --- Changes for v2: - New patch Changes for v3: - Removed unneeded parenthesis Changes for v4: - None --- drivers/rtc/s3c24x0_rtc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)