From patchwork Fri Sep 21 18:47:43 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [U-Boot,v5,06/11] rtc: Improve rtc_get() on s3c24x0_rtc Date: Fri, 21 Sep 2012 08:47:43 -0000 From: =?utf-8?q?Jos=C3=A9_Miguel_Gon=C3=A7alves_=3Cjose=2Egoncalves=40inov?= =?utf-8?q?=2Ept=3E?= X-Patchwork-Id: 185883 Message-Id: <1348253268-21812-7-git-send-email-jose.goncalves@inov.pt> To: u-boot@lists.denx.de Cc: marex@denx.de, trini@ti.com, =?UTF-8?q?Jos=C3=A9=20Miguel=20Gon=C3=A7alves?= , scottwood@freescale.com 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 --- Changes for v2: - New patch Changes for v3: - Removed unneeded parenthesis Changes for v4: - None Changes for v5: - 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);