watchdog: wdt-uclass.c: keep track of each device's running state
As a step towards handling all DM watchdogs in watchdog_reset(), use a
per-device flag to keep track of whether the device has been started
instead of a bit in gd->flags.
We will still need that bit to know whether we are past
initr_watchdog() and hence have populated gd->watchdog_dev -
incidentally, that is how it was used prior to commit 9c44ff1c5f
.
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Stefan Roese <sr@denx.de>
Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
This commit is contained in:

committed by
Stefan Roese

parent
3eaf6e2e42
commit
f1b112afbb
@@ -33,6 +33,8 @@ struct wdt_priv {
|
|||||||
* ->reset().
|
* ->reset().
|
||||||
*/
|
*/
|
||||||
ulong next_reset;
|
ulong next_reset;
|
||||||
|
/* Whether watchdog_start() has been called on the device. */
|
||||||
|
bool running;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_watchdog_dev(struct udevice *dev)
|
static void init_watchdog_dev(struct udevice *dev)
|
||||||
@@ -74,6 +76,7 @@ int initr_watchdog(void)
|
|||||||
}
|
}
|
||||||
init_watchdog_dev(gd->watchdog_dev);
|
init_watchdog_dev(gd->watchdog_dev);
|
||||||
|
|
||||||
|
gd->flags |= GD_FLG_WDT_READY;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,8 +89,11 @@ int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
|
|||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
ret = ops->start(dev, timeout_ms, flags);
|
ret = ops->start(dev, timeout_ms, flags);
|
||||||
if (ret == 0)
|
if (ret == 0) {
|
||||||
gd->flags |= GD_FLG_WDT_READY;
|
struct wdt_priv *priv = dev_get_uclass_priv(dev);
|
||||||
|
|
||||||
|
priv->running = true;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -101,8 +107,11 @@ int wdt_stop(struct udevice *dev)
|
|||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
ret = ops->stop(dev);
|
ret = ops->stop(dev);
|
||||||
if (ret == 0)
|
if (ret == 0) {
|
||||||
gd->flags &= ~GD_FLG_WDT_READY;
|
struct wdt_priv *priv = dev_get_uclass_priv(dev);
|
||||||
|
|
||||||
|
priv->running = false;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -156,6 +165,9 @@ void watchdog_reset(void)
|
|||||||
|
|
||||||
dev = gd->watchdog_dev;
|
dev = gd->watchdog_dev;
|
||||||
priv = dev_get_uclass_priv(dev);
|
priv = dev_get_uclass_priv(dev);
|
||||||
|
if (!priv->running)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Do not reset the watchdog too often */
|
/* Do not reset the watchdog too often */
|
||||||
now = get_timer(0);
|
now = get_timer(0);
|
||||||
if (time_after_eq(now, priv->next_reset)) {
|
if (time_after_eq(now, priv->next_reset)) {
|
||||||
|
Reference in New Issue
Block a user