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@xxxxxxx> Reviewed-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > 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 >