From: UtsavAgarwalADI <[email protected]>

The ADI watchdog drives a reset through a Security (SEC) controller
fault source. The source index was hardcoded to 3 in adi_wdt_start(),
which is only correct for the SC5xx parts that happen to use that
index.

Read the index from a new "secid" device tree property so boards that
route the watchdog fault to a different SEC source can configure it.

Set secid = <3> in the SC57x, SC58x, SC594 and SC598 device trees to
match the value they relied on before.

Co-developed-by: Ozan Durgut <[email protected]>
Signed-off-by: Ozan Durgut <[email protected]>
Signed-off-by: UtsavAgarwalADI <[email protected]>
---
 arch/arm/dts/sc57x.dtsi     | 1 +
 arch/arm/dts/sc58x.dtsi     | 1 +
 arch/arm/dts/sc594-som.dtsi | 1 +
 arch/arm/dts/sc598-som.dtsi | 1 +
 drivers/watchdog/adi_wdt.c  | 9 ++++++++-
 5 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/arch/arm/dts/sc57x.dtsi b/arch/arm/dts/sc57x.dtsi
index e4cc612959f..794e80c3cf1 100644
--- a/arch/arm/dts/sc57x.dtsi
+++ b/arch/arm/dts/sc57x.dtsi
@@ -113,6 +113,7 @@
 
 &wdog {
        clocks = <&clk ADSP_SC57X_CLK_CGU0_SCLK0>;
+       secid = <3>;
 };
 
 &eth0 {
diff --git a/arch/arm/dts/sc58x.dtsi b/arch/arm/dts/sc58x.dtsi
index 7b07589de47..d4008ba7988 100644
--- a/arch/arm/dts/sc58x.dtsi
+++ b/arch/arm/dts/sc58x.dtsi
@@ -158,6 +158,7 @@
 
 &wdog {
        clocks = <&clk ADSP_SC58X_CLK_CGU0_SCLK0>;
+       secid = <3>;
 };
 
 &eth0 {
diff --git a/arch/arm/dts/sc594-som.dtsi b/arch/arm/dts/sc594-som.dtsi
index 1c2adc601dd..7a7167fbbba 100644
--- a/arch/arm/dts/sc594-som.dtsi
+++ b/arch/arm/dts/sc594-som.dtsi
@@ -67,6 +67,7 @@
 
 &wdog {
        clocks = <&clk ADSP_SC594_CLK_CGU0_SCLK0>;
+       secid = <3>;
 };
 
 &i2c0 {
diff --git a/arch/arm/dts/sc598-som.dtsi b/arch/arm/dts/sc598-som.dtsi
index bc212ef25cb..bca3ff765d6 100644
--- a/arch/arm/dts/sc598-som.dtsi
+++ b/arch/arm/dts/sc598-som.dtsi
@@ -124,6 +124,7 @@
 
 &wdog {
        clocks = <&clk ADSP_SC598_CLK_CGU0_SCLK0>;
+       secid = <3>;
 };
 
 &i2c0 {
diff --git a/drivers/watchdog/adi_wdt.c b/drivers/watchdog/adi_wdt.c
index 7d7cf98b55e..8e7ff958121 100644
--- a/drivers/watchdog/adi_wdt.c
+++ b/drivers/watchdog/adi_wdt.c
@@ -36,6 +36,7 @@ struct adi_wdt_priv {
        void __iomem *rcu_base;
        void __iomem *sec_base;
        void __iomem *wdt_base;
+       u32 secid;
        struct clk clock;
 };
 
@@ -72,7 +73,7 @@ static int adi_wdt_start(struct udevice *dev, u64 timeout_ms, 
ulong flags)
        iowrite32(0xc1, priv->sec_base + SEC_FCTL);
 
        /* enable SEC fault source for watchdog0 */
-       setbits_32(priv->sec_base + SEC_SCTL0 + (3*8), 0x6);
+       setbits_32(priv->sec_base + SEC_SCTL0 + (priv->secid * 8), 0x6);
 
        /* Enable SYSCD_RESETb input */
        iowrite32(0x100, priv->rcu_base + RCU_CTL);
@@ -95,6 +96,7 @@ static int adi_wdt_probe(struct udevice *dev)
        struct adi_wdt_priv *priv = dev_get_priv(dev);
        int ret;
        struct resource res;
+       u32 secid;
 
        ret = dev_read_resource_byname(dev, "rcu", &res);
        if (ret)
@@ -111,6 +113,11 @@ static int adi_wdt_probe(struct udevice *dev)
                return ret;
        priv->wdt_base = devm_ioremap(dev, res.start, resource_size(&res));
 
+       ret = dev_read_u32(dev, "secid", &secid);
+       if (ret)
+               return ret;
+       priv->secid = secid;
+
        ret = clk_get_by_name(dev, "sclk0", &priv->clock);
        if (ret < 0) {
                printf("Can't get WDT clk: %d\n", ret);
-- 
2.43.0

Reply via email to