Message ID | 20220627111432.2625168-4-stephan.gerhold@kernkonzept.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | watchdog: pm8916_wdt: Some minor improvements | expand |
On 6/27/22 04:14, Stephan Gerhold wrote: > 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> > --- > drivers/watchdog/pm8916_wdt.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c > index 3fc03fdae466..4ebd1d0cab85 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]; > > @@ -198,6 +199,11 @@ static int pm8916_wdt_probe(struct platform_device *pdev) > dev_err(dev, "failed to read POFF reason: %d\n", err); > } > > + err = regmap_read(wdt->regmap, wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL2, > + &val); > + if (err == 0 && val & S2_RESET_EN_BIT) > + set_bit(WDOG_HW_RUNNING, &wdt->wdev.status); > + If reading the status returns an error, I'd assume that something is seriously wrong. If it is ok to ignore such errors, explain why this is the case. Thanks, Guenter > /* Configure watchdog to hard-reset mode */ > err = regmap_write(wdt->regmap, > wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL,
diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c index 3fc03fdae466..4ebd1d0cab85 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]; @@ -198,6 +199,11 @@ static int pm8916_wdt_probe(struct platform_device *pdev) dev_err(dev, "failed to read POFF reason: %d\n", err); } + err = regmap_read(wdt->regmap, wdt->baseaddr + PON_PMIC_WD_RESET_S2_CTL2, + &val); + if (err == 0 && 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,
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> --- drivers/watchdog/pm8916_wdt.c | 6 ++++++ 1 file changed, 6 insertions(+)