提交 2d0747c4 编写于 作者: G Grant Likely

of: Properly set the OF_POPULATED_BUS flag on root node

of_platform_populate() takes a subset of the device tree and turns it
into a set of platform_devices. At the same time it sets the
OF_POPULATED_BUS flag in each bus nodes so that of_platform_depopulate()
can undo the operation at a later time. However, it doesn't set the flag
on the root of the population tree which means that dynamic modifications
of the device tree at runtime will not create/destroy devices correctly.

Fix of_platform_populate() to set the OF_POPULATED_BUS flag on the node
it is called with.
Signed-off-by: NGrant Likely <grant.likely@linaro.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Cc: Pawel Moll <pawel.moll@arm.com>
上级 08d53aa5
...@@ -500,6 +500,7 @@ int of_platform_populate(struct device_node *root, ...@@ -500,6 +500,7 @@ int of_platform_populate(struct device_node *root,
if (rc) if (rc)
break; break;
} }
of_node_set_flag(root, OF_POPULATED_BUS);
of_node_put(root); of_node_put(root);
return rc; return rc;
...@@ -542,7 +543,10 @@ static int of_platform_device_destroy(struct device *dev, void *data) ...@@ -542,7 +543,10 @@ static int of_platform_device_destroy(struct device *dev, void *data)
*/ */
void of_platform_depopulate(struct device *parent) void of_platform_depopulate(struct device *parent)
{ {
device_for_each_child(parent, NULL, of_platform_device_destroy); if (parent->of_node && of_node_check_flag(parent->of_node, OF_POPULATED_BUS)) {
device_for_each_child(parent, NULL, of_platform_device_destroy);
of_node_clear_flag(parent->of_node, OF_POPULATED_BUS);
}
} }
EXPORT_SYMBOL_GPL(of_platform_depopulate); EXPORT_SYMBOL_GPL(of_platform_depopulate);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册