summaryrefslogtreecommitdiff |
diff options
author | Yadan Fan <ydfan@suse.com> | 2018-07-11 18:25:13 +0800 |
---|---|---|
committer | Yadan Fan <ydfan@suse.com> | 2018-07-11 18:25:40 +0800 |
commit | 856c325c8752cd937061df20762decb1b5285728 (patch) | |
tree | 7a84c7ee2205f730efe28861e5f10ff859367a58 | |
parent | 9ee2c505d843da307593a631db43b4a3803bb9db (diff) |
watchdog: da9063: Fix setting/changing timeout (bsc#1100843).
suse-commit: 6ecb5e5c9fa7b129e88af277851d6eab6c911305
-rw-r--r-- | drivers/watchdog/da9063_wdt.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c index 4691c5509129..832ec8737647 100644 --- a/drivers/watchdog/da9063_wdt.c +++ b/drivers/watchdog/da9063_wdt.c @@ -53,8 +53,31 @@ static unsigned int da9063_wdt_timeout_to_sel(unsigned int secs) return DA9063_TWDSCALE_MAX; } +static int da9063_wdt_disable_timer(struct da9063 *da9063) +{ + return regmap_update_bits(da9063->regmap, DA9063_REG_CONTROL_D, + DA9063_TWDSCALE_MASK, + DA9063_TWDSCALE_DISABLE); +} + static int _da9063_wdt_set_timeout(struct da9063 *da9063, unsigned int regval) { + int ret; + + /* + * The watchdog triggers a reboot if a timeout value is already + * programmed because the timeout value combines two functions + * in one: indicating the counter limit and starting the watchdog. + * The watchdog must be disabled to be able to change the timeout + * value if the watchdog is already running. Then we can set the + * new timeout value which enables the watchdog again. + */ + ret = da9063_wdt_disable_timer(da9063); + if (ret) + return ret; + + usleep_range(150, 300); + return regmap_update_bits(da9063->regmap, DA9063_REG_CONTROL_D, DA9063_TWDSCALE_MASK, regval); } @@ -79,8 +102,7 @@ static int da9063_wdt_stop(struct watchdog_device *wdd) struct da9063_watchdog *wdt = watchdog_get_drvdata(wdd); int ret; - ret = regmap_update_bits(wdt->da9063->regmap, DA9063_REG_CONTROL_D, - DA9063_TWDSCALE_MASK, DA9063_TWDSCALE_DISABLE); + ret = da9063_wdt_disable_timer(da9063); if (ret) dev_alert(wdt->da9063->dev, "Watchdog failed to stop (err = %d)\n", ret); |