diff options
author | Rasmus Villemoes <rasmus.villemoes@prevas.dk> | 2021-08-19 11:57:01 +0200 |
---|---|---|
committer | Stefan Roese <sr@denx.de> | 2021-08-31 12:04:03 +0200 |
commit | 90555dc83e886250f029711728939a219c225f2d (patch) | |
tree | f8af297850a3777eacdd92827303df26b29064d3 | |
parent | 815529ebe183cc9773b2e51f754daba5b6906d32 (diff) | |
download | u-boot-90555dc83e886250f029711728939a219c225f2d.tar.gz u-boot-90555dc83e886250f029711728939a219c225f2d.tar.bz2 u-boot-90555dc83e886250f029711728939a219c225f2d.zip |
watchdog: wdt-uclass.c: add wdt_stop_all() helper
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>
-rw-r--r-- | drivers/watchdog/wdt-uclass.c | 25 | ||||
-rw-r--r-- | include/wdt.h | 8 |
2 files changed, 33 insertions, 0 deletions
diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c index 358fc68e27..5b1c0df5d6 100644 --- a/drivers/watchdog/wdt-uclass.c +++ b/drivers/watchdog/wdt-uclass.c @@ -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); diff --git a/include/wdt.h b/include/wdt.h index bc242c2eb2..baaa9db08a 100644 --- a/include/wdt.h +++ b/include/wdt.h @@ -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() * |