summaryrefslogtreecommitdiffstats
path: root/drivers/of/platform.c
diff options
context:
space:
mode:
authorKefeng Wang <wangkefeng.wang@huawei.com>2016-06-01 14:52:54 +0800
committerRob Herring <robh@kernel.org>2016-06-23 14:58:30 -0500
commit44a7185c2ae6383c88ff5b1ef2e2969f35d7b8b7 (patch)
tree7edab7e6a92c796868c28d2e1b489318ef68f4a4 /drivers/of/platform.c
parentbb8e15d60462a84a25a3bf33e8bc29b46c6d470a (diff)
downloadlinux-stable-44a7185c2ae6383c88ff5b1ef2e2969f35d7b8b7.tar.gz
linux-stable-44a7185c2ae6383c88ff5b1ef2e2969f35d7b8b7.tar.bz2
linux-stable-44a7185c2ae6383c88ff5b1ef2e2969f35d7b8b7.zip
of/platform: Add common method to populate default bus
The arch code calls of_platform_populate() with default match table when it wants to populate default bus. This patch introduce a new of_platform_default_populate_init() and make it arch_initcall_sync(it should be later than some iommu configration, eg, of_iommu_init() and swiotlb_late_init in arm64), then we can finish above job in common method. In order to avoid the default bus being populated twice, simply checking the flag of bus node whether has be set OF_POPULATED_BUS or not. After that, we can safely remove the caller in arch code. Btw, add debug print in of_platform_populate(), and use __func__ to print function's name of of_platform_bus_create(). Cc: Rob Herring <robh+dt@kernel.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: Grant Likely <grant.likely@linaro.org> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers/of/platform.c')
-rw-r--r--drivers/of/platform.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 16e8daffac06..c559ef81b07a 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -363,6 +363,12 @@ static int of_platform_bus_create(struct device_node *bus,
return 0;
}
+ if (of_node_check_flag(bus, OF_POPULATED_BUS)) {
+ pr_debug("%s() - skipping %s, already populated\n",
+ __func__, bus->full_name);
+ return 0;
+ }
+
auxdata = of_dev_lookup(lookup, bus);
if (auxdata) {
bus_id = auxdata->name;
@@ -414,7 +420,7 @@ int of_platform_bus_probe(struct device_node *root,
if (!root)
return -EINVAL;
- pr_debug("of_platform_bus_probe()\n");
+ pr_debug("%s()\n", __func__);
pr_debug(" starting at: %s\n", root->full_name);
/* Do a self check of bus type, if there's a match, create children */
@@ -466,6 +472,9 @@ int of_platform_populate(struct device_node *root,
if (!root)
return -EINVAL;
+ pr_debug("%s()\n", __func__);
+ pr_debug(" starting at: %s\n", root->full_name);
+
for_each_child_of_node(root, child) {
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc) {
@@ -489,6 +498,15 @@ int of_platform_default_populate(struct device_node *root,
}
EXPORT_SYMBOL_GPL(of_platform_default_populate);
+static int __init of_platform_default_populate_init(void)
+{
+ if (of_have_populated_dt())
+ of_platform_default_populate(NULL, NULL, NULL);
+
+ return 0;
+}
+arch_initcall_sync(of_platform_default_populate_init);
+
static int of_platform_device_destroy(struct device *dev, void *data)
{
/* Do not touch devices not populated from the device tree */