]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fdt_support: Add fdt_for_each_node_by_compatible() helper macro
authorMarek Behún <marek.behun@nic.cz>
Thu, 20 Jan 2022 00:04:42 +0000 (01:04 +0100)
committerStefan Roese <sr@denx.de>
Thu, 20 Jan 2022 10:35:29 +0000 (11:35 +0100)
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>
Reviewed-by: Stefan Roese <sr@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
16 files changed:
arch/arm/cpu/armv8/fsl-layerscape/fdt.c
arch/arm/cpu/armv8/fsl-layerscape/icid.c
arch/arm/mach-tegra/gpu.c
arch/mips/mach-octeon/octeon_fdt.c
arch/powerpc/cpu/mpc85xx/liodn.c
board/Marvell/octeon_ebb7304/board.c
board/congatec/cgtqmx8/spl.c
board/freescale/lx2160a/lx2160a.c
common/fdt_support.c
drivers/misc/fsl_portals.c
drivers/net/fm/fdt.c
drivers/pci/pcie_layerscape_fixup_common.c
drivers/phy/marvell/comphy_a3700.c
drivers/video/meson/simplefb_common.c
drivers/video/sunxi/simplefb_common.c
include/fdt_support.h

index 4354aa251e16b7c55997c695e2f2795f680c6abd..2fa7ebf163916a25881c4ba8219342e9525664f8 100644 (file)
@@ -161,14 +161,9 @@ void fsl_fdt_disable_usb(void *blob)
         * controller is used, SYSCLK must meet the additional requirement
         * of 100 MHz.
         */
-       if (get_board_sys_clk() != 100000000) {
-               off = fdt_node_offset_by_compatible(blob, -1, "snps,dwc3");
-               while (off != -FDT_ERR_NOTFOUND) {
+       if (get_board_sys_clk() != 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
index 82c5a8b123a12125b1bfcfa9bc5faabcf8aa6c39..25cd82f16ebeff224a59e1faea1aa5baba363b3a 100644 (file)
@@ -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);
        }
 }
 
index 13ffade0408e041568c965d3c735c6fb60e69965..36538e7f96adc75a51638c413b121ac79c4e0194 100644 (file)
@@ -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;
 }
index 199f69251668da04cff2a6a95ccc5b29bae1a1de..5c5a14e87af80d242adc7e14f0ebe6ff0a175e04 100644 (file)
@@ -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");
-       }
 }
 
 /**
index e552378e78be0923c45a0c79fd7b10b6b6d3c2b8..a08400249492b1c85e7fae9537066c2b1d428a52 100644 (file)
@@ -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];
index c6c7c13483f44ab69b86e74b67b503b5ab755dd8..5fd84b260b5882984335d583ae5bb19de4bbff8f 100644 (file)
@@ -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, -1,
+                                       "cavium,octeon-7890-mix") {
                int parent;
                int len;
                const char *name;
index 37b7221c52a9b0ec41173b9d0dd64378fe4ff56d..dea34e4dc63cd85048913279a98d5d46c599c353 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <fdt_support.h>
 #include <init.h>
 #include <log.h>
 #include <spl.h>
@@ -29,13 +30,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);
 
index bda665624dcdd2772688c7fe3883e53f563a93d3..c9835f92999b93ae7d2a0b28cfe9daf4ede9d4b3 100644 (file)
@@ -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;
index c6b93e788905fae13f034fdc10d1bfa78a0f4507..77ee3ea051a5abd00f1d956f002d47d21e134efb 100644 (file)
@@ -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;
index 02bc3f86cae054e0c066220399b5c0ff2b9e9376..59df57a9acc7f1cb337d42aa1ec77a4c5ac84ec7 100644 (file)
@@ -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");
        }
 }
 
index 3855d7d58fa19ab311710cfd2434381975b49828..9828753412b8acbb83530ef92268833d67d15139 100644 (file)
@@ -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) {
index faccf6c141f172b9043538d7a1e8b879f1fd0bc6..095874a92763298cf4ef752316572b3e17ac4a17 100644 (file)
@@ -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;
index 41043535554748d347f26ef9b765f1f319f5ca9c..7cde59b8e28f3670e13f0031365d0fe348ef82f4 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 #include <common.h>
-#include <fdtdec.h>
+#include <fdt_support.h>
 #include <log.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
@@ -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,
index 81782326d4686a21c28c27d4d73abd5c587f8109..c8b5af501de2b1096fe46bf92d4fba79d9909728 100644 (file)
@@ -7,22 +7,19 @@
  * (C) Copyright 2017 Icenowy Zheng <icenowy@aosc.io>
  */
 
-#include <fdtdec.h>
+#include <fdt_support.h>
 
 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;
index df6501e4c3f85c3d8f24498fb885a80c2dbad893..ce0dc8f171bec85ff5050a4911d692e3b2dbe088 100644 (file)
@@ -7,7 +7,7 @@
  * (C) Copyright 2017 Icenowy Zheng <icenowy@aosc.io>
  */
 
-#include <fdtdec.h>
+#include <fdt_support.h>
 
 int sunxi_simplefb_fdt_match(void *blob, const char *pipeline)
 {
@@ -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;
index 8ec461af6c3d74387806c7007703cc1ddf539c0b..852040f66f4a8c31b116498fd848fcd6d0e1626a 100644 (file)
@@ -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);