mirror of
https://xff.cz/git/u-boot/
synced 2025-09-25 20:41:16 +02:00
dm: core: Move "/chosen" and "/firmware" node scan
Use the new function dm_scan_fdt_ofnode_path() to scan all the nodes which aren't devices themselves but may contain some: - "/chosen" - "/clocks" - "/firmware" The patch removes the strcmp call in recursive function dm_scan_fdt_live() and also corrects a conflict with the 2 applied patches in the commit1712ca2192
("dm: core: Scan /firmware node by default") and in the commit747558d014
("dm: fdt: scan for devices under /firmware too"): the subnodes of "/firmware" (optee for example) are bound 2 times. For example the dm tree command result on STM32MP1 is: STM32MP> dm tree Class Index Probed Driver Name ----------------------------------------------------------- root 0 [ + ] root_driver root_driver firmware 0 [ ] psci |-- psci sysreset 0 [ ] psci-sysreset | `-- psci-sysreset simple_bus 0 [ + ] generic_simple_bus |-- soc ... tee 0 [ + ] optee |-- optee ... tee 1 [ ] optee `-- optee Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> Tested-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Simon Glass
parent
67817b3b7a
commit
0544ecbfe9
@@ -203,15 +203,6 @@ static int dm_scan_fdt_live(struct udevice *parent,
|
|||||||
int ret = 0, err;
|
int ret = 0, err;
|
||||||
|
|
||||||
for (np = node_parent->child; np; np = np->sibling) {
|
for (np = node_parent->child; np; np = np->sibling) {
|
||||||
/* "chosen" node isn't a device itself but may contain some: */
|
|
||||||
if (!strcmp(np->name, "chosen")) {
|
|
||||||
pr_debug("parsing subnodes of \"chosen\"\n");
|
|
||||||
|
|
||||||
err = dm_scan_fdt_live(parent, np, pre_reloc_only);
|
|
||||||
if (err && !ret)
|
|
||||||
ret = err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!of_device_is_available(np)) {
|
if (!of_device_is_available(np)) {
|
||||||
pr_debug(" - ignoring disabled device\n");
|
pr_debug(" - ignoring disabled device\n");
|
||||||
@@ -256,21 +247,6 @@ static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
|
|||||||
offset = fdt_next_subnode(blob, offset)) {
|
offset = fdt_next_subnode(blob, offset)) {
|
||||||
const char *node_name = fdt_get_name(blob, offset, NULL);
|
const char *node_name = fdt_get_name(blob, offset, NULL);
|
||||||
|
|
||||||
/*
|
|
||||||
* The "chosen" and "firmware" nodes aren't devices
|
|
||||||
* themselves but may contain some:
|
|
||||||
*/
|
|
||||||
if (!strcmp(node_name, "chosen") ||
|
|
||||||
!strcmp(node_name, "firmware")) {
|
|
||||||
pr_debug("parsing subnodes of \"%s\"\n", node_name);
|
|
||||||
|
|
||||||
err = dm_scan_fdt_node(parent, blob, offset,
|
|
||||||
pre_reloc_only);
|
|
||||||
if (err && !ret)
|
|
||||||
ret = err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fdtdec_get_is_enabled(blob, offset)) {
|
if (!fdtdec_get_is_enabled(blob, offset)) {
|
||||||
pr_debug(" - ignoring disabled device\n");
|
pr_debug(" - ignoring disabled device\n");
|
||||||
continue;
|
continue;
|
||||||
@@ -315,7 +291,8 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only)
|
|||||||
return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
|
return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dm_scan_fdt_ofnode_path(const char *path, bool pre_reloc_only)
|
static int dm_scan_fdt_ofnode_path(const void *blob, const char *path,
|
||||||
|
bool pre_reloc_only)
|
||||||
{
|
{
|
||||||
ofnode node;
|
ofnode node;
|
||||||
|
|
||||||
@@ -327,13 +304,18 @@ static int dm_scan_fdt_ofnode_path(const char *path, bool pre_reloc_only)
|
|||||||
if (of_live_active())
|
if (of_live_active())
|
||||||
return dm_scan_fdt_live(gd->dm_root, node.np, pre_reloc_only);
|
return dm_scan_fdt_live(gd->dm_root, node.np, pre_reloc_only);
|
||||||
#endif
|
#endif
|
||||||
return dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node.of_offset,
|
return dm_scan_fdt_node(gd->dm_root, blob, node.of_offset,
|
||||||
pre_reloc_only);
|
pre_reloc_only);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
|
int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, i;
|
||||||
|
const char * const nodes[] = {
|
||||||
|
"/chosen",
|
||||||
|
"/clocks",
|
||||||
|
"/firmware"
|
||||||
|
};
|
||||||
|
|
||||||
ret = dm_scan_fdt(blob, pre_reloc_only);
|
ret = dm_scan_fdt(blob, pre_reloc_only);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -341,16 +323,16 @@ int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dm_scan_fdt_ofnode_path("/clocks", pre_reloc_only);
|
/* Some nodes aren't devices themselves but may contain some */
|
||||||
if (ret) {
|
for (i = 0; i < ARRAY_SIZE(nodes); i++) {
|
||||||
debug("scan for /clocks failed: %d\n", ret);
|
ret = dm_scan_fdt_ofnode_path(blob, nodes[i], pre_reloc_only);
|
||||||
return ret;
|
if (ret) {
|
||||||
|
debug("dm_scan_fdt() scan for %s failed: %d\n",
|
||||||
|
nodes[i], ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dm_scan_fdt_ofnode_path("/firmware", pre_reloc_only);
|
|
||||||
if (ret)
|
|
||||||
debug("scan for /firmware failed: %d\n", ret);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -255,7 +255,7 @@ static int dm_test_fdt(struct unit_test_state *uts)
|
|||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ret = dm_scan_fdt(gd->fdt_blob, false);
|
ret = dm_extended_scan_fdt(gd->fdt_blob, false);
|
||||||
ut_assert(!ret);
|
ut_assert(!ret);
|
||||||
|
|
||||||
ret = uclass_get(UCLASS_TEST_FDT, &uc);
|
ret = uclass_get(UCLASS_TEST_FDT, &uc);
|
||||||
|
Reference in New Issue
Block a user