diff options
Diffstat (limited to 'drivers/mtd/nand/nand_spl_simple.c')
| -rw-r--r-- | drivers/mtd/nand/nand_spl_simple.c | 42 | 
1 files changed, 16 insertions, 26 deletions
| diff --git a/drivers/mtd/nand/nand_spl_simple.c b/drivers/mtd/nand/nand_spl_simple.c index 7eb08a3b0..4a4d02f4c 100644 --- a/drivers/mtd/nand/nand_spl_simple.c +++ b/drivers/mtd/nand/nand_spl_simple.c @@ -27,6 +27,11 @@ static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS;  static nand_info_t mtd;  static struct nand_chip nand_chip; +#define ECCSTEPS	(CONFIG_SYS_NAND_PAGE_SIZE / \ +					CONFIG_SYS_NAND_ECCSIZE) +#define ECCTOTAL	(ECCSTEPS * CONFIG_SYS_NAND_ECCBYTES) + +  #if (CONFIG_SYS_NAND_PAGE_SIZE <= 512)  /*   * NAND command for small page NAND devices (512) @@ -145,29 +150,21 @@ static int nand_is_bad_block(int block)  static int nand_read_page(int block, int page, uchar *dst)  {  	struct nand_chip *this = mtd.priv; -	u_char *ecc_calc; -	u_char *ecc_code; -	u_char *oob_data; +	u_char ecc_calc[ECCTOTAL]; +	u_char ecc_code[ECCTOTAL]; +	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];  	int i;  	int eccsize = CONFIG_SYS_NAND_ECCSIZE;  	int eccbytes = CONFIG_SYS_NAND_ECCBYTES; -	int eccsteps = CONFIG_SYS_NAND_ECCSTEPS; +	int eccsteps = ECCSTEPS;  	uint8_t *p = dst; -	/* -	 * No malloc available for now, just use some temporary locations -	 * in SDRAM -	 */ -	ecc_calc = (u_char *)(CONFIG_SYS_SDRAM_BASE + 0x10000); -	ecc_code = ecc_calc + 0x100; -	oob_data = ecc_calc + 0x200; -  	nand_command(block, page, 0, NAND_CMD_READOOB);  	this->read_buf(&mtd, oob_data, CONFIG_SYS_NAND_OOBSIZE);  	nand_command(block, page, 0, NAND_CMD_READ0);  	/* Pick the ECC bytes out of the oob data */ -	for (i = 0; i < CONFIG_SYS_NAND_ECCTOTAL; i++) +	for (i = 0; i < ECCTOTAL; i++)  		ecc_code[i] = oob_data[nand_ecc_pos[i]]; @@ -184,24 +181,17 @@ static int nand_read_page(int block, int page, uchar *dst)  static int nand_read_page(int block, int page, void *dst)  {  	struct nand_chip *this = mtd.priv; -	u_char *ecc_calc; -	u_char *ecc_code; -	u_char *oob_data; +	u_char ecc_calc[ECCTOTAL]; +	u_char ecc_code[ECCTOTAL]; +	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];  	int i;  	int eccsize = CONFIG_SYS_NAND_ECCSIZE;  	int eccbytes = CONFIG_SYS_NAND_ECCBYTES; -	int eccsteps = CONFIG_SYS_NAND_ECCSTEPS; +	int eccsteps = ECCSTEPS;  	uint8_t *p = dst;  	nand_command(block, page, 0, NAND_CMD_READ0); -	/* No malloc available for now, just use some temporary locations -	 * in SDRAM -	 */ -	ecc_calc = (u_char *)(CONFIG_SYS_SDRAM_BASE + 0x10000); -	ecc_code = ecc_calc + 0x100; -	oob_data = ecc_calc + 0x200; -  	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {  		if (this->ecc.mode != NAND_ECC_SOFT)  			this->ecc.hwctl(&mtd, NAND_ECC_READ); @@ -211,10 +201,10 @@ static int nand_read_page(int block, int page, void *dst)  	this->read_buf(&mtd, oob_data, CONFIG_SYS_NAND_OOBSIZE);  	/* Pick the ECC bytes out of the oob data */ -	for (i = 0; i < CONFIG_SYS_NAND_ECCTOTAL; i++) +	for (i = 0; i < ECCTOTAL; i++)  		ecc_code[i] = oob_data[nand_ecc_pos[i]]; -	eccsteps = CONFIG_SYS_NAND_ECCSTEPS; +	eccsteps = ECCSTEPS;  	p = dst;  	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { |