mtd/nand: Fix IFC driver to support 2K NAND page
authorPrabhakar Kushwaha <prabhakar@freescale.com>
Fri, 20 Jan 2012 13:09:05 +0000 (18:39 +0530)
committerScott Wood <scottwood@freescale.com>
Tue, 28 Feb 2012 20:03:39 +0000 (14:03 -0600)
1) OOB area should be updated irrespective of NAND page size. Earlier it was
updated only for 512byte NAND page.

2) During OOB update fbcr should be equal to OOB size.

Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com>
Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
drivers/mtd/nand/fsl_ifc_nand.c

index b3f3c3c05a58bc23c2ae7b68fdd5ec00a6421027..36e1baeb497660b4e8da27eb1803573b9095fa24 100644 (file)
@@ -448,21 +448,19 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
                        out_be32(&ifc->ifc_nand.nand_fir1,
                                 (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT));
 
-                       if (column >= mtd->writesize) {
-                               /* OOB area --> READOOB */
-                               column -= mtd->writesize;
-                               nand_fcr0 |= NAND_CMD_READOOB <<
-                                               IFC_NAND_FCR0_CMD0_SHIFT;
-                               ctrl->oob = 1;
-                       } else if (column < 256) {
-                               /* First 256 bytes --> READ0 */
-                               nand_fcr0 |= NAND_CMD_READ0 << FCR_CMD0_SHIFT;
-                       } else {
-                               /* Second 256 bytes --> READ1 */
-                               nand_fcr0 |= NAND_CMD_READ1 << FCR_CMD0_SHIFT;
-                       }
+                       if (column >= mtd->writesize)
+                               nand_fcr0 |=
+                               NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
+                       else
+                               nand_fcr0 |=
+                               NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
                }
 
+               if (column >= mtd->writesize) {
+                       /* OOB area --> READOOB */
+                       column -= mtd->writesize;
+                       ctrl->oob = 1;
+               }
                out_be32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
                set_addr(mtd, column, page_addr, ctrl->oob);
                return;
@@ -471,7 +469,8 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
        /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
        case NAND_CMD_PAGEPROG:
                if (ctrl->oob)
-                       out_be32(&ifc->ifc_nand.nand_fbcr, ctrl->index);
+                       out_be32(&ifc->ifc_nand.nand_fbcr,
+                                       ctrl->index - ctrl->column);
                else
                        out_be32(&ifc->ifc_nand.nand_fbcr, 0);