[PATCH] watchdog: take all OF aliases into account when assigning id
Rasmus Villemoes <[email protected]>
| Newsgroups | org.kernel.vger.linux-watchdog,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
If some, but not all, watchdog devices have device tree aliases, those without aliases might (depending on probe order) be assigned an id which would otherwise be assigned to one of those with an alias. This is problematic when for example watchdog0 is an alias for an always-running gpio watchdog that userspace must handle, but the SOC's watchdog device(s) get probed first and thus one of those become /dev/watchdog0. Ensure that ids for devices without a device tree alias are allocated from above the highest numbered alias, if any. Signed-off-by: Rasmus Villemoes <[email protected]> --- This is similar to how the mmc, i2c, i3c and spi subsystems handle device tree aliases and avoid using an id that might be assigned to a device/bus that is probed later. drivers/watchdog/watchdog_core.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 6152dba4b52c..80675f160e11 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -239,7 +239,7 @@ EXPORT_SYMBOL_GPL(watchdog_set_restart_priority); static int ___watchdog_register_device(struct watchdog_device *wdd) { - int ret, id = -1; + int ret, min_id, id = -1; if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL) return -EINVAL; @@ -264,8 +264,15 @@ static int ___watchdog_register_device(struct watchdog_device *wdd) GFP_KERNEL); } - if (id < 0) - id = ida_alloc_max(&watchdog_ida, MAX_DOGS - 1, GFP_KERNEL); + if (id < 0) { + ret = of_alias_get_highest_id("watchdog"); + if (ret >= 0) + min_id = ret + 1; + else + min_id = 0; + + id = ida_alloc_range(&watchdog_ida, min_id, MAX_DOGS - 1, GFP_KERNEL); + } if (id < 0) return id; -- 2.54.0