On 9/8/20 2:56 AM, 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> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > > This is the same patch as V2 sent out nearly one year ago. There was one > issue when probe() failed and the clocks were disabled, so the WDT > wouldn't fire despite the FW set it up before. We fixed this at clk > driver level and all the commits are upstream now. I tested this on a > Renesas Salvator-XS board (R-Car M3N) with all combinations of > HANDLE_BOOT_ENABLED, open_timeout values and injected failures I could > think of. This patch is now good to go IMO. > > drivers/watchdog/renesas_wdt.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c > index 00662a8e039c..47fce4de0110 100644 > --- a/drivers/watchdog/renesas_wdt.c > +++ b/drivers/watchdog/renesas_wdt.c > @@ -194,6 +194,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(dev)) > return -ENODEV; > @@ -213,8 +214,8 @@ static int rwdt_probe(struct platform_device *pdev) > pm_runtime_enable(dev); > pm_runtime_get_sync(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(dev); > > if (!priv->clk_rate) { > @@ -252,6 +253,13 @@ 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, dev); > > + /* Check if FW enabled the watchdog */ > + if (csra & RWTCSRA_TME) { > + /* Ensure properly initialized dividers */ > + rwdt_start(&priv->wdev); > + set_bit(WDOG_HW_RUNNING, &priv->wdev.status); > + } > + > ret = watchdog_register_device(&priv->wdev); > if (ret < 0) > goto out_pm_disable; >