From: Sebastian Reichel sebastian.reichel@collabora.com
[ Upstream commit ac3dbb91e0167d017f44701dd51c1efe30d0c256 ]
The Synopsys Watchdog driver sets the default timeout to 30 seconds, but on some devices this is not a valid timeout. E.g. on RK3588 the actual timeout being used is 44 seconds instead.
Once the watchdog is started the value is updated accordingly, but it would be better to expose a sensible timeout to userspace without the need to first start the watchdog.
Signed-off-by: Sebastian Reichel sebastian.reichel@collabora.com Reviewed-by: Guenter Roeck linux@roeck-us.net Link: https://lore.kernel.org/r/20250717-dw-wdt-fix-initial-timeout-v1-1-86dc864d4... Signed-off-by: Guenter Roeck linux@roeck-us.net Signed-off-by: Wim Van Sebroeck wim@linux-watchdog.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
Based on my analysis of the commit, here's my assessment:
**Backport Status: YES**
## Extensive Explanation:
This commit is a clear bugfix that should be backported to stable kernel trees for the following reasons:
### 1. **It fixes a real user-visible bug** The commit addresses a problem where the watchdog driver exposes an incorrect timeout value (30 seconds) to userspace when that value is not actually valid for the hardware. On RK3588 specifically, the hardware uses 44 seconds instead of the requested 30 seconds, creating a discrepancy between what userspace sees and what the hardware actually does.
### 2. **The fix is minimal and contained** The change adds only two lines of code: ```c + /* Limit timeout value to hardware constraints. */ + dw_wdt_set_timeout(wdd, wdd->timeout); ``` This simply calls the existing `dw_wdt_set_timeout()` function during initialization to ensure the timeout value is properly validated and adjusted to hardware constraints before the watchdog is registered with the kernel.
### 3. **No architectural changes or new features** The commit doesn't introduce any new functionality or change the driver's architecture. It merely ensures that the existing timeout validation logic (which was already being called when the watchdog starts) is also applied during initialization.
### 4. **Low risk of regression** The `dw_wdt_set_timeout()` function is already being called in other code paths (when the watchdog is started, when timeout is changed). This commit just ensures it's also called during probe to validate the initial timeout. The function itself uses `dw_wdt_find_best_top()` to find a valid hardware timeout value that's closest to the requested value.
### 5. **Affects user-facing behavior** Without this fix, userspace applications that query the watchdog timeout before starting it will get an incorrect value (30 seconds) that doesn't match what the hardware will actually use (e.g., 44 seconds on RK3588). This could lead to incorrect assumptions about watchdog behavior in monitoring and recovery systems.
### 6. **The fix follows established patterns** The commit message notes "it would be better to expose a sensible timeout to userspace without the need to first start the watchdog" - this is a reasonable expectation that userspace should have accurate information about hardware settings without needing to activate the hardware first.
### 7. **Subsystem maintainer review** The commit has been reviewed by Guenter Roeck (the watchdog subsystem maintainer) and signed off by both subsystem maintainers, indicating it's a proper fix that they consider important.
The fix ensures that the watchdog timeout value exposed to userspace through sysfs and ioctl interfaces accurately reflects the hardware's actual timeout capability from the moment the driver is loaded, rather than showing an incorrect default value until the watchdog is started. This is particularly important for systems that need to make decisions based on watchdog capabilities before actually starting the watchdog timer.
drivers/watchdog/dw_wdt.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c index 26efca9ae0e7..c3fbb6068c52 100644 --- a/drivers/watchdog/dw_wdt.c +++ b/drivers/watchdog/dw_wdt.c @@ -644,6 +644,8 @@ static int dw_wdt_drv_probe(struct platform_device *pdev) } else { wdd->timeout = DW_WDT_DEFAULT_SECONDS; watchdog_init_timeout(wdd, 0, dev); + /* Limit timeout value to hardware constraints. */ + dw_wdt_set_timeout(wdd, wdd->timeout); }
platform_set_drvdata(pdev, dw_wdt);