summaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2012-12-05 20:02:47 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-12-06 08:43:01 +0100
commit97110094e3af84c21bf5e74aae138167e4127f7b (patch)
treeffe7ac0a3f3cdc8684036b5175549f06e76fe99f /drivers/mtd
parent47515fbdaa7e5ebd3e5010418588b52dd105252e (diff)
downloadbarebox-97110094e3af84c21bf5e74aae138167e4127f7b.tar.gz
barebox-97110094e3af84c21bf5e74aae138167e4127f7b.tar.xz
mtd: nand: mxs: reset BCH earlier, too, to avoid NAND startup problems
It could happen (1 out of 100 times) that NAND did not start up correctly after warm rebooting, so barebox could not find its environment or DMA timed out due to a stalled BCH. When resetting BCH together with GPMI, the issue could not be observed anymore. We probably need the consistent state already before sending commands to NAND. Signed-off-by: Wolfram Sang <w.sang@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nand/nand_mxs.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/mtd/nand/nand_mxs.c b/drivers/mtd/nand/nand_mxs.c
index 975a44f569..c4509d3dd6 100644
--- a/drivers/mtd/nand/nand_mxs.c
+++ b/drivers/mtd/nand/nand_mxs.c
@@ -1128,6 +1128,7 @@ int mxs_nand_alloc_buffers(struct mxs_nand_info *nand_info)
int mxs_nand_hw_init(struct mxs_nand_info *info)
{
void __iomem *gpmi_regs = (void *)MXS_GPMI_BASE;
+ void __iomem *bch_regs = (void __iomem *)MXS_BCH_BASE;
int i = 0, ret;
u32 val;
@@ -1153,6 +1154,15 @@ int mxs_nand_hw_init(struct mxs_nand_info *info)
if (ret)
return ret;
+ val = readl(gpmi_regs + GPMI_VERSION);
+ info->version = val >> GPMI_VERSION_MINOR_OFFSET;
+
+ /* Reset BCH. Don't use SFTRST on MX23 due to Errata #2847 */
+ ret = mxs_reset_block(bch_regs + BCH_CTRL,
+ info->version == GPMI_VERSION_TYPE_MX23);
+ if (ret)
+ return ret;
+
/*
* Choose NAND mode, set IRQ polarity, disable write protection and
* select BCH ECC.
@@ -1163,9 +1173,6 @@ int mxs_nand_hw_init(struct mxs_nand_info *info)
GPMI_CTRL1_BCH_MODE;
writel(val, gpmi_regs + GPMI_CTRL1);
- val = readl(gpmi_regs + GPMI_VERSION);
- info->version = val >> GPMI_VERSION_MINOR_OFFSET;
-
return 0;
err2: