Hi Stephen, On Wed, Jul 10, 2024 at 10:14 PM Stephen Boyd <sboyd@xxxxxxxxxx> wrote: > We'd like to apply overlays to the root node in KUnit so we can test > platform devices created as children of the root node. > > On some architectures (powerpc), the root node isn't marked with > OF_POPULATED_BUS. If an overlay tries to modify the root node on these > platforms it will fail, while on other platforms, such as ARM, it will > succeed. This is because the root node is marked with OF_POPULATED_BUS > by of_platform_default_populate_init() calling > of_platform_default_populate() with NULL as the first argument. > > Loosen the requirement here so that platform devices can be created for > nodes created as children of the root node via DT overlays even if the > platform bus wasn't populated for the root node. > > Reviewed-by: Rob Herring (Arm) <robh@xxxxxxxxxx> > Cc: Saravana Kannan <saravanak@xxxxxxxxxx> > Signed-off-by: Stephen Boyd <sboyd@xxxxxxxxxx> Thanks for your patch, which is now commit 98290f295fbcf18f ("of/platform: Allow overlays to create platform devices from the root node") in clk/clk-next. This causes i2c-demux-pinctrl to fail on the Koelsch development board: i2c-demux-pinctrl i2c-mux1: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux2: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux3: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux2: Failed to create device link (0x180) with e6ef0000.video i2c-demux-pinctrl i2c-mux2: Failed to create device link (0x180) with e6ef1000.video i2c-demux-pinctrl i2c-mux2: Failed to create device link (0x180) with hdmi-in i2c-demux-pinctrl i2c-mux2: Failed to create device link (0x180) with hdmi-out and anything relying on I2C connected to these muxes fails, too. Also, loading the 25LC040 DT overlay[1] on Ebisu using the out-of-tree of-configfs now fails, too. > --- a/drivers/of/platform.c > +++ b/drivers/of/platform.c > @@ -732,11 +732,14 @@ static int of_platform_notify(struct notifier_block *nb, > struct of_reconfig_data *rd = arg; > struct platform_device *pdev_parent, *pdev; > bool children_left; > + struct device_node *parent; > > switch (of_reconfig_get_state_change(action, rd)) { > case OF_RECONFIG_CHANGE_ADD: > - /* verify that the parent is a bus */ > - if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS)) > + parent = rd->dn->parent; > + /* verify that the parent is a bus (or the root node) */ > + if (!of_node_is_root(parent) && Parent = /soc, so this returns early. Hence of_changeset_apply() [2] didn't add the I2C mux bus, causing of_get_i2c_adapter_by_node() [3] to fail. > + of_node_check_flag(parent, OF_POPULATED_BUS)) Oh, you inverted the check for of_node_check_flag(); was that intentional? Re-adding the "!" fixes all issues for me. > return NOTIFY_OK; /* not for us */ > > /* already populated? (driver using of_populate manually) */ > @@ -749,7 +752,7 @@ static int of_platform_notify(struct notifier_block *nb, > */ > rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE; > /* pdev_parent may be NULL when no bus platform device */ > - pdev_parent = of_find_device_by_node(rd->dn->parent); > + pdev_parent = of_find_device_by_node(parent); > pdev = of_platform_device_create(rd->dn, NULL, > pdev_parent ? &pdev_parent->dev : NULL); > platform_device_put(pdev_parent); [1] https://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git/tree/arch/arm64/boot/dts/renesas/r8a77990-ebisu-cn41-msiof0-25lc040.dtso?h=topic/renesas-overlays [2] https://elixir.bootlin.com/linux/latest/source/drivers/i2c/muxes/i2c-demux-pinctrl.c#L60 [3] https://elixir.bootlin.com/linux/latest/source/drivers/i2c/muxes/i2c-demux-pinctrl.c#L64 Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds