diff options
Diffstat (limited to 'drivers/of/platform.c')
| -rw-r--r-- | drivers/of/platform.c | 37 | 
1 files changed, 27 insertions, 10 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 16e8daffac06..765390e3ed8d 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -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 */  |