Re: [PATCH v6 02/27] of: dynamic: Fix overlayed devices not probing because of fw_devlink

From: Doug Anderson

Date: Wed Apr 22 2026 - 15:02:53 EST


Hi,

On Wed, Apr 22, 2026 at 10:44 AM Geert Uytterhoeven
<geert@xxxxxxxxxxxxxx> wrote:
>
> Hi Hervé,
>
> CC Douglas
>
> On Wed, 25 Mar 2026 at 15:36, 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]
> > [Herve: Add the call to driver_deferred_probe_trigger()]
> > Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
> > Tested-by: Kalle Niemi <kaleposti@xxxxxxxxx>
> > 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)
>
> After commit f72e77c33e4b5657 ("device property: Make modifications
> of fwnode "flags" thread safe"), this must be changed to:
>
> if (fwnode_test_flag(fwnode, FWNODE_FLAG_NOT_DEVICE))
>
> With this change my DT overlays are working again.
>
> I guess keeping the FWNODE_FLAG_* names, but changing their values
> from bit masks to bit numbers was probably not such a good idea,
> as it fails to catch missing conversions...

Crud, I should have thought about that. :( Do you think it's worth it
to do a rename at this point to catch future problems?

-Doug