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

Stefan Roese sr at denx.de
Tue Jan 17 07:05:53 CET 2023


Hi Pali,

On 1/16/23 18:54, Pali Rohár wrote:
> 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")

Will do when applying. Thanks.

Thanks,
Stefan

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

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Erika Unter
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list