mtd: nand: fixup for fmr initialization of Freescale NAND controller
authorShengzhou Liu <Shengzhou.Liu@freescale.com>
Mon, 12 Dec 2011 09:40:52 +0000 (17:40 +0800)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 9 Jan 2012 18:18:44 +0000 (18:18 +0000)
There was a bug for fmr initialization, which lead to  fmr was always 0x100
in fsl_elbc_chip_init() and caused FCM command timeout before calling
fsl_elbc_chip_init_tail(), now we initialize CWTO to maximum timeout value
and not relying on the setting of bootloader.

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 d29479a..080e603 100644 (file)
@@ -671,9 +671,7 @@ static int fsl_elbc_chip_init_tail(struct mtd_info *mtd)
        if (chip->pagemask & 0xff000000)
                al++;
 
-       /* add to ECCM mode set in fsl_elbc_init */
-       priv->fmr |= (12 << FMR_CWTO_SHIFT) |  /* Timeout > 12 ms */
-                    (al << FMR_AL_SHIFT);
+       priv->fmr |= al << FMR_AL_SHIFT;
 
        dev_dbg(priv->dev, "fsl_elbc_init: nand->numchips = %d\n",
                chip->numchips);
@@ -776,8 +774,10 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
        priv->mtd.priv = chip;
        priv->mtd.owner = THIS_MODULE;
 
-       /* Set the ECCM according to the settings in bootloader.*/
-       priv->fmr = in_be32(&lbc->fmr) & FMR_ECCM;
+       /* set timeout to maximum */
+       priv->fmr = 15 << FMR_CWTO_SHIFT;
+       if (in_be32(&lbc->bank[priv->bank].or) & OR_FCM_PGS)
+               priv->fmr |= FMR_ECCM;
 
        /* fill in nand_chip structure */
        /* set up function call table */