diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2007-11-21 13:30:15 -0600 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2007-11-21 15:11:58 -0600 |
commit | 9eb77cea1fa12d5969eb26a1d1d81da381bd6b1c (patch) | |
tree | 989e4f66372f19f1faf905e0cc863649c0e00a59 | |
parent | ab544633abdd14f4dd5d92e500b73eb59ef57e67 (diff) |
Add additional fdt fixup helper functions
Added the following fdt fixup helpers:
* do_fixup_by_prop{_u32} - Find matching nodes by property name/value
* do_fixup_by_compat{_u32} - Find matching nodes by compat
The _u32 variants work the same only the property they are setting
is know to be a 32-bit integer instead of a byte buffer.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
-rw-r--r-- | common/fdt_support.c | 55 | ||||
-rw-r--r-- | include/fdt_support.h | 11 |
2 files changed, 66 insertions, 0 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c index e848386fbef..c67bb3d390f 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -386,6 +386,61 @@ void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, do_fixup_by_path(fdt, path, prop, &val, sizeof(val), create); } +void do_fixup_by_prop(void *fdt, + const char *pname, const void *pval, int plen, + const char *prop, const void *val, int len, + int create) +{ + int off; +#if defined(DEBUG) + int i; + debug("Updating property '%s/%s' = ", node, prop); + for (i = 0; i < len; i++) + debug(" %.2x", *(u8*)(val+i)); + debug("\n"); +#endif + off = fdt_node_offset_by_prop_value(fdt, -1, pname, pval, plen); + while (off != -FDT_ERR_NOTFOUND) { + if (create || (fdt_get_property(fdt, off, prop, 0) != NULL)) + fdt_setprop(fdt, off, prop, val, len); + off = fdt_node_offset_by_prop_value(fdt, off, pname, pval, plen); + } +} + +void do_fixup_by_prop_u32(void *fdt, + const char *pname, const void *pval, int plen, + const char *prop, u32 val, int create) +{ + val = cpu_to_fdt32(val); + do_fixup_by_prop(fdt, pname, pval, plen, prop, &val, 4, create); +} + +void do_fixup_by_compat(void *fdt, const char *compat, + const char *prop, const void *val, int len, int create) +{ + int off = -1; +#if defined(DEBUG) + int i; + debug("Updating property '%s/%s' = ", node, prop); + for (i = 0; i < len; i++) + debug(" %.2x", *(u8*)(val+i)); + debug("\n"); +#endif + off = fdt_node_offset_by_compatible(fdt, -1, compat); + while (off != -FDT_ERR_NOTFOUND) { + if (create || (fdt_get_property(fdt, off, prop, 0) != 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, + const char *prop, u32 val, int create) +{ + val = cpu_to_fdt32(val); + do_fixup_by_compat(fdt, compat, prop, &val, 4, create); +} + void fdt_fixup_ethernet(void *fdt, bd_t *bd) { int node; diff --git a/include/fdt_support.h b/include/fdt_support.h index 150dd2b22fc..8f781d4405b 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -33,6 +33,17 @@ void do_fixup_by_path(void *fdt, const char *path, const char *prop, const void *val, int len, int create); void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, u32 val, int create); +void do_fixup_by_prop(void *fdt, + const char *pname, const void *pval, int plen, + const char *prop, const void *val, int len, + int create); +void do_fixup_by_prop_u32(void *fdt, + const char *pname, const void *pval, int plen, + const char *prop, u32 val, int create); +void do_fixup_by_compat(void *fdt, const char *compat, + const char *prop, const void *val, int len, int create); +void do_fixup_by_compat_u32(void *fdt, const char *compat, + const char *prop, u32 val, int create); void fdt_fixup_ethernet(void *fdt, bd_t *bd); #ifdef CONFIG_OF_HAS_UBOOT_ENV |