mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
watchdog: take all OF aliases into account when assigning id
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, and then at some point later, the gpio watchdog device gets probed and becomes /dev/watchdog5. Ensure that ids for devices without a device tree alias are allocated from among those where no watchdogX alias exists. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Link: https://lore.kernel.org/r/20260714105356.2931450-1-linux@rasmusvillemoes.dk [groeck: Use scnprintf() instead of snprintf() to make gcc happy] Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
5e845fe634
commit
19ff50d05f
|
|
@ -240,7 +240,9 @@ 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;
|
||||
struct device_node *np;
|
||||
char alias[16];
|
||||
|
||||
if (wdd == NULL || wdd->info == NULL || wdd->ops == NULL)
|
||||
return -EINVAL;
|
||||
|
|
@ -265,8 +267,26 @@ 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);
|
||||
/*
|
||||
* Find an id which is not pre-assigned via a DT alias to some
|
||||
* other, possibly not yet probed, watchdog device.
|
||||
*/
|
||||
if (id < 0) {
|
||||
np = of_find_node_by_path("/aliases");
|
||||
|
||||
for (min_id = 0; ; min_id = id + 1) {
|
||||
id = ida_alloc_range(&watchdog_ida, min_id, MAX_DOGS - 1,
|
||||
GFP_KERNEL);
|
||||
if (!np || id < 0)
|
||||
break;
|
||||
|
||||
scnprintf(alias, sizeof(alias), "watchdog%d", id);
|
||||
if (!of_get_property(np, alias, NULL))
|
||||
break;
|
||||
ida_free(&watchdog_ida, id);
|
||||
}
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
if (id < 0)
|
||||
return id;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user