driver: watchdog: reset watchdog in designware_wdt_stop() function
authorMengLi <meng.li@windriver.com>
Mon, 24 May 2021 02:22:48 +0000 (10:22 +0800)
committerStefan Roese <sr@denx.de>
Fri, 16 Jul 2021 08:28:35 +0000 (10:28 +0200)
In uboot command line environment, watchdog is not able to be
stopped with below commands:
SOCFPGA_STRATIX10 # wdt dev watchdog@ffd00200
SOCFPGA_STRATIX10 # wdt stop
Refer to watchdog driver in linux kernel, it is also need to reset
watchdog after disable it so that the disable action takes effect.

Signed-off-by: Meng Li <Meng.Li@windriver.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Reviewed-by: Sean Anderson <sean.anderson@seco.com>
drivers/watchdog/designware_wdt.c

index 9e54871..afed81e 100644 (file)
@@ -22,6 +22,7 @@
 struct designware_wdt_priv {
        void __iomem    *base;
        unsigned int    clk_khz;
+       struct reset_ctl_bulk *resets;
 };
 
 /*
@@ -95,6 +96,18 @@ static int designware_wdt_stop(struct udevice *dev)
        designware_wdt_reset(dev);
        writel(0, priv->base + DW_WDT_CR);
 
+        if (CONFIG_IS_ENABLED(DM_RESET)) {
+               int ret;
+
+               ret = reset_assert_bulk(priv->resets);
+               if (ret)
+                       return ret;
+
+               ret = reset_deassert_bulk(priv->resets);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -143,13 +156,11 @@ static int designware_wdt_probe(struct udevice *dev)
 #endif
 
        if (CONFIG_IS_ENABLED(DM_RESET)) {
-               struct reset_ctl_bulk resets;
-
-               ret = reset_get_bulk(dev, &resets);
+               ret = reset_get_bulk(dev, priv->resets);
                if (ret)
                        goto err;
 
-               ret = reset_deassert_bulk(&resets);
+               ret = reset_deassert_bulk(priv->resets);
                if (ret)
                        goto err;
        }