* [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro
@ 2022-01-07 10:13 Marek Behún
2022-01-07 11:33 ` Marek Behún
2022-01-10 7:59 ` Stefan Roese
0 siblings, 2 replies; 4+ messages in thread
From: Marek Behún @ 2022-01-07 10:13 UTC (permalink / raw)
To: Simon Glass
Cc: Albert Aribaud, Tom Warren, Aaron Williams, Daniel Schwierzeck,
York Sun, Priyanka Jain, Wolfgang Denk, Oliver Graute,
Meenakshi Aggarwal, Wasim Khan, Joe Hershberger, Ramon Fried,
Anatolij Gustschin, Neil Armstrong, Jagan Teki, Andre Przywara,
Biwen Li, Chaitanya Sakinam, Anji J, Michael Walle, Stefan Roese,
Marek Behún, Vladimir Oltean, Bin Meng, Hou Zhiqiang,
Pali Rohár, Igal Liberman, u-boot, u-boot-amlogic
From: Marek Behún <marek.behun@nic.cz>
Add macro fdt_for_each_node_by_compatible() to allow iterating over
fdt nodes by compatible string.
Convert various usages of
off = fdt_node_offset_by_compatible(fdt, start, compat);
while (off > 0) {
code();
off = fdt_node_offset_by_compatible(fdt, off, compat);
}
and similar, to
fdt_for_each_node_by_compatible(off, fdt, start, compat)
code();
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
This currently applies on marvell/next, so only after that is merged
it can be applied elsewhere.
---
arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 9 ++-------
arch/arm/cpu/armv8/fsl-layerscape/icid.c | 5 +----
arch/arm/mach-tegra/gpu.c | 5 +----
arch/mips/mach-octeon/octeon_fdt.c | 11 ++---------
arch/powerpc/cpu/mpc85xx/liodn.c | 9 ++-------
board/Marvell/octeon_ebb7304/board.c | 9 +++------
board/congatec/cgtqmx8/spl.c | 7 ++-----
board/freescale/lx2160a/lx2160a.c | 5 +----
common/fdt_support.c | 22 ++++++++--------------
drivers/misc/fsl_portals.c | 6 +-----
drivers/net/fm/fdt.c | 3 +--
drivers/pci/pcie_layerscape_fixup_common.c | 12 ++----------
drivers/phy/marvell/comphy_a3700.c | 10 +++++-----
drivers/video/meson/simplefb_common.c | 7 ++-----
drivers/video/sunxi/simplefb_common.c | 5 ++---
include/fdt_support.h | 6 ++++++
16 files changed, 41 insertions(+), 90 deletions(-)
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
index 4ec0dbf516..ddceab29d2 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
@@ -161,14 +161,9 @@ void fsl_fdt_disable_usb(void *blob)
* controller is used, SYSCLK must meet the additional requirement
* of 100 MHz.
*/
- if (CONFIG_SYS_CLK_FREQ != 100000000) {
- off = fdt_node_offset_by_compatible(blob, -1, "snps,dwc3");
- while (off != -FDT_ERR_NOTFOUND) {
+ if (CONFIG_SYS_CLK_FREQ != 100000000)
+ fdt_for_each_node_by_compatible (off, blob, -1, "snps,dwc3")
fdt_status_disabled(blob, off);
- off = fdt_node_offset_by_compatible(blob, off,
- "snps,dwc3");
- }
- }
}
#ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c
index 82c5a8b123..b74387e731 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/icid.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c
@@ -116,8 +116,7 @@ void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph,
int noff, len, icid;
const u32 *prop;
- noff = fdt_node_offset_by_compatible(blob, -1, compat);
- while (noff > 0) {
+ fdt_for_each_node_by_compatible (noff, blob, -1, compat) {
prop = fdt_getprop(blob, noff, "cell-index", &len);
if (!prop) {
printf("WARNING missing cell-index for fman port\n");
@@ -137,8 +136,6 @@ void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph,
}
fdt_set_iommu_prop(blob, noff, smmu_ph, (u32 *)&icid, 1);
-
- noff = fdt_node_offset_by_compatible(blob, noff, compat);
}
}
diff --git a/arch/arm/mach-tegra/gpu.c b/arch/arm/mach-tegra/gpu.c
index 13ffade040..3ce51e8526 100644
--- a/arch/arm/mach-tegra/gpu.c
+++ b/arch/arm/mach-tegra/gpu.c
@@ -46,11 +46,8 @@ int tegra_gpu_enable_node(void *blob, const char *compat)
if (!_configured)
return 0;
- offset = fdt_node_offset_by_compatible(blob, -1, compat);
- while (offset != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (offset, blob, -1, compat)
fdt_status_okay(blob, offset);
- offset = fdt_node_offset_by_compatible(blob, offset, compat);
- }
return 0;
}
diff --git a/arch/mips/mach-octeon/octeon_fdt.c b/arch/mips/mach-octeon/octeon_fdt.c
index 199f692516..1338b67611 100644
--- a/arch/mips/mach-octeon/octeon_fdt.c
+++ b/arch/mips/mach-octeon/octeon_fdt.c
@@ -424,12 +424,8 @@ void __octeon_fixup_fdt_mac_addr(void)
}
/* Assign 78XX addresses in the order they appear in the device tree. */
- node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-7890-bgx-port");
- while (node != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (node, working_fdt, -1, "cavium,octeon-7890-bgx-port")
octeon_set_one_fdt_mac(node, &mac);
- node = fdt_node_offset_by_compatible(working_fdt, node,
- "cavium,octeon-7890-bgx-port");
- }
}
#endif
@@ -450,11 +446,8 @@ void __octeon_fixup_fdt_uart(void)
/* Device trees already have good values for fast simulator
* output, real boards need the correct value.
*/
- node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-3860-uart");
- while (node != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (node, working_fdt, -1, "cavium,octeon-3860-uart")
fdt_setprop_inplace_cell(working_fdt, node, "clock-frequency", clk);
- node = fdt_node_offset_by_compatible(working_fdt, node, "cavium,octeon-3860-uart");
- }
}
/**
diff --git a/arch/powerpc/cpu/mpc85xx/liodn.c b/arch/powerpc/cpu/mpc85xx/liodn.c
index e552378e78..d876fcff2c 100644
--- a/arch/powerpc/cpu/mpc85xx/liodn.c
+++ b/arch/powerpc/cpu/mpc85xx/liodn.c
@@ -268,15 +268,10 @@ static void fdt_fixup_pci_liodn_offsets(void *fdt, const char *compat,
* Count the number of pci nodes.
* It's needed later when the interleaved liodn offsets are generated.
*/
- off = fdt_node_offset_by_compatible(fdt, -1, compat);
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, compat)
pci_cnt++;
- off = fdt_node_offset_by_compatible(fdt, off, compat);
- }
- for (off = fdt_node_offset_by_compatible(fdt, -1, compat);
- off != -FDT_ERR_NOTFOUND;
- off = fdt_node_offset_by_compatible(fdt, off, compat)) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, compat) {
base_liodn = fdt_getprop(fdt, off, "fsl,liodn", &rc);
if (!base_liodn) {
char path[64];
diff --git a/board/Marvell/octeon_ebb7304/board.c b/board/Marvell/octeon_ebb7304/board.c
index c6c7c13483..daa9fc19d8 100644
--- a/board/Marvell/octeon_ebb7304/board.c
+++ b/board/Marvell/octeon_ebb7304/board.c
@@ -103,9 +103,7 @@ static int get_lmac_fdt_node(const void *fdt, int search_node, int search_bgx, i
int parent;
/* Iterate through all bgx ports */
- node = -1;
- while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
- compat)) >= 0) {
+ fdt_for_each_node_by_compatible (node, (void *)fdt, -1, compat) {
/* Get the node and bgx from the physical address */
parent = fdt_parent_offset(fdt, node);
reg = fdt_getprop(fdt, parent, "reg", &len);
@@ -146,9 +144,8 @@ static int get_mix_fdt_node(const void *fdt, int search_node, int search_index)
int node;
/* Iterate through all the mix fdt nodes */
- node = -1;
- while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
- "cavium,octeon-7890-mix")) >= 0) {
+ fdt_for_each_node_by_compatible (node, (void *)fdt, node,
+ "cavium,octeon-7890-mix") {
int parent;
int len;
const char *name;
diff --git a/board/congatec/cgtqmx8/spl.c b/board/congatec/cgtqmx8/spl.c
index 37b7221c52..19b681b65b 100644
--- a/board/congatec/cgtqmx8/spl.c
+++ b/board/congatec/cgtqmx8/spl.c
@@ -29,13 +29,10 @@ void spl_board_init(void)
continue;
}
- offset = fdt_node_offset_by_compatible(gd->fdt_blob, -1, "nxp,imx8-pd");
- while (offset != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (offset, gd->fdt_blob, -1,
+ "nxp,imx8-pd")
lists_bind_fdt(gd->dm_root, offset_to_ofnode(offset),
NULL, NULL, true);
- offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
- "nxp,imx8-pd");
- }
uclass_find_first_device(UCLASS_POWER_DOMAIN, &dev);
diff --git a/board/freescale/lx2160a/lx2160a.c b/board/freescale/lx2160a/lx2160a.c
index bda665624d..29d7722968 100644
--- a/board/freescale/lx2160a/lx2160a.c
+++ b/board/freescale/lx2160a/lx2160a.c
@@ -123,8 +123,7 @@ int board_fix_fdt(void *fdt)
if (IS_SVR_REV(get_svr(), 1, 0))
return 0;
- off = fdt_node_offset_by_compatible(fdt, -1, "fsl,lx2160a-pcie");
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie") {
fdt_setprop(fdt, off, "compatible", "fsl,ls-pcie",
strlen("fsl,ls-pcie") + 1);
@@ -166,8 +165,6 @@ int board_fix_fdt(void *fdt)
}
fdt_setprop(fdt, off, "reg-names", reg_names, names_len);
- off = fdt_node_offset_by_compatible(fdt, off,
- "fsl,lx2160a-pcie");
}
return 0;
diff --git a/common/fdt_support.c b/common/fdt_support.c
index b2ba0825df..5d02927fb2 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -371,12 +371,9 @@ void do_fixup_by_compat(void *fdt, const char *compat,
debug(" %.2x", *(u8*)(val+i));
debug("\n");
#endif
- off = fdt_node_offset_by_compatible(fdt, -1, compat);
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, compat)
if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL))
fdt_setprop(fdt, off, prop, val, len);
- off = fdt_node_offset_by_compatible(fdt, off, compat);
- }
}
void do_fixup_by_compat_u32(void *fdt, const char *compat,
@@ -996,10 +993,9 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info,
for (i = 0; i < node_info_size; i++) {
idx = 0;
- noff = -1;
- while ((noff = fdt_node_offset_by_compatible(blob, noff,
- node_info[i].compat)) >= 0) {
+ fdt_for_each_node_by_compatible (noff, blob, -1,
+ node_info[i].compat) {
const char *prop;
prop = fdt_getprop(blob, noff, "status", NULL);
@@ -1473,14 +1469,12 @@ out:
int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
phys_addr_t compat_off)
{
- int len, off = fdt_node_offset_by_compatible(blob, -1, compat);
- while (off != -FDT_ERR_NOTFOUND) {
+ int len, off;
+
+ fdt_for_each_node_by_compatible(off, blob, -1, compat) {
const fdt32_t *reg = fdt_getprop(blob, off, "reg", &len);
- if (reg) {
- if (compat_off == fdt_translate_address(blob, off, reg))
- return off;
- }
- off = fdt_node_offset_by_compatible(blob, off, compat);
+ if (reg && compat_off == fdt_translate_address(blob, off, reg))
+ return off;
}
return -FDT_ERR_NOTFOUND;
diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c
index 02bc3f86ca..5300c030a7 100644
--- a/drivers/misc/fsl_portals.c
+++ b/drivers/misc/fsl_portals.c
@@ -208,8 +208,7 @@ void fdt_fixup_qportals(void *blob)
maj, min, ip_cfg) + 1;
compat_len += sprintf(compat + compat_len, "fsl,qman-portal") + 1;
- off = fdt_node_offset_by_compatible(blob, -1, "fsl,qman-portal");
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, blob, -1, "fsl,qman-portal") {
#if defined(CONFIG_PPC) || defined(CONFIG_ARCH_LS1043A) || \
defined(CONFIG_ARCH_LS1046A)
#ifdef CONFIG_FSL_CORENET
@@ -295,9 +294,6 @@ err:
fdt_strerror(err));
return;
}
-
- off = fdt_node_offset_by_compatible(blob, off,
- "fsl,qman-portal");
}
}
diff --git a/drivers/net/fm/fdt.c b/drivers/net/fm/fdt.c
index 3855d7d58f..850ac49c8c 100644
--- a/drivers/net/fm/fdt.c
+++ b/drivers/net/fm/fdt.c
@@ -115,8 +115,7 @@ void fdt_fixup_fman_firmware(void *blob)
}
/* Find all other Fman nodes and point them to the firmware node. */
- while ((fmnode = fdt_node_offset_by_compatible(blob, fmnode,
- "fsl,fman")) > 0) {
+ fdt_for_each_node_by_compatible (fmnode, blob, fmnode, "fsl,fman") {
rc = fdt_setprop_cell(blob, fmnode, "fsl,firmware-phandle",
phandle);
if (rc < 0) {
diff --git a/drivers/pci/pcie_layerscape_fixup_common.c b/drivers/pci/pcie_layerscape_fixup_common.c
index faccf6c141..b9163833b8 100644
--- a/drivers/pci/pcie_layerscape_fixup_common.c
+++ b/drivers/pci/pcie_layerscape_fixup_common.c
@@ -48,8 +48,7 @@ static int lx2_board_fix_fdt(void *fdt)
const fdt32_t *prop;
u32 ob_wins, ib_wins;
- off = fdt_node_offset_by_compatible(fdt, -1, "fsl,lx2160a-pcie");
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie") {
fdt_setprop(fdt, off, "compatible", "fsl,ls2088a-pcie",
strlen("fsl,ls2088a-pcie") + 1);
@@ -89,14 +88,10 @@ static int lx2_board_fix_fdt(void *fdt)
fdt_setprop(fdt, off, "reg-names", reg_names, names_len);
fdt_delprop(fdt, off, "apio-wins");
fdt_delprop(fdt, off, "ppio-wins");
- off = fdt_node_offset_by_compatible(fdt, off,
- "fsl,lx2160a-pcie");
}
/* Fixup PCIe EP nodes */
- off = -1;
- off = fdt_node_offset_by_compatible(fdt, off, "fsl,lx2160a-pcie-ep");
- while (off != -FDT_ERR_NOTFOUND) {
+ fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie-ep") {
fdt_setprop_string(fdt, off, "compatible",
"fsl,lx2160ar2-pcie-ep");
prop = fdt_getprop(fdt, off, "apio-wins", NULL);
@@ -113,9 +108,6 @@ static int lx2_board_fix_fdt(void *fdt)
fdt_setprop_u32(fdt, off, "num-ib-windows", ib_wins);
fdt_setprop_u32(fdt, off, "num-ob-windows", ob_wins);
fdt_delprop(fdt, off, "apio-wins");
-
- off = fdt_node_offset_by_compatible(fdt, off,
- "fsl,lx2160a-pcie-ep");
}
return 0;
diff --git a/drivers/phy/marvell/comphy_a3700.c b/drivers/phy/marvell/comphy_a3700.c
index 4104353555..5a3456584c 100644
--- a/drivers/phy/marvell/comphy_a3700.c
+++ b/drivers/phy/marvell/comphy_a3700.c
@@ -985,12 +985,12 @@ void comphy_dedicated_phys_init(void)
static int find_available_node_by_compatible(int offset, const char *compatible)
{
- do {
- offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
- compatible);
- } while (offset > 0 && !fdtdec_get_is_enabled(gd->fdt_blob, offset));
+ fdt_for_each_node_by_compatible (offset, gd->fdt_blob, offset,
+ compatible)
+ if (fdtdec_get_is_enabled(gd->fdt_blob, offset))
+ return offset;
- return offset;
+ return -1;
}
static bool comphy_a3700_find_lane(const int nodes[3], int node,
diff --git a/drivers/video/meson/simplefb_common.c b/drivers/video/meson/simplefb_common.c
index 81782326d4..70ef86eced 100644
--- a/drivers/video/meson/simplefb_common.c
+++ b/drivers/video/meson/simplefb_common.c
@@ -14,15 +14,12 @@ int meson_simplefb_fdt_match(void *blob, const char *pipeline)
int offset, ret;
/* Find a prefilled simpefb node, matching out pipeline config */
- offset = fdt_node_offset_by_compatible(blob, -1,
- "amlogic,simple-framebuffer");
- while (offset >= 0) {
+ fdt_for_each_node_by_compatible (offset, blob, -1,
+ "amlogic,simple-framebuffer") {
ret = fdt_stringlist_search(blob, offset, "amlogic,pipeline",
pipeline);
if (ret == 0)
break;
- offset = fdt_node_offset_by_compatible(blob, offset,
- "amlogic,simple-framebuffer");
}
return offset;
diff --git a/drivers/video/sunxi/simplefb_common.c b/drivers/video/sunxi/simplefb_common.c
index df6501e4c3..852157c9c6 100644
--- a/drivers/video/sunxi/simplefb_common.c
+++ b/drivers/video/sunxi/simplefb_common.c
@@ -16,13 +16,12 @@ int sunxi_simplefb_fdt_match(void *blob, const char *pipeline)
/* Find a prefilled simpefb node, matching out pipeline config */
offset = fdt_node_offset_by_compatible(blob, -1,
"allwinner,simple-framebuffer");
- while (offset >= 0) {
+ fdt_for_each_node_by_compatible (offset, blob, -1,
+ "allwinner,simple-framebuffer") {
ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline",
pipeline);
if (ret == 0)
break;
- offset = fdt_node_offset_by_compatible(blob, offset,
- "allwinner,simple-framebuffer");
}
return offset;
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 8ec461af6c..852040f66f 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -289,6 +289,12 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
phys_addr_t compat_off);
int fdt_node_offset_by_pathf(void *blob, const char *fmt, ...)
__attribute__ ((format (printf, 2, 3)));
+
+#define fdt_for_each_node_by_compatible(node, fdt, start, compat) \
+ for (node = fdt_node_offset_by_compatible(fdt, start, compat); \
+ node >= 0; \
+ node = fdt_node_offset_by_compatible(fdt, node, compat))
+
int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle);
unsigned int fdt_create_phandle(void *fdt, int nodeoffset);
unsigned int fdt_create_phandle_by_compatible(void *fdt, const char *compat);
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro
2022-01-07 10:13 [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro Marek Behún
@ 2022-01-07 11:33 ` Marek Behún
2022-01-10 8:06 ` Stefan Roese
2022-01-10 7:59 ` Stefan Roese
1 sibling, 1 reply; 4+ messages in thread
From: Marek Behún @ 2022-01-07 11:33 UTC (permalink / raw)
To: Simon Glass, Stefan Roese
Cc: Albert Aribaud, Tom Warren, Aaron Williams, Daniel Schwierzeck,
York Sun, Priyanka Jain, Wolfgang Denk, Oliver Graute,
Meenakshi Aggarwal, Wasim Khan, Joe Hershberger, Ramon Fried,
Anatolij Gustschin, Neil Armstrong, Jagan Teki, Andre Przywara,
Biwen Li, Chaitanya Sakinam, Anji J, Michael Walle,
Vladimir Oltean, Bin Meng, Hou Zhiqiang, Pali Rohár,
Igal Liberman, u-boot, u-boot-amlogic
Hello Simon, Stefan,
this patch is for u-boot-dm, but will apply only after marvell/next is
merged.
Could we perhaps review it and let Stefan apply it on marvell/next?
BTW it passed CI on github.
Marek
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro
2022-01-07 10:13 [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro Marek Behún
2022-01-07 11:33 ` Marek Behún
@ 2022-01-10 7:59 ` Stefan Roese
1 sibling, 0 replies; 4+ messages in thread
From: Stefan Roese @ 2022-01-10 7:59 UTC (permalink / raw)
To: Marek Behún, Simon Glass
Cc: Albert Aribaud, Tom Warren, Aaron Williams, Daniel Schwierzeck,
York Sun, Priyanka Jain, Wolfgang Denk, Oliver Graute,
Meenakshi Aggarwal, Wasim Khan, Joe Hershberger, Ramon Fried,
Anatolij Gustschin, Neil Armstrong, Jagan Teki, Andre Przywara,
Biwen Li, Chaitanya Sakinam, Anji J, Michael Walle,
Marek Behún, Vladimir Oltean, Bin Meng, Hou Zhiqiang,
Pali Rohár, Igal Liberman, u-boot, u-boot-amlogic
Please find a few minor comments below...
On 1/7/22 11:13, Marek Behún wrote:
> From: Marek Behún <marek.behun@nic.cz>
>
> Add macro fdt_for_each_node_by_compatible() to allow iterating over
> fdt nodes by compatible string.
>
> Convert various usages of
> off = fdt_node_offset_by_compatible(fdt, start, compat);
> while (off > 0) {
> code();
> off = fdt_node_offset_by_compatible(fdt, off, compat);
> }
> and similar, to
> fdt_for_each_node_by_compatible(off, fdt, start, compat)
> code();
>
> Signed-off-by: Marek Behún <marek.behun@nic.cz>
> ---
> This currently applies on marvell/next, so only after that is merged
> it can be applied elsewhere.
> ---
> arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 9 ++-------
> arch/arm/cpu/armv8/fsl-layerscape/icid.c | 5 +----
> arch/arm/mach-tegra/gpu.c | 5 +----
> arch/mips/mach-octeon/octeon_fdt.c | 11 ++---------
> arch/powerpc/cpu/mpc85xx/liodn.c | 9 ++-------
> board/Marvell/octeon_ebb7304/board.c | 9 +++------
> board/congatec/cgtqmx8/spl.c | 7 ++-----
> board/freescale/lx2160a/lx2160a.c | 5 +----
> common/fdt_support.c | 22 ++++++++--------------
> drivers/misc/fsl_portals.c | 6 +-----
> drivers/net/fm/fdt.c | 3 +--
> drivers/pci/pcie_layerscape_fixup_common.c | 12 ++----------
> drivers/phy/marvell/comphy_a3700.c | 10 +++++-----
> drivers/video/meson/simplefb_common.c | 7 ++-----
> drivers/video/sunxi/simplefb_common.c | 5 ++---
> include/fdt_support.h | 6 ++++++
> 16 files changed, 41 insertions(+), 90 deletions(-)
Diffstat looks nice. :)
>
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> index 4ec0dbf516..ddceab29d2 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> @@ -161,14 +161,9 @@ void fsl_fdt_disable_usb(void *blob)
> * controller is used, SYSCLK must meet the additional requirement
> * of 100 MHz.
> */
> - if (CONFIG_SYS_CLK_FREQ != 100000000) {
> - off = fdt_node_offset_by_compatible(blob, -1, "snps,dwc3");
> - while (off != -FDT_ERR_NOTFOUND) {
> + if (CONFIG_SYS_CLK_FREQ != 100000000)
> + fdt_for_each_node_by_compatible (off, blob, -1, "snps,dwc3")
Again here the question:
Why are adding the space before the "(" here? This does not seem the
common and preferred coding style AFAICT.
Other that this:
Reviewed-by: Stefan Roese <sr@denx.de>
Thanks,
Stefan
> fdt_status_disabled(blob, off);
> - off = fdt_node_offset_by_compatible(blob, off,
> - "snps,dwc3");
> - }
> - }
> }
>
> #ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c
> index 82c5a8b123..b74387e731 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/icid.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c
> @@ -116,8 +116,7 @@ void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph,
> int noff, len, icid;
> const u32 *prop;
>
> - noff = fdt_node_offset_by_compatible(blob, -1, compat);
> - while (noff > 0) {
> + fdt_for_each_node_by_compatible (noff, blob, -1, compat) {
> prop = fdt_getprop(blob, noff, "cell-index", &len);
> if (!prop) {
> printf("WARNING missing cell-index for fman port\n");
> @@ -137,8 +136,6 @@ void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph,
> }
>
> fdt_set_iommu_prop(blob, noff, smmu_ph, (u32 *)&icid, 1);
> -
> - noff = fdt_node_offset_by_compatible(blob, noff, compat);
> }
> }
>
> diff --git a/arch/arm/mach-tegra/gpu.c b/arch/arm/mach-tegra/gpu.c
> index 13ffade040..3ce51e8526 100644
> --- a/arch/arm/mach-tegra/gpu.c
> +++ b/arch/arm/mach-tegra/gpu.c
> @@ -46,11 +46,8 @@ int tegra_gpu_enable_node(void *blob, const char *compat)
> if (!_configured)
> return 0;
>
> - offset = fdt_node_offset_by_compatible(blob, -1, compat);
> - while (offset != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (offset, blob, -1, compat)
> fdt_status_okay(blob, offset);
> - offset = fdt_node_offset_by_compatible(blob, offset, compat);
> - }
>
> return 0;
> }
> diff --git a/arch/mips/mach-octeon/octeon_fdt.c b/arch/mips/mach-octeon/octeon_fdt.c
> index 199f692516..1338b67611 100644
> --- a/arch/mips/mach-octeon/octeon_fdt.c
> +++ b/arch/mips/mach-octeon/octeon_fdt.c
> @@ -424,12 +424,8 @@ void __octeon_fixup_fdt_mac_addr(void)
> }
>
> /* Assign 78XX addresses in the order they appear in the device tree. */
> - node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-7890-bgx-port");
> - while (node != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (node, working_fdt, -1, "cavium,octeon-7890-bgx-port")
> octeon_set_one_fdt_mac(node, &mac);
> - node = fdt_node_offset_by_compatible(working_fdt, node,
> - "cavium,octeon-7890-bgx-port");
> - }
> }
> #endif
>
> @@ -450,11 +446,8 @@ void __octeon_fixup_fdt_uart(void)
> /* Device trees already have good values for fast simulator
> * output, real boards need the correct value.
> */
> - node = fdt_node_offset_by_compatible(working_fdt, -1, "cavium,octeon-3860-uart");
> - while (node != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (node, working_fdt, -1, "cavium,octeon-3860-uart")
> fdt_setprop_inplace_cell(working_fdt, node, "clock-frequency", clk);
> - node = fdt_node_offset_by_compatible(working_fdt, node, "cavium,octeon-3860-uart");
> - }
> }
>
> /**
> diff --git a/arch/powerpc/cpu/mpc85xx/liodn.c b/arch/powerpc/cpu/mpc85xx/liodn.c
> index e552378e78..d876fcff2c 100644
> --- a/arch/powerpc/cpu/mpc85xx/liodn.c
> +++ b/arch/powerpc/cpu/mpc85xx/liodn.c
> @@ -268,15 +268,10 @@ static void fdt_fixup_pci_liodn_offsets(void *fdt, const char *compat,
> * Count the number of pci nodes.
> * It's needed later when the interleaved liodn offsets are generated.
> */
> - off = fdt_node_offset_by_compatible(fdt, -1, compat);
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, compat)
> pci_cnt++;
> - off = fdt_node_offset_by_compatible(fdt, off, compat);
> - }
>
> - for (off = fdt_node_offset_by_compatible(fdt, -1, compat);
> - off != -FDT_ERR_NOTFOUND;
> - off = fdt_node_offset_by_compatible(fdt, off, compat)) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, compat) {
> base_liodn = fdt_getprop(fdt, off, "fsl,liodn", &rc);
> if (!base_liodn) {
> char path[64];
> diff --git a/board/Marvell/octeon_ebb7304/board.c b/board/Marvell/octeon_ebb7304/board.c
> index c6c7c13483..daa9fc19d8 100644
> --- a/board/Marvell/octeon_ebb7304/board.c
> +++ b/board/Marvell/octeon_ebb7304/board.c
> @@ -103,9 +103,7 @@ static int get_lmac_fdt_node(const void *fdt, int search_node, int search_bgx, i
> int parent;
>
> /* Iterate through all bgx ports */
> - node = -1;
> - while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
> - compat)) >= 0) {
> + fdt_for_each_node_by_compatible (node, (void *)fdt, -1, compat) {
> /* Get the node and bgx from the physical address */
> parent = fdt_parent_offset(fdt, node);
> reg = fdt_getprop(fdt, parent, "reg", &len);
> @@ -146,9 +144,8 @@ static int get_mix_fdt_node(const void *fdt, int search_node, int search_index)
> int node;
>
> /* Iterate through all the mix fdt nodes */
> - node = -1;
> - while ((node = fdt_node_offset_by_compatible((void *)fdt, node,
> - "cavium,octeon-7890-mix")) >= 0) {
> + fdt_for_each_node_by_compatible (node, (void *)fdt, node,
> + "cavium,octeon-7890-mix") {
> int parent;
> int len;
> const char *name;
> diff --git a/board/congatec/cgtqmx8/spl.c b/board/congatec/cgtqmx8/spl.c
> index 37b7221c52..19b681b65b 100644
> --- a/board/congatec/cgtqmx8/spl.c
> +++ b/board/congatec/cgtqmx8/spl.c
> @@ -29,13 +29,10 @@ void spl_board_init(void)
> continue;
> }
>
> - offset = fdt_node_offset_by_compatible(gd->fdt_blob, -1, "nxp,imx8-pd");
> - while (offset != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (offset, gd->fdt_blob, -1,
> + "nxp,imx8-pd")
> lists_bind_fdt(gd->dm_root, offset_to_ofnode(offset),
> NULL, NULL, true);
> - offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
> - "nxp,imx8-pd");
> - }
>
> uclass_find_first_device(UCLASS_POWER_DOMAIN, &dev);
>
> diff --git a/board/freescale/lx2160a/lx2160a.c b/board/freescale/lx2160a/lx2160a.c
> index bda665624d..29d7722968 100644
> --- a/board/freescale/lx2160a/lx2160a.c
> +++ b/board/freescale/lx2160a/lx2160a.c
> @@ -123,8 +123,7 @@ int board_fix_fdt(void *fdt)
> if (IS_SVR_REV(get_svr(), 1, 0))
> return 0;
>
> - off = fdt_node_offset_by_compatible(fdt, -1, "fsl,lx2160a-pcie");
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie") {
> fdt_setprop(fdt, off, "compatible", "fsl,ls-pcie",
> strlen("fsl,ls-pcie") + 1);
>
> @@ -166,8 +165,6 @@ int board_fix_fdt(void *fdt)
> }
>
> fdt_setprop(fdt, off, "reg-names", reg_names, names_len);
> - off = fdt_node_offset_by_compatible(fdt, off,
> - "fsl,lx2160a-pcie");
> }
>
> return 0;
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index b2ba0825df..5d02927fb2 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -371,12 +371,9 @@ void do_fixup_by_compat(void *fdt, const char *compat,
> debug(" %.2x", *(u8*)(val+i));
> debug("\n");
> #endif
> - off = fdt_node_offset_by_compatible(fdt, -1, compat);
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, compat)
> if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL))
> fdt_setprop(fdt, off, prop, val, len);
> - off = fdt_node_offset_by_compatible(fdt, off, compat);
> - }
> }
>
> void do_fixup_by_compat_u32(void *fdt, const char *compat,
> @@ -996,10 +993,9 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info,
>
> for (i = 0; i < node_info_size; i++) {
> idx = 0;
> - noff = -1;
>
> - while ((noff = fdt_node_offset_by_compatible(blob, noff,
> - node_info[i].compat)) >= 0) {
> + fdt_for_each_node_by_compatible (noff, blob, -1,
> + node_info[i].compat) {
> const char *prop;
>
> prop = fdt_getprop(blob, noff, "status", NULL);
> @@ -1473,14 +1469,12 @@ out:
> int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
> phys_addr_t compat_off)
> {
> - int len, off = fdt_node_offset_by_compatible(blob, -1, compat);
> - while (off != -FDT_ERR_NOTFOUND) {
> + int len, off;
> +
> + fdt_for_each_node_by_compatible(off, blob, -1, compat) {
> const fdt32_t *reg = fdt_getprop(blob, off, "reg", &len);
> - if (reg) {
> - if (compat_off == fdt_translate_address(blob, off, reg))
> - return off;
> - }
> - off = fdt_node_offset_by_compatible(blob, off, compat);
> + if (reg && compat_off == fdt_translate_address(blob, off, reg))
> + return off;
> }
>
> return -FDT_ERR_NOTFOUND;
> diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c
> index 02bc3f86ca..5300c030a7 100644
> --- a/drivers/misc/fsl_portals.c
> +++ b/drivers/misc/fsl_portals.c
> @@ -208,8 +208,7 @@ void fdt_fixup_qportals(void *blob)
> maj, min, ip_cfg) + 1;
> compat_len += sprintf(compat + compat_len, "fsl,qman-portal") + 1;
>
> - off = fdt_node_offset_by_compatible(blob, -1, "fsl,qman-portal");
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, blob, -1, "fsl,qman-portal") {
> #if defined(CONFIG_PPC) || defined(CONFIG_ARCH_LS1043A) || \
> defined(CONFIG_ARCH_LS1046A)
> #ifdef CONFIG_FSL_CORENET
> @@ -295,9 +294,6 @@ err:
> fdt_strerror(err));
> return;
> }
> -
> - off = fdt_node_offset_by_compatible(blob, off,
> - "fsl,qman-portal");
> }
> }
>
> diff --git a/drivers/net/fm/fdt.c b/drivers/net/fm/fdt.c
> index 3855d7d58f..850ac49c8c 100644
> --- a/drivers/net/fm/fdt.c
> +++ b/drivers/net/fm/fdt.c
> @@ -115,8 +115,7 @@ void fdt_fixup_fman_firmware(void *blob)
> }
>
> /* Find all other Fman nodes and point them to the firmware node. */
> - while ((fmnode = fdt_node_offset_by_compatible(blob, fmnode,
> - "fsl,fman")) > 0) {
> + fdt_for_each_node_by_compatible (fmnode, blob, fmnode, "fsl,fman") {
> rc = fdt_setprop_cell(blob, fmnode, "fsl,firmware-phandle",
> phandle);
> if (rc < 0) {
> diff --git a/drivers/pci/pcie_layerscape_fixup_common.c b/drivers/pci/pcie_layerscape_fixup_common.c
> index faccf6c141..b9163833b8 100644
> --- a/drivers/pci/pcie_layerscape_fixup_common.c
> +++ b/drivers/pci/pcie_layerscape_fixup_common.c
> @@ -48,8 +48,7 @@ static int lx2_board_fix_fdt(void *fdt)
> const fdt32_t *prop;
> u32 ob_wins, ib_wins;
>
> - off = fdt_node_offset_by_compatible(fdt, -1, "fsl,lx2160a-pcie");
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie") {
> fdt_setprop(fdt, off, "compatible", "fsl,ls2088a-pcie",
> strlen("fsl,ls2088a-pcie") + 1);
>
> @@ -89,14 +88,10 @@ static int lx2_board_fix_fdt(void *fdt)
> fdt_setprop(fdt, off, "reg-names", reg_names, names_len);
> fdt_delprop(fdt, off, "apio-wins");
> fdt_delprop(fdt, off, "ppio-wins");
> - off = fdt_node_offset_by_compatible(fdt, off,
> - "fsl,lx2160a-pcie");
> }
>
> /* Fixup PCIe EP nodes */
> - off = -1;
> - off = fdt_node_offset_by_compatible(fdt, off, "fsl,lx2160a-pcie-ep");
> - while (off != -FDT_ERR_NOTFOUND) {
> + fdt_for_each_node_by_compatible (off, fdt, -1, "fsl,lx2160a-pcie-ep") {
> fdt_setprop_string(fdt, off, "compatible",
> "fsl,lx2160ar2-pcie-ep");
> prop = fdt_getprop(fdt, off, "apio-wins", NULL);
> @@ -113,9 +108,6 @@ static int lx2_board_fix_fdt(void *fdt)
> fdt_setprop_u32(fdt, off, "num-ib-windows", ib_wins);
> fdt_setprop_u32(fdt, off, "num-ob-windows", ob_wins);
> fdt_delprop(fdt, off, "apio-wins");
> -
> - off = fdt_node_offset_by_compatible(fdt, off,
> - "fsl,lx2160a-pcie-ep");
> }
>
> return 0;
> diff --git a/drivers/phy/marvell/comphy_a3700.c b/drivers/phy/marvell/comphy_a3700.c
> index 4104353555..5a3456584c 100644
> --- a/drivers/phy/marvell/comphy_a3700.c
> +++ b/drivers/phy/marvell/comphy_a3700.c
> @@ -985,12 +985,12 @@ void comphy_dedicated_phys_init(void)
>
> static int find_available_node_by_compatible(int offset, const char *compatible)
> {
> - do {
> - offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset,
> - compatible);
> - } while (offset > 0 && !fdtdec_get_is_enabled(gd->fdt_blob, offset));
> + fdt_for_each_node_by_compatible (offset, gd->fdt_blob, offset,
> + compatible)
> + if (fdtdec_get_is_enabled(gd->fdt_blob, offset))
> + return offset;
>
> - return offset;
> + return -1;
> }
>
> static bool comphy_a3700_find_lane(const int nodes[3], int node,
> diff --git a/drivers/video/meson/simplefb_common.c b/drivers/video/meson/simplefb_common.c
> index 81782326d4..70ef86eced 100644
> --- a/drivers/video/meson/simplefb_common.c
> +++ b/drivers/video/meson/simplefb_common.c
> @@ -14,15 +14,12 @@ int meson_simplefb_fdt_match(void *blob, const char *pipeline)
> int offset, ret;
>
> /* Find a prefilled simpefb node, matching out pipeline config */
> - offset = fdt_node_offset_by_compatible(blob, -1,
> - "amlogic,simple-framebuffer");
> - while (offset >= 0) {
> + fdt_for_each_node_by_compatible (offset, blob, -1,
> + "amlogic,simple-framebuffer") {
> ret = fdt_stringlist_search(blob, offset, "amlogic,pipeline",
> pipeline);
> if (ret == 0)
> break;
> - offset = fdt_node_offset_by_compatible(blob, offset,
> - "amlogic,simple-framebuffer");
> }
>
> return offset;
> diff --git a/drivers/video/sunxi/simplefb_common.c b/drivers/video/sunxi/simplefb_common.c
> index df6501e4c3..852157c9c6 100644
> --- a/drivers/video/sunxi/simplefb_common.c
> +++ b/drivers/video/sunxi/simplefb_common.c
> @@ -16,13 +16,12 @@ int sunxi_simplefb_fdt_match(void *blob, const char *pipeline)
> /* Find a prefilled simpefb node, matching out pipeline config */
> offset = fdt_node_offset_by_compatible(blob, -1,
> "allwinner,simple-framebuffer");
> - while (offset >= 0) {
> + fdt_for_each_node_by_compatible (offset, blob, -1,
> + "allwinner,simple-framebuffer") {
> ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline",
> pipeline);
> if (ret == 0)
> break;
> - offset = fdt_node_offset_by_compatible(blob, offset,
> - "allwinner,simple-framebuffer");
> }
>
> return offset;
> diff --git a/include/fdt_support.h b/include/fdt_support.h
> index 8ec461af6c..852040f66f 100644
> --- a/include/fdt_support.h
> +++ b/include/fdt_support.h
> @@ -289,6 +289,12 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
> phys_addr_t compat_off);
> int fdt_node_offset_by_pathf(void *blob, const char *fmt, ...)
> __attribute__ ((format (printf, 2, 3)));
> +
> +#define fdt_for_each_node_by_compatible(node, fdt, start, compat) \
> + for (node = fdt_node_offset_by_compatible(fdt, start, compat); \
> + node >= 0; \
> + node = fdt_node_offset_by_compatible(fdt, node, compat))
> +
> int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle);
> unsigned int fdt_create_phandle(void *fdt, int nodeoffset);
> unsigned int fdt_create_phandle_by_compatible(void *fdt, const char *compat);
>
Viele Grüße,
Stefan Roese
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr@denx.de
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro
2022-01-07 11:33 ` Marek Behún
@ 2022-01-10 8:06 ` Stefan Roese
0 siblings, 0 replies; 4+ messages in thread
From: Stefan Roese @ 2022-01-10 8:06 UTC (permalink / raw)
To: Marek Behún, Simon Glass
Cc: Albert Aribaud, Tom Warren, Aaron Williams, Daniel Schwierzeck,
York Sun, Priyanka Jain, Wolfgang Denk, Oliver Graute,
Meenakshi Aggarwal, Wasim Khan, Joe Hershberger, Ramon Fried,
Anatolij Gustschin, Neil Armstrong, Jagan Teki, Andre Przywara,
Biwen Li, Chaitanya Sakinam, Anji J, Michael Walle,
Vladimir Oltean, Bin Meng, Hou Zhiqiang, Pali Rohár,
Igal Liberman, u-boot, u-boot-amlogic
Hi Marek,
On 1/7/22 12:33, Marek Behún wrote:
> Hello Simon, Stefan,
>
> this patch is for u-boot-dm, but will apply only after marvell/next is
> merged.
>
> Could we perhaps review it and let Stefan apply it on marvell/next?
I'm fine with this (when my minor comment is addressed), if Simon and
others are also okay with this patch.
Thanks,
Stefan
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-01-10 8:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-07 10:13 [PATCH u-boot-dm] fdt_support: Add fdt_for_each_node_by_compatible() helper macro Marek Behún
2022-01-07 11:33 ` Marek Behún
2022-01-10 8:06 ` Stefan Roese
2022-01-10 7:59 ` Stefan Roese
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox