From: Sylvain Lemieux <slemi...@tycoint.com>

Incorporate ECC layout for small page NAND from legacy
LPCLinux NXP BSP.
The code taken from the legacy patch is:
- lpc32xx SLC NAND driver (ECC layout for small page)

This layout is matching the lpc32xx NAND SLC Kernel driver:
https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/drivers/mtd/nand/lpc32xx_slc.c?id=refs/tags/v4.1.3

Signed-off-by: Sylvain Lemieux <slemi...@tycoint.com>
---
Changes from v5 to v6:
* Updated comment regarding default OOB layout.

Changes from v4 to v5:
* No changes; patch context updated.

Changes from v3 to v4:
* No changes.

Changes from v2 to v3:
* No changes; patch context updated.

Changes from v1 to v2:
* Move ECC layout for small page NAND into a separate patch.

The legacy BSP patch (u-boot-2009.03_lpc32x0-v1.07.patch.tar.bz2)
was downloaded from the LPCLinux Web site.

 drivers/mtd/nand/lpc32xx_nand_slc.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/nand/lpc32xx_nand_slc.c 
b/drivers/mtd/nand/lpc32xx_nand_slc.c
index 2a32264..088818f 100644
--- a/drivers/mtd/nand/lpc32xx_nand_slc.c
+++ b/drivers/mtd/nand/lpc32xx_nand_slc.c
@@ -94,6 +94,19 @@ struct lpc32xx_nand_slc_regs {
 #define TAC_R_HOLD(n)          (max_t(uint32_t, (n), 0xF) << 4)
 #define TAC_R_SETUP(n)         (max_t(uint32_t, (n), 0xF) << 0)
 
+/* NAND ECC Layout for small page NAND devices
+ * Note: For large page devices, the default layouts are used. */
+static struct nand_ecclayout lpc32xx_nand_oob_16 = {
+       .eccbytes = 6,
+       .eccpos = {10, 11, 12, 13, 14, 15},
+       .oobfree = {
+               {.offset = 0,
+                . length = 4},
+               {.offset = 6,
+                . length = 4}
+               }
+};
+
 #if defined(CONFIG_DMA_LPC32XX)
 /* Total ECC bytes and size; refer to board_nand_init() for details. */
 #define ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / CONFIG_SYS_NAND_ECCSIZE)
@@ -530,7 +543,7 @@ int board_nand_init(struct nand_chip *lpc32xx_chip)
        lpc32xx_chip->write_buf  = lpc32xx_write_buf;
 
        /*
-        * Use default ECC layout, but these values are predefined
+        * These values are predefined
         * for both small and large page NAND flash devices.
         */
        lpc32xx_chip->ecc.size     = CONFIG_SYS_NAND_ECCSIZE;
@@ -539,6 +552,9 @@ int board_nand_init(struct nand_chip *lpc32xx_chip)
 
        lpc32xx_chip->ecc.strength = 1;
 
+       if (CONFIG_SYS_NAND_PAGE_SIZE != NAND_LARGE_BLOCK_PAGE_SIZE)
+               lpc32xx_chip->ecc.layout = &lpc32xx_nand_oob_16;
+
 #if defined(CONFIG_SYS_NAND_USE_FLASH_BBT)
        lpc32xx_chip->bbt_options |= NAND_BBT_USE_FLASH;
 #endif
-- 
1.8.3.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to