Browse Source

watchdog: dw: save/restore control and timeout across suspend/resume

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>
Brian Norris 7 years ago
parent
commit
8c088370c2
1 changed files with 9 additions and 0 deletions
  1. 9 0
      drivers/watchdog/dw_wdt.c

+ 9 - 0
drivers/watchdog/dw_wdt.c

@@ -57,6 +57,9 @@ struct dw_wdt {
 	unsigned long		rate;
 	unsigned long		rate;
 	struct watchdog_device	wdd;
 	struct watchdog_device	wdd;
 	struct reset_control	*rst;
 	struct reset_control	*rst;
+	/* Save/restore */
+	u32			control;
+	u32			timeout;
 };
 };
 
 
 #define to_dw_wdt(wdd)	container_of(wdd, struct dw_wdt, wdd)
 #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);
 	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);
 	clk_disable_unprepare(dw_wdt->clk);
 
 
 	return 0;
 	return 0;
@@ -218,6 +224,9 @@ static int dw_wdt_resume(struct device *dev)
 	if (err)
 	if (err)
 		return 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);
 	dw_wdt_ping(&dw_wdt->wdd);
 
 
 	return 0;
 	return 0;