Skip to content

Commit

Permalink
watchdog: rti_wdt: Fix calculation and evaluation of preset heartbeat
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jan Kiszka authored and Wim Van Sebroeck committed May 21, 2022
1 parent 95d0eee commit c83f643
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/watchdog/rti_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down

0 comments on commit c83f643

Please sign in to comment.