nand_spl_simple: add support for software ECC
authorIlya Yanok <yanok@emcraft.com>
Mon, 28 Nov 2011 06:37:37 +0000 (06:37 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Tue, 6 Dec 2011 22:59:36 +0000 (23:59 +0100)
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>
drivers/mtd/nand/nand_ecc.c
drivers/mtd/nand/nand_spl_simple.c

index 52bc916afb7370b30763b776a86f10b8d31c5861..81f0e0812b126b99d9aaee98d79dea7d2ec1db7a 100644 (file)
@@ -50,7 +50,7 @@
  * only nand_correct_data() is needed
  */
 
-#ifndef CONFIG_NAND_SPL
+#if !defined(CONFIG_NAND_SPL) || defined(CONFIG_SPL_NAND_SOFTECC)
 /*
  * Pre-calculated 256-way 1 byte column parity
  */
index e5003e646e2863ad9bcfa6b4d91e3550a2b52f9c..ed821f244d1720989e0b0c6f4dc0994dbfc94554 100644 (file)
@@ -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);
 }