watchdog: rti_wdt: Fix calculation and evaluation of preset heartbeat
authorJan Kiszka <jan.kiszka@siemens.com>
Mon, 21 Feb 2022 16:22:38 +0000 (17:22 +0100)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Sat, 21 May 2022 08:07:32 +0000 (10:07 +0200)
This ensures that the same value is read back as was eventually
programmed when using seconds as accuracy. Even then, comparing the more
precise heartbeat_ms against heartbeat in seconds will almost never
provide a match and will needlessly raise a warning. Fix by comparing
apples to apples.

Tested in combination with U-Boot as watchdog starter.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/6a4b54ac-9588-e172-c4c7-b91d524a851e@siemens.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/rti_wdt.c

index db843f8..35f3c39 100644 (file)
@@ -253,6 +253,7 @@ static int rti_wdt_probe(struct platform_device *pdev)
        }
 
        if (readl(wdt->base + RTIDWDCTRL) == WDENABLE_KEY) {
+               int preset_heartbeat;
                u32 time_left_ms;
                u64 heartbeat_ms;
                u32 wsize;
@@ -263,11 +264,12 @@ static int rti_wdt_probe(struct platform_device *pdev)
                heartbeat_ms <<= WDT_PRELOAD_SHIFT;
                heartbeat_ms *= 1000;
                do_div(heartbeat_ms, wdt->freq);
-               if (heartbeat_ms != heartbeat * 1000)
+               preset_heartbeat = heartbeat_ms + 500;
+               preset_heartbeat /= 1000;
+               if (preset_heartbeat != heartbeat)
                        dev_warn(dev, "watchdog already running, ignoring heartbeat config!\n");
 
-               heartbeat = heartbeat_ms;
-               heartbeat /= 1000;
+               heartbeat = preset_heartbeat;
 
                wsize = readl(wdt->base + RTIWWDSIZECTRL);
                ret = rti_wdt_setup_hw_hb(wdd, wsize);