Home Home > GIT Browse > openSUSE-15.0
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYadan Fan <ydfan@suse.com>2018-07-11 18:25:13 +0800
committerYadan Fan <ydfan@suse.com>2018-07-11 18:25:40 +0800
commitb19dc7439ea49292298ab0eefb499905e0bb6419 (patch)
tree68df8db28f4a720d42d7836cf8e567dae2cfffca
parent856c325c8752cd937061df20762decb1b5285728 (diff)
watchdog: da9063: Fix updating timeout value (bsc#1100843).
-rw-r--r--drivers/watchdog/da9063_wdt.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c
index 832ec8737647..f0b1430cb10c 100644
--- a/drivers/watchdog/da9063_wdt.c
+++ b/drivers/watchdog/da9063_wdt.c
@@ -129,10 +129,23 @@ static int da9063_wdt_set_timeout(struct watchdog_device *wdd,
{
struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd);
unsigned int selector;
- int ret;
+ int ret = 0;
selector = da9063_wdt_timeout_to_sel(timeout);
- ret = _da9063_wdt_set_timeout(wdt->da9063, selector);
+
+ /*
+ * There are two cases when a set_timeout() will be called:
+ * 1. The watchdog is off and someone wants to set the timeout for the
+ * further use.
+ * 2. The watchdog is already running and a new timeout value should be
+ * set.
+ *
+ * The watchdog can't store a timeout value not equal zero without
+ * enabling the watchdog, so the timeout must be buffered by the driver.
+ */
+ if (watchdog_active(wdd))
+ ret = _da9063_wdt_set_timeout(da9063, selector);
+
if (ret)
dev_err(wdt->da9063->dev, "Failed to set watchdog timeout (err = %d)\n",
ret);