diff options
Diffstat (limited to 'board/keymile/km8xx/km8xx.c')
-rw-r--r-- | board/keymile/km8xx/km8xx.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/board/keymile/km8xx/km8xx.c b/board/keymile/km8xx/km8xx.c index 7c58179..ec883a4 100644 --- a/board/keymile/km8xx/km8xx.c +++ b/board/keymile/km8xx/km8xx.c @@ -159,12 +159,6 @@ int hush_init_var (void) } #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) -extern int fdt_set_node_and_value (void *blob, - char *nodename, - char *regname, - void *var, - int size); - /* * update "memory" property in the blob */ @@ -172,33 +166,53 @@ void ft_blob_update (void *blob, bd_t *bd) { ulong brg_data[1] = {0}; ulong memory_data[2] = {0}; - ulong flash_data[4] = {0}; + ulong *flash_data = NULL; ulong flash_reg[3] = {0}; - uchar enetaddr[6]; + flash_info_t *info; + int len; + int i = 0; memory_data[0] = cpu_to_be32 (bd->bi_memstart); memory_data[1] = cpu_to_be32 (bd->bi_memsize); fdt_set_node_and_value (blob, "/memory", "reg", memory_data, sizeof (memory_data)); - flash_data[2] = cpu_to_be32 (bd->bi_flashstart); - flash_data[3] = cpu_to_be32 (bd->bi_flashsize); + len = fdt_get_node_and_value (blob, "/localbus", "ranges", + (void *)&flash_data); + + if (flash_data == NULL) { + printf ("%s: error /localbus/ranges entry\n", __FUNCTION__); + return; + } + + /* update Flash addr, size */ + while ( i < (len / 4)) { + switch (flash_data[i]) { + case 0: + info = flash_get_info(CONFIG_SYS_FLASH_BASE); + flash_data[i + 1] = 0; + flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE); + flash_data[i + 3] = cpu_to_be32 (info->size); + break; + default: + break; + } + i += 4; + } fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data, - sizeof (flash_data)); + len); flash_reg[2] = cpu_to_be32 (bd->bi_flashsize); fdt_set_node_and_value (blob, "/localbus/flash@0,0", "reg", flash_reg, sizeof (flash_reg)); - /* BRG */ brg_data[0] = cpu_to_be32 (bd->bi_busfreq); fdt_set_node_and_value (blob, "/soc/cpm", "brg-frequency", brg_data, sizeof (brg_data)); /* MAC adr */ - eth_getenv_enetaddr("ethaddr", enetaddr); fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address", - enetaddr, sizeof (u8) * 6); + bd->bi_enetaddr, sizeof (u8) * 6); } void ft_board_setup(void *blob, bd_t *bd) |