[PATCH 1/4] watchdog: Set/unset GD_FLG_WDT_READY flag in wdt_start()/wdt_stop()

Stefan Roese sr at denx.de
Tue Mar 9 12:26:39 CET 2021


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 at kernel.org>

Reviewed-by: Stefan Roese <sr at 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

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list