On Mon, Jul 06, 2026 at 02:54:09PM +0200, Bartosz Golaszewski wrote: > Software nodes can be used to describe supplier-consumer relationships > between devices they represent using reference property entries. Unlike > for OF-nodes, driver core cannot yet use these references to create a > probe order that avoids needless probe deferrals on missing providers. > > Implement software_node_add_links() modelled on of_fwnode_add_links(). > For every DEV_PROP_REF property we resolve each referenced supplier and > create an fwnode link from the node to it. The driver core later promotes > these to device links and defers the consumer until the suppliers are > ready. > > There's no allowlist like the one DT needs - devicetree phandles appear > in plenty of non-supplier contexts, but a software node only carries a > reference property when its author explicitly points at another node, so > we treat every reference as an intentional supplier dependency and link > all of them. Graph "remote-endpoint" references are skipped for now: they > go 2-ways between endpoint nodes and would create graph cycles without > the port-parent lifting DT does via get_con_dev(). References to > suppliers that aren't registered yet and self-references are ignored. > > fw_devlink resolves the supplier device through fwnode->dev but the core > only records the owning device on the primary fwnode. When the software > node is a device's secondary fwnode, mirror the device pointer onto it in > software_node_notify() so the consumer can actually find the supplier > instead of deferring forever. > > While at it: purge the fwnode links in software_node_release() now that > software nodes can own them.
... > + /* > + * When the software node is the device's secondary firmware node, > + * the core only records the owning device on the primary fwnode > + * (see device_add()). fw_devlink resolves a supplier device through > + * fwnode->dev, so without this a consumer referencing the software > + * node could never find the supplier device and would defer forever. > + * Make fwnode.dev point to its owner in that case. > + */ > + if (dev_fwnode(dev) != &swnode->fwnode && !swnode->fwnode.dev) Can we use device_match_fwnode() here? > + swnode->fwnode.dev = dev; > + ... > + /* > + * Drop the device pointer mirrored onto a secondary software node in > + * software_node_notify(). For a primary software node the core owns > + * fwnode->dev and clears it in device_del(). > + */ > + if (dev_fwnode(dev) != &swnode->fwnode && swnode->fwnode.dev == dev) > + swnode->fwnode.dev = NULL; Ditto. Note, it does check passed fwnode pointer against NULL, but looking at the above &swnode->fwnode must never be NULL, so basically device_match_node() will be an equivalent replacement. -- With Best Regards, Andy Shevchenko

