diff mbox series

[v2,05/10] watchdog: wdt-uclass.c: keep track of each device's running state

Message ID 20210527220017.1266765-6-rasmus.villemoes@prevas.dk
State Superseded
Delegated to: Stefan Roese
Headers show
Series handling all DM watchdogs in watchdog_reset() | expand

Commit Message

Rasmus Villemoes May 27, 2021, 10 p.m. UTC
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 9c44ff1c5f3c.

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
---
 drivers/watchdog/wdt-uclass.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

Comments

Simon Glass June 22, 2021, 1:31 p.m. UTC | #1
On Thu, 27 May 2021 at 16:00, Rasmus Villemoes
<rasmus.villemoes@prevas.dk> wrote:
>
> 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 9c44ff1c5f3c.
>
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
> ---
>  drivers/watchdog/wdt-uclass.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Stefan Roese June 29, 2021, 6:04 a.m. UTC | #2
On 28.05.21 00:00, Rasmus Villemoes wrote:
> 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 9c44ff1c5f3c.
> 
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>

Reviewed-by: Stefan Roese <sr@denx.de>

Thanks,
Stefan

> ---
>   drivers/watchdog/wdt-uclass.c | 19 +++++++++++++++----
>   1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
> index 5d5dbcd0f7..026b6d1eb4 100644
> --- a/drivers/watchdog/wdt-uclass.c
> +++ b/drivers/watchdog/wdt-uclass.c
> @@ -22,6 +22,7 @@ struct wdt_priv {
>   	u32 timeout;
>   	ulong reset_period;
>   	ulong next_reset;
> +	bool running;
>   };
>   
>   static void init_watchdog_dev(struct udevice *dev)
> @@ -63,6 +64,7 @@ int initr_watchdog(void)
>   	}
>   	init_watchdog_dev(gd->watchdog_dev);
>   
> +	gd->flags |= GD_FLG_WDT_READY;
>   	return 0;
>   }
>   
> @@ -75,8 +77,11 @@ int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
>   		return -ENOSYS;
>   
>   	ret = ops->start(dev, timeout_ms, flags);
> -	if (ret == 0)
> -		gd->flags |= GD_FLG_WDT_READY;
> +	if (ret == 0) {
> +		struct wdt_priv *priv = dev_get_uclass_priv(dev);
> +
> +		priv->running = true;
> +	}
>   
>   	return ret;
>   }
> @@ -90,8 +95,11 @@ int wdt_stop(struct udevice *dev)
>   		return -ENOSYS;
>   
>   	ret = ops->stop(dev);
> -	if (ret == 0)
> -		gd->flags &= ~GD_FLG_WDT_READY;
> +	if (ret == 0) {
> +		struct wdt_priv *priv = dev_get_uclass_priv(dev);
> +
> +		priv->running = false;
> +	}
>   
>   	return ret;
>   }
> @@ -145,6 +153,9 @@ void watchdog_reset(void)
>   
>   	dev = gd->watchdog_dev;
>   	priv = dev_get_uclass_priv(dev);
> +	if (!priv->running)
> +		return;
> +
>   	/* Do not reset the watchdog too often */
>   	now = get_timer(0);
>   	if (time_after_eq(now, priv->next_reset)) {
> 


Viele Grüße,
Stefan
diff mbox series

Patch

diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
index 5d5dbcd0f7..026b6d1eb4 100644
--- a/drivers/watchdog/wdt-uclass.c
+++ b/drivers/watchdog/wdt-uclass.c
@@ -22,6 +22,7 @@  struct wdt_priv {
 	u32 timeout;
 	ulong reset_period;
 	ulong next_reset;
+	bool running;
 };
 
 static void init_watchdog_dev(struct udevice *dev)
@@ -63,6 +64,7 @@  int initr_watchdog(void)
 	}
 	init_watchdog_dev(gd->watchdog_dev);
 
+	gd->flags |= GD_FLG_WDT_READY;
 	return 0;
 }
 
@@ -75,8 +77,11 @@  int wdt_start(struct udevice *dev, u64 timeout_ms, ulong flags)
 		return -ENOSYS;
 
 	ret = ops->start(dev, timeout_ms, flags);
-	if (ret == 0)
-		gd->flags |= GD_FLG_WDT_READY;
+	if (ret == 0) {
+		struct wdt_priv *priv = dev_get_uclass_priv(dev);
+
+		priv->running = true;
+	}
 
 	return ret;
 }
@@ -90,8 +95,11 @@  int wdt_stop(struct udevice *dev)
 		return -ENOSYS;
 
 	ret = ops->stop(dev);
-	if (ret == 0)
-		gd->flags &= ~GD_FLG_WDT_READY;
+	if (ret == 0) {
+		struct wdt_priv *priv = dev_get_uclass_priv(dev);
+
+		priv->running = false;
+	}
 
 	return ret;
 }
@@ -145,6 +153,9 @@  void watchdog_reset(void)
 
 	dev = gd->watchdog_dev;
 	priv = dev_get_uclass_priv(dev);
+	if (!priv->running)
+		return;
+
 	/* Do not reset the watchdog too often */
 	now = get_timer(0);
 	if (time_after_eq(now, priv->next_reset)) {