+Rob and Frank

On Fri, Nov 6, 2020 at 7:09 AM Mark Brown <broo...@kernel.org> wrote:
>
> Currently the fwnode API and things that rely on it like fw_devlink will
> not reliably work for devices created from DT since each subsystem that
> creates devices must individually set dev->fwnode in addition to setting
> dev->of_node, currently a number of subsystems don't do so. Ensure that
> this can't get missed by setting fwnode from of_node if it's not
> previously been set by the subsystem.
>
> Reported-by: Saravana Kannan <sarava...@google.com>
> Signed-off-by: Mark Brown <broo...@kernel.org>
> ---
>
> *Very* minimally tested.
>
>  drivers/base/core.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/drivers/base/core.c b/drivers/base/core.c
> index d661ada1518f..658626bafd76 100644
> --- a/drivers/base/core.c
> +++ b/drivers/base/core.c
> @@ -2864,6 +2864,10 @@ int device_add(struct device *dev)
>         if (parent && (dev_to_node(dev) == NUMA_NO_NODE))
>                 set_dev_node(dev, dev_to_node(parent));
>
> +       /* ensure that fwnode is set up */
> +       if (IS_ENABLED(CONFIG_OF) && dev->of_node && !dev->fwnode)
> +               dev->fwnode = of_fwnode_handle(dev->of_node);
> +

I don't think we should add more CONFIG_OF specific code in drivers/base/

If you want to do this in "one common place", then I think the way to
do this is have include/linux/of.h provide something like:
void of_set_device_of_node(dev, of_node)
{
    dev->of_node = of_node;
    dev->fw_node = &of_node->fwnode;
   /* bunch of other housekeeping like setting OF_POPULATED and doing
proper of_node_get() */
   // Passing NULL for of_node could undo all the above for dev->of_node.
}

And all the subsystems that create their own device from an of_node
should use of_set_device_of_node() to set the device's of_node. That
way, all this is done in a consistent manner across subsystems and
avoid all of the of_get/put() and OF_POPULATED set/clear strewn all
over the subsystems.

For example a bunch of subsystems don't do of_get()/of_put() correctly
when they det a device's of_node (I sent patches as I found them).

-Saravana

Reply via email to