diff options
Diffstat (limited to 'nand_spl/nand_boot.c')
| -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  	 */ |