]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'master' of git://git.denx.de/u-boot-nand-flash
authorTom Rini <trini@ti.com>
Wed, 5 Mar 2014 02:23:42 +0000 (21:23 -0500)
committerTom Rini <trini@ti.com>
Wed, 5 Mar 2014 02:23:42 +0000 (21:23 -0500)
37 files changed:
arch/arm/include/asm/arch-am33xx/cpu.h
arch/arm/include/asm/arch-am33xx/omap_gpmc.h [deleted file]
arch/arm/include/asm/arch-am33xx/sys_proto.h
arch/arm/include/asm/arch-omap3/cpu.h
arch/arm/include/asm/arch-omap3/mem.h
arch/arm/include/asm/arch-omap3/omap_gpmc.h [deleted file]
arch/arm/include/asm/arch-omap3/sys_proto.h
arch/arm/include/asm/arch-omap4/cpu.h
arch/arm/include/asm/arch-omap4/sys_proto.h
arch/arm/include/asm/arch-omap5/cpu.h
arch/arm/include/asm/arch-omap5/sys_proto.h
arch/arm/include/asm/omap_gpmc.h [deleted file]
board/isee/igep00x0/igep00x0.c
board/overo/overo.c
board/ti/am335x/README
drivers/mtd/nand/omap_elm.c
drivers/mtd/nand/omap_gpmc.c
include/configs/am335x_evm.h
include/configs/am335x_igep0033.h
include/configs/am3517_crane.h
include/configs/am3517_evm.h
include/configs/cm_t35.h
include/configs/devkit8000.h
include/configs/dig297.h
include/configs/mcx.h
include/configs/omap3_beagle.h
include/configs/omap3_evm_common.h
include/configs/omap3_igep00x0.h
include/configs/omap3_logic.h
include/configs/omap3_overo.h
include/configs/omap3_pandora.h
include/configs/omap3_zoom1.h
include/configs/siemens-am33x-common.h
include/configs/tam3517-common.h
include/configs/tricorder.h
include/linux/mtd/omap_elm.h [moved from arch/arm/include/asm/omap_elm.h with 100% similarity]
include/linux/mtd/omap_gpmc.h [new file with mode: 0644]

index 71bed4efab85fa9229f9bdf14e17f1a265c449fb..d9f0306b0abbff0a51611cb9d914bd809b4b992d 100644 (file)
 
 #ifndef __KERNEL_STRICT_NAMES
 #ifndef __ASSEMBLY__
-struct gpmc_cs {
-       u32 config1;            /* 0x00 */
-       u32 config2;            /* 0x04 */
-       u32 config3;            /* 0x08 */
-       u32 config4;            /* 0x0C */
-       u32 config5;            /* 0x10 */
-       u32 config6;            /* 0x14 */
-       u32 config7;            /* 0x18 */
-       u32 nand_cmd;           /* 0x1C */
-       u32 nand_adr;           /* 0x20 */
-       u32 nand_dat;           /* 0x24 */
-       u8 res[8];              /* blow up to 0x30 byte */
-};
-
-struct bch_res_0_3 {
-       u32 bch_result_x[4];
-};
-
-struct gpmc {
-       u8 res1[0x10];
-       u32 sysconfig;          /* 0x10 */
-       u8 res2[0x4];
-       u32 irqstatus;          /* 0x18 */
-       u32 irqenable;          /* 0x1C */
-       u8 res3[0x20];
-       u32 timeout_control;    /* 0x40 */
-       u8 res4[0xC];
-       u32 config;             /* 0x50 */
-       u32 status;             /* 0x54 */
-       u8 res5[0x8];           /* 0x58 */
-       struct gpmc_cs cs[8];   /* 0x60, 0x90, .. */
-       u8 res6[0x14];          /* 0x1E0 */
-       u32 ecc_config;         /* 0x1F4 */
-       u32 ecc_control;        /* 0x1F8 */
-       u32 ecc_size_config;    /* 0x1FC */
-       u32 ecc1_result;        /* 0x200 */
-       u32 ecc2_result;        /* 0x204 */
-       u32 ecc3_result;        /* 0x208 */
-       u32 ecc4_result;        /* 0x20C */
-       u32 ecc5_result;        /* 0x210 */
-       u32 ecc6_result;        /* 0x214 */
-       u32 ecc7_result;        /* 0x218 */
-       u32 ecc8_result;        /* 0x21C */
-       u32 ecc9_result;        /* 0x220 */
-       u8 res7[12];            /* 0x224 */
-       u32 testmomde_ctrl;     /* 0x230 */
-       u8 res8[12];            /* 0x234 */
-       struct bch_res_0_3 bch_result_0_3[2];   /* 0x240 */
-};
 
-/* Used for board specific gpmc initialization */
-extern struct gpmc *gpmc_cfg;
 
 #ifndef CONFIG_AM43XX
 /* Encapsulating core pll registers */
diff --git a/arch/arm/include/asm/arch-am33xx/omap_gpmc.h b/arch/arm/include/asm/arch-am33xx/omap_gpmc.h
deleted file mode 100644 (file)
index 00ad1d0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * (C) Copyright 2004-2008 Texas Instruments, <www.ti.com>
- * Rohit Choraria <rohitkc@ti.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-#ifndef __ASM_ARCH_OMAP_GPMC_H
-#define __ASM_ARCH_OMAP_GPMC_H
-
-/* These GPMC_NAND_HW_BCHx_ECC_LAYOUT defines are based on AM33xx ELM */
-#define GPMC_NAND_HW_BCH4_ECC_LAYOUT {\
-       .eccbytes = 32,\
-       .eccpos = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\
-                               16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,\
-                               28, 29, 30, 31, 32, 33},\
-       .oobfree = {\
-               {.offset = 34,\
-                .length = 30 } } \
-}
-
-#define GPMC_NAND_HW_BCH8_ECC_LAYOUT {\
-       .eccbytes = 56,\
-       .eccpos = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\
-                               16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,\
-                               28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\
-                               40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,\
-                               52, 53, 54, 55, 56, 57},\
-       .oobfree = {\
-               {.offset = 58,\
-                .length = 6 } } \
-}
-
-#define GPMC_NAND_HW_BCH16_ECC_LAYOUT {\
-       .eccbytes = 104,\
-       .eccpos = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\
-                               16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,\
-                               28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\
-                               40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,\
-                               52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\
-                               64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,\
-                               76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,\
-                               88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\
-                               100, 101, 102, 103, 104, 105},\
-       .oobfree = {\
-               {.offset = 106,\
-                .length = 8 } } \
-}
-#endif /* __ASM_ARCH_OMAP_GPMC_H */
index 2e5c356e448746e225636b920820ffb867a43400..91ff2ad0e4cd49b3f86df6ba2be439e92387beb6 100644 (file)
@@ -10,6 +10,7 @@
 
 #ifndef _SYS_PROTO_H_
 #define _SYS_PROTO_H_
+#include <linux/mtd/omap_gpmc.h>
 #include <asm/arch/cpu.h>
 
 #define BOARD_REV_ID   0x0
index 61ec8f24e0a58eccd479f91be8b23580bac1c631..4d06ef83fee31255d41c69834edee5b7dab0c141 100644 (file)
@@ -77,59 +77,7 @@ struct ctrl_id {
 #define GPMC_CONFIG_CS0_BASE   (GPMC_BASE + GPMC_CONFIG_CS0)
 
 #ifndef __KERNEL_STRICT_NAMES
-#ifndef __ASSEMBLY__
-struct gpmc_cs {
-       u32 config1;            /* 0x00 */
-       u32 config2;            /* 0x04 */
-       u32 config3;            /* 0x08 */
-       u32 config4;            /* 0x0C */
-       u32 config5;            /* 0x10 */
-       u32 config6;            /* 0x14 */
-       u32 config7;            /* 0x18 */
-       u32 nand_cmd;           /* 0x1C */
-       u32 nand_adr;           /* 0x20 */
-       u32 nand_dat;           /* 0x24 */
-       u8 res[8];              /* blow up to 0x30 byte */
-};
-
-struct bch_res_0_3 {
-       u32 bch_result_x[4];
-};
-
-struct gpmc {
-       u8 res1[0x10];
-       u32 sysconfig;          /* 0x10 */
-       u8 res2[0x4];
-       u32 irqstatus;          /* 0x18 */
-       u32 irqenable;          /* 0x1C */
-       u8 res3[0x20];
-       u32 timeout_control;    /* 0x40 */
-       u8 res4[0xC];
-       u32 config;             /* 0x50 */
-       u32 status;             /* 0x54 */
-       u8 res5[0x8];   /* 0x58 */
-       struct gpmc_cs cs[8];   /* 0x60, 0x90, .. */
-       u8 res6[0x14];          /* 0x1E0 */
-       u32 ecc_config;         /* 0x1F4 */
-       u32 ecc_control;        /* 0x1F8 */
-       u32 ecc_size_config;    /* 0x1FC */
-       u32 ecc1_result;        /* 0x200 */
-       u32 ecc2_result;        /* 0x204 */
-       u32 ecc3_result;        /* 0x208 */
-       u32 ecc4_result;        /* 0x20C */
-       u32 ecc5_result;        /* 0x210 */
-       u32 ecc6_result;        /* 0x214 */
-       u32 ecc7_result;        /* 0x218 */
-       u32 ecc8_result;        /* 0x21C */
-       u32 ecc9_result;        /* 0x220 */
-       u8 res7[0x1C];          /* fill up to 0x240 */
-       struct bch_res_0_3 bch_result_0_3[7];   /* 0x240 */
-};
-
-/* Used for board specific gpmc initialization */
-extern struct gpmc *gpmc_cfg;
-
-#else /* __ASSEMBLY__ */
+#ifdef __ASSEMBLY__
 #define GPMC_CONFIG1           0x00
 #define GPMC_CONFIG2           0x04
 #define GPMC_CONFIG3           0x08
index bcc22c43e1c7db62e661063264a7c48141f57f69..18041913c4153dd0cf1474347bac8f704c57abfc 100644 (file)
@@ -419,6 +419,16 @@ enum {
 #define NET_GPMC_CONFIG6       0x00000FCF
 #define NET_GPMC_CONFIG7       0x00000f6c
 
+/* GPMC CS configuration for an SMSC LAN9221 ethernet controller */
+#define NET_LAN9221_GPMC_CONFIG1    0x00001000
+#define NET_LAN9221_GPMC_CONFIG2    0x00060700
+#define NET_LAN9221_GPMC_CONFIG3    0x00020201
+#define NET_LAN9221_GPMC_CONFIG4    0x06000700
+#define NET_LAN9221_GPMC_CONFIG5    0x0006090A
+#define NET_LAN9221_GPMC_CONFIG6    0x87030000
+#define NET_LAN9221_GPMC_CONFIG7    0x00000f6c
+
+
 /* max number of GPMC Chip Selects */
 #define GPMC_MAX_CS    8
 /* max number of GPMC regs */
diff --git a/arch/arm/include/asm/arch-omap3/omap_gpmc.h b/arch/arm/include/asm/arch-omap3/omap_gpmc.h
deleted file mode 100644 (file)
index bf23219..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * (C) Copyright 2004-2008 Texas Instruments, <www.ti.com>
- * Rohit Choraria <rohitkc@ti.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-#ifndef __ASM_ARCH_OMAP_GPMC_H
-#define __ASM_ARCH_OMAP_GPMC_H
-
-/*
- * These GPMC_NAND_HW_BCHx_ECC_LAYOUT defines using the BCH library.
- * The OOB layout was first defined by linx kernel in commit
- * 0e618ef0a6a33cf7ef96c2c824402088dd8ef48c, we have to reuse it here cause
- * we want to be compatible.
- */
-#define GPMC_NAND_HW_BCH8_ECC_LAYOUT {\
-       .eccbytes = 56,\
-       .eccpos = {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,\
-                       23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,\
-                       37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\
-                       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63},\
-       .oobfree = {\
-               {.offset = 2,\
-                .length = 10 } } \
-}
-
-/* GPMC CS configuration for an SMSC LAN9221 ethernet controller */
-#define NET_LAN9221_GPMC_CONFIG1    0x00001000
-#define NET_LAN9221_GPMC_CONFIG2    0x00060700
-#define NET_LAN9221_GPMC_CONFIG3    0x00020201
-#define NET_LAN9221_GPMC_CONFIG4    0x06000700
-#define NET_LAN9221_GPMC_CONFIG5    0x0006090A
-#define NET_LAN9221_GPMC_CONFIG6    0x87030000
-#define NET_LAN9221_GPMC_CONFIG7    0x00000f6c
-
-#endif /* __ASM_ARCH_OMAP_GPMC_H */
index 43b54f7cae8359d44ac06fcd59167066a2686495..44fa66f8a389b91bf195b8c11fce016f7ffcf7a3 100644 (file)
@@ -7,6 +7,7 @@
  */
 #ifndef _SYS_PROTO_H_
 #define _SYS_PROTO_H_
+#include <linux/mtd/omap_gpmc.h>
 
 typedef struct {
        u32 mtype;
index 545d9d96ad79b3f0fe1c41e443b27996f6ee5966..c21fb54714a5055f4afde4b765a892e796948ec9 100644 (file)
 
 #ifndef __KERNEL_STRICT_NAMES
 #ifndef __ASSEMBLY__
-struct gpmc_cs {
-       u32 config1;            /* 0x00 */
-       u32 config2;            /* 0x04 */
-       u32 config3;            /* 0x08 */
-       u32 config4;            /* 0x0C */
-       u32 config5;            /* 0x10 */
-       u32 config6;            /* 0x14 */
-       u32 config7;            /* 0x18 */
-       u32 nand_cmd;           /* 0x1C */
-       u32 nand_adr;           /* 0x20 */
-       u32 nand_dat;           /* 0x24 */
-       u8 res[8];              /* blow up to 0x30 byte */
-};
-
-struct gpmc {
-       u8 res1[0x10];
-       u32 sysconfig;          /* 0x10 */
-       u8 res2[0x4];
-       u32 irqstatus;          /* 0x18 */
-       u32 irqenable;          /* 0x1C */
-       u8 res3[0x20];
-       u32 timeout_control;    /* 0x40 */
-       u8 res4[0xC];
-       u32 config;             /* 0x50 */
-       u32 status;             /* 0x54 */
-       u8 res5[0x8];   /* 0x58 */
-       struct gpmc_cs cs[8];   /* 0x60, 0x90, .. */
-       u8 res6[0x14];          /* 0x1E0 */
-       u32 ecc_config;         /* 0x1F4 */
-       u32 ecc_control;        /* 0x1F8 */
-       u32 ecc_size_config;    /* 0x1FC */
-       u32 ecc1_result;        /* 0x200 */
-       u32 ecc2_result;        /* 0x204 */
-       u32 ecc3_result;        /* 0x208 */
-       u32 ecc4_result;        /* 0x20C */
-       u32 ecc5_result;        /* 0x210 */
-       u32 ecc6_result;        /* 0x214 */
-       u32 ecc7_result;        /* 0x218 */
-       u32 ecc8_result;        /* 0x21C */
-       u32 ecc9_result;        /* 0x220 */
-};
-
-/* Used for board specific gpmc initialization */
-extern struct gpmc *gpmc_cfg;
-
 struct gptimer {
        u32 tidr;               /* 0x00 r */
        u8 res[0xc];
index fc9472544d4689dacc7f4e115f519caee17fe0e0..b338a1566c6df3b02bc8c553ca1df7d23eca2991 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/arch/clock.h>
 #include <asm/io.h>
 #include <asm/omap_common.h>
+#include <linux/mtd/omap_gpmc.h>
 #include <asm/arch/mux_omap4.h>
 
 DECLARE_GLOBAL_DATA_PTR;
index fb5a568b698b34abf5d1f4604342d1d12a046020..5f1d7454d01ae68d76b4fd2239844b1172beff7d 100644 (file)
 
 #ifndef __KERNEL_STRICT_NAMES
 #ifndef __ASSEMBLY__
-struct gpmc_cs {
-       u32 config1;            /* 0x00 */
-       u32 config2;            /* 0x04 */
-       u32 config3;            /* 0x08 */
-       u32 config4;            /* 0x0C */
-       u32 config5;            /* 0x10 */
-       u32 config6;            /* 0x14 */
-       u32 config7;            /* 0x18 */
-       u32 nand_cmd;           /* 0x1C */
-       u32 nand_adr;           /* 0x20 */
-       u32 nand_dat;           /* 0x24 */
-       u8 res[8];              /* blow up to 0x30 byte */
-};
-
-struct gpmc {
-       u8 res1[0x10];
-       u32 sysconfig;          /* 0x10 */
-       u8 res2[0x4];
-       u32 irqstatus;          /* 0x18 */
-       u32 irqenable;          /* 0x1C */
-       u8 res3[0x20];
-       u32 timeout_control;    /* 0x40 */
-       u8 res4[0xC];
-       u32 config;             /* 0x50 */
-       u32 status;             /* 0x54 */
-       u8 res5[0x8];   /* 0x58 */
-       struct gpmc_cs cs[8];   /* 0x60, 0x90, .. */
-       u8 res6[0x14];          /* 0x1E0 */
-       u32 ecc_config;         /* 0x1F4 */
-       u32 ecc_control;        /* 0x1F8 */
-       u32 ecc_size_config;    /* 0x1FC */
-       u32 ecc1_result;        /* 0x200 */
-       u32 ecc2_result;        /* 0x204 */
-       u32 ecc3_result;        /* 0x208 */
-       u32 ecc4_result;        /* 0x20C */
-       u32 ecc5_result;        /* 0x210 */
-       u32 ecc6_result;        /* 0x214 */
-       u32 ecc7_result;        /* 0x218 */
-       u32 ecc8_result;        /* 0x21C */
-       u32 ecc9_result;        /* 0x220 */
-};
-
-/* Used for board specific gpmc initialization */
-extern struct gpmc *gpmc_cfg;
-
 struct gptimer {
        u32 tidr;               /* 0x00 r */
        u8 res1[0xc];
index 43011a4acd4524581701efda1ff518b413b75a58..9e007c87ae61217e2e784477362192e833db5b54 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/omap_common.h>
+#include <linux/mtd/omap_gpmc.h>
 #include <asm/arch/clock.h>
 
 DECLARE_GLOBAL_DATA_PTR;
diff --git a/arch/arm/include/asm/omap_gpmc.h b/arch/arm/include/asm/omap_gpmc.h
deleted file mode 100644 (file)
index d4143ec..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * (C) Copyright 2004-2008 Texas Instruments, <www.ti.com>
- * Rohit Choraria <rohitkc@ti.com>
- *
- * (C) Copyright 2013 Andreas Bießmann <andreas.devel@googlemail.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-#ifndef __ASM_OMAP_GPMC_H
-#define __ASM_OMAP_GPMC_H
-
-#include <asm/arch/omap_gpmc.h>
-
-#define GPMC_BUF_EMPTY 0
-#define GPMC_BUF_FULL  1
-
-#define ECCCLEAR       (0x1 << 8)
-#define ECCRESULTREG1  (0x1 << 0)
-#define ECCSIZE512BYTE 0xFF
-#define ECCSIZE1       (ECCSIZE512BYTE << 22)
-#define ECCSIZE0       (ECCSIZE512BYTE << 12)
-#define ECCSIZE0SEL    (0x000 << 0)
-
-/* Generic ECC Layouts */
-/* Large Page x8 NAND device Layout */
-#ifdef GPMC_NAND_ECC_LP_x8_LAYOUT
-#define GPMC_NAND_HW_ECC_LAYOUT {\
-       .eccbytes = 12,\
-       .eccpos = {1, 2, 3, 4, 5, 6, 7, 8,\
-               9, 10, 11, 12},\
-       .oobfree = {\
-               {.offset = 13,\
-                .length = 51 } } \
-}
-#endif
-
-/* Large Page x16 NAND device Layout */
-#ifdef GPMC_NAND_ECC_LP_x16_LAYOUT
-#define GPMC_NAND_HW_ECC_LAYOUT {\
-       .eccbytes = 12,\
-       .eccpos = {2, 3, 4, 5, 6, 7, 8, 9,\
-               10, 11, 12, 13},\
-       .oobfree = {\
-               {.offset = 14,\
-                .length = 50 } } \
-}
-#endif
-
-/* Small Page x8 NAND device Layout */
-#ifdef GPMC_NAND_ECC_SP_x8_LAYOUT
-#define GPMC_NAND_HW_ECC_LAYOUT {\
-       .eccbytes = 3,\
-       .eccpos = {1, 2, 3},\
-       .oobfree = {\
-               {.offset = 4,\
-                .length = 12 } } \
-}
-#endif
-
-/* Small Page x16 NAND device Layout */
-#ifdef GPMC_NAND_ECC_SP_x16_LAYOUT
-#define GPMC_NAND_HW_ECC_LAYOUT {\
-       .eccbytes = 3,\
-       .eccpos = {2, 3, 4},\
-       .oobfree = {\
-               {.offset = 5,\
-                .length = 11 } } \
-}
-#endif
-
-enum omap_ecc {
-       /* 1-bit  ECC calculation by Software, Error detection by Software */
-       OMAP_ECC_HAM1_CODE_SW = 1, /* avoid un-initialized int can be 0x0 */
-       /* 1-bit  ECC calculation by GPMC, Error detection by Software */
-       /* ECC layout compatible to legacy ROMCODE. */
-       OMAP_ECC_HAM1_CODE_HW,
-       /* 4-bit  ECC calculation by GPMC, Error detection by Software */
-       OMAP_ECC_BCH4_CODE_HW_DETECTION_SW,
-       /* 4-bit  ECC calculation by GPMC, Error detection by ELM */
-       OMAP_ECC_BCH4_CODE_HW,
-       /* 8-bit  ECC calculation by GPMC, Error detection by Software */
-       OMAP_ECC_BCH8_CODE_HW_DETECTION_SW,
-       /* 8-bit  ECC calculation by GPMC, Error detection by ELM */
-       OMAP_ECC_BCH8_CODE_HW,
-};
-
-#endif /* __ASM_OMAP_GPMC_H */
index 7a7500b342076476e98a25cc5e86892d543ce5ca..3b2b1f15b8e9647fe0fc72efee1e8f78fa11b588 100644 (file)
@@ -8,7 +8,6 @@
 #include <twl4030.h>
 #include <netdev.h>
 #include <asm/gpio.h>
