OSDN Git Service

watchdog: dw: save/restore control and timeout across suspend/resume
authorBrian Norris <briannorris@chromium.org>
Sat, 10 Mar 2018 03:46:07 +0000 (19:46 -0800)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Tue, 13 Mar 2018 18:14:19 +0000 (19:14 +0100)
Some platforms lose this state in suspend. It should be safe to do this
unconditionally.

Signed-off-by: Brian Norris <briannorris@chromium.org>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/dw_wdt.c

index 918357b..501aebb 100644 (file)
@@ -57,6 +57,9 @@ struct dw_wdt {
        unsigned long           rate;
        struct watchdog_device  wdd;
        struct reset_control    *rst;
+       /* Save/restore */
+       u32                     control;
+       u32                     timeout;
 };
 
 #define to_dw_wdt(wdd) container_of(wdd, struct dw_wdt, wdd)
@@ -205,6 +208,9 @@ static int dw_wdt_suspend(struct device *dev)
 {
        struct dw_wdt *dw_wdt = dev_get_drvdata(dev);
 
+       dw_wdt->control = readl(dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
+       dw_wdt->timeout = readl(dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
+
        clk_disable_unprepare(dw_wdt->clk);
 
        return 0;
@@ -218,6 +224,9 @@ static int dw_wdt_resume(struct device *dev)
        if (err)
                return err;
 
+       writel(dw_wdt->timeout, dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
+       writel(dw_wdt->control, dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
+
        dw_wdt_ping(&dw_wdt->wdd);
 
        return 0;