mtd: nand: Add ONFI support for FSL NAND controller
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Mon, 12 Dec 2011 09:40:53 +0000 (17:40 +0800)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 9 Jan 2012 18:18:47 +0000 (18:18 +0000)
- fix NAND_CMD_READID command for ONFI detect.
- add NAND_CMD_PARAM command to read the ONFI parameter page.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/fsl_elbc_nand.c

index 080e6037cbfb44a40221e9b6bfd82ef6279a17e9..7195ee6efe12293df9e92302959dbe786b3f80bd 100644 (file)
@@ -356,20 +356,22 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
                fsl_elbc_run_command(mtd);
                return;
 
-       /* READID must read all 5 possible bytes while CEB is active */
        case NAND_CMD_READID:
-               dev_vdbg(priv->dev, "fsl_elbc_cmdfunc: NAND_CMD_READID.\n");
+       case NAND_CMD_PARAM:
+               dev_vdbg(priv->dev, "fsl_elbc_cmdfunc: NAND_CMD %x\n", command);
 
                out_be32(&lbc->fir, (FIR_OP_CM0 << FIR_OP0_SHIFT) |
                                    (FIR_OP_UA  << FIR_OP1_SHIFT) |
                                    (FIR_OP_RBW << FIR_OP2_SHIFT));
-               out_be32(&lbc->fcr, NAND_CMD_READID << FCR_CMD0_SHIFT);
-               /* nand_get_flash_type() reads 8 bytes of entire ID string */
-               out_be32(&lbc->fbcr, 8);
-               elbc_fcm_ctrl->read_bytes = 8;
+               out_be32(&lbc->fcr, command << FCR_CMD0_SHIFT);
+               /*
+                * although currently it's 8 bytes for READID, we always read
+                * the maximum 256 bytes(for PARAM)
+                */
+               out_be32(&lbc->fbcr, 256);
+               elbc_fcm_ctrl->read_bytes = 256;
                elbc_fcm_ctrl->use_mdr = 1;
-               elbc_fcm_ctrl->mdr = 0;
-
+               elbc_fcm_ctrl->mdr = column;
                set_addr(mtd, 0, 0, 0);
                fsl_elbc_run_command(mtd);
                return;