Message ID | 20240718210513.3801024-2-sboyd@kernel.org |
---|---|
State | Accepted |
Commit | 814cff595d1ff6079fb4df2fd8ceeb0b6ad2d221 |
Headers | show |
Series | clk: Add kunit tests for fixed rate and parent data | expand |
Quoting Stephen Boyd (2024-07-18 14:05:00) > 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@kernel.org> > Cc: Saravana Kannan <saravanak@google.com> > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> > [sboyd@kernel.org: Folded in condition fix] > Signed-off-by: Stephen Boyd <sboyd@kernel.org> > --- Applied to clk-next
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 389d4ea6bfc1..86be4dfb9323 100644 --- 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) && + !of_node_check_flag(parent, OF_POPULATED_BUS)) 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);