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

Reply via email to