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. + } + ret = watchdog_register_device(&priv->wdev); if (ret < 0) goto out_pm_disable; -- 2.11.0