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

