Implement the get_timeout operation for the OcteonTX watchdog driver. Add a timeout_ms field to the private driver data. octeontx_wdt_start() stores the timeout after applying overflow clamping.
octeontx_wdt_get_timeout() stores the effective timeout in the timeout_ms output parameter. Signed-off-by: Juuso Rinta <[email protected]> --- drivers/watchdog/octeontx_wdt.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/watchdog/octeontx_wdt.c b/drivers/watchdog/octeontx_wdt.c index 7299a9f9739..e1286ac165c 100644 --- a/drivers/watchdog/octeontx_wdt.c +++ b/drivers/watchdog/octeontx_wdt.c @@ -31,6 +31,7 @@ struct octeontx_wdt_data { struct octeontx_wdt { void __iomem *reg; const struct octeontx_wdt_data *data; + u64 timeout_ms; struct clk clk; }; @@ -38,7 +39,7 @@ static int octeontx_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) { struct octeontx_wdt *priv = dev_get_priv(dev); u64 clk_rate, val; - u64 tout_wdog; + u64 tout_wdog, calculated_timeout; if (priv->data->has_clk) { clk_rate = clk_get_rate(&priv->clk); @@ -61,6 +62,11 @@ static int octeontx_wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) if (tout_wdog >= 0x10000) tout_wdog = 0xffff; + /* Store calculated timeout in milliseconds for get_timeout */ + calculated_timeout = (tout_wdog << 8) << priv->data->timer_shift; + + priv->timeout_ms = clk_rate ? calculated_timeout * 1000 / clk_rate : 0; + val = FIELD_PREP(WDOG_MODE, 0x3) | FIELD_PREP(WDOG_LEN, tout_wdog) | FIELD_PREP(WDOG_CNT, tout_wdog << 8); @@ -88,6 +94,14 @@ static int octeontx_wdt_expire_now(struct udevice *dev, ulong flags) return 0; } +static int octeontx_wdt_get_timeout(struct udevice *dev, u64 *timeout_ms) +{ + struct octeontx_wdt *priv = dev_get_priv(dev); + *timeout_ms = priv->timeout_ms; + + return 0; +} + static int octeontx_wdt_reset(struct udevice *dev) { struct octeontx_wdt *priv = dev_get_priv(dev); @@ -142,6 +156,7 @@ static const struct wdt_ops octeontx_wdt_ops = { .start = octeontx_wdt_start, .stop = octeontx_wdt_stop, .expire_now = octeontx_wdt_expire_now, + .get_timeout = octeontx_wdt_get_timeout, }; static const struct octeontx_wdt_data octeontx_data = { -- 2.39.2

