[PATCH v2 1/5] imx: soc: Get watchdog base addresses from device tree
alice.guo at oss.nxp.com
alice.guo at oss.nxp.com
Tue Apr 21 16:01:27 CEST 2026
From: Alice Guo <alice.guo at nxp.com>
Replace hardcoded watchdog base addresses with dynamic address lookup
from device tree for i.MX7ULP, i.MX8ULP, i.MX91, i.MX93, i.MX943, i.MX95
and i.MX952.
Move i.MX7ULP watchdog initialization from s_init() to
arch_cpu_init() because ofnode_* APIs depend on FDT, which is not
available during s_init().
Signed-off-by: Alice Guo <alice.guo at nxp.com>
---
arch/arm/mach-imx/imx8ulp/soc.c | 14 +++++++++++++-
arch/arm/mach-imx/imx9/scmi/soc.c | 15 ++++++++++++---
arch/arm/mach-imx/imx9/soc.c | 16 +++++++++++++---
arch/arm/mach-imx/mx7ulp/soc.c | 24 ++++++++++++++++++------
4 files changed, 56 insertions(+), 13 deletions(-)
diff --git a/arch/arm/mach-imx/imx8ulp/soc.c b/arch/arm/mach-imx/imx8ulp/soc.c
index 1ee483065e8..ec85625ea25 100644
--- a/arch/arm/mach-imx/imx8ulp/soc.c
+++ b/arch/arm/mach-imx/imx8ulp/soc.c
@@ -343,7 +343,19 @@ static void disable_wdog(void __iomem *wdog_base)
void init_wdog(void)
{
- disable_wdog((void __iomem *)WDG3_RBASE);
+ ofnode node;
+
+ for (node = ofnode_by_compatible(ofnode_null(), "fsl,imx8ulp-wdt");
+ ofnode_valid(node);
+ node = ofnode_by_compatible(node, "fsl,imx8ulp-wdt")) {
+ phys_addr_t base;
+
+ base = ofnode_get_addr(node);
+ if (base == FDT_ADDR_T_NONE)
+ continue;
+
+ disable_wdog((void __iomem *)base);
+ }
}
static struct mm_region imx8ulp_arm64_mem_map[] = {
diff --git a/arch/arm/mach-imx/imx9/scmi/soc.c b/arch/arm/mach-imx/imx9/scmi/soc.c
index fbee435786c..365891d1d1a 100644
--- a/arch/arm/mach-imx/imx9/scmi/soc.c
+++ b/arch/arm/mach-imx/imx9/scmi/soc.c
@@ -786,9 +786,18 @@ static void gpio_reset(ulong gpio_base)
int arch_cpu_init(void)
{
if (IS_ENABLED(CONFIG_SPL_BUILD)) {
- if (!IS_ENABLED(CONFIG_IMX952)) {
- disable_wdog((void __iomem *)WDG3_BASE_ADDR);
- disable_wdog((void __iomem *)WDG4_BASE_ADDR);
+ ofnode node;
+
+ for (node = ofnode_by_compatible(ofnode_null(), "fsl,imx93-wdt");
+ ofnode_valid(node);
+ node = ofnode_by_compatible(node, "fsl,imx93-wdt")) {
+ phys_addr_t base;
+
+ base = ofnode_get_addr(node);
+ if (base == FDT_ADDR_T_NONE)
+ continue;
+
+ disable_wdog((void __iomem *)base);
}
gpio_reset(GPIO2_BASE_ADDR);
diff --git a/arch/arm/mach-imx/imx9/soc.c b/arch/arm/mach-imx/imx9/soc.c
index 44b3e0f5310..edd4ce89911 100644
--- a/arch/arm/mach-imx/imx9/soc.c
+++ b/arch/arm/mach-imx/imx9/soc.c
@@ -281,9 +281,19 @@ static void disable_wdog(void __iomem *wdog_base)
void init_wdog(void)
{
- disable_wdog((void __iomem *)WDG3_BASE_ADDR);
- disable_wdog((void __iomem *)WDG4_BASE_ADDR);
- disable_wdog((void __iomem *)WDG5_BASE_ADDR);
+ ofnode node;
+
+ for (node = ofnode_by_compatible(ofnode_null(), "fsl,imx93-wdt");
+ ofnode_valid(node);
+ node = ofnode_by_compatible(node, "fsl,imx93-wdt")) {
+ phys_addr_t base;
+
+ base = ofnode_get_addr(node);
+ if (base == FDT_ADDR_T_NONE)
+ continue;
+
+ disable_wdog((void __iomem *)base);
+ }
}
static struct mm_region imx93_mem_map[] = {
diff --git a/arch/arm/mach-imx/mx7ulp/soc.c b/arch/arm/mach-imx/mx7ulp/soc.c
index 5306e76223f..d262039ad82 100644
--- a/arch/arm/mach-imx/mx7ulp/soc.c
+++ b/arch/arm/mach-imx/mx7ulp/soc.c
@@ -83,8 +83,12 @@ enum bt_mode get_boot_mode(void)
return LOW_POWER_BOOT;
}
+static void init_wdog(void);
int arch_cpu_init(void)
{
+ /* Disable wdog */
+ init_wdog();
+
enable_ca7_smp();
return 0;
}
@@ -146,7 +150,7 @@ static void disable_wdog(u32 wdog_base)
while (!(readl(wdog_base + 0x00) & 0x400));
}
-void init_wdog(void)
+static void init_wdog(void)
{
/*
* ROM will configure WDOG1, disable it or enable it
@@ -161,8 +165,19 @@ void init_wdog(void)
* In this function, we will disable both WDOG1 and WDOG2,
* and set update bit for both. So that kernel can reconfigure them.
*/
- disable_wdog(WDG1_RBASE);
- disable_wdog(WDG2_RBASE);
+ ofnode node;
+
+ for (node = ofnode_by_compatible(ofnode_null(), "fsl,imx7ulp-wdt");
+ ofnode_valid(node);
+ node = ofnode_by_compatible(node, "fsl,imx7ulp-wdt")) {
+ phys_addr_t base;
+
+ base = ofnode_get_addr(node);
+ if (base == FDT_ADDR_T_NONE)
+ continue;
+
+ disable_wdog((u32)base);
+ }
}
static bool ldo_mode_is_enabled(void)
@@ -221,9 +236,6 @@ static void init_ldo_mode(void)
void s_init(void)
{
- /* Disable wdog */
- init_wdog();
-
/* clock configuration. */
clock_init();
--
2.34.1
More information about the U-Boot
mailing list