[U-Boot] [PATCH v4 06/11] rtc: Improve rtc_get() on s3c24x0_rtc

José Miguel Gonçalves
2012-09-19T11:25:22Z

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(-)

diff --git a/drivers/rtc/s3c24x0_rtc.c b/drivers/rtc/s3c24x0_rtc.c
index c16ff2e..b31dc53 100644
--- a/drivers/rtc/s3c24x0_rtc.c
+++ b/drivers/rtc/s3c24x0_rtc.c
@@ -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);
--
1.7.9.5