[PATCH v1 02/10] watchdog: ulp_wdog: Get watchdog base address from device tree

alice.guo
2026-03-10T13:13:30Z

Replace hardcoded WDOG_BASE_ADDR with dynamic address lookup from device
tree.

Signed-off-by: Alice Guo <alice.guo@nxp.com>
---
drivers/watchdog/ulp_wdog.c | 38 +++++++++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/drivers/watchdog/ulp_wdog.c b/drivers/watchdog/ulp_wdog.c
index 83f19dc0e86..3840a3db784 100644
--- a/drivers/watchdog/ulp_wdog.c
+++ b/drivers/watchdog/ulp_wdog.c
@@ -6,6 +6,7 @@
#include <cpu_func.h>
#include <asm/io.h>
#include <asm/arch/imx-regs.h>
+#include <asm/arch/sys_proto.h>
#include <dm.h>
#include <wdt.h>

@@ -51,11 +52,22 @@ struct ulp_wdt_priv {
#define CLK_RATE_1KHZ 1000
#define CLK_RATE_32KHZ 125

-void hw_watchdog_set_timeout(u16 val)
+static struct wdog_regs *ulp_watchdog_get_wdog_regs(void)
{
- /* setting timeout value */
- struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
+ fdt_addr_t addr;
+
+ addr = imx_wdog_alias_to_addr(NULL, true);
+ if (addr == FDT_ADDR_T_NONE) {
+ printf("Error: Failed to get watchdog base address from DT\n");
+ return NULL;
+ }
+
+ return (struct wdog_regs *)addr;
+}

+void hw_watchdog_set_timeout(struct wdog_regs *wdog, u16 val)
+{
+ /* setting timeout value */
writel(val, &wdog->toval);
}

@@ -89,7 +101,7 @@ void ulp_watchdog_init(struct wdog_regs *wdog, u16 timeout)
while (!(readl(&wdog->cs) & WDGCS_ULK))
;

- hw_watchdog_set_timeout(timeout);
+ hw_watchdog_set_timeout(wdog, timeout);
writel(0, &wdog->win);

/* setting 1-kHz clock source, enable counter running, and clear interrupt */
@@ -107,16 +119,17 @@ void ulp_watchdog_init(struct wdog_regs *wdog, u16 timeout)
ulp_watchdog_reset(wdog);
}

-void hw_watchdog_reset(void)
+void hw_watchdog_reset(struct wdog_regs *wdog)
{
- struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
-
ulp_watchdog_reset(wdog);
}

void hw_watchdog_init(void)
{
- struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
+ struct wdog_regs *wdog = ulp_watchdog_get_wdog_regs();
+
+ if (!wdog)
+ return;

ulp_watchdog_init(wdog, CONFIG_WATCHDOG_TIMEOUT_MSECS);
}
@@ -124,9 +137,12 @@ void hw_watchdog_init(void)
#if !CONFIG_IS_ENABLED(SYSRESET)
void reset_cpu(void)
{
- struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
+ struct wdog_regs *wdog = ulp_watchdog_get_wdog_regs();
u32 cmd32 = 0;

+ if (!wdog)
+ return;
+
if (readl(&wdog->cs) & WDGCS_CMD32EN) {
writel(UNLOCK_WORD, &wdog->cnt);
cmd32 = WDGCS_CMD32EN;
@@ -141,7 +157,7 @@ void reset_cpu(void)
while (!(readl(&wdog->cs) & WDGCS_ULK))
;

- hw_watchdog_set_timeout(5); /* 5ms timeout for general; 40ms timeout for imx93 */
+ hw_watchdog_set_timeout(wdog, 5); /* 5ms timeout for general; 40ms timeout for imx93 */
writel(0, &wdog->win);

/* enable counter running */
@@ -155,7 +171,7 @@ void reset_cpu(void)
while (!(readl(&wdog->cs) & WDGCS_RCS))
;

- hw_watchdog_reset();
+ hw_watchdog_reset(wdog);

while (1);
}

--
2.43.0