summaryrefslogtreecommitdiff
path: root/drivers/mtd/nand/gpmi-nand
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2012-12-06 00:46:02 +0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-17 20:50:45 +0400
commitb53673dcf8a31a4b2f41fdf2fa168b7c693fd7b3 (patch)
tree3e10975166e5262fa28a103b2f82f7d0893e9357 /drivers/mtd/nand/gpmi-nand
parent272965fcdaf55d0930dbc594fdfd93cd13fcc8cd (diff)
downloadlinux-b53673dcf8a31a4b2f41fdf2fa168b7c693fd7b3.tar.xz
mtd: nand: gpmi: reset BCH earlier, too, to avoid NAND startup problems
commit 6f2a6a52560ad8d85710aabd92b7a3239b3a6b07 upstream. It could happen (1 out of 100 times) that NAND did not start up correctly after warm rebooting, so the kernel could not find the UBI or DMA timed out due to a stalled BCH. When resetting BCH together with GPMI, the issue could not be observed anymore (after 10000+ reboots). We probably need the consistent state already before sending any command to NAND, even when no ECC is needed. I chose to keep the extra reset for BCH when changing the flash layout to be on the safe side. Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> Acked-by: Huang Shijie <b32955@freescale.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/mtd/nand/gpmi-nand')
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-lib.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
index e8ea7107932e..022feb45c15e 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
@@ -135,6 +135,15 @@ int gpmi_init(struct gpmi_nand_data *this)
if (ret)
goto err_out;
+ /*
+ * Reset BCH here, too. We got failures otherwise :(
+ * See later BCH reset for explanation of MX23 handling
+ */
+ ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this));
+ if (ret)
+ goto err_out;
+
+
/* Choose NAND mode. */
writel(BM_GPMI_CTRL1_GPMI_MODE, r->gpmi_regs + HW_GPMI_CTRL1_CLR);