From: Alice Guo <[email protected]>

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 <[email protected]>
---
 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

Reply via email to