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

Marek Vasut marex at denx.de
Fri Sep 14 20:06:55 CEST 2012


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 <jose.goncalves at inov.pt>
> ---
> 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


More information about the U-Boot mailing list