[PATCH] watchdog: bcm2835_wdt: Fix WDIOC_SETTIMEOUT handling
Guenter Roeck
linux at roeck-us.net
Mon Nov 13 06:31:12 PST 2023
On Sun, Nov 12, 2023 at 06:32:51PM +0100, Stefan Wahren wrote:
> Users report about the unexpected behavior for setting timeouts above
> 15 sec on Raspberry Pi. According to watchdog-api.rst the ioctl
> WDIOC_SETTIMEOUT shouldn't fail because of hardware limitations.
> But looking at the code shows that max_timeout based on the
> register value PM_WDOG_TIME_SET, which is the maximum.
>
> Since 664a39236e71 ("watchdog: Introduce hardware maximum heartbeat
> in watchdog core") the watchdog core is able to handle this problem.
>
> This fix has been tested with watchdog-test from selftests.
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217374
> Fixes: 664a39236e71 ("watchdog: Introduce hardware maximum heartbeat in watchdog core")
> Signed-off-by: Stefan Wahren <wahrenst at gmx.net>
Reviewed-by: Guenter Roeck <linux at roeck-us.net>
> ---
> drivers/watchdog/bcm2835_wdt.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
> index 7a855289ff5e..bb001c5d7f17 100644
> --- a/drivers/watchdog/bcm2835_wdt.c
> +++ b/drivers/watchdog/bcm2835_wdt.c
> @@ -42,6 +42,7 @@
>
> #define SECS_TO_WDOG_TICKS(x) ((x) << 16)
> #define WDOG_TICKS_TO_SECS(x) ((x) >> 16)
> +#define WDOG_TICKS_TO_MSECS(x) ((x) * 1000 >> 16)
>
> struct bcm2835_wdt {
> void __iomem *base;
> @@ -140,7 +141,7 @@ static struct watchdog_device bcm2835_wdt_wdd = {
> .info = &bcm2835_wdt_info,
> .ops = &bcm2835_wdt_ops,
> .min_timeout = 1,
> - .max_timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET),
> + .max_hw_heartbeat_ms = WDOG_TICKS_TO_MSECS(PM_WDOG_TIME_SET),
> .timeout = WDOG_TICKS_TO_SECS(PM_WDOG_TIME_SET),
> };
>
> --
> 2.34.1
>
More information about the linux-arm-kernel
mailing list