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



Reply via email to