Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / of / platform.c
index 16e8daf..765390e 100644 (file)
@@ -11,6 +11,9 @@
  *  2 of the License, or (at your option) any later version.
  *
  */
+
+#define pr_fmt(fmt)    "OF: " fmt
+
 #include <linux/errno.h>
 #include <linux/module.h>
 #include <linux/amba/bus.h>
@@ -31,7 +34,6 @@ const struct of_device_id of_default_bus_match_table[] = {
 #endif /* CONFIG_ARM_AMBA */
        {} /* Empty terminated list */
 };
-EXPORT_SYMBOL(of_default_bus_match_table);
 
 static int of_dev_node_match(struct device *dev, void *data)
 {
@@ -234,11 +236,8 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
                return NULL;
 
        dev = amba_device_alloc(NULL, 0, 0);
-       if (!dev) {
-               pr_err("%s(): amba_device_alloc() failed for %s\n",
-                      __func__, node->full_name);
+       if (!dev)
                goto err_clear_flag;
-       }
 
        /* setup generic device info */
        dev->dev.of_node = of_node_get(node);
@@ -261,15 +260,15 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
 
        ret = of_address_to_resource(node, 0, &dev->res);
        if (ret) {
-               pr_err("%s(): of_address_to_resource() failed (%d) for %s\n",
-                      __func__, ret, node->full_name);
+               pr_err("amba: of_address_to_resource() failed (%d) for %s\n",
+                      ret, node->full_name);
                goto err_free;
        }
 
        ret = amba_device_add(dev, &iomem_resource);
        if (ret) {
-               pr_err("%s(): amba_device_add() failed (%d) for %s\n",
-                      __func__, ret, node->full_name);
+               pr_err("amba_device_add() failed (%d) for %s\n",
+                      ret, node->full_name);
                goto err_free;
        }
 
@@ -363,6 +362,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 +419,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 +471,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 +497,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 */