[PATCH] timer: orion-timer: Fix problem in early_init_done()

Pali Rohár pali at kernel.org
Mon Jan 16 18:54:21 CET 2023


On Monday 16 January 2023 16:34:45 Stefan Roese wrote:
> It was noticed that Clearfog is currently broken with this newly
> introduced early_init_done() function. Apparently the timer is enabled
> here when U-Boot is run but not configured - at least not correctly.
> Resulting in a hangup in the timer reading functions.
> 
> To fix this, also read the value of the reload register and check it's
> value with the one written to by U-Boot. Only if this matches, the
> init has already been done.
> 
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Martin Rowe <martin.p.rowe at gmail.com>
> Cc: Tony Dinh <mibodhi at gmail.com>
> Cc: Pali Rohár <pali at kernel.org>
> Cc: Michael Walle <michael at walle.cc>

Looks good.

Acked-by: Pali Rohár <pali at kernel.org>

Maybe you should also fixed line:

Fixes: 5387b093cb79 ("timer: orion-timer: Fix problem with early static variable")

> ---
>  drivers/timer/orion-timer.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/timer/orion-timer.c b/drivers/timer/orion-timer.c
> index 810a03d54960..9cab27f2e48b 100644
> --- a/drivers/timer/orion-timer.c
> +++ b/drivers/timer/orion-timer.c
> @@ -25,7 +25,8 @@ struct orion_timer_priv {
>  
>  static bool early_init_done(void *base)
>  {
> -	if (readl(base + TIMER_CTRL) & TIMER0_EN)
> +	if ((readl(base + TIMER_CTRL) & TIMER0_EN) &&
> +	    (readl(base + TIMER0_RELOAD) == ~0))
>  		return true;
>  	return false;
>  }
> -- 
> 2.39.0
> 


More information about the U-Boot mailing list