summaryrefslogtreecommitdiff
path: root/drivers/timer
diff options
context:
space:
mode:
authorStefan Roese <sr@denx.de>2022-12-21 12:18:49 +0300
committerStefan Roese <sr@denx.de>2023-01-02 11:14:16 +0300
commit5387b093cb7914b3c0404da928fa4bafdffac291 (patch)
tree9a61931429bc320ad8e105a28ff5fdeb0d3098e9 /drivers/timer
parent3089d12a02efd1dc5dce01e0ec0fda9142693b11 (diff)
downloadu-boot-5387b093cb7914b3c0404da928fa4bafdffac291.tar.xz
timer: orion-timer: Fix problem with early static variable
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@denx.de> Cc: Pali Rohár <pali@kernel.org> Cc: Michael Walle <michael@walle.cc> Cc: Tony Dinh <mibodhi@gmail.com> Tested-by: Tony Dinh <mibodhi@gmail.com>
Diffstat (limited to 'drivers/timer')
-rw-r--r--drivers/timer/orion-timer.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/timer/orion-timer.c b/drivers/timer/orion-timer.c
index d0eab3ce78..6804bf0fa2 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);