aboutsummaryrefslogtreecommitdiff
path: root/lib/fdtdec.c
diff options
context:
space:
mode:
authorAswath Govindraju <a-govindraju@ti.com>2020-12-03 10:55:45 +0530
committerSimon Glass <sjg@chromium.org>2020-12-22 20:39:25 -0700
commitc589132a1de0c24dd247dbeb31e387f3b945bcfb (patch)
tree6c46955a14391088b6a96af8d18795986967f5e4 /lib/fdtdec.c
parent9883df1bbb8e907f4122a582006eaf441b924276 (diff)
downloadu-boot-c589132a1de0c24dd247dbeb31e387f3b945bcfb.zip
u-boot-c589132a1de0c24dd247dbeb31e387f3b945bcfb.tar.gz
u-boot-c589132a1de0c24dd247dbeb31e387f3b945bcfb.tar.bz2
fdt: Use phandle to distinguish DT nodes with same name
While assigning the sequence number to subsystem instances by reading the aliases property, only DT nodes names are compared and not the complete path. This causes a problem when there are two DT nodes with same name but have different paths. In arch/arm/dts/k3-am65-main.dtsi there are two USB controllers with the same device tree node name but different path. When aliases are defined for these USB controllers then fdtdec_get_alias_seq() fails to pick the correct instance for a given index. fdt_path_offset() function is slow and this would effect the U-Boot startup. To avert the time penalty on all boards, apply this extra check only when required by using a config option. Fix it by comparing the phandles of DT nodes after the node names match, under a config option. Signed-off-by: Aswath Govindraju <a-govindraju@ti.com> Reviewed-by: Simon Glass <sjg@chromium.org> Fix whitespace error in Kconfig: Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'lib/fdtdec.c')
-rw-r--r--lib/fdtdec.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index ee1bd41..0ab7105 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -500,6 +500,17 @@ int fdtdec_get_alias_seq(const void *blob, const char *base, int offset,
slash = strrchr(prop, '/');
if (strcmp(slash + 1, find_name))
continue;
+
+ /*
+ * Adding an extra check to distinguish DT nodes with
+ * same name
+ */
+ if (IS_ENABLED(CONFIG_PHANDLE_CHECK_SEQ)) {
+ if (fdt_get_phandle(blob, offset) !=
+ fdt_get_phandle(blob, fdt_path_offset(blob, prop)))
+ continue;
+ }
+
val = trailing_strtol(name);
if (val != -1) {
*seqp = val;