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+renesas@xxxxxxxxxxxxxxxxxxxx> > --- > > 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 >