Re: [PATCH v5 03/28] of: dynamic: Fix overlayed devices not probing because of fw_devlink
From: Geert Uytterhoeven
Date: Fri Feb 27 2026 - 11:58:04 EST
Hi Hervé,
On Fri, 27 Feb 2026 at 14:56, Herve Codina <herve.codina@xxxxxxxxxxx> wrote:
> From: Saravana Kannan <saravanak@xxxxxxxxxx>
>
> When an overlay is applied, if the target device has already probed
> successfully and bound to a device, then some of the fw_devlink logic
> that ran when the device was probed needs to be rerun. This allows newly
> created dangling consumers of the overlayed device tree nodes to be
> moved to become consumers of the target device.
>
> Fixes: 1a50d9403fb9 ("treewide: Fix probing of devices in DT overlays")
> Reported-by: Herve Codina <herve.codina@xxxxxxxxxxx>
> Closes: https://lore.kernel.org/lkml/CAMuHMdXEnSD4rRJ-o90x4OprUacN_rJgyo8x6=9F9rZ+-KzjOg@xxxxxxxxxxxxxx/
> Closes: https://lore.kernel.org/all/20240221095137.616d2aaa@xxxxxxxxxxx/
> Closes: https://lore.kernel.org/lkml/20240312151835.29ef62a0@xxxxxxxxxxx/
> Signed-off-by: Saravana Kannan <saravanak@xxxxxxxxxx>
> Link: https://lore.kernel.org/lkml/20240411235623.1260061-3-saravanak@xxxxxxxxxx/
> [Herve: Rebase on top of recent kernel and use get_device_from_fwnode()]
> [Herve: Add the call to driver_deferred_probe_trigger()]
Thanks, that last change did the trick, finally!
> Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
Tested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -235,6 +235,79 @@ static void __fw_devlink_pickup_dangling_consumers(struct fwnode_handle *fwnode,
> __fw_devlink_pickup_dangling_consumers(child, new_sup);
> }
>
> +static void fw_devlink_pickup_dangling_consumers(struct device *dev)
> +{
> + struct fwnode_handle *child;
> +
> + guard(mutex)(&fwnode_link_lock);
> +
> + fwnode_for_each_available_child_node(dev->fwnode, child)
> + __fw_devlink_pickup_dangling_consumers(child, dev->fwnode);
> + __fw_devlink_link_to_consumers(dev);
> +}
> +
> +/**
> + * fw_devlink_refresh_fwnode - Recheck the tree under this firmware node
> + * @fwnode: The fwnode under which the fwnode tree has changed
> + *
> + * This function is mainly meant to adjust the supplier/consumer dependencies
> + * after a fwnode tree overlay has occurred.
> + */
> +void fw_devlink_refresh_fwnode(struct fwnode_handle *fwnode)
> +{
> + struct device *dev;
> +
> + /*
> + * Find the closest ancestor fwnode that has been converted to a device
> + * that can bind to a driver (bus device).
> + */
> + fwnode_handle_get(fwnode);
> + do {
> + if (fwnode->flags & FWNODE_FLAG_NOT_DEVICE)
> + continue;
> +
> + dev = get_device_from_fwnode(fwnode);
> + if (!dev)
> + continue;
> +
> + if (dev->bus)
> + break;
> +
> + put_device(dev);
> + } while ((fwnode = fwnode_get_next_parent(fwnode)));
> +
> + /*
> + * If none of the ancestor fwnodes have (yet) been converted to a device
> + * that can bind to a driver, there's nothing to fix up.
> + */
> + if (!fwnode)
> + return;
> +
> + WARN(device_is_bound(dev) && dev->links.status != DL_DEV_DRIVER_BOUND,
> + "Don't multithread overlaying and probing the same device!\n");
> +
> + /*
> + * If the device has already bound to a driver, then we need to redo
> + * some of the work that was done after the device was bound to a
> + * driver. If the device hasn't bound to a driver, running thing too
things
> + * soon would incorrectly pick up consumers that it shouldn't.
> + */
> + if (dev->links.status == DL_DEV_DRIVER_BOUND) {
> + fw_devlink_pickup_dangling_consumers(dev);
> + /*
> + * Some of dangling consumers could have been put previously in
> + * the deferred probe list due to the unavailability of their
> + * suppliers. Those consumers have been picked up and some of
> + * their suppliers links have been update. Time to re-try their
updated
> + * probe sequence.
> + */
> + driver_deferred_probe_trigger();
> + }
> +
> + put_device(dev);
> + fwnode_handle_put(fwnode);
> +}
> +
> static DEFINE_MUTEX(device_links_lock);
> DEFINE_STATIC_SRCU(device_links_srcu);
>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds