| From 3f77f244d8ec28e3a0a81240ffac7d626390060c Mon Sep 17 00:00:00 2001 |
| From: Martin Kaiser <martin@kaiser.cx> |
| Date: Mon, 18 Jun 2018 22:41:03 +0200 |
| Subject: mtd: rawnand: mxc: set spare area size register explicitly |
| |
| From: Martin Kaiser <martin@kaiser.cx> |
| |
| commit 3f77f244d8ec28e3a0a81240ffac7d626390060c upstream. |
| |
| The v21 version of the NAND flash controller contains a Spare Area Size |
| Register (SPAS) at offset 0x10. Its setting defaults to the maximum |
| spare area size of 218 bytes. The size that is set in this register is |
| used by the controller when it calculates the ECC bytes internally in |
| hardware. |
| |
| Usually, this register is updated from settings in the IIM fuses when |
| the system is booting from NAND flash. For other boot media, however, |
| the SPAS register remains at the default setting, which may not work for |
| the particular flash chip on the board. The same goes for flash chips |
| whose configuration cannot be set in the IIM fuses (e.g. chips with 2k |
| sector size and 128 bytes spare area size can't be configured in the IIM |
| fuses on imx25 systems). |
| |
| Set the SPAS register explicitly during the preset operation. Derive the |
| register value from mtd->oobsize that was detected during probe by |
| decoding the flash chip's ID bytes. |
| |
| While at it, rename the define for the spare area register's offset to |
| NFC_V21_RSLTSPARE_AREA. The register at offset 0x10 on v1 controllers is |
| different from the register on v21 controllers. |
| |
| Fixes: d484018 ("mtd: mxc_nand: set NFC registers after reset") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Martin Kaiser <martin@kaiser.cx> |
| Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de> |
| Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| drivers/mtd/nand/mxc_nand.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/mtd/nand/mxc_nand.c |
| +++ b/drivers/mtd/nand/mxc_nand.c |
| @@ -49,7 +49,7 @@ |
| #define NFC_V1_V2_CONFIG (host->regs + 0x0a) |
| #define NFC_V1_V2_ECC_STATUS_RESULT (host->regs + 0x0c) |
| #define NFC_V1_V2_RSLTMAIN_AREA (host->regs + 0x0e) |
| -#define NFC_V1_V2_RSLTSPARE_AREA (host->regs + 0x10) |
| +#define NFC_V21_RSLTSPARE_AREA (host->regs + 0x10) |
| #define NFC_V1_V2_WRPROT (host->regs + 0x12) |
| #define NFC_V1_UNLOCKSTART_BLKADDR (host->regs + 0x14) |
| #define NFC_V1_UNLOCKEND_BLKADDR (host->regs + 0x16) |
| @@ -1034,6 +1034,9 @@ static void preset_v2(struct mtd_info *m |
| writew(config1, NFC_V1_V2_CONFIG1); |
| /* preset operation */ |
| |
| + /* spare area size in 16-bit half-words */ |
| + writew(mtd->oobsize / 2, NFC_V21_RSLTSPARE_AREA); |
| + |
| /* Unlock the internal RAM Buffer */ |
| writew(0x2, NFC_V1_V2_CONFIG); |
| |