On Mon, Apr 15, 2019 at 12:52:01PM +0200, Wolfram Sang wrote:
> Support an already running watchdog by checking its enable bit and set
> up the status accordingly before registering the device.
> 
> Signed-off-by: Wolfram Sang <wsa+rene...@sang-engineering.com>
> ---
> 
> This patch was tested using a Renesas Salvator XS board (R-Car M3N). It works.
> However, there is a small window where the watchdog clock is disabled, namely
> after the MSSR clock driver initializes it until RuntimePM of the watchdog
> driver takes over. If the system hangs in this window, bad luck. So, I'd think
> it makes sense to have this clock either always-on or to keep the state which
> came from the firmware. Geert, what do you think?
> 
>  drivers/watchdog/renesas_wdt.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c
> index 565dbc1ec638..37d757288b22 100644
> --- a/drivers/watchdog/renesas_wdt.c
> +++ b/drivers/watchdog/renesas_wdt.c
> @@ -179,6 +179,7 @@ static int rwdt_probe(struct platform_device *pdev)
>       struct clk *clk;
>       unsigned long clks_per_sec;
>       int ret, i;
> +     u8 csra;
>  
>       if (rwdt_blacklisted(&pdev->dev))
>               return -ENODEV;
> @@ -198,8 +199,8 @@ static int rwdt_probe(struct platform_device *pdev)
>       pm_runtime_enable(&pdev->dev);
>       pm_runtime_get_sync(&pdev->dev);
>       priv->clk_rate = clk_get_rate(clk);
> -     priv->wdev.bootstatus = (readb_relaxed(priv->base + RWTCSRA) &
> -                             RWTCSRA_WOVF) ? WDIOF_CARDRESET : 0;
> +     csra = readb_relaxed(priv->base + RWTCSRA);
> +     priv->wdev.bootstatus = csra & RWTCSRA_WOVF ? WDIOF_CARDRESET : 0;
>       pm_runtime_put(&pdev->dev);
>  
>       if (!priv->clk_rate) {
> @@ -237,6 +238,16 @@ static int rwdt_probe(struct platform_device *pdev)
>       /* This overrides the default timeout only if DT configuration was 
> found */
>       watchdog_init_timeout(&priv->wdev, 0, &pdev->dev);
>  
> +     if (csra & RWTCSRA_TME) {
> +             /* Ensure properly initialized dividers */
> +             rwdt_start(&priv->wdev);
> +             set_bit(WDOG_HW_RUNNING, &priv->wdev.status);
> +             //FIXME: We are missing pm_runtime_put in some code paths to
> +             // to balance PM calls. We first need to decide if we maybe
> +             // should have the RWDT clock always-on or if using RPM for
> +             // clock management is OK.

Maybe I am missing something, but ..

Is handover even possible if the clock is controlled by clock management ?
Seems to me the clock would then be turned off through pm, which effectively
turns off the watchdog. So it will be off between clock/pm initialization
and the above code, meaning wdt handover from the boot loader is for all
practical purposes useless if the kernel gets stuck in between.

Thanks,
Guenter

> +     }
> +
>       ret = watchdog_register_device(&priv->wdev);
>       if (ret < 0)
>               goto out_pm_disable;
> -- 
> 2.11.0
> 

Reply via email to