summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crowe <mac@mcrowe.com>2024-12-03 12:57:44 +0300
committerWim Van Sebroeck <wim@linux-watchdog.org>2025-01-06 21:37:50 +0300
commit3322d53fdab8eedf01a9bca45dbf010566922e3c (patch)
treeab675d9f1f181fbac83aca34c6372988999e29d0
parent6a569e299f2be13e5e0f487930455b55a9cb4874 (diff)
downloadlinux-3322d53fdab8eedf01a9bca45dbf010566922e3c.tar.xz
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>
-rw-r--r--drivers/watchdog/sp805_wdt.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c
index 109e2e37e8f0..4400c439c718 100644
--- a/drivers/watchdog/sp805_wdt.c
+++ b/drivers/watchdog/sp805_wdt.c
@@ -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);