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: Grant Likely <[email protected]>
Cc: Rob Herring <[email protected]>
Cc: Pantelis Antoniou <[email protected]>
Cc: Pawel Moll <[email protected]>
---
 drivers/of/platform.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 770a8e0a14f2..69f6dff85d15 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -500,6 +500,7 @@ int of_platform_populate(struct device_node *root,
                if (rc)
                        break;
        }
+       of_node_set_flag(root, OF_POPULATED_BUS);
 
        of_node_put(root);
        return rc;
@@ -542,7 +543,10 @@ static int of_platform_device_destroy(struct device *dev, 
void *data)
  */
 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);
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to