-#include <asm/omap_gpmc.h>
 #include <asm/io.h>
 #include <asm/arch/mem.h>
 #include <asm/arch/mmc_host_def.h>
index 9ac35d2f4e331056bff1b1359b270688444e97c2..1192d02e9171ed99b52f3152cf86e3bab0e48d72 100644 (file)
@@ -21,7 +21,6 @@
 #include <asm/arch/mux.h>
 #include <asm/arch/mem.h>
 #include <asm/arch/sys_proto.h>
-#include <asm/omap_gpmc.h>
 #include <asm/gpio.h>
 #include <asm/mach-types.h>
 #include "overo.h"
index 2a30ab89817df5881aca0a75241df847715f2a92..947305b58debfad2e2b02cc2ea7e5ee537785c20 100644 (file)
@@ -46,23 +46,42 @@ NAND
 The AM335x GP EVM ships with a 256MiB NAND available in most profiles.  In
 this example to program the NAND we assume that an SD card has been
 inserted with the files to write in the first SD slot and that mtdparts
-have been configured correctly for the board.  As a time saving measure we
-load MLO into memory in one location, copy it into the three locatations
-that the ROM checks for additional valid copies, then load U-Boot into
-memory.  We then write that whole section of memory to NAND.
-
-U-Boot # mmc rescan
-U-Boot # env default -f -a
-U-Boot # nand erase.chip
-U-Boot # saveenv
-U-Boot # load mmc 0 81000000 MLO
-U-Boot # cp.b 81000000 81020000 20000
-U-Boot # cp.b 81000000 81040000 20000
-U-Boot # cp.b 81000000 81060000 20000
-U-Boot # load mmc 0 81080000 u-boot.img
-U-Boot # nand write 81000000 0 260000
-U-Boot # load mmc 0 ${loadaddr} uImage
-U-Boot # nand write ${loadaddr} kernel 500000
+have been configured correctly for the board. All images are first loaded
+into memory, then written to NAND.
+
+Step-1: Building u-boot for NAND boot
+       Set following CONFIGxx options for NAND device.
+       CONFIG_SYS_NAND_PAGE_SIZE       number of main bytes in NAND page
+       CONFIG_SYS_NAND_OOBSIZE         number of OOB bytes in NAND page
+       CONFIG_SYS_NAND_BLOCK_SIZE      number of bytes in NAND erase-block
+       CONFIG_SYS_NAND_ECCPOS          ECC map for NAND page
+       CONFIG_NAND_OMAP_ECCSCHEME      (refer doc/README.nand)
+
+Step-2: Flashing NAND via MMC/SD
+       # select BOOTSEL to MMC/SD boot and boot from MMC/SD card
+       U-Boot # mmc rescan
+       # erase flash
+       U-Boot # nand erase.chip
+       U-Boot # env default -f -a
+       U-Boot # saveenv
+       # flash MLO. Redundant copies of MLO are kept for failsafe
+       U-Boot # load mmc 0 0x82000000 MLO
+       U-Boot # nand write 0x82000000 0x00000 0x20000
+       U-Boot # nand write 0x82000000 0x20000 0x20000
+       U-Boot # nand write 0x82000000 0x40000 0x20000
+       U-Boot # nand write 0x82000000 0x60000 0x20000
+       # flash u-boot.img
+       U-Boot # load mmc 0 0x82000000 u-boot.img
+       U-Boot # nand write 0x82000000 0x80000 0x60000
+       # flash kernel image
+       U-Boot # load mmc 0 0x82000000 uImage
+       U-Boot # nand write 0x82000000 ${nandsrcaddr} ${nandimgsize}
+       # flash filesystem image
+       U-Boot # load mmc 0 0x82000000 filesystem.img
+       U-Boot # nand write 0x82000000 ${loadaddress} 0x300000
+
+Step-3: Set BOOTSEL pin to select NAND boot, and POR the device.
+       The device should boot from images flashed on NAND device.
 
 NOR
 ===
