aboutsummaryrefslogtreecommitdiff
path: root/drivers/watchdog
diff options
context:
space:
mode:
authorGravatar Stephan Gerhold <stephan.gerhold@kernkonzept.com> 2022-06-29 10:48:16 +0200
committerGravatar Wim Van Sebroeck <wim@linux-watchdog.org> 2022-07-23 14:21:28 +0200
commit066951ca33ced33f84a725214494df2ee8ad49bd (patch)
tree66a47e79aa646a9dc4878721c1486e14892da10e /drivers/watchdog
parentwatchdog: pm8916_wdt: Report reboot reason (diff)
downloadlinux-066951ca33ced33f84a725214494df2ee8ad49bd.tar.gz
linux-066951ca33ced33f84a725214494df2ee8ad49bd.tar.bz2
linux-066951ca33ced33f84a725214494df2ee8ad49bd.zip
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: Stephan Gerhold <stephan.gerhold@kernkonzept.com> Reviewed-by: Loic Poulain <loic.poulain@linaro.org> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Link: https://lore.kernel.org/r/20220629084816.125515-4-stephan.gerhold@kernkonzept.com Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Diffstat (limited to 'drivers/watchdog')
-rw-r--r--drivers/watchdog/pm8916_wdt.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
index 49f1a5204526..f4bfbffaf49c 100644
--- a/drivers/watchdog/pm8916_wdt.c
+++ b/drivers/watchdog/pm8916_wdt.c
@@ -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,