[PATCH] watchdog: sunplus: fix sp_wdt_restart spin loop and timeout
Andrew Gaylard <[email protected]>
| Newsgroups | org.kernel.vger.linux-watchdog,org.infradead.lists.linux-arm-kernel |
|---|---|
| Message-ID | <[email protected]> |
sp_wdt_restart() returns immediately after writing WDT_RESUME. The kernel continues executing and the watchdog kthread could pet the watchdog before the short timeout expired, preventing reset. Add a spin loop so no other CPU can pet the watchdog while waiting for the reset. Set the restart timeout to ~1.5s. Signed-off-by: Andrew Gaylard <[email protected]> --- drivers/watchdog/sunplus_wdt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/watchdog/sunplus_wdt.c b/drivers/watchdog/sunplus_wdt.c index e5212f3d2e24..b44dcc307634 100644 --- a/drivers/watchdog/sunplus_wdt.c +++ b/drivers/watchdog/sunplus_wdt.c @@ -61,10 +61,16 @@ static int sp_wdt_restart(struct watchdog_device *wdev, writel(WDT_STOP, base + WDT_CTRL); writel(WDT_UNLOCK, base + WDT_CTRL); - writel(0x0001, base + WDT_CNT); + writel(0x20F5, base + WDT_CNT); /* ~1.5s at 90kHz */ writel(WDT_LOCK, base + WDT_CTRL); writel(WDT_RESUME, base + WDT_CTRL); + /* Spin until the watchdog resets us. This prevents any other CPU + * from petting the watchdog. + */ + while (1) + cpu_relax(); + return 0; } -- 2.53.0