mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-24 04:34:22 +08:00
dm: core: Combine the flattree and livetree binding code
At present there are two copies of this code. With ofnode we can combine them to reduce duplication. Update the dm_scan_fdt_node() function and adjust its callers. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
d0c20ce6bc
commit
2ebea5eaeb
@ -199,33 +199,6 @@ int dm_scan_platdata(bool pre_reloc_only)
|
||||
}
|
||||
|
||||
#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||
static int dm_scan_fdt_live(struct udevice *parent,
|
||||
const struct device_node *node_parent,
|
||||
bool pre_reloc_only)
|
||||
{
|
||||
struct device_node *np;
|
||||
int ret = 0, err;
|
||||
|
||||
for (np = node_parent->child; np; np = np->sibling) {
|
||||
|
||||
if (!of_device_is_available(np)) {
|
||||
pr_debug(" - ignoring disabled device\n");
|
||||
continue;
|
||||
}
|
||||
err = lists_bind_fdt(parent, np_to_ofnode(np), NULL,
|
||||
pre_reloc_only);
|
||||
if (err && !ret) {
|
||||
ret = err;
|
||||
debug("%s: ret=%d\n", np->name, ret);
|
||||
}
|
||||
}
|
||||
|
||||
if (ret)
|
||||
dm_warn("Some drivers failed to bind\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_scan_fdt_node() - Scan the device tree and bind drivers for a node
|
||||
*
|
||||
@ -233,28 +206,30 @@ static int dm_scan_fdt_live(struct udevice *parent,
|
||||
* for each one.
|
||||
*
|
||||
* @parent: Parent device for the devices that will be created
|
||||
* @blob: Pointer to device tree blob
|
||||
* @offset: Offset of node to scan
|
||||
* @node: Node to scan
|
||||
* @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
|
||||
* flag. If false bind all drivers.
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
|
||||
int offset, bool pre_reloc_only)
|
||||
static int dm_scan_fdt_node(struct udevice *parent, ofnode parent_node,
|
||||
bool pre_reloc_only)
|
||||
{
|
||||
int ret = 0, err;
|
||||
ofnode node;
|
||||
|
||||
for (offset = fdt_first_subnode(blob, offset);
|
||||
offset > 0;
|
||||
offset = fdt_next_subnode(blob, offset)) {
|
||||
const char *node_name = fdt_get_name(blob, offset, NULL);
|
||||
if (!ofnode_valid(parent_node))
|
||||
return 0;
|
||||
|
||||
if (!fdtdec_get_is_enabled(blob, offset)) {
|
||||
for (node = ofnode_first_subnode(parent_node);
|
||||
ofnode_valid(node);
|
||||
node = ofnode_next_subnode(node)) {
|
||||
const char *node_name = ofnode_get_name(node);
|
||||
|
||||
if (!ofnode_is_enabled(node)) {
|
||||
pr_debug(" - ignoring disabled device\n");
|
||||
continue;
|
||||
}
|
||||
err = lists_bind_fdt(parent, offset_to_ofnode(offset), NULL,
|
||||
pre_reloc_only);
|
||||
err = lists_bind_fdt(parent, node, NULL, pre_reloc_only);
|
||||
if (err && !ret) {
|
||||
ret = err;
|
||||
debug("%s: ret=%d\n", node_name, ret);
|
||||
@ -269,24 +244,13 @@ static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
|
||||
|
||||
int dm_scan_fdt_dev(struct udevice *dev)
|
||||
{
|
||||
if (!dev_of_valid(dev))
|
||||
return 0;
|
||||
|
||||
if (of_live_active())
|
||||
return dm_scan_fdt_live(dev, dev_np(dev),
|
||||
gd->flags & GD_FLG_RELOC ? false : true);
|
||||
|
||||
return dm_scan_fdt_node(dev, gd->fdt_blob, dev_of_offset(dev),
|
||||
return dm_scan_fdt_node(dev, dev_ofnode(dev),
|
||||
gd->flags & GD_FLG_RELOC ? false : true);
|
||||
}
|
||||
|
||||
int dm_scan_fdt(const void *blob, bool pre_reloc_only)
|
||||
{
|
||||
if (of_live_active())
|
||||
return dm_scan_fdt_live(gd->dm_root, gd_of_root(),
|
||||
pre_reloc_only);
|
||||
|
||||
return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
|
||||
return dm_scan_fdt_node(gd->dm_root, ofnode_root(), pre_reloc_only);
|
||||
}
|
||||
|
||||
static int dm_scan_fdt_ofnode_path(const void *blob, const char *path,
|
||||
@ -295,14 +259,8 @@ static int dm_scan_fdt_ofnode_path(const void *blob, const char *path,
|
||||
ofnode node;
|
||||
|
||||
node = ofnode_path(path);
|
||||
if (!ofnode_valid(node))
|
||||
return 0;
|
||||
|
||||
if (of_live_active())
|
||||
return dm_scan_fdt_live(gd->dm_root, node.np, pre_reloc_only);
|
||||
|
||||
return dm_scan_fdt_node(gd->dm_root, blob, node.of_offset,
|
||||
pre_reloc_only);
|
||||
return dm_scan_fdt_node(gd->dm_root, node, pre_reloc_only);
|
||||
}
|
||||
|
||||
int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
|
||||
|
Loading…
Reference in New Issue
Block a user