]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mtd: gpmi: set the Golois Field bit for mx6q's BCH
authorHuang Shijie <b32955@freescale.com>
Fri, 25 Jan 2013 06:04:07 +0000 (14:04 +0800)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Mon, 4 Feb 2013 08:27:59 +0000 (10:27 +0200)
The GF13 can be only used in the following case:
    The ECC data chunk is less then 1K bytes.

In mx23/mx28, the ecc data chunk is 512 bytes. So it is okay.

But in mx6q, we begin to use some large nand chip whose ecc
data chunk maybe 1K bytes long.  So when the data chunk is 1K bytes,
we have to use the GF14.

This patch sets the Golois Field bit when the GF14 is needed.

Signed-off-by: Huang Shijie <b32955@freescale.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
drivers/mtd/nand/gpmi-nand/bch-regs.h
drivers/mtd/nand/gpmi-nand/gpmi-lib.c
drivers/mtd/nand/gpmi-nand/gpmi-nand.c

index d67bca5174bcb003db7878839540ef1b71cb8c5c..588f5374047c65c2f3e78219da875009c0092051 100644 (file)
                        & BM_BCH_FLASH0LAYOUT0_ECC0)            \
        )
 
+#define MX6Q_BP_BCH_FLASH0LAYOUT0_GF_13_14     10
+#define MX6Q_BM_BCH_FLASH0LAYOUT0_GF_13_14                     \
+                               (0x1 << MX6Q_BP_BCH_FLASH0LAYOUT0_GF_13_14)
+#define BF_BCH_FLASH0LAYOUT0_GF(v, x)                          \
+       ((GPMI_IS_MX6Q(x) && ((v) == 14))                       \
+               ? (((1) << MX6Q_BP_BCH_FLASH0LAYOUT0_GF_13_14)  \
+                       & MX6Q_BM_BCH_FLASH0LAYOUT0_GF_13_14)   \
+               : 0                                             \
+       )
+
 #define BP_BCH_FLASH0LAYOUT0_DATA0_SIZE                0
 #define BM_BCH_FLASH0LAYOUT0_DATA0_SIZE                \
                        (0xfff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)
                        & BM_BCH_FLASH0LAYOUT1_ECCN)            \
        )
 
+#define MX6Q_BP_BCH_FLASH0LAYOUT1_GF_13_14     10
+#define MX6Q_BM_BCH_FLASH0LAYOUT1_GF_13_14                     \
+                               (0x1 << MX6Q_BP_BCH_FLASH0LAYOUT1_GF_13_14)
+#define BF_BCH_FLASH0LAYOUT1_GF(v, x)                          \
+       ((GPMI_IS_MX6Q(x) && ((v) == 14))                       \
+               ? (((1) << MX6Q_BP_BCH_FLASH0LAYOUT1_GF_13_14)  \
+                       & MX6Q_BM_BCH_FLASH0LAYOUT1_GF_13_14)   \
+               : 0                                             \
+       )
+
 #define BP_BCH_FLASH0LAYOUT1_DATAN_SIZE                0
 #define BM_BCH_FLASH0LAYOUT1_DATAN_SIZE                \
                        (0xfff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE)
index 01cc570e98aa8470502fa47b49308b6485a723be..4f8857fa48a7f93f502e7b0d1a2581eebac64234 100644 (file)
@@ -237,6 +237,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
        unsigned int metadata_size;
        unsigned int ecc_strength;
        unsigned int page_size;
+       unsigned int gf_len;
        int ret;
 
        if (common_nfc_set_geometry(this))
@@ -247,6 +248,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
        metadata_size = bch_geo->metadata_size;
        ecc_strength  = bch_geo->ecc_strength >> 1;
        page_size     = bch_geo->page_size;
+       gf_len        = bch_geo->gf_len;
 
        ret = gpmi_enable_clk(this);
        if (ret)
@@ -268,11 +270,13 @@ int bch_set_geometry(struct gpmi_nand_data *this)
        writel(BF_BCH_FLASH0LAYOUT0_NBLOCKS(block_count)
                        | BF_BCH_FLASH0LAYOUT0_META_SIZE(metadata_size)
                        | BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this)
+                       | BF_BCH_FLASH0LAYOUT0_GF(gf_len, this)
                        | BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size, this),
                        r->bch_regs + HW_BCH_FLASH0LAYOUT0);
 
        writel(BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size)
                        | BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this)
+                       | BF_BCH_FLASH0LAYOUT1_GF(gf_len, this)
                        | BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size, this),
                        r->bch_regs + HW_BCH_FLASH0LAYOUT1);
 
index 38c8b8bfc42894dcc2bd566f33de3eb1934be5cb..25216785f180786168053c17a9a71e4dc9d9b571 100644 (file)
@@ -112,10 +112,12 @@ int common_nfc_set_geometry(struct gpmi_nand_data *this)
        /* The default for the length of Galois Field. */
        geo->gf_len = 13;
 
-       /* The default for chunk size. There is no oobsize greater then 512. */
+       /* The default for chunk size. */
        geo->ecc_chunk_size = 512;
-       while (geo->ecc_chunk_size < mtd->oobsize)
+       while (geo->ecc_chunk_size < mtd->oobsize) {
                geo->ecc_chunk_size *= 2; /* keep C >= O */
+               geo->gf_len = 14;
+       }
 
        geo->ecc_chunk_count = mtd->writesize / geo->ecc_chunk_size;