diff options
| author | Ilya Yanok <yanok@emcraft.com> | 2011-11-28 06:37:37 +0000 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2011-12-06 23:59:36 +0100 | 
| commit | 1df308e5be76ec42ade8fb21f623f36ba09217bd (patch) | |
| tree | 19ea8959f104971e98015ba79f03c94b0ad655d1 /drivers/mtd/nand/nand_spl_simple.c | |
| parent | ad2a7909a1430321224ea25c808494b4df8d1140 (diff) | |
| download | olio-uboot-2014.01-1df308e5be76ec42ade8fb21f623f36ba09217bd.tar.xz olio-uboot-2014.01-1df308e5be76ec42ade8fb21f623f36ba09217bd.zip | |
nand_spl_simple: add support for software ECC
This patch adds support for software ECC to the nand_spl_simple driver.
To enable this one have to define CONFIG_SPL_NAND_SOFTECC.
Tested on OMAP3.
Signed-off-by: Ilya Yanok <yanok@emcraft.com>
Acked-by: Scott Wood <scottwood@freescale.com>
Diffstat (limited to 'drivers/mtd/nand/nand_spl_simple.c')
| -rw-r--r-- | drivers/mtd/nand/nand_spl_simple.c | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/drivers/mtd/nand/nand_spl_simple.c b/drivers/mtd/nand/nand_spl_simple.c index e5003e646..ed821f244 100644 --- a/drivers/mtd/nand/nand_spl_simple.c +++ b/drivers/mtd/nand/nand_spl_simple.c @@ -21,6 +21,7 @@  #include <common.h>  #include <nand.h>  #include <asm/io.h> +#include <linux/mtd/nand_ecc.h>  static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS;  static nand_info_t mtd; @@ -204,7 +205,8 @@ static int nand_read_page(int block, int page, void *dst)  	oob_data = ecc_calc + 0x200;  	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { -		this->ecc.hwctl(&mtd, NAND_ECC_READ); +		if (this->ecc.mode != NAND_ECC_SOFT) +			this->ecc.hwctl(&mtd, NAND_ECC_READ);  		this->read_buf(&mtd, p, eccsize);  		this->ecc.calculate(&mtd, p, &ecc_calc[i]);  	} @@ -274,6 +276,13 @@ void nand_init(void)  		(void  __iomem *)CONFIG_SYS_NAND_BASE;  	board_nand_init(&nand_chip); +#ifdef CONFIG_SPL_NAND_SOFTECC +	if (nand_chip.ecc.mode == NAND_ECC_SOFT) { +		nand_chip.ecc.calculate = nand_calculate_ecc; +		nand_chip.ecc.correct = nand_correct_data; +	} +#endif +  	if (nand_chip.select_chip)  		nand_chip.select_chip(&mtd, 0);  } |