index 2aa7807f3e5e5bba40b84b183073ada9bb490845..47b1f1bfe27b0dbbb50efa32363fc1f58c93b04d 100644 (file)
@@ -16,9 +16,9 @@
 #include <common.h>
 #include <asm/io.h>
 #include <asm/errno.h>
-#include <asm/arch/cpu.h>
-#include <asm/omap_gpmc.h>
-#include <asm/omap_elm.h>
+#include <linux/mtd/omap_gpmc.h>
+#include <linux/mtd/omap_elm.h>
+#include <asm/arch/hardware.h>
 
 #define ELM_DEFAULT_POLY (0)
 
index 389c4de59a1189d6cbc22f51337bab1a56ef9002..881a63618c3205786fbc866b5b2b3d90af240024 100644 (file)
@@ -9,17 +9,24 @@
 #include <asm/io.h>
 #include <asm/errno.h>
 #include <asm/arch/mem.h>
-#include <asm/arch/cpu.h>
-#include <asm/omap_gpmc.h>
+#include <linux/mtd/omap_gpmc.h>
 #include <linux/mtd/nand_ecc.h>
 #include <linux/bch.h>
 #include <linux/compiler.h>
 #include <nand.h>
-#include <asm/omap_elm.h>
+#include <linux/mtd/omap_elm.h>
 
 #define BADBLOCK_MARKER_LENGTH 2
 #define SECTOR_BYTES           512
+#define ECCCLEAR               (0x1 << 8)
+#define ECCRESULTREG1          (0x1 << 0)
+/* 4 bit padding to make byte aligned, 56 = 52 + 4 */
+#define BCH4_BIT_PAD           4
 
+#ifdef CONFIG_BCH
+static u8  bch8_polynomial[] = {0xef, 0x51, 0x2e, 0x09, 0xed, 0x93, 0x9a, 0xc2,
+                               0x97, 0x79, 0xe5, 0x24, 0xb5};
+#endif
 static uint8_t cs;
 static __maybe_unused struct nand_ecclayout omap_ecclayout;
 
@@ -60,21 +67,6 @@ int omap_spl_dev_ready(struct mtd_info *mtd)
 }
 #endif
 
-/*
- * omap_hwecc_init - Initialize the Hardware ECC for NAND flash in
- *                   GPMC controller
- * @mtd:        MTD device structure
- *
- */
-static void __maybe_unused omap_hwecc_init(struct nand_chip *chip)
-{
-       /*
-        * Init ECC Control Register
-        * Clear all ECC | Enable Reg1
-        */
-       writel(ECCCLEAR | ECCRESULTREG1, &gpmc_cfg->ecc_control);
-       writel(ECCSIZE1 | ECCSIZE0 | ECCSIZE0SEL, &gpmc_cfg->ecc_size_config);
-}
 
 /*
  * gen_true_ecc - This function will generate true ECC value, which
@@ -155,74 +147,6 @@ static int __maybe_unused omap_correct_data(struct mtd_info *mtd, uint8_t *dat,
        return 0;
 }
 
-/*
- *  omap_calculate_ecc - Generate non-inverted ECC bytes.
- *
- *  Using noninverted ECC can be considered ugly since writing a blank
- *  page ie. padding will clear the ECC bytes. This is no problem as
- *  long nobody is trying to write data on the seemingly unused page.
- *  Reading an erased page will produce an ECC mismatch between
- *  generated and read ECC bytes that has to be dealt with separately.
- *  E.g. if page is 0xFF (fresh erased), and if HW ECC engine within GPMC
- *  is used, the result of read will be 0x0 while the ECC offsets of the
- *  spare area will be 0xFF which will result in an ECC mismatch.
- *  @mtd:      MTD structure
- *  @dat:      unused
- *  @ecc_code: ecc_code buffer
- */
-static int __maybe_unused omap_calculate_ecc(struct mtd_info *mtd,
-               const uint8_t *dat, uint8_t *ecc_code)
-{
-       u_int32_t val;
-
-       /* Start Reading from HW ECC1_Result = 0x200 */
-       val = readl(&gpmc_cfg->ecc1_result);
-
-       ecc_code[0] = val & 0xFF;
-       ecc_code[1] = (val >> 16) & 0xFF;
-       ecc_code[2] = ((val >> 8) & 0x0F) | ((val >> 20) & 0xF0);
-
-       /*
-        * Stop reading anymore ECC vals and clear old results
-        * enable will be called if more reads are required
-        */
-       writel(0x000, &gpmc_cfg->ecc_config);
-
-       return 0;
-}
-
-/*
- * omap_enable_ecc - This function enables the hardware ecc functionality
- * @mtd:        MTD device structure
- * @mode:       Read/Write mode
- */
-static void __maybe_unused omap_enable_hwecc(struct mtd_info *mtd, int32_t mode)
-{
-       struct nand_chip *chip = mtd->priv;
-       uint32_t val, dev_width = (chip->options & NAND_BUSWIDTH_16) >> 1;
-
-       switch (mode) {
-       case NAND_ECC_READ:
-       case NAND_ECC_WRITE:
-               /* Clear the ecc result registers, select ecc reg as 1 */
-               writel(ECCCLEAR | ECCRESULTREG1, &gpmc_cfg->ecc_control);
-
-               /*
-                * Size 0 = 0xFF, Size1 is 0xFF - both are 512 bytes
-                * tell all regs to generate size0 sized regs
-                * we just have a single ECC engine for all CS
-                */
-               writel(ECCSIZE1 | ECCSIZE0 | ECCSIZE0SEL,
-                       &gpmc_cfg->ecc_size_config);
-               val = (dev_width << 7) | (cs << 1) | (0x1);
-               writel(val, &gpmc_cfg->ecc_config);
-               break;
-       default:
-               printf("Error: Unrecognized Mode[%d]!\n", mode);
-               break;
-       }
-}
-
 /*
  * Generic BCH interface
  */
