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>
This commit is contained in:
Rasmus Villemoes 2021-08-19 11:57:01 +02:00 committed by Stefan Roese
parent 815529ebe1
commit 90555dc83e
2 changed files with 33 additions and 0 deletions

View 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);

View file

@ -37,6 +37,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()