diff options
| author | Guennadi Liakhovetski <lg@denx.de> | 2008-08-06 21:42:07 +0200 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2008-08-12 11:31:32 -0500 | 
| commit | aa646643b6bc250cb3a4966bf728876e0c10d329 (patch) | |
| tree | 09af8a50c8ef75cbc17594ebc487c615de6494a8 | |
| parent | 4f32d7760a58fe73981b6edc0b0751565d2daa4c (diff) | |
| download | olio-uboot-2014.01-aa646643b6bc250cb3a4966bf728876e0c10d329.tar.xz olio-uboot-2014.01-aa646643b6bc250cb3a4966bf728876e0c10d329.zip | |
nand_spl: Support page-aligned read in nand_load, use chipselect
Supporting page-aligned reads doesn't incure any sinificant overhead, just
a small change in the algorithm. Also replace in_8 with readb, since there
is no in_8 on ARM.
Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
Signed-off-by: Scott Wood <scottwood@freescale.com>
| -rw-r--r-- | nand_spl/nand_boot.c | 30 | 
1 files changed, 20 insertions, 10 deletions
| diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c index 81b4dfc54..16d128fc8 100644 --- a/nand_spl/nand_boot.c +++ b/nand_spl/nand_boot.c @@ -131,7 +131,7 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)  	/*  	 * Read one byte  	 */ -	if (in_8(this->IO_ADDR_R) != 0xff) +	if (readb(this->IO_ADDR_R) != 0xff)  		return 1;  	return 0; @@ -184,29 +184,33 @@ static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)  	return 0;  } -static int nand_load(struct mtd_info *mtd, int offs, int uboot_size, uchar *dst) +static int nand_load(struct mtd_info *mtd, unsigned int offs, +                     unsigned int uboot_size, uchar *dst)  { -	int block; -	int blockcopy_count; -	int page; +	unsigned int block, lastblock; +	unsigned int page;  	/* -	 * offs has to be aligned to a block address! +	 * offs has to be aligned to a page address!  	 */  	block = offs / CFG_NAND_BLOCK_SIZE; -	blockcopy_count = 0; +	lastblock = (offs + uboot_size - 1) / CFG_NAND_BLOCK_SIZE; +	page = (offs % CFG_NAND_BLOCK_SIZE) / CFG_NAND_PAGE_SIZE; -	while (blockcopy_count < (uboot_size / CFG_NAND_BLOCK_SIZE)) { +	while (block <= lastblock) {  		if (!nand_is_bad_block(mtd, block)) {  			/*  			 * Skip bad blocks  			 */ -			for (page = 0; page < CFG_NAND_PAGE_COUNT; page++) { +			while (page < CFG_NAND_PAGE_COUNT) {  				nand_read_page(mtd, block, page, dst);  				dst += CFG_NAND_PAGE_SIZE; +				page++;  			} -			blockcopy_count++; +			page = 0; +		} else { +			lastblock++;  		}  		block++; @@ -235,12 +239,18 @@ void nand_boot(void)  	nand_chip.dev_ready = NULL;	/* preset to NULL */  	board_nand_init(&nand_chip); +	if (nand_chip.select_chip) +		nand_chip.select_chip(&nand_info, 0); +  	/*  	 * Load U-Boot image from NAND into RAM  	 */  	ret = nand_load(&nand_info, CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE,  			(uchar *)CFG_NAND_U_BOOT_DST); +	if (nand_chip.select_chip) +		nand_chip.select_chip(&nand_info, -1); +  	/*  	 * Jump to U-Boot image  	 */ |