Skip to content
Snippets Groups Projects
Commit be9e9c2a authored by Marco Felsch's avatar Marco Felsch Committed by Wim Van Sebroeck
Browse files

watchdog: da9063: Fix timeout handling during probe


The watchdog can be enabled in previous steps (e.g. the bootloader). Set
the driver default timeout value (8s) if the watchdog is already running
and the HW_RUNNING flag. So the watchdog core framework will ping the
watchdog till the user space activates the watchdog explicit with the
desired timeout value.

Fixes: 5e9c16e3 ("watchdog: Add DA9063 PMIC watchdog driver.")
Signed-off-by: default avatarMarco Felsch <m.felsch@pengutronix.de>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
parent 44ee54aa
No related branches found
No related tags found
No related merge requests found
...@@ -45,6 +45,18 @@ static unsigned int da9063_wdt_timeout_to_sel(unsigned int secs) ...@@ -45,6 +45,18 @@ static unsigned int da9063_wdt_timeout_to_sel(unsigned int secs)
return DA9063_TWDSCALE_MAX; return DA9063_TWDSCALE_MAX;
} }
/*
* Return 0 if watchdog is disabled, else non zero.
*/
static unsigned int da9063_wdt_is_running(struct da9063 *da9063)
{
unsigned int val;
regmap_read(da9063->regmap, DA9063_REG_CONTROL_D, &val);
return val & DA9063_TWDSCALE_MASK;
}
static int da9063_wdt_disable_timer(struct da9063 *da9063) static int da9063_wdt_disable_timer(struct da9063 *da9063)
{ {
return regmap_update_bits(da9063->regmap, DA9063_REG_CONTROL_D, return regmap_update_bits(da9063->regmap, DA9063_REG_CONTROL_D,
...@@ -206,6 +218,15 @@ static int da9063_wdt_probe(struct platform_device *pdev) ...@@ -206,6 +218,15 @@ static int da9063_wdt_probe(struct platform_device *pdev)
watchdog_set_drvdata(wdd, da9063); watchdog_set_drvdata(wdd, da9063);
/* Change the timeout to the default value if the watchdog is running */
if (da9063_wdt_is_running(da9063)) {
unsigned int timeout;
timeout = da9063_wdt_timeout_to_sel(DA9063_WDG_TIMEOUT);
_da9063_wdt_set_timeout(da9063, timeout);
set_bit(WDOG_HW_RUNNING, &wdd->status);
}
return devm_watchdog_register_device(&pdev->dev, wdd); return devm_watchdog_register_device(&pdev->dev, wdd);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment