diff options
Diffstat (limited to 'target/linux/adm5120-2.6/files/drivers/mtd')
-rw-r--r-- | target/linux/adm5120-2.6/files/drivers/mtd/maps/adm5120_mtd.c | 137 | ||||
-rw-r--r-- | target/linux/adm5120-2.6/files/drivers/mtd/myloader.c | 4 |
2 files changed, 77 insertions, 64 deletions
diff --git a/target/linux/adm5120-2.6/files/drivers/mtd/maps/adm5120_mtd.c b/target/linux/adm5120-2.6/files/drivers/mtd/maps/adm5120_mtd.c index 1fdbc7f100..426ab67c82 100644 --- a/target/linux/adm5120-2.6/files/drivers/mtd/maps/adm5120_mtd.c +++ b/target/linux/adm5120-2.6/files/drivers/mtd/maps/adm5120_mtd.c @@ -49,11 +49,13 @@ #include <linux/squashfs_fs.h> #include <linux/jffs2.h> #include <linux/crc32.h> -#ifdef CONFIG_SSB -#include <linux/ssb/ssb.h> -#endif #include <asm/io.h> +#include <asm/mach-adm5120/myloader.h> +#include <asm/mach-adm5120/adm5120_info.h> +extern int parse_myloader_partitions(struct mtd_info *master, + struct mtd_partition **pparts, + unsigned long origin); #define TRX_MAGIC 0x30524448 /* "HDR0" */ #define TRX_VERSION 1 @@ -76,9 +78,6 @@ struct trx_header { #define WINDOW_SIZE 0x400000 #define BUSWIDTH 2 -#ifdef CONFIG_SSB -extern struct ssb_bus ssb; -#endif static struct mtd_info *adm5120_mtd; static struct map_info adm5120_map = { @@ -90,7 +89,7 @@ static struct map_info adm5120_map = { #ifdef CONFIG_MTD_PARTITIONS -static struct mtd_partition adm5120_parts[] = { +static struct mtd_partition adm5120_cfe_parts[] = { { name: "cfe", offset: 0, size: 0, mask_flags: MTD_WRITEABLE, }, { name: "linux", offset: 0, size: 0, }, { name: "rootfs", offset: 0, size: 0, }, @@ -325,91 +324,78 @@ init_mtd_partitions(struct mtd_info *mtd, size_t size) return NULL; /* boot loader */ - adm5120_parts[0].offset = 0; - adm5120_parts[0].size = cfe_size; + adm5120_cfe_parts[0].offset = 0; + adm5120_cfe_parts[0].size = cfe_size; /* nvram */ if (cfe_size != 384 * 1024) { - adm5120_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); - adm5120_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize); + adm5120_cfe_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize); + adm5120_cfe_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize); } else { /* nvram (old 128kb config partition on netgear wgt634u) */ - adm5120_parts[3].offset = adm5120_parts[0].size; - adm5120_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize); + adm5120_cfe_parts[3].offset = adm5120_cfe_parts[0].size; + adm5120_cfe_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize); } /* linux (kernel and rootfs) */ if (cfe_size != 384 * 1024) { - adm5120_parts[1].offset = adm5120_parts[0].size; - adm5120_parts[1].size = adm5120_parts[3].offset - - adm5120_parts[1].offset; + adm5120_cfe_parts[1].offset = adm5120_cfe_parts[0].size; + adm5120_cfe_parts[1].size = adm5120_cfe_parts[3].offset - + adm5120_cfe_parts[1].offset; } else { /* do not count the elf loader, which is on one block */ - adm5120_parts[1].offset = adm5120_parts[0].size + - adm5120_parts[3].size + mtd->erasesize; - adm5120_parts[1].size = size - - adm5120_parts[0].size - - (2*adm5120_parts[3].size) - + adm5120_cfe_parts[1].offset = adm5120_cfe_parts[0].size + + adm5120_cfe_parts[3].size + mtd->erasesize; + adm5120_cfe_parts[1].size = size - + adm5120_cfe_parts[0].size - + (2*adm5120_cfe_parts[3].size) - mtd->erasesize; } /* find and size rootfs */ - if (find_root(mtd,size,&adm5120_parts[2])==0) { + if (find_root(mtd,size,&adm5120_cfe_parts[2])==0) { /* entirely jffs2 */ - adm5120_parts[4].name = NULL; - adm5120_parts[2].size = size - adm5120_parts[2].offset - - adm5120_parts[3].size; + adm5120_cfe_parts[4].name = NULL; + adm5120_cfe_parts[2].size = size - adm5120_cfe_parts[2].offset - + adm5120_cfe_parts[3].size; } else { /* legacy setup */ /* calculate leftover flash, and assign it to the jffs2 partition */ if (cfe_size != 384 * 1024) { - adm5120_parts[4].offset = adm5120_parts[2].offset + - adm5120_parts[2].size; - if ((adm5120_parts[4].offset % mtd->erasesize) > 0) { - adm5120_parts[4].offset += mtd->erasesize - - (adm5120_parts[4].offset % mtd->erasesize); + adm5120_cfe_parts[4].offset = adm5120_cfe_parts[2].offset + + adm5120_cfe_parts[2].size; + if ((adm5120_cfe_parts[4].offset % mtd->erasesize) > 0) { + adm5120_cfe_parts[4].offset += mtd->erasesize - + (adm5120_cfe_parts[4].offset % mtd->erasesize); } - adm5120_parts[4].size = adm5120_parts[3].offset - - adm5120_parts[4].offset; + adm5120_cfe_parts[4].size = adm5120_cfe_parts[3].offset - + adm5120_cfe_parts[4].offset; } else { - adm5120_parts[4].offset = adm5120_parts[2].offset + - adm5120_parts[2].size; - if ((adm5120_parts[4].offset % mtd->erasesize) > 0) { - adm5120_parts[4].offset += mtd->erasesize - - (adm5120_parts[4].offset % mtd->erasesize); + adm5120_cfe_parts[4].offset = adm5120_cfe_parts[2].offset + + adm5120_cfe_parts[2].size; + if ((adm5120_cfe_parts[4].offset % mtd->erasesize) > 0) { + adm5120_cfe_parts[4].offset += mtd->erasesize - + (adm5120_cfe_parts[4].offset % mtd->erasesize); } - adm5120_parts[4].size = size - adm5120_parts[3].size - - adm5120_parts[4].offset; + adm5120_cfe_parts[4].size = size - adm5120_cfe_parts[3].size - + adm5120_cfe_parts[4].offset; } } - return adm5120_parts; + return adm5120_cfe_parts; } #endif int __init init_adm5120_map(void) { -#ifdef CONFIG_SSB - struct ssb_mipscore *mcore = &ssb.mipscore; -#endif size_t size; int ret = 0; -#ifdef CONFIG_MTD_PARTITIONS +#if defined (CONFIG_MTD_PARTITIONS) || (CONFIG_MTD_MYLOADER_PARTS) struct mtd_partition *parts; - int i; + int i, parsed_nr_parts = 0; #endif -#ifdef CONFIG_SSB - u32 window = mcore->flash_window; - u32 window_size = mcore->flash_window_size; - - printk("adm5120 : flash init: 0x%08x 0x%08x\n", window, window_size); - adm5120_map.phys = window; - adm5120_map.size = window_size; - adm5120_map.virt = ioremap_nocache(window, window_size); -#else printk("adm5120 : flash init : 0x%08x 0x%08x\n", WINDOW_ADDR, WINDOW_SIZE); adm5120_map.virt = ioremap_nocache(WINDOW_ADDR, WINDOW_SIZE); -#endif if (!adm5120_map.virt) { printk("Failed to ioremap\n"); @@ -430,12 +416,41 @@ int __init init_adm5120_map(void) printk(KERN_NOTICE "Flash device: 0x%x at 0x%x\n", size, WINDOW_ADDR); #ifdef CONFIG_MTD_PARTITIONS - parts = init_mtd_partitions(adm5120_mtd, size); - for (i = 0; parts[i].name; i++); - ret = add_mtd_partitions(adm5120_mtd, parts, i); - if (ret) { - printk(KERN_ERR "Flash: add_mtd_partitions failed\n"); - goto fail; + + if (adm5120_info.boot_loader == BOOT_LOADER_CFE) + { + printk(KERN_NOTICE "adm5120 : using CFE flash mapping\n"); + parts = init_mtd_partitions(adm5120_mtd, size); + + for (i = 0; parts[i].name; i++); + ret = add_mtd_partitions(adm5120_mtd, parts, i); + + if (ret) { + printk(KERN_ERR "Flash: add_mtd_partitions failed\n"); + goto fail; + } + } +#endif +#ifdef CONFIG_MTD_MYLOADER_PARTS + if (adm5120_info.boot_loader == BOOT_LOADER_MYLOADER) + { + printk(KERN_NOTICE "adm5120 : using MyLoader flash mapping\n"); + char *part_type; + + if (parsed_nr_parts == 0) { + ret = parse_myloader_partitions(adm5120_mtd, &parts, 0); + + if (ret > 0) { + part_type ="MyLoader"; + parsed_nr_parts = ret; + } + } + ret = add_mtd_partitions(adm5120_mtd, parts, parsed_nr_parts); + + if (ret) { + printk(KERN_ERR "Flash: add_mtd_partitions failed\n"); + goto fail; + } } #endif return 0; diff --git a/target/linux/adm5120-2.6/files/drivers/mtd/myloader.c b/target/linux/adm5120-2.6/files/drivers/mtd/myloader.c index 1bdd798e46..023ae5c61f 100644 --- a/target/linux/adm5120-2.6/files/drivers/mtd/myloader.c +++ b/target/linux/adm5120-2.6/files/drivers/mtd/myloader.c @@ -40,7 +40,7 @@ #define NAME_PARTITION_TABLE "Partition Table" #define BLOCK_LEN_MIN 0x10000 -static int parse_myloader_partitions(struct mtd_info *master, +int parse_myloader_partitions(struct mtd_info *master, struct mtd_partition **pparts, unsigned long origin) { @@ -171,8 +171,6 @@ static void __exit mylo_mtd_parser_exit(void) module_init(mylo_mtd_parser_init); module_exit(mylo_mtd_parser_exit); -EXPORT_SYMBOL_GPL(parse_myloader_partitions); - MODULE_AUTHOR("Gabor Juhos <juhosg@freemail.hu>"); MODULE_DESCRIPTION("Parsing code for MyLoader partition tables"); MODULE_LICENSE("GPL"); |