watchdog: wdt-uclass.c: add wdt_stop_all() helper
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>
Thu, 19 Aug 2021 09:57:01 +0000 (11:57 +0200)
committerStefan Roese <sr@denx.de>
Tue, 31 Aug 2021 10:04:03 +0000 (12:04 +0200)
Since the watchdog_dev member of struct global_data is going away in
favor of the wdt-uclass handling all watchdog devices, prepare for
that by adding a helper to call wdt_stop() on all known devices.

If an error is encountered, still do wdt_stop() on remaining devices,
but remember and return the first error seen.

Initially, this will only be used in one single
place (board/alliedtelesis/x530/x530.c).

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
drivers/watchdog/wdt-uclass.c
include/wdt.h

index 358fc68..5b1c0df 100644 (file)
@@ -116,6 +116,31 @@ int wdt_stop(struct udevice *dev)
        return ret;
 }
 
+int wdt_stop_all(void)
+{
+       struct wdt_priv *priv;
+       struct udevice *dev;
+       struct uclass *uc;
+       int ret, err;
+
+       ret = uclass_get(UCLASS_WDT, &uc);
+       if (ret)
+               return ret;
+
+       uclass_foreach_dev(dev, uc) {
+               if (!device_active(dev))
+                       continue;
+               priv = dev_get_uclass_priv(dev);
+               if (!priv->running)
+                       continue;
+               err = wdt_stop(dev);
+               if (!ret)
+                       ret = err;
+       }
+
+       return ret;
+}
+
 int wdt_reset(struct udevice *dev)
 {
        const struct wdt_ops *ops = device_get_ops(dev);
index bc242c2..baaa9db 100644 (file)
@@ -38,6 +38,14 @@ int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags);
 int wdt_stop(struct udevice *dev);
 
 /*
+ * Stop all registered watchdog devices.
+ *
+ * @return: 0 if ok, first error encountered otherwise (but wdt_stop()
+ * is still called on following devices)
+ */
+int wdt_stop_all(void);
+
+/*
  * Reset the timer, typically restoring the counter to
  * the value configured by start()
  *