Re: [PATCH v6 05/12] watchdog: wdt-uclass.c: keep track of each device's running state

2021-08-19 Thread Wolfgang Denk
Dear Rasmus,

please check your patches for proper error handling.

In message <20210819095706.3585923-6-rasmus.villem...@prevas.dk> you wrote:
>
...
> diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
> index 0a1f43771c..358fc68e27 100644
> --- a/drivers/watchdog/wdt-uclass.c
> +++ b/drivers/watchdog/wdt-uclass.c
...
> @@ -86,8 +89,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;

dev_get_uclass_priv() can return NULL, in which case you would be
dereferencing a NULL pointer...

> @@ -101,8 +107,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;

Same here.

> @@ -156,6 +165,9 @@ void watchdog_reset(void)
>  
>   dev = gd->watchdog_dev;
>   priv = dev_get_uclass_priv(dev);
> + if (!priv->running)
> + return;
> +

And here again.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,  Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
I used to be indecisive, now I'm not sure.


[PATCH v6 05/12] watchdog: wdt-uclass.c: keep track of each device's running state

2021-08-19 Thread Rasmus Villemoes
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.

Reviewed-by: Simon Glass 
Reviewed-by: Stefan Roese 
Signed-off-by: Rasmus Villemoes 
---
 drivers/watchdog/wdt-uclass.c | 20 
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/drivers/watchdog/wdt-uclass.c b/drivers/watchdog/wdt-uclass.c
index 0a1f43771c..358fc68e27 100644
--- a/drivers/watchdog/wdt-uclass.c
+++ b/drivers/watchdog/wdt-uclass.c
@@ -33,6 +33,8 @@ struct wdt_priv {
 * ->reset().
 */
ulong next_reset;
+   /* Whether watchdog_start() has been called on the device. */
+   bool running;
 };
 
 static void init_watchdog_dev(struct udevice *dev)
@@ -74,6 +76,7 @@ int initr_watchdog(void)
}
init_watchdog_dev(gd->watchdog_dev);
 
+   gd->flags |= GD_FLG_WDT_READY;
return 0;
 }
 
@@ -86,8 +89,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;
 }
@@ -101,8 +107,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;
 }
@@ -156,6 +165,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)) {
-- 
2.31.1