diff options
Diffstat (limited to 'target')
| -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 1fdbc7f10..426ab67c8 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 1bdd798e4..023ae5c61 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"); | 
