On 29.11.23 10:12, Sascha Hauer wrote: > On Mon, Nov 27, 2023 at 07:35:54AM +0100, Ahmad Fatoum wrote: >> of_device_create_on_demand won't create a new device if the device tree >> node already has a device associated. What it will do however, is to >> create devices for all parent nodes in the device tree if they don't >> already exist. This is unnecessary and clutters the device list >> with nodes that won't ever be matched as they lack a compatible anyway. >> For example a reference to scmi_reg11 in below snippet: >> >> &{scmi/protocol@17} { >> reg = <0x17>; >> regulators { >> #address-cells = <0x1>; >> #size-cells = <0x0>; >> scmi_reg11: regulator@0 { >> reg = <0x0>; >> regulator-name = "reg11"; >> }; >> }; >> }; >> >> will result in creation of a device for the regulators node that serves >> no purpose whatsoever: >> >> `-- firmware.of >> `-- firmware:scmi.of >> `-- scmi_dev0 >> `-- firmware:scmi:protocol@17:regulators.of >> >> Avoid this by creating devices on demand only if they have a compatible. > > How will this change affect the device hierarchy? When a parent device > node doesn't have a compatible, will the child device then be a child > of its grandparent, or will it just have no parent at all? It will have the platform bus as parent. I am not sure how this can happen in a working setup. If the parent has no compatible, that means that the grandparent needs to populate it by driver. Grandparent device is created first, so only case it wouldn't match is if driver is missing in which case, it's game over anyway. Cheers, Ahmad > > Sascha > >> >> Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> >> --- >> drivers/of/platform.c | 8 +++++--- >> 1 file changed, 5 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/of/platform.c b/drivers/of/platform.c >> index 9e592d567cae..9ba4438812c1 100644 >> --- a/drivers/of/platform.c >> +++ b/drivers/of/platform.c >> @@ -442,9 +442,6 @@ static struct device *of_device_create_on_demand(struct device_node *np) >> if (!np->dev && parent->dev) >> device_rescan(parent->dev); >> >> - if (!np->dev) >> - pr_debug("Creating device for %pOF\n", np); >> - >> /* Create all parent devices needed for the requested device */ >> parent_dev = parent->dev ? : of_device_create_on_demand(parent); >> if (IS_ERR(parent_dev)) >> @@ -458,6 +455,11 @@ static struct device *of_device_create_on_demand(struct device_node *np) >> if (np->dev) >> return np->dev; >> >> + if (!of_property_present(np, "compatible")) >> + return NULL; >> + >> + pr_debug("Creating device for %pOF\n", np); >> + >> if (of_device_is_compatible(np, "arm,primecell")) >> dev = of_amba_device_create(np); >> else >> -- >> 2.39.2 >> >> >> > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |