> -----Original Message----- > From: Guenter Roeck <groeck7@xxxxxxxxx> On Behalf Of Guenter Roeck > Sent: Friday, June 14, 2019 12:46 PM > To: Ken Sloat <KSloat@xxxxxxxxxxxxxx> > Cc: nicolas.ferre@xxxxxxxxxxxxx; alexandre.belloni@xxxxxxxxxxx; > ludovic.desroches@xxxxxxxxxxxxx; wim@xxxxxxxxxxxxxxxxxx; linux-arm- > kernel@xxxxxxxxxxxxxxxxxxx; linux-watchdog@xxxxxxxxxxxxxxx; linux- > kernel@xxxxxxxxxxxxxxx > Subject: Re: [PATCH v2 1/1] watchdog: atmel: atmel-sama5d4-wdt: Disable > watchdog on system suspend > > [This is an EXTERNAL EMAIL] > ________________________________ > > On Fri, Jun 14, 2019 at 12:53:22PM +0000, Ken Sloat wrote: > > From: Ken Sloat <ksloat@xxxxxxxxxxxxxx> > > > > Currently, the atmel-sama5d4-wdt continues to run after system suspend. > > Unless the system resumes within the watchdog timeout period so the > > userspace can kick it, the system will be reset. This change disables > > the watchdog on suspend if it is active and re-enables on resume. > > These actions occur during the late and early phases of suspend and > > resume respectively to minimize chances where a lock could occur while > > the watchdog is disabled. > > > > Signed-off-by: Ken Sloat <ksloat@xxxxxxxxxxxxxx> > > --- > > Changes in v2: > > -Consolidate resume and resume early statements. > > > > drivers/watchdog/sama5d4_wdt.c | 21 ++++++++++++++++++--- > > 1 file changed, 18 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/watchdog/sama5d4_wdt.c > > b/drivers/watchdog/sama5d4_wdt.c index 111695223aae..0d123f8cbcc6 > > 100644 > > --- a/drivers/watchdog/sama5d4_wdt.c > > +++ b/drivers/watchdog/sama5d4_wdt.c > > @@ -280,7 +280,17 @@ static const struct of_device_id > > sama5d4_wdt_of_match[] = { MODULE_DEVICE_TABLE(of, > > sama5d4_wdt_of_match); > > > > #ifdef CONFIG_PM_SLEEP > > -static int sama5d4_wdt_resume(struct device *dev) > > +static int sama5d4_wdt_suspend_late(struct device *dev) { > > + struct sama5d4_wdt *wdt = dev_get_drvdata(dev); > > + > > + if (watchdog_active(&wdt->wdd)) > > + sama5d4_wdt_stop(&wdt->wdd); > > + > > + return 0; > > +} > > + > > +static int sama5d4_wdt_resume_early(struct device *dev) > > { > > struct sama5d4_wdt *wdt = dev_get_drvdata(dev); > > > > @@ -291,12 +301,17 @@ static int sama5d4_wdt_resume(struct device > *dev) > > */ > > sama5d4_wdt_init(wdt); > > > > + if (watchdog_active(&wdt->wdd)) > > + sama5d4_wdt_start(&wdt->wdd); > > + > > The call to sama5d4_wdt_init() above now explicitly stops the watchdog > even if we want to (re)start it. I think this would be better handled with an > else case here > > else > sama5d4_wdt_stop(&wdt->wdd); > So we completely remove the sama5d4_wdt_init() call then correct? To leave the code as it behaves today with the addition of wdt stop/start, shouldn't we call init in the else instead? if (watchdog_active(&wdt->wdd)) sama5d4_wdt_start(&wdt->wdd); else sama5d4_wdt_init(); I guess I don't really understand the purpose of having the init statement in resume in the first place. I agree, calling this first does end up essentially resetting the wdt it will start again if it was running before, but the count will be reset. > Guenter > > > return 0; > > } > > #endif > > > > -static SIMPLE_DEV_PM_OPS(sama5d4_wdt_pm_ops, NULL, > > - sama5d4_wdt_resume); > > +static const struct dev_pm_ops sama5d4_wdt_pm_ops = { > > + SET_LATE_SYSTEM_SLEEP_PM_OPS(sama5d4_wdt_suspend_late, > > + sama5d4_wdt_resume_early) }; > > > > static struct platform_driver sama5d4_wdt_driver = { > > .probe = sama5d4_wdt_probe, > > -- > > 2.17.1 > > Thanks, Ken Sloat