Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

watchdog: sp805: Report correct timeleft at maximum

sp805_wdt::load_val is of type unsigned int. When the interrupt is
inactive wdt_timeleft adds one to the value, and then adds that to the
value used to calculate the time remaining. Unfortunately it's not
unlikely that load_val contains LOAD_MAX, which is 0xFFFFFFFF and wraps
to zero when one is added to it, resulting in the time left being
understated by about 21.7s. Fix this by ensuring the addition happens as
64-bit.

Signed-off-by: Mike Crowe <mac@mcrowe.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20241203095744.3001795-1-mac@mcrowe.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>

authored by

Mike Crowe and committed by
Wim Van Sebroeck
3322d53f 6a569e29

+1 -1
+1 -1
drivers/watchdog/sp805_wdt.c
··· 128 128 129 129 /*If the interrupt is inactive then time left is WDTValue + WDTLoad. */ 130 130 if (!(readl_relaxed(wdt->base + WDTRIS) & INT_MASK)) 131 - load += wdt->load_val + 1; 131 + load += (u64)wdt->load_val + 1; 132 132 spin_unlock(&wdt->lock); 133 133 134 134 return div_u64(load, wdt->rate);