diff options
Diffstat (limited to 'common/fdt_support.c')
-rw-r--r-- | common/fdt_support.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/common/fdt_support.c b/common/fdt_support.c index 6f32e3f..b8a3dc9 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -620,7 +620,7 @@ int fdt_fixup_nor_flash_size(void *blob) int off; int len; struct fdt_property *prop; - u32 *reg; + u32 *reg, *reg2; int i; for (i = 0; i < 2; i++) { @@ -640,18 +640,21 @@ int fdt_fixup_nor_flash_size(void *blob) * There might be multiple reg-tuples, * so loop through them all */ - len /= tuple_size; - reg = (u32 *)&prop->data[0]; - for (idx = 0; idx < len; idx++) { + reg = reg2 = (u32 *)&prop->data[0]; + for (idx = 0; idx < (len / tuple_size); idx++) { /* * Update size in reg property */ reg[2] = flash_get_bank_size(reg[0], idx); - fdt_setprop(blob, off, "reg", reg, - tuple_size); - reg += tuple_size; + + /* + * Point to next reg tuple + */ + reg += 3; } + + fdt_setprop(blob, off, "reg", reg2, len); } /* Move to next compatible node */ @@ -664,6 +667,16 @@ int fdt_fixup_nor_flash_size(void *blob) } #endif +int fdt_increase_size(void *fdt, int add_len) +{ + int newlen; + + newlen = fdt_totalsize(fdt) + add_len; + + /* Open in place with a new len */ + return fdt_open_into(fdt, fdt, newlen); +} + #ifdef CONFIG_FDT_FIXUP_PARTITIONS #include <jffs2/load_kernel.h> #include <mtd_node.h> @@ -698,16 +711,6 @@ int fdt_del_subnodes(const void *blob, int parent_offset) return 0; } -int fdt_increase_size(void *fdt, int add_len) -{ - int newlen; - - newlen = fdt_totalsize(fdt) + add_len; - - /* Open in place with a new len */ - return fdt_open_into(fdt, fdt, newlen); -} - int fdt_del_partitions(void *blob, int parent_offset) { const void *prop; @@ -1186,3 +1189,32 @@ int fdt_alloc_phandle(void *blob) return phandle + 1; } + +#if defined(CONFIG_VIDEO) +int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf) +{ + int noff; + int ret; + + noff = fdt_node_offset_by_compatible(blob, -1, compat); + if (noff != -FDT_ERR_NOTFOUND) { + debug("%s: %s\n", fdt_get_name(blob, noff, 0), compat); +add_edid: + ret = fdt_setprop(blob, noff, "edid", edid_buf, 128); + if (ret == -FDT_ERR_NOSPACE) { + ret = fdt_increase_size(blob, 512); + if (!ret) + goto add_edid; + else + goto err_size; + } else if (ret < 0) { + printf("Can't add property: %s\n", fdt_strerror(ret)); + return ret; + } + } + return 0; +err_size: + printf("Can't increase blob size: %s\n", fdt_strerror(ret)); + return ret; +} +#endif |