@@ -239,12 +163,7 @@ struct nand_bch_priv {
 #define ECC_BCH8       1
 #define ECC_BCH16      2
 
-/* GPMC ecc engine settings */
-#define BCH_WRAPMODE_1         1       /* BCH wrap mode 1 */
-#define BCH_WRAPMODE_6         6       /* BCH wrap mode 6 */
-
 /* BCH nibbles for diff bch levels */
-#define NAND_ECC_HW_BCH ((uint8_t)(NAND_ECC_HW_OOB_FIRST) + 1)
 #define ECC_BCH4_NIBBLES       13
 #define ECC_BCH8_NIBBLES       26
 #define ECC_BCH16_NIBBLES      52
@@ -256,266 +175,161 @@ struct nand_bch_priv {
  * When some users with other BCH strength will exists this have to change!
  */
 static __maybe_unused struct nand_bch_priv bch_priv = {
-       .mode = NAND_ECC_HW_BCH,
        .type = ECC_BCH8,
        .nibbles = ECC_BCH8_NIBBLES,
        .control = NULL
 };
 
 /*
- * omap_hwecc_init_bch - Initialize the BCH Hardware ECC for NAND flash in
- *                             GPMC controller
- * @mtd:       MTD device structure
- * @mode:      Read/Write mode
- */
-__maybe_unused
-static void omap_hwecc_init_bch(struct nand_chip *chip, int32_t mode)
+ * omap_reverse_list - re-orders list elements in reverse order [internal]
+ * @list:      pointer to start of list
+ * @length:    length of list
+*/
+void omap_reverse_list(u8 *list, unsigned int length)
 {
-       uint32_t val;
-       uint32_t dev_width = (chip->options & NAND_BUSWIDTH_16) >> 1;
-       uint32_t unused_length = 0;
-       uint32_t wr_mode = BCH_WRAPMODE_6;
-       struct nand_bch_priv *bch = chip->priv;
-
-       /* Clear the ecc result registers, select ecc reg as 1 */
-       writel(ECCCLEAR | ECCRESULTREG1, &gpmc_cfg->ecc_control);
-
-       if (bch->ecc_scheme == OMAP_ECC_BCH8_CODE_HW) {
-               wr_mode = BCH_WRAPMODE_1;
-
-               switch (bch->nibbles) {
-               case ECC_BCH4_NIBBLES:
-                       unused_length = 3;
-                       break;
-               case ECC_BCH8_NIBBLES:
-                       unused_length = 2;
-                       break;
-               case ECC_BCH16_NIBBLES:
-                       unused_length = 0;
-                       break;
-               }
-
-               /*
-                * This is ecc_size_config for ELM mode.  Here we are using
-                * different settings for read and write access and also
-                * depending on BCH strength.
-                */
-               switch (mode) {
-               case NAND_ECC_WRITE:
-                       /* write access only setup eccsize1 config */
-                       val = ((unused_length + bch->nibbles) << 22);
-                       break;
-
-               case NAND_ECC_READ:
-               default:
-                       /*
-                        * by default eccsize0 selected for ecc1resultsize
-                        * eccsize0 config.
-                        */
-                       val  = (bch->nibbles << 12);
-                       /* eccsize1 config */
-                       val |= (unused_length << 22);
-                       break;
-               }
-       } else {
-               /*
-                * This ecc_size_config setting is for BCH sw library.
-                *
-                * Note: we only support BCH8 currently with BCH sw library!
-                * Should be really easy to adobt to BCH4, however some omap3
-                * have flaws with BCH4.
-                *
-                * Here we are using wrapping mode 6 both for reading and
-                * writing, with:
-                *  size0 = 0  (no additional protected byte in spare area)
-                *  size1 = 32 (skip 32 nibbles = 16 bytes per sector in
-                *              spare area)
-                */
-               val = (32 << 22) | (0 << 12);
+       unsigned int i, j;
+       unsigned int half_length = length / 2;
+       u8 tmp;
+       for (i = 0, j = length - 1; i < half_length; i++, j--) {
+               tmp = list[i];
+               list[i] = list[j];
+               list[j] = tmp;
        }
-       /* ecc size configuration */
-       writel(val, &gpmc_cfg->ecc_size_config);
-
-       /*
-        * Configure the ecc engine in gpmc
-        * We assume 512 Byte sector pages for access to NAND.
-        */
-       val  = (1 << 16);               /* enable BCH mode */
-       val |= (bch->type << 12);       /* setup BCH type */
-       val |= (wr_mode << 8);          /* setup wrapping mode */
-       val |= (dev_width << 7);        /* setup device width (16 or 8 bit) */
-       val |= (cs << 1);               /* setup chip select to work on */
-       debug("set ECC_CONFIG=0x%08x\n", val);
-       writel(val, &gpmc_cfg->ecc_config);
 }
 
 /*
- * omap_enable_ecc_bch - This function enables the bch h/w ecc functionality
+ * omap_enable_hwecc - configures GPMC as per ECC scheme before read/write
  * @mtd:       MTD device structure
  * @mode:      Read/Write mode
  */
 __maybe_unused
-static void omap_enable_ecc_bch(struct mtd_info *mtd, int32_t mode)
-{
-       struct nand_chip *chip = mtd->priv;
-
-       omap_hwecc_init_bch(chip, mode);
-       /* enable ecc */
-       writel((readl(&gpmc_cfg->ecc_config) | 0x1), &gpmc_cfg->ecc_config);
-}
-
-/*
- * omap_ecc_disable - Disable H/W ECC calculation
- *
- * @mtd:       MTD device structure
- */
-static void __maybe_unused omap_ecc_disable(struct mtd_info *mtd)
+static void omap_enable_hwecc(struct mtd_info *mtd, int32_t mode)
 {
-       writel((readl(&gpmc_cfg->ecc_config) & ~0x1), &gpmc_cfg->ecc_config);
+       struct nand_chip        *nand   = mtd->priv;
+       struct nand_bch_priv    *bch    = nand->priv;
+       unsigned int dev_width = (nand->options & NAND_BUSWIDTH_16) ? 1 : 0;
+       unsigned int ecc_algo = 0;
+       unsigned int bch_type = 0;
+       unsigned int eccsize1 = 0x00, eccsize0 = 0x00, bch_wrapmode = 0x00;
+       u32 ecc_size_config_val = 0;
+       u32 ecc_config_val = 0;
+
+       /* configure GPMC for specific ecc-scheme */
+       switch (bch->ecc_scheme) {
+       case OMAP_ECC_HAM1_CODE_SW:
+               return;
+       case OMAP_ECC_HAM1_CODE_HW:
+               ecc_algo = 0x0;
+               bch_type = 0x0;
+               bch_wrapmode = 0x00;
+               eccsize0 = 0xFF;
+               eccsize1 = 0xFF;
+               break;
+       case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
+       case OMAP_ECC_BCH8_CODE_HW:
+               ecc_algo = 0x1;
+               bch_type = 0x1;
+               if (mode == NAND_ECC_WRITE) {
+                       bch_wrapmode = 0x01;
+                       eccsize0 = 0;  /* extra bits in nibbles per sector */
+                       eccsize1 = 28; /* OOB bits in nibbles per sector */
+               } else {
+                       bch_wrapmode = 0x01;
+                       eccsize0 = 26; /* ECC bits in nibbles per sector */
+                       eccsize1 = 2;  /* non-ECC bits in nibbles per sector */
+               }
+               break;
+       default:
+               return;
+       }
+       /* Clear ecc and enable bits */
+       writel(ECCCLEAR | ECCRESULTREG1, &gpmc_cfg->ecc_control);
+       /* Configure ecc size for BCH */
+       ecc_size_config_val = (eccsize1 << 22) | (eccsize0 << 12);
+       writel(ecc_size_config_val, &gpmc_cfg->ecc_size_config);
+
+       /* Configure device details for BCH engine */
+       ecc_config_val = ((ecc_algo << 16)      | /* HAM1 | BCHx */
+                       (bch_type << 12)        | /* BCH4/BCH8/BCH16 */
+                       (bch_wrapmode << 8)     | /* wrap mode */
+                       (dev_width << 7)        | /* bus width */
+                       (0x0 << 4)              | /* number of sectors */
+                       (cs <<  1)              | /* ECC CS */
+                       (0x1));                   /* enable ECC */
+       writel(ecc_config_val, &gpmc_cfg->ecc_config);
 }
 
 /*
- * BCH support using ELM module
- */
-#ifdef CONFIG_NAND_OMAP_ELM
-/*
- * omap_read_bch8_result - Read BCH result for BCH8 level
- *
- * @mtd:       MTD device structure
- * @big_endian:        When set read register 3 first
- * @ecc_code:  Read syndrome from BCH result registers
+ *  omap_calculate_ecc - Read ECC result
+ *  @mtd:      MTD structure
+ *  @dat:      unused
+ *  @ecc_code: ecc_code buffer
+ *  Using noninverted ECC can be considered ugly since writing a blank
+ *  page ie. padding will clear the ECC bytes. This is no problem as
+ *  long nobody is trying to write data on the seemingly unused page.
+ *  Reading an erased page will produce an ECC mismatch between
+ *  generated and read ECC bytes that has to be dealt with separately.
+ *  E.g. if page is 0xFF (fresh erased), and if HW ECC engine within GPMC
+ *  is used, the result of read will be 0x0 while the ECC offsets of the
+ *  spare area will be 0xFF which will result in an ECC mismatch.
  */
-static void omap_read_bch8_result(struct mtd_info *mtd, uint8_t big_endian,
+static int omap_calculate_ecc(struct mtd_info *mtd, const uint8_t *dat,
                                uint8_t *ecc_code)
 {
-       uint32_t *ptr;
+       struct nand_chip *chip = mtd->priv;
+       struct nand_bch_priv *bch = chip->priv;
+       uint32_t *ptr, val = 0;
        int8_t i = 0, j;
 
-       if (big_endian) {
+       switch (bch->ecc_scheme) {
+       case OMAP_ECC_HAM1_CODE_HW:
+               val = readl(&gpmc_cfg->ecc1_result);
+               ecc_code[0] = val & 0xFF;
+               ecc_code[1] = (val >> 16) & 0xFF;
+               ecc_code[2] = ((val >> 8) & 0x0F) | ((val >> 20) & 0xF0);
+               break;
+#ifdef CONFIG_BCH
+       case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
+#endif
+       case OMAP_ECC_BCH8_CODE_HW:
                ptr = &gpmc_cfg->bch_result_0_3[0].bch_result_x[3];
-               ecc_code[i++] = readl(ptr) & 0xFF;
+               val = readl(ptr);
+               ecc_code[i++] = (val >>  0) & 0xFF;
                ptr--;
                for (j = 0; j < 3; j++) {
-                       ecc_code[i++] = (readl(ptr) >> 24) & 0xFF;
-                       ecc_code[i++] = (readl(ptr) >> 16) & 0xFF;
-                       ecc_code[i++] = (readl(ptr) >>  8) & 0xFF;
-                       ecc_code[i++] = readl(ptr) & 0xFF;
+                       val = readl(ptr);
+                       ecc_code[i++] = (val >> 24) & 0xFF;
+                       ecc_code[i++] = (val >> 16) & 0xFF;
+                       ecc_code[i++] = (val >>  8) & 0xFF;
+                       ecc_code[i++] = (val >>  0) & 0xFF;
                        ptr--;
                }
-       } else {
-               ptr = &gpmc_cfg->bch_result_0_3[0].bch_result_x[0];
-               for (j = 0; j < 3; j++) {
-                       ecc_code[i++] = readl(ptr) & 0xFF;
-                       ecc_code[i++] = (readl(ptr) >>  8) & 0xFF;
-                       ecc_code[i++] = (readl(ptr) >> 16) & 0xFF;
-                       ecc_code[i++] = (readl(ptr) >> 24) & 0xFF;
-                       ptr++;
-               }
-               ecc_code[i++] = readl(ptr) & 0xFF;
-               ecc_code[i++] = 0;      /* 14th byte is always zero */
+               break;
+       default:
+               return -EINVAL;
        }
-}
-
-/*
- * omap_rotate_ecc_bch - Rotate the syndrome bytes
- *
- * @mtd:       MTD device structure
- * @calc_ecc:  ECC read from ECC registers
- * @syndrome:  Rotated syndrome will be retuned in this array
- *
- */
-static void omap_rotate_ecc_bch(struct mtd_info *mtd, uint8_t *calc_ecc,
-               uint8_t *syndrome)
-{
-       struct nand_chip *chip = mtd->priv;
-       struct nand_bch_priv *bch = chip->priv;
-       uint8_t n_bytes = 0;
-       int8_t i, j;
-
-       switch (bch->type) {
-       case ECC_BCH4:
-               n_bytes = 8;
+       /* ECC scheme specific syndrome customizations */
+       switch (bch->ecc_scheme) {
+       case OMAP_ECC_HAM1_CODE_HW:
                break;
+#ifdef CONFIG_BCH
+       case OMAP_ECC_BCH8_CODE_HW_DETECTION_SW:
 
-       case ECC_BCH16:
-               n_bytes = 28;
+               for (i = 0; i < chip->ecc.bytes; i++)
+                       *(ecc_code + i) = *(ecc_code + i) ^
+                                               bch8_polynomial[i];
                break;
-
-       case ECC_BCH8:
-       default:
-               n_bytes = 13;
+#endif
+       case OMAP_ECC_BCH8_CODE_HW:
+               ecc_code[chip->ecc.bytes - 1] = 0x00;
                break;
+       default:
+               return -EINVAL;
        }
-
-       for (i = 0, j = (n_bytes-1); i < n_bytes; i++, j--)
-               syndrome[i] =  calc_ecc[j];
-}
-
-/*
- *  omap_calculate_ecc_bch - Read BCH ECC result
- *
- *  @mtd:      MTD structure
- *  @dat:      unused
- *  @ecc_code: ecc_code buffer
- */
-static int omap_calculate_ecc_bch(struct mtd_info *mtd, const uint8_t *dat,
-                               uint8_t *ecc_code)
-{
-       struct nand_chip *chip = mtd->priv;
-       struct nand_bch_priv *bch = chip->priv;
-       uint8_t big_endian = 1;
-       int8_t ret = 0;
-
-       if (bch->type == ECC_BCH8)
-               omap_read_bch8_result(mtd, big_endian, ecc_code);
-       else /* BCH4 and BCH16 currently not supported */
-               ret = -1;
-
-       /*
-        * Stop reading anymore ECC vals and clear old results
-        * enable will be called if more reads are required
-        */
-       omap_ecc_disable(mtd);
-
-       return ret;
-}
-
-/*
- * omap_fix_errors_bch - Correct bch error in the data
- *
- * @mtd:       MTD device structure
- * @data:      Data read from flash
- * @error_count:Number of errors in data
- * @error_loc: Locations of errors in the data
- *
- */
-static void omap_fix_errors_bch(struct mtd_info *mtd, uint8_t *data,
-               uint32_t error_count, uint32_t *error_loc)
-{
-       struct nand_chip *chip = mtd->priv;
-       struct nand_bch_priv *bch = chip->priv;
-       uint8_t count = 0;
-       uint32_t error_byte_pos;
-       uint32_t error_bit_mask;
-       uint32_t last_bit = (bch->nibbles * 4) - 1;
-
-       /* Flip all bits as specified by the error location array. */
-       /* FOR( each found error location flip the bit ) */
-       for (count = 0; count < error_count; count++) {
-               if (error_loc[count] > last_bit) {
-                       /* Remove the ECC spare bits from correction. */
-                       error_loc[count] -= (last_bit + 1);
-                       /* Offset bit in data region */
-                       error_byte_pos = ((512 * 8) -
-                                       (error_loc[count]) - 1) / 8;
-                       /* Error Bit mask */
-                       error_bit_mask = 0x1 << (error_loc[count] % 8);
-                       /* Toggle the error bit to make the correction. */
-                       data[error_byte_pos] ^= error_bit_mask;
-               }
-       }
+       return 0;
 }
 
+#ifdef CONFIG_NAND_OMAP_ELM
 /*
  * omap_correct_data_bch - Compares the ecc read from nand spare area
  * with ECC registers values and corrects one bit error if it has occured
@@ -532,40 +346,72 @@ static int omap_correct_data_bch(struct mtd_info *mtd, uint8_t *dat,
 {
        struct nand_chip *chip = mtd->priv;
        struct nand_bch_priv *bch = chip->priv;
-       uint8_t syndrome[28];
-       uint32_t error_count = 0;
+       uint32_t eccbytes = chip->ecc.bytes;
+       uint32_t error_count = 0, error_max;
        uint32_t error_loc[8];
-       uint32_t i, ecc_flag;
+       uint32_t i, ecc_flag = 0;
+       uint8_t count, err = 0;
+       uint32_t byte_pos, bit_pos;
+
+       /* check calculated ecc */
+       for (i = 0; i < chip->ecc.bytes && !ecc_flag; i++) {
+               if (calc_ecc[i] != 0x00)
+                       ecc_flag = 1;
+       }
+       if (!ecc_flag)
+               return 0;
 
+       /* check for whether its a erased-page */
        ecc_flag = 0;
-       for (i = 0; i < chip->ecc.bytes; i++)
+       for (i = 0; i < chip->ecc.bytes && !ecc_flag; i++) {
                if (read_ecc[i] != 0xff)
                        ecc_flag = 1;
-
+       }
        if (!ecc_flag)
                return 0;
 
-       elm_reset();
-       elm_config((enum bch_level)(bch->type));
-
        /*
         * while reading ECC result we read it in big endian.
         * Hence while loading to ELM we have rotate to get the right endian.
         */
-       omap_rotate_ecc_bch(mtd, calc_ecc, syndrome);
-
+       switch (bch->ecc_scheme) {
+       case OMAP_ECC_BCH8_CODE_HW:
+               omap_reverse_list(calc_ecc, eccbytes - 1);
+               break;
+       default:
+               return -EINVAL;
+       }
        /* use elm module to check for errors */
-       if (elm_check_error(syndrome, bch->nibbles, &error_count,
-                               error_loc) != 0) {
-               printf("ECC: uncorrectable.\n");
-               return -1;
+       elm_config((enum bch_level)(bch->type));
+       if (elm_check_error(calc_ecc, bch->nibbles, &error_count, error_loc)) {
+               printf("nand: error: uncorrectable ECC errors\n");
+               return -EINVAL;
        }
-
        /* correct bch error */
-       if (error_count > 0)
-               omap_fix_errors_bch(mtd, dat, error_count, error_loc);
-
-       return 0;
+       for (count = 0; count < error_count; count++) {
+               switch (bch->type) {
+               case ECC_BCH8:
+                       /* 14th byte in ECC is reserved to match ROM layout */
+                       error_max = SECTOR_BYTES + (eccbytes - 1);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               byte_pos = error_max - (error_loc[count] / 8) - 1;
+               bit_pos  = error_loc[count] % 8;
+               if (byte_pos < SECTOR_BYTES) {
+                       dat[byte_pos] ^= 1 << bit_pos;
+                       printf("nand: bit-flip corrected @data=%d\n", byte_pos);
+               } else if (byte_pos < error_max) {
+                       read_ecc[byte_pos - SECTOR_BYTES] = 1 << bit_pos;
+                       printf("nand: bit-flip corrected @oob=%d\n", byte_pos -
+                                                               SECTOR_BYTES);
+               } else {
+                       err = -EBADMSG;
+                       printf("nand: error: invalid bit-flip location\n");
+               }
+       }
+       return (err) ? err : error_count;
 }
 
 /**
@@ -636,57 +482,6 @@ static int omap_read_page_bch(struct mtd_info *mtd, struct nand_chip *chip,
  * OMAP3 BCH8 support (with BCH library)
  */
 #ifdef CONFIG_BCH
-/*
- *  omap_calculate_ecc_bch_sw - Read BCH ECC result
- *
- *  @mtd:      MTD device structure
- *  @dat:      The pointer to data on which ecc is computed (unused here)
- *  @ecc:      The ECC output buffer
- */
-static int omap_calculate_ecc_bch_sw(struct mtd_info *mtd, const uint8_t *dat,
-                               uint8_t *ecc)
-{
-       int ret = 0;
-       size_t i;
-       unsigned long nsectors, val1, val2, val3, val4;
-
-       nsectors = ((readl(&gpmc_cfg->ecc_config) >> 4) & 0x7) + 1;
-
-       for (i = 0; i < nsectors; i++) {
-               /* Read hw-computed remainder */
-               val1 = readl(&gpmc_cfg->bch_result_0_3[i].bch_result_x[0]);
-               val2 = readl(&gpmc_cfg->bch_result_0_3[i].bch_result_x[1]);
-               val3 = readl(&gpmc_cfg->bch_result_0_3[i].bch_result_x[2]);
-               val4 = readl(&gpmc_cfg->bch_result_0_3[i].bch_result_x[3]);
-
-               /*
-                * Add constant polynomial to remainder, in order to get an ecc
-                * sequence of 0xFFs for a buffer filled with 0xFFs.
-                */
-               *ecc++ = 0xef ^ (val4 & 0xFF);
-               *ecc++ = 0x51 ^ ((val3 >> 24) & 0xFF);
-               *ecc++ = 0x2e ^ ((val3 >> 16) & 0xFF);
-               *ecc++ = 0x09 ^ ((val3 >> 8) & 0xFF);
-               *ecc++ = 0xed ^ (val3 & 0xFF);
-               *ecc++ = 0x93 ^ ((val2 >> 24) & 0xFF);
-               *ecc++ = 0x9a ^ ((val2 >> 16) & 0xFF);
-               *ecc++ = 0xc2 ^ ((val2 >> 8) & 0xFF);
-               *ecc++ = 0x97 ^ (val2 & 0xFF);
-               *ecc++ = 0x79 ^ ((val1 >> 24) & 0xFF);
-               *ecc++ = 0xe5 ^ ((val1 >> 16) & 0xFF);
-               *ecc++ = 0x24 ^ ((val1 >> 8) & 0xFF);
-               *ecc++ = 0xb5 ^ (val1 & 0xFF);
-       }
-
-       /*
-        * Stop reading anymore ECC vals and clear old results
-        * enable will be called if more reads are required
-        */
-       omap_ecc_disable(mtd);
-
-       return ret;
-}
-
 /**
  * omap_correct_data_bch_sw - Decode received data and correct errors
  * @mtd: MTD device structure
@@ -835,9 +630,9 @@ static int omap_select_ecc_scheme(struct nand_chip *nand,
                nand->ecc.strength      = 8;
                nand->ecc.size          = SECTOR_BYTES;
                nand->ecc.bytes         = 13;
-               nand->ecc.hwctl         = omap_enable_ecc_bch;
+               nand->ecc.hwctl         = omap_enable_hwecc;
                nand->ecc.correct       = omap_correct_data_bch_sw;
-               nand->ecc.calculate     = omap_calculate_ecc_bch_sw;
+               nand->ecc.calculate     = omap_calculate_ecc;
                /* define ecc-layout */
                ecclayout->eccbytes     = nand->ecc.bytes * eccsteps;
                ecclayout->eccpos[0]    = BADBLOCK_MARKER_LENGTH;
@@ -852,7 +647,6 @@ static int omap_select_ecc_scheme(struct nand_chip *nand,
                ecclayout->oobfree[0].offset = i + BADBLOCK_MARKER_LENGTH;
                ecclayout->oobfree[0].length = oobsize - ecclayout->eccbytes -
                                                BADBLOCK_MARKER_LENGTH;
-               omap_hwecc_init_bch(nand, NAND_ECC_READ);
                bch->ecc_scheme         = OMAP_ECC_BCH8_CODE_HW_DETECTION_SW;
                break;
 #else
@@ -878,9 +672,9 @@ static int omap_select_ecc_scheme(struct nand_chip *nand,
                nand->ecc.strength      = 8;
                nand->ecc.size          = SECTOR_BYTES;
                nand->ecc.bytes         = 14;
-               nand->ecc.hwctl         = omap_enable_ecc_bch;
+               nand->ecc.hwctl         = omap_enable_hwecc;
                nand->ecc.correct       = omap_correct_data_bch;
-               nand->ecc.calculate     = omap_calculate_ecc_bch;
+               nand->ecc.calculate     = omap_calculate_ecc;
                nand->ecc.read_page     = omap_read_page_bch;
                /* define ecc-layout */
                ecclayout->eccbytes     = nand->ecc.bytes * eccsteps;
index 59a8f36d16947d45b8726fac86973307a40db7d2..a5736b7f0ab9e7928e67d9697338f7e2588983c0 100644 (file)
 /* NAND support */
 #ifdef CONFIG_NAND
 #define CONFIG_CMD_NAND
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #if !defined(CONFIG_SPI_BOOT) && !defined(CONFIG_NOR_BOOT)
 #define MTDIDS_DEFAULT                 "nand0=omap2-nand.0"
 #define MTDPARTS_DEFAULT               "mtdparts=omap2-nand.0:128k(SPL)," \
index 115d1b37c9e9439b17d949c7e1a4d6220a284401..c00d54f7b275b9b9952b865ee5885ee491e01029 100644 (file)
 #define CONFIG_NAND
 #define CONFIG_NAND_OMAP_GPMC
 #define CONFIG_NAND_OMAP_ELM
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_SYS_NAND_BASE           (0x08000000)    /* phys address CS0 */
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
 #define CONFIG_SYS_NAND_ONFI_DETECTION 1
index 468fb43ea8e4b88106c9472b2f7738becd076146..4407b454dd133ba8e5d6892d1954f2238a0290d1 100644 (file)
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_ENV_IS_IN_NAND          1
 #define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
index b8b99c806fa535e583dde2fc43f3c6b1291fcb46..0102ff5b7f90bbdb2fc4ffb781270f206bcb8c42 100644 (file)
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_ENV_IS_IN_NAND          1
 #define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
index 08c67f588c1f9235a0ba6f6d7d99946fd02ddace..cfc4f9bb8ebb2856c6508ca1e0c304d876453cfb 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x8_LAYOUT
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
 /* Environment information */
index 4f43ba988227d0b067b482118473374e52197a35..16a00ebe867aee0f0c4b4e1ea82fed107e7a9d5f 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
 #define CONFIG_JFFS2_NAND
index 5049afca7a7025a00939217285c165424ecaa7a4..af6f56bb348199b5d1ecfc12d53a6d5c3ae5ecf8 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
 
 #if defined(CONFIG_CMD_NET)
index 7c5c2f4d1c57972149ab04c97dc925e96b0ae9eb..47244c003434d7a8f826ba2ecb5410066029d750 100644 (file)
 #define PISMO1_NAND_SIZE               GPMC_SIZE_128M
 
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT
 #define CONFIG_ENV_IS_IN_NAND
 #define SMNAND_ENV_OFFSET              0x180000 /* environment starts here */
 
index c58bc91a50c5b1410526a6f266ef737a78d128e3..ac0ed4371cf6b4a4989854bc1ab445e0747a81b1 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
 
index 43616e2b029b791e809063e21bc5b203dc2b7254..7f3424b4f0e00f985dffc5bb24886d9422ec45bd 100644 (file)
 #define CONFIG_SYS_FLASH_BASE          PISMO1_NAND_BASE
 
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT
 #define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
 #elif defined(CONFIG_CMD_ONENAND)
 #define CONFIG_SYS_FLASH_BASE          PISMO1_ONEN_BASE
index 20fbbecdfbd05231a68314ccf0d6339a01d86d93..12d8141e2272a4192e8f85fc89393d32ef3a13aa 100644 (file)
 
 #ifdef CONFIG_NAND
 #define PISMO1_NAND_SIZE               GPMC_SIZE_128M /* Configure the PISMO */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_ENV_OFFSET              0x260000 /* environment starts here */
 #define CONFIG_ENV_IS_IN_NAND          1
 #define CONFIG_ENV_SIZE                        (512 << 10) /* Total Size Environment */
index bedd6f9cb39b61794fefd71c270879f6ae3c8117..0d03c75ce3012a28043154aa13d7df63e9ef1f31 100644 (file)
 
 #if defined(CONFIG_CMD_NAND)
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_ENV_IS_IN_NAND
 #define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
 #endif
index e0f026269fc497ffb814e89d47c88d3c940d23e2..007e27f9f1185df13ee15b18b51624499536c01d 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand */
                                                        /* at CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1       /* Max number of NAND */
                                                /* devices */
 #define CONFIG_JFFS2_NAND
index eacdfaaa53b04a8df199ed973690cafd44bafa3e..da67787e69ef5c1410302239364afa866b885969 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand */
                                                        /* at CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1       /* Max number of NAND */
                                                /* devices */
 
index 1dd53fa13308a8ca244c3d83d1c050dc9a909239..f0fa96efcb82e76d1781cb455c650801eba5b57f 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
 #define CONFIG_JFFS2_NAND
index 286304295d1df5c56a28bba6b8d6bf90c83e3c71..98b6e7206d9fdaf59f986bdd5375f4ad71342c07 100644 (file)
 
 #define CONFIG_NAND_OMAP_GPMC
 #define CONFIG_NAND_OMAP_ELM
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
 #define CONFIG_SYS_NAND_BASE           (0x08000000)    /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
index d44b5c036de2a80ed1d1462c2919525f85314f5a..3522c1a07a7a379a0cd50865bc284263df462900 100644 (file)
 #define PISMO1_NAND_SIZE               GPMC_SIZE_128M
 
 #define CONFIG_NAND_OMAP_GPMC
-#define GPMC_NAND_ECC_LP_x16_LAYOUT
 #define CONFIG_ENV_IS_IN_NAND
 #define SMNAND_ENV_OFFSET              0x180000 /* environment starts here */
 
index cc4001fcd13a1cee45585f3d9b35846aef7263d5..62f97d24fb490eaab1bc641e84eb31fd781e32b2 100644 (file)
 #define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
                                                        /* to access nand at */
                                                        /* CS0 */
-#define GPMC_NAND_ECC_LP_x16_LAYOUT    1
-
 #define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of NAND */
                                                        /* devices */
 #define CONFIG_BCH
diff --git a/include/linux/mtd/omap_gpmc.h b/include/linux/mtd/omap_gpmc.h
new file mode 100644 (file)
index 0000000..22f6573
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * (C) Copyright 2004-2008 Texas Instruments, <www.ti.com>
+ * Rohit Choraria <rohitkc@ti.com>
+ *
+ * (C) Copyright 2013 Andreas Bießmann <andreas.devel@googlemail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef __ASM_OMAP_GPMC_H
+#define __ASM_OMAP_GPMC_H
+
+#define GPMC_BUF_EMPTY 0
+#define GPMC_BUF_FULL  1
+
+enum omap_ecc {
+       /* 1-bit  ECC calculation by Software, Error detection by Software */
+       OMAP_ECC_HAM1_CODE_SW = 1, /* avoid un-initialized int can be 0x0 */
+       /* 1-bit  ECC calculation by GPMC, Error detection by Software */
+       /* ECC layout compatible to legacy ROMCODE. */
+       OMAP_ECC_HAM1_CODE_HW,
+       /* 4-bit  ECC calculation by GPMC, Error detection by Software */
+       OMAP_ECC_BCH4_CODE_HW_DETECTION_SW,
+       /* 4-bit  ECC calculation by GPMC, Error detection by ELM */
+       OMAP_ECC_BCH4_CODE_HW,
+       /* 8-bit  ECC calculation by GPMC, Error detection by Software */
+       OMAP_ECC_BCH8_CODE_HW_DETECTION_SW,
+       /* 8-bit  ECC calculation by GPMC, Error detection by ELM */
+       OMAP_ECC_BCH8_CODE_HW,
+};
+
+struct gpmc_cs {
+       u32 config1;            /* 0x00 */
+       u32 config2;            /* 0x04 */
+       u32 config3;            /* 0x08 */
+       u32 config4;            /* 0x0C */
+       u32 config5;            /* 0x10 */
+       u32 config6;            /* 0x14 */
+       u32 config7;            /* 0x18 */
+       u32 nand_cmd;           /* 0x1C */
+       u32 nand_adr;           /* 0x20 */
+       u32 nand_dat;           /* 0x24 */
+       u8 res[8];              /* blow up to 0x30 byte */
+};
+
+struct bch_res_0_3 {
+       u32 bch_result_x[4];
+};
+
+struct gpmc {
+       u8 res1[0x10];
+       u32 sysconfig;          /* 0x10 */
+       u8 res2[0x4];
+       u32 irqstatus;          /* 0x18 */
+       u32 irqenable;          /* 0x1C */
+       u8 res3[0x20];
+       u32 timeout_control;    /* 0x40 */
+       u8 res4[0xC];
+       u32 config;             /* 0x50 */
+       u32 status;             /* 0x54 */
+       u8 res5[0x8];           /* 0x58 */
+       struct gpmc_cs cs[8];   /* 0x60, 0x90, .. */
+       u8 res6[0x14];          /* 0x1E0 */
+       u32 ecc_config;         /* 0x1F4 */
+       u32 ecc_control;        /* 0x1F8 */
+       u32 ecc_size_config;    /* 0x1FC */
+       u32 ecc1_result;        /* 0x200 */
+       u32 ecc2_result;        /* 0x204 */
+       u32 ecc3_result;        /* 0x208 */
+       u32 ecc4_result;        /* 0x20C */
+       u32 ecc5_result;        /* 0x210 */
+       u32 ecc6_result;        /* 0x214 */
+       u32 ecc7_result;        /* 0x218 */
+       u32 ecc8_result;        /* 0x21C */
+       u32 ecc9_result;        /* 0x220 */
+       u8 res7[12];            /* 0x224 */
+       u32 testmomde_ctrl;     /* 0x230 */
+       u8 res8[12];            /* 0x234 */
+       struct bch_res_0_3 bch_result_0_3[2];   /* 0x240 */
+};
+
+/* Used for board specific gpmc initialization */
+extern struct gpmc *gpmc_cfg;
+
+#endif /* __ASM_OMAP_GPMC_H */