]> Git Repo - J-linux.git/commitdiff
watchdog: pm8916_wdt: Handle watchdog enabled by bootloader
authorStephan Gerhold <[email protected]>
Wed, 29 Jun 2022 08:48:16 +0000 (10:48 +0200)
committerWim Van Sebroeck <[email protected]>
Sat, 23 Jul 2022 12:21:28 +0000 (14:21 +0200)
The bootloader might already enable the watchdog to catch hangs
during the boot process. In that case the kernel needs to ping
the watchdog temporarily until userspace is fully started.

Add a check for this in the probe() function and set the WDOG_HW_RUNNING
flag to make the watchdog core handle this automatically.

Signed-off-by: Stephan Gerhold <[email protected]>
Reviewed-by: Loic Poulain <[email protected]>
Reviewed-by: Guenter Roeck <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Guenter Roeck <[email protected]>
Signed-off-by: Wim Van Sebroeck <[email protected]>
drivers/watchdog/pm8916_wdt.c

index 49f1a520452608e308f8417e587ba2675d6455ee..f4bfbffaf49ceda5c47da5fa47cc6d70befedc63 100644 (file)
@@ -142,6 +142,7 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct pm8916_wdt *wdt;
        struct device *parent;
+       unsigned int val;
        int err, irq;
        u8 poff[2];
 
@@ -199,6 +200,15 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
        if (poff[1] & PON_POFF_REASON2_OTST3)
                wdt->wdev.bootstatus |= WDIOF_OVERHEAT;
 
+       err = regmap_read(wdt->regmap, wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL2,
+                         &val);
+       if (err)  {
+               dev_err(dev, "failed to check if watchdog is active: %d\n", err);
+               return err;
+       }
+       if (val & S2_RESET_EN_BIT)
+               set_bit(WDOG_HW_RUNNING, &wdt->wdev.status);
+
        /* Configure watchdog to hard-reset mode */
        err = regmap_write(wdt->regmap,
                           wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL,
This page took 0.051248 seconds and 4 git commands to generate.