[PATCH] timer: orion-timer: Fix problem with early static variable

Stefan Roese sr at denx.de
Wed Dec 21 10:18:49 CET 2022


We've noticed that at least one Kirkwood board (Pogo v4) has problems
with the new orion DM timer implementation. Debugging revealed that this
issue is related with the static variable "early_init_done" which does
not work correctly before relocation in all cases.

This patch removes this static variable and replaces it's functionality
via a function that detects if the timer is already initialized.

Signed-off-by: Stefan Roese <sr at denx.de>
Cc: Pali Rohár <pali at kernel.org>
Cc: Michael Walle <michael at walle.cc>
Cc: Tony Dinh <mibodhi at gmail.com>
---
 drivers/timer/orion-timer.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/timer/orion-timer.c b/drivers/timer/orion-timer.c
index d0eab3ce781d..6804bf0fa2cb 100644
--- a/drivers/timer/orion-timer.c
+++ b/drivers/timer/orion-timer.c
@@ -23,15 +23,19 @@ struct orion_timer_priv {
 
 #define MVEBU_TIMER_FIXED_RATE_25MHZ	25000000
 
-static bool early_init_done __section(".data") = false;
+static bool early_init_done(void *base)
+{
+	if (readl(base + TIMER_CTRL) & TIMER0_EN)
+		return true;
+	return false;
+}
 
 /* Common functions for early (boot) and DM based timer */
 static void orion_timer_init(void *base, enum input_clock_type type)
 {
 	/* Only init the timer once */
-	if (early_init_done)
+	if (early_init_done(base))
 		return;
-	early_init_done = true;
 
 	writel(~0, base + TIMER0_VAL);
 	writel(~0, base + TIMER0_RELOAD);
-- 
2.39.0



More information about the U-Boot mailing list