Skip to content

Commit

Permalink
dt: Refactor of_platform_bus_probe()
Browse files Browse the repository at this point in the history
The current implementation uses three copies of of basically identical
code.  This patch consolidates them to make the code simpler.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Grant Likely committed Mar 23, 2011
1 parent 4bbba11 commit 38e9e21
Showing 1 changed file with 18 additions and 37 deletions.
55 changes: 18 additions & 37 deletions drivers/of/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,32 +210,30 @@ struct platform_device *of_platform_device_create(struct device_node *np,
EXPORT_SYMBOL(of_platform_device_create);

/**
* of_platform_bus_create - Create an OF device for a bus node and all its
* children. Optionally recursively instantiate matching busses.
* of_platform_bus_create() - Create a device for a node and its children.
* @bus: device node of the bus to instantiate
* @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
* disallow recursive creation of child busses
* disallow recursive creation of child buses
* @parent: parent for new device, or NULL for top level.
*
* Creates a platform_device for the provided device_node, and optionally
* recursively create devices for all the child nodes.
*/
static int of_platform_bus_create(const struct device_node *bus,
static int of_platform_bus_create(struct device_node *bus,
const struct of_device_id *matches,
struct device *parent)
{
struct device_node *child;
struct platform_device *dev;
int rc = 0;

dev = of_platform_device_create(bus, NULL, parent);
if (!dev || !of_match_node(matches, bus))
return 0;

for_each_child_of_node(bus, child) {
pr_debug(" create child: %s\n", child->full_name);
dev = of_platform_device_create(child, NULL, parent);
if (dev == NULL)
continue;

if (!of_match_node(matches, child))
continue;
if (rc == 0) {
pr_debug(" and sub busses\n");
rc = of_platform_bus_create(child, matches, &dev->dev);
}
rc = of_platform_bus_create(child, matches, &dev->dev);
if (rc) {
of_node_put(child);
break;
Expand All @@ -245,7 +243,7 @@ static int of_platform_bus_create(const struct device_node *bus,
}

/**
* of_platform_bus_probe - Probe the device-tree for platform busses
* of_platform_bus_probe() - Probe the device-tree for platform buses
* @root: parent of the first level to probe or NULL for the root of the tree
* @matches: match table, NULL to use the default
* @parent: parent to hook devices from, NULL for toplevel
Expand All @@ -258,7 +256,6 @@ int of_platform_bus_probe(struct device_node *root,
struct device *parent)
{
struct device_node *child;
struct platform_device *dev;
int rc = 0;

if (WARN_ON(!matches || matches == OF_NO_DEEP_PROBE))
Expand All @@ -277,31 +274,15 @@ int of_platform_bus_probe(struct device_node *root,
* children
*/
if (of_match_node(matches, root)) {
pr_debug(" root match, create all sub devices\n");
dev = of_platform_device_create(root, NULL, parent);
if (dev == NULL)
goto bail;

pr_debug(" create all sub busses\n");
rc = of_platform_bus_create(root, matches, &dev->dev);
goto bail;
}
for_each_child_of_node(root, child) {
rc = of_platform_bus_create(root, matches, parent);
} else for_each_child_of_node(root, child) {
if (!of_match_node(matches, child))
continue;

pr_debug(" match: %s\n", child->full_name);
dev = of_platform_device_create(child, NULL, parent);
if (dev == NULL)
continue;

rc = of_platform_bus_create(child, matches, &dev->dev);
if (rc) {
of_node_put(child);
rc = of_platform_bus_create(child, matches, parent);
if (rc)
break;
}
}
bail:

of_node_put(root);
return rc;
}
Expand Down

0 comments on commit 38e9e21

Please sign in to comment.