From a4d005c91d403d9f3d0272db6cc46202c06ec774 Mon Sep 17 00:00:00 2001 From: Axel Gembe Date: Mon, 12 May 2008 18:54:09 +0200 Subject: [PATCH] bcm963xx: flashmap support Signed-off-by: Axel Gembe --- arch/mips/bcm63xx/boards/board_bcm963xx.c | 19 +---------------- drivers/mtd/maps/bcm963xx-flash.c | 32 ++++++++++++++++++++++++---- drivers/mtd/redboot.c | 13 +++++++++-- 3 files changed, 38 insertions(+), 26 deletions(-) --- a/arch/mips/bcm63xx/dev-flash.c +++ b/arch/mips/bcm63xx/dev-flash.c @@ -30,7 +30,7 @@ static struct mtd_partition mtd_partitio } }; -static const char *bcm63xx_part_types[] = { "bcm63xxpart", NULL }; +static const char *bcm63xx_part_types[] = { "bcm63xxpart", "RedBoot", NULL }; static struct physmap_flash_data flash_data = { .width = 2, --- a/drivers/mtd/redboot.c +++ b/drivers/mtd/redboot.c @@ -72,6 +72,7 @@ static int parse_redboot_partitions(stru int nulllen = 0; int numslots; unsigned long offset; + unsigned long fis_origin = 0; #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED static char nullstring[] = "unallocated"; #endif @@ -178,6 +179,16 @@ static int parse_redboot_partitions(stru goto out; } + if (data && data->origin) { + fis_origin = data->origin; + } else { + for (i = 0; i < numslots; i++) { + if (!strncmp(buf[i].name, "RedBoot", 8)) { + fis_origin = (buf[i].flash_base & (master->size << 1) - 1); + } + } + } + for (i = 0; i < numslots; i++) { struct fis_list *new_fl, **prev; @@ -198,10 +209,10 @@ static int parse_redboot_partitions(stru goto out; } new_fl->img = &buf[i]; - if (data && data->origin) - buf[i].flash_base -= data->origin; - else - buf[i].flash_base &= master->size-1; + if (fis_origin) + buf[i].flash_base -= fis_origin; + + buf[i].flash_base &= (master->size << 1) - 1; /* I'm sure the JFFS2 code has done me permanent damage. * I now think the following is _normal_