Implement the get_timeout operation for the SBSA watchdog driver.

Add a timeout_ms field in sbsa_gwdt_priv.

In sbsa_gwdt_start(), store the clamped timeout value
written to the register to the timeout_ms field.

In sbsa_gwdt_get_timeout(), write the effective timeout
to *timeout_ms.

Signed-off-by: Juuso Rinta <[email protected]>
---
 drivers/watchdog/sbsa_gwdt.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
index 3a924cb2b9a..3e91d093f4d 100644
--- a/drivers/watchdog/sbsa_gwdt.c
+++ b/drivers/watchdog/sbsa_gwdt.c
@@ -35,6 +35,7 @@
 struct sbsa_gwdt_priv {
        void __iomem *reg_refresh;
        void __iomem *reg_control;
+       u64 timeout_ms;
 };
 
 static int sbsa_gwdt_reset(struct udevice *dev)
@@ -46,6 +47,14 @@ static int sbsa_gwdt_reset(struct udevice *dev)
        return 0;
 }
 
+static int sbsa_gwdt_get_timeout(struct udevice *dev, u64 *timeout_ms)
+{
+       struct sbsa_gwdt_priv *priv = dev_get_priv(dev);
+       *timeout_ms = priv->timeout_ms;
+
+       return 0;
+}
+
 static int sbsa_gwdt_start(struct udevice *dev, u64 timeout, ulong flags)
 {
        struct sbsa_gwdt_priv *priv = dev_get_priv(dev);
@@ -65,6 +74,7 @@ static int sbsa_gwdt_start(struct udevice *dev, u64 timeout, 
ulong flags)
        if (tout_wdog > U32_MAX)
                tout_wdog = U32_MAX;
 
+       priv->timeout_ms = clk ? (tout_wdog * 2 * 1000) / clk : 0;
        writel(tout_wdog, priv->reg_control + SBSA_GWDT_WOR);
 
        /* writing WCS will cause an explicit watchdog refresh */
@@ -116,6 +126,7 @@ static const struct wdt_ops sbsa_gwdt_ops = {
        .reset = sbsa_gwdt_reset,
        .stop = sbsa_gwdt_stop,
        .expire_now = sbsa_gwdt_expire_now,
+       .get_timeout = sbsa_gwdt_get_timeout,
 };
 
 static const struct udevice_id sbsa_gwdt_ids[] = {

-- 
2.39.2

Reply via email to