Message ID | 20210305213659.31025-1-pali@kernel.org |
---|---|
State | Superseded |
Delegated to: | Stefan Roese |
Headers | show |
Series | [1/4] watchdog: Set/unset GD_FLG_WDT_READY flag in wdt_start()/wdt_stop() | expand |
On 05.03.21 22:36, Pali Rohár wrote: > Watchdog is ready after successful call of ops->start() callback in > wdt_start() function. And is stopped after successful call of ops->stop() > callback in wdt_stop function. > > So move setting of GD_FLG_WDT_READY flag from initr_watchdog() function to > wdt_start() and ensure that GD_FLG_WDT_READY flag is unset in wdt_stop() > function. > > This change ensures that GD_FLG_WDT_READY flag is set only when watchdog is > running. And ensures that flag is also also when watchdog was started not > only by initr_watchdog() call (e.g. by U-Boot 'wdt' command). > > Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Stefan Roese <sr@denx.de> Thanks, Stefan > --- > drivers/watchdog/wdt-uclass.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c > index 28f7918c4673..3f707f61f74f 100644 > --- a/drivers/watchdog/wdt-uclass.c > +++ b/drivers/watchdog/wdt-uclass.c > @@ -51,7 +51,6 @@ int initr_watchdog(void) > } > > wdt_start(gd->watchdog_dev, timeout * 1000, 0); > - gd->flags |= GD_FLG_WDT_READY; > printf("WDT: Started with%s servicing (%ds timeout)\n", > IS_ENABLED(CONFIG_WATCHDOG) ? "" : "out", timeout); > > @@ -61,21 +60,31 @@ int initr_watchdog(void) > int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) > { > const struct wdt_ops *ops = device_get_ops(dev); > + int ret; > > if (!ops->start) > return -ENOSYS; > > - return ops->start(dev, timeout_ms, flags); > + ret = ops->start(dev, timeout_ms, flags); > + if (ret == 0) > + gd->flags |= GD_FLG_WDT_READY; > + > + return ret; > } > > int wdt_stop(struct udevice *dev) > { > const struct wdt_ops *ops = device_get_ops(dev); > + int ret; > > if (!ops->stop) > return -ENOSYS; > > - return ops->stop(dev); > + ret = ops->stop(dev); > + if (ret == 0) > + gd->flags &= ~GD_FLG_WDT_READY; > + > + return ret; > } > > int wdt_reset(struct udevice *dev) > Viele Grüße, Stefan
diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c index 28f7918c4673..3f707f61f74f 100644 --- a/drivers/watchdog/wdt-uclass.c +++ b/drivers/watchdog/wdt-uclass.c @@ -51,7 +51,6 @@ int initr_watchdog(void) } wdt_start(gd->watchdog_dev, timeout * 1000, 0); - gd->flags |= GD_FLG_WDT_READY; printf("WDT: Started with%s servicing (%ds timeout)\n", IS_ENABLED(CONFIG_WATCHDOG) ? "" : "out", timeout); @@ -61,21 +60,31 @@ int initr_watchdog(void) int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags) { const struct wdt_ops *ops = device_get_ops(dev); + int ret; if (!ops->start) return -ENOSYS; - return ops->start(dev, timeout_ms, flags); + ret = ops->start(dev, timeout_ms, flags); + if (ret == 0) + gd->flags |= GD_FLG_WDT_READY; + + return ret; } int wdt_stop(struct udevice *dev) { const struct wdt_ops *ops = device_get_ops(dev); + int ret; if (!ops->stop) return -ENOSYS; - return ops->stop(dev); + ret = ops->stop(dev); + if (ret == 0) + gd->flags &= ~GD_FLG_WDT_READY; + + return ret; } int wdt_reset(struct udevice *dev)
Watchdog is ready after successful call of ops->start() callback in wdt_start() function. And is stopped after successful call of ops->stop() callback in wdt_stop function. So move setting of GD_FLG_WDT_READY flag from initr_watchdog() function to wdt_start() and ensure that GD_FLG_WDT_READY flag is unset in wdt_stop() function. This change ensures that GD_FLG_WDT_READY flag is set only when watchdog is running. And ensures that flag is also also when watchdog was started not only by initr_watchdog() call (e.g. by U-Boot 'wdt' command). Signed-off-by: Pali Rohár <pali@kernel.org> --- drivers/watchdog/wdt-uclass.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)