Aspeed watchdog uses counting down logic, so the value set to register should be the value of subtracting pretimeout from total timeout. Fixes: 9ec0b7e06835 ("watchdog: aspeed: Enable pre-timeout interrupt") Signed-off-by: Heyi Guo <guoheyi@xxxxxxxxxxxxxxxxx> Cc: Wim Van Sebroeck <wim@xxxxxxxxxxxxxxxxxx> Cc: Guenter Roeck <linux@xxxxxxxxxxxx> Cc: Joel Stanley <joel@xxxxxxxxx> Cc: Andrew Jeffery <andrew@xxxxxxxxxxxxxxxxxxxx> Cc: Eddie James <eajames@xxxxxxxxxxxxx> --- drivers/watchdog/aspeed_wdt.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/watchdog/aspeed_wdt.c b/drivers/watchdog/aspeed_wdt.c index b4773a6aaf8c..520d8aba12a5 100644 --- a/drivers/watchdog/aspeed_wdt.c +++ b/drivers/watchdog/aspeed_wdt.c @@ -187,6 +187,13 @@ static int aspeed_wdt_set_pretimeout(struct watchdog_device *wdd, u32 actual = pretimeout * WDT_RATE_1MHZ; u32 s = wdt->cfg->irq_shift; u32 m = wdt->cfg->irq_mask; + u32 reload = readl(wdt->base + WDT_RELOAD_VALUE); + + if (actual >= reload) + return -EINVAL; + + /* watchdog timer is counting down */ + actual = reload - actual; wdd->pretimeout = pretimeout; wdt->ctrl &= ~m; -- 2.43.0