diff options
author | Tom Rini <trini@konsulko.com> | 2020-04-16 13:45:03 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-04-16 13:45:03 -0400 |
commit | f51b4bcf61c9aa7994138a4a417488c1fbdb47cd (patch) | |
tree | 4f536d0892be1359f2cf02bfe366b56bef83bf28 /drivers/core/ofnode.c | |
parent | dba0a6ae1907bbff3ebda06e4874d006f10db1bb (diff) | |
parent | b0dcc87106464c3fc019e3771378a092fd32ebdb (diff) |
Merge tag 'dm-pull-10apr20-take2' of git://git.denx.de/u-boot-dm
Functions for reading indexed values from device tree
Enhancements to 'dm' command
Log test enhancements and syslog driver
DM change to read parent ofdata before children
Minor fixes
Diffstat (limited to 'drivers/core/ofnode.c')
-rw-r--r-- | drivers/core/ofnode.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 96a5dd20bd..b0be7cbe19 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -18,32 +18,53 @@ int ofnode_read_u32(ofnode node, const char *propname, u32 *outp) { + return ofnode_read_u32_index(node, propname, 0, outp); +} + +u32 ofnode_read_u32_default(ofnode node, const char *propname, u32 def) +{ + assert(ofnode_valid(node)); + ofnode_read_u32_index(node, propname, 0, &def); + + return def; +} + +int ofnode_read_u32_index(ofnode node, const char *propname, int index, + u32 *outp) +{ + const fdt32_t *cell; + int len; + assert(ofnode_valid(node)); debug("%s: %s: ", __func__, propname); - if (ofnode_is_np(node)) { - return of_read_u32(ofnode_to_np(node), propname, outp); - } else { - const fdt32_t *cell; - int len; + if (ofnode_is_np(node)) + return of_read_u32_index(ofnode_to_np(node), propname, index, + outp); - cell = fdt_getprop(gd->fdt_blob, ofnode_to_offset(node), - propname, &len); - if (!cell || len < sizeof(int)) { - debug("(not found)\n"); - return -EINVAL; - } - *outp = fdt32_to_cpu(cell[0]); + cell = fdt_getprop(gd->fdt_blob, ofnode_to_offset(node), propname, + &len); + if (!cell) { + debug("(not found)\n"); + return -EINVAL; + } + + if (len < (sizeof(int) * (index + 1))) { + debug("(not large enough)\n"); + return -EOVERFLOW; } + + *outp = fdt32_to_cpu(cell[index]); debug("%#x (%d)\n", *outp, *outp); return 0; } -u32 ofnode_read_u32_default(ofnode node, const char *propname, u32 def) +u32 ofnode_read_u32_index_default(ofnode node, const char *propname, int index, + u32 def) { assert(ofnode_valid(node)); - ofnode_read_u32(node, propname, &def); + ofnode_read_u32_index(node, propname, index, &def); return def; } |