nand: arasan_nfc: Use the calculated ecc address for updating ecc register
authorSiva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Thu, 4 Jan 2018 10:34:22 +0000 (16:04 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Tue, 30 Jan 2018 13:29:07 +0000 (14:29 +0100)
This patch corrects the ecc address calculation before updating
to ecc register. The ecc address has to be calculated based on
page, oob and ecc sizes of the device.

Signed-off-by: Siva Durga Prasad Paladugu <sivadur@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/mtd/nand/arasan_nfc.c

index 70cb00e85fbd59f6d8cfeabb7da4d2b99da392a3..3c9a0215c53e6fc5e310a22dee17d01909ecc271 100644 (file)
@@ -1133,7 +1133,7 @@ static void arasan_check_ondie(struct mtd_info *mtd)
 static int arasan_nand_ecc_init(struct mtd_info *mtd)
 {
        int found = -1;
-       u32 regval, eccpos_start, i;
+       u32 regval, eccpos_start, i, eccaddr;
        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 
        for (i = 0; i < ARRAY_SIZE(ecc_matrix); i++) {
@@ -1152,7 +1152,10 @@ static int arasan_nand_ecc_init(struct mtd_info *mtd)
        if (found < 0)
                return 1;
 
-       regval = ecc_matrix[found].eccaddr |
+       eccaddr = mtd->writesize + mtd->oobsize -
+                 ecc_matrix[found].eccsize;
+
+       regval = eccaddr |
                 (ecc_matrix[found].eccsize << ARASAN_NAND_ECC_SIZE_SHIFT) |
                 (ecc_matrix[found].bch << ARASAN_NAND_ECC_BCH_SHIFT);
        writel(regval, &arasan_nand_base->ecc_reg);