mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
watchdog: arm_smc_wdt: get wdt status through SMCWD_GET_TIMELEFT
The optional SMCWD_GET_TIMELEFT command can be used to detect if the watchdog has already been started. See the implementation in OP-TEE secure OS [1]. At probe time, check if the watchdog is already started and then set WDOG_HW_RUNNING in the watchdog status. This will cause the watchdog framework to ping the watchdog until a userspace watchdog daemon takes over the control. Link: https://github.com/OP-TEE/optee_os/commit/a7f2d4bd8632 [1] Signed-off-by: Antonio Borneo <antonio.borneo@foss.st.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Link: https://lore.kernel.org/r/20250520085952.210723-1-antonio.borneo@foss.st.com Signed-off-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
This commit is contained in:
committed by
Wim Van Sebroeck
parent
27a46a0f08
commit
cc0df5eba1
@@ -46,6 +46,8 @@ static int smcwd_call(struct watchdog_device *wdd, enum smcwd_call call,
|
||||
return -ENODEV;
|
||||
if (res->a0 == PSCI_RET_INVALID_PARAMS)
|
||||
return -EINVAL;
|
||||
if (res->a0 == PSCI_RET_DISABLED)
|
||||
return -ENODATA;
|
||||
if (res->a0 != PSCI_RET_SUCCESS)
|
||||
return -EIO;
|
||||
return 0;
|
||||
@@ -131,10 +133,19 @@ static int smcwd_probe(struct platform_device *pdev)
|
||||
|
||||
wdd->info = &smcwd_info;
|
||||
/* get_timeleft is optional */
|
||||
if (smcwd_call(wdd, SMCWD_GET_TIMELEFT, 0, NULL))
|
||||
wdd->ops = &smcwd_ops;
|
||||
else
|
||||
err = smcwd_call(wdd, SMCWD_GET_TIMELEFT, 0, NULL);
|
||||
switch (err) {
|
||||
case 0:
|
||||
set_bit(WDOG_HW_RUNNING, &wdd->status);
|
||||
fallthrough;
|
||||
case -ENODATA:
|
||||
wdd->ops = &smcwd_timeleft_ops;
|
||||
break;
|
||||
default:
|
||||
wdd->ops = &smcwd_ops;
|
||||
break;
|
||||
}
|
||||
|
||||
wdd->timeout = res.a2;
|
||||
wdd->max_timeout = res.a2;
|
||||
wdd->min_timeout = res.a1;
|
||||
|
||||
Reference in New Issue
Block a user