fdt_support: Add fdt_for_each_node_by_compatible() helper macro
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>
This commit is contained in:
parent
068415eade
commit
3058e283b8
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user