drivers: watchdog: wdt-uclass.c: add a property u-boot, noautostart
authorPhilippe Reynes <philippe.reynes@softathome.com>
Thu, 10 Feb 2022 17:17:54 +0000 (18:17 +0100)
committerStefan Roese <sr@denx.de>
Tue, 8 Mar 2022 08:08:00 +0000 (09:08 +0100)
Since commit 492ee6b8d0e7 ("watchdog: wdt-uclass.c: handle all DM
watchdogs in watchdog_reset()"), all the watchdog are started when
the config WATCHDOG_AUTOSTART.

To avoid a binary choice none/all, a property u-boot,noautostart
may be added in the watchdog node of the u-boot device tree to not
autostart this watchdog.

Signed-off-by: Philippe Reynes <philippe.reynes@softathome.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Stefan Roese <sr@denx.de>
drivers/watchdog/wdt-uclass.c

index 6d0f473..dbf5564 100644 (file)
@@ -36,6 +36,8 @@ struct wdt_priv {
        ulong next_reset;
        /* Whether watchdog_start() has been called on the device. */
        bool running;
+       /* No autostart */
+       bool noautostart;
 };
 
 static void init_watchdog_dev(struct udevice *dev)
@@ -52,7 +54,7 @@ static void init_watchdog_dev(struct udevice *dev)
                               dev->name);
        }
 
-       if (!IS_ENABLED(CONFIG_WATCHDOG_AUTOSTART)) {
+       if (!IS_ENABLED(CONFIG_WATCHDOG_AUTOSTART) || priv->noautostart) {
                printf("WDT:   Not starting %s\n", dev->name);
                return;
        }
@@ -256,16 +258,19 @@ static int wdt_pre_probe(struct udevice *dev)
         * indicated by a hw_margin_ms property.
         */
        ulong reset_period = 1000;
+       bool noautostart = false;
        struct wdt_priv *priv;
 
        if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
                timeout = dev_read_u32_default(dev, "timeout-sec", timeout);
                reset_period = dev_read_u32_default(dev, "hw_margin_ms",
                                                    4 * reset_period) / 4;
+               noautostart = dev_read_bool(dev, "u-boot,noautostart");
        }
        priv = dev_get_uclass_priv(dev);
        priv->timeout = timeout;
        priv->reset_period = reset_period;
+       priv->noautostart = noautostart;
        /*
         * Pretend this device was last reset "long" ago so the first
         * watchdog_reset will actually call its ->reset method.