mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
watchdog: sp805: set WDOG_HW_RUNNING when appropriate
If the watchdog hardware is already enabled during the boot process, when the Linux watchdog driver loads, it should reset the watchdog and tell the watchdog framework. As a result, ping can be generated from the watchdog framework, until the userspace watchdog daemon takes over control Signed-off-by: Ray Jui <ray.jui@broadcom.com> Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com> Reviewed-by: Scott Branden <scott.branden@broadcom.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
This commit is contained in:
parent
b800885888
commit
fa5072ed8f
@ -42,6 +42,7 @@
|
||||
/* control register masks */
|
||||
#define INT_ENABLE (1 << 0)
|
||||
#define RESET_ENABLE (1 << 1)
|
||||
#define ENABLE_MASK (INT_ENABLE | RESET_ENABLE)
|
||||
#define WDTINTCLR 0x00C
|
||||
#define WDTRIS 0x010
|
||||
#define WDTMIS 0x014
|
||||
@ -74,6 +75,15 @@ module_param(nowayout, bool, 0);
|
||||
MODULE_PARM_DESC(nowayout,
|
||||
"Set to 1 to keep watchdog running after device release");
|
||||
|
||||
/* returns true if wdt is running; otherwise returns false */
|
||||
static bool wdt_is_running(struct watchdog_device *wdd)
|
||||
{
|
||||
struct sp805_wdt *wdt = watchdog_get_drvdata(wdd);
|
||||
u32 wdtcontrol = readl_relaxed(wdt->base + WDTCONTROL);
|
||||
|
||||
return (wdtcontrol & ENABLE_MASK) == ENABLE_MASK;
|
||||
}
|
||||
|
||||
/* This routine finds load value that will reset system in required timout */
|
||||
static int wdt_setload(struct watchdog_device *wdd, unsigned int timeout)
|
||||
{
|
||||
@ -253,6 +263,15 @@ sp805_wdt_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
watchdog_init_timeout(&wdt->wdd, 0, &adev->dev);
|
||||
wdt_setload(&wdt->wdd, wdt->wdd.timeout);
|
||||
|
||||
/*
|
||||
* If HW is already running, enable/reset the wdt and set the running
|
||||
* bit to tell the wdt subsystem
|
||||
*/
|
||||
if (wdt_is_running(&wdt->wdd)) {
|
||||
wdt_enable(&wdt->wdd);
|
||||
set_bit(WDOG_HW_RUNNING, &wdt->wdd.status);
|
||||
}
|
||||
|
||||
ret = watchdog_register_device(&wdt->wdd);
|
||||
if (ret) {
|
||||
dev_err(&adev->dev, "watchdog_register_device() failed: %d\n",
|
||||
|
Loading…
Reference in New Issue
Block a user