]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
watchdog: sp805: Report correct timeleft at maximum
authorMike Crowe <mac@mcrowe.com>
Tue, 3 Dec 2024 09:57:44 +0000 (09:57 +0000)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Mon, 6 Jan 2025 18:37:50 +0000 (19:37 +0100)
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>
drivers/watchdog/sp805_wdt.c

index 109e2e37e8f09e6f8afd61375f52316664bc744d..4400c439c718436244ecc39a9982bf1ba642e849 100644 (file)
@@ -128,7 +128,7 @@ static unsigned int wdt_timeleft(struct watchdog_device *wdd)
 
        /*If the interrupt is inactive then time left is WDTValue + WDTLoad. */
        if (!(readl_relaxed(wdt->base + WDTRIS) & INT_MASK))
-               load += wdt->load_val + 1;
+               load += (u64)wdt->load_val + 1;
        spin_unlock(&wdt->lock);
 
        return div_u64(load, wdt->rate);