Commit 066951ca authored by Stephan Gerhold's avatar Stephan Gerhold Committed by Wim Van Sebroeck
Browse files

watchdog: pm8916_wdt: Handle watchdog enabled by bootloader



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: default avatarStephan Gerhold <stephan.gerhold@kernkonzept.com>
Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20220629084816.125515-4-stephan.gerhold@kernkonzept.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
parent e7c54a41
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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,