From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 14 Sep 2012 20:06:55 +0200 Subject: [U-Boot] [PATCH v2 06/11] rtc: Improve rtc_get() on s3c24x0_rtc In-Reply-To: <1347643742-19966-7-git-send-email-jose.goncalves@inov.pt> References: <1347643742-19966-1-git-send-email-jose.goncalves@inov.pt> <1347643742-19966-7-git-send-email-jose.goncalves@inov.pt> Message-ID: <201209142006.55190.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Jos? Miguel Gon?alves, > 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 > --- > 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..7d04b74 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++)); You don't need that parens around (have_retried++) > > /* read ALARM registers */ > a_sec = readb(&rtc->almsec); Best regards, Marek Vasut