diff options
author | Mark Marshall <mark.marshall@omicronenergy.com> | 2017-01-26 10:18:27 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-12 00:41:52 -0500 |
commit | 9d82393e658cf7010b90a79d7c065e1766e5480c (patch) | |
tree | 2c02ca09f4ac9cc691100c5f9ed3dfd728272674 | |
parent | 178d07a0b8c4dc1f6e8a924f04231a5cf9cf86d1 (diff) |
mtd: nand: ifc: Fix location of eccstat registers for IFC V1.0
commit 656441478ed55d960df5f3ccdf5a0f8c61dfd0b3 upstream.
The commit 7a654172161c ("mtd/ifc: Add support for IFC controller
version 2.0") added support for version 2.0 of the IFC controller.
The version 2.0 controller has the ECC status registers at a different
location to the previous versions.
Correct the fsl_ifc_nand structure so that the ECC status can be read
from the correct location for both version 1.0 and 2.0 of the controller.
Fixes: 7a654172161c ("mtd/ifc: Add support for IFC controller version 2.0")
Signed-off-by: Mark Marshall <mark.marshall@omicronenergy.com>
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/mtd/nand/fsl_ifc_nand.c | 8 | ||||
-rw-r--r-- | include/linux/fsl_ifc.h | 8 |
2 files changed, 13 insertions, 3 deletions
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c index 0a177b1bfe3e..d1570f512f0b 100644 --- a/drivers/mtd/nand/fsl_ifc_nand.c +++ b/drivers/mtd/nand/fsl_ifc_nand.c | |||
@@ -258,9 +258,15 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) | |||
258 | int bufnum = nctrl->page & priv->bufnum_mask; | 258 | int bufnum = nctrl->page & priv->bufnum_mask; |
259 | int sector = bufnum * chip->ecc.steps; | 259 | int sector = bufnum * chip->ecc.steps; |
260 | int sector_end = sector + chip->ecc.steps - 1; | 260 | int sector_end = sector + chip->ecc.steps - 1; |
261 | __be32 *eccstat_regs; | ||
262 | |||
263 | if (ctrl->version >= FSL_IFC_VERSION_2_0_0) | ||
264 | eccstat_regs = ifc->ifc_nand.v2_nand_eccstat; | ||
265 | else | ||
266 | eccstat_regs = ifc->ifc_nand.v1_nand_eccstat; | ||
261 | 267 | ||
262 | for (i = sector / 4; i <= sector_end / 4; i++) | 268 | for (i = sector / 4; i <= sector_end / 4; i++) |
263 | eccstat[i] = ifc_in32(&ifc->ifc_nand.nand_eccstat[i]); | 269 | eccstat[i] = ifc_in32(&eccstat_regs[i]); |
264 | 270 | ||
265 | for (i = sector; i <= sector_end; i++) { | 271 | for (i = sector; i <= sector_end; i++) { |
266 | errors = check_read_ecc(mtd, ctrl, eccstat, i); | 272 | errors = check_read_ecc(mtd, ctrl, eccstat, i); |
diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h index 3f9778cbc79d..c332f0a45607 100644 --- a/include/linux/fsl_ifc.h +++ b/include/linux/fsl_ifc.h | |||
@@ -733,8 +733,12 @@ struct fsl_ifc_nand { | |||
733 | __be32 nand_erattr1; | 733 | __be32 nand_erattr1; |
734 | u32 res19[0x10]; | 734 | u32 res19[0x10]; |
735 | __be32 nand_fsr; | 735 | __be32 nand_fsr; |
736 | u32 res20[0x3]; | 736 | u32 res20; |
737 | __be32 nand_eccstat[6]; | 737 | /* The V1 nand_eccstat is actually 4 words that overlaps the |
738 | * V2 nand_eccstat. | ||
739 | */ | ||
740 | __be32 v1_nand_eccstat[2]; | ||
741 | __be32 v2_nand_eccstat[6]; | ||
738 | u32 res21[0x1c]; | 742 | u32 res21[0x1c]; |
739 | __be32 nanndcr; | 743 | __be32 nanndcr; |
740 | u32 res22[0x2]; | 744 | u32 res22[0x2]; |