[PATCH] watchdog: adi_wdt: get SEC fault source ID from DT

Ozan Durgut <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.