lkml.org 
[lkml]   [2019]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH v2 1/1] watchdog: atmel: atmel-sama5d4-wdt: Disable watchdog on system suspend
    On 14/06/2019 12:53:22+0000, Ken Sloat wrote:
    > From: Ken Sloat <ksloat@aampglobal.com>
    >
    > 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@aampglobal.com>
    Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

    > ---
    > 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);
    > +
    > 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
    >

    --
    Alexandre Belloni, Bootlin
    Embedded Linux and Kernel engineering
    https://bootlin.com

    \
     
     \ /
      Last update: 2019-06-20 10:33    [W:4.361 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site