diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-07-18 15:02:58 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-07-22 16:14:08 +0200 |
commit | d15561082121015724734c9eecf7f7f25d7c95b1 (patch) | |
tree | 527053e5762c76e105d113a930ee49638f42db6f /drivers | |
parent | e3885851b737f7dbe8dcd4aab823b7acab8a49a4 (diff) | |
download | barebox-d15561082121015724734c9eecf7f7f25d7c95b1.tar.gz barebox-d15561082121015724734c9eecf7f7f25d7c95b1.tar.xz |
mtd: introduce ecc strength
This introduces the ecc stength fields in the structures and fills
them in, but leaves them unused right now.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 2 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_imx.c | 3 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_mxs.c | 1 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_omap_gpmc.c | 8 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_s3c24xx.c | 2 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_swecc.c | 1 | ||||
-rw-r--r-- | drivers/mtd/nand/nomadik_nand.c | 1 |
7 files changed, 18 insertions, 0 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 6a81f419fa..cc7a3dbfc4 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1686,6 +1686,7 @@ int nand_scan_tail(struct mtd_info *mtd) chip->ecc.read_oob = nand_read_oob_std; chip->ecc.size = mtd->writesize; chip->ecc.bytes = 0; + chip->ecc.strength = 0; break; #endif default: @@ -1762,6 +1763,7 @@ int nand_scan_tail(struct mtd_info *mtd) #endif /* propagate ecc.layout to mtd_info */ mtd->ecclayout = chip->ecc.layout; + mtd->ecc_strength = chip->ecc.strength; /* Check, if we should skip the bad block table scan */ if (chip->options & NAND_SKIP_BBTSCAN) diff --git a/drivers/mtd/nand/nand_imx.c b/drivers/mtd/nand/nand_imx.c index 1d7d3e8ded..91ee494a67 100644 --- a/drivers/mtd/nand/nand_imx.c +++ b/drivers/mtd/nand/nand_imx.c @@ -1298,6 +1298,9 @@ static int __init imxnd_probe(struct device_d *dev) writew(NFC_V2_SPAS_SPARESIZE(16), host->regs + NFC_V2_SPAS); } + if (this->ecc.mode == NAND_ECC_HW) + this->ecc.strength = host->eccsize; + /* second phase scan */ if (nand_scan_tail(mtd)) { err = -ENXIO; diff --git a/drivers/mtd/nand/nand_mxs.c b/drivers/mtd/nand/nand_mxs.c index c4183ab863..bf08731387 100644 --- a/drivers/mtd/nand/nand_mxs.c +++ b/drivers/mtd/nand/nand_mxs.c @@ -1246,6 +1246,7 @@ static int mxs_nand_probe(struct device_d *dev) nand->ecc.mode = NAND_ECC_HW; nand->ecc.bytes = 9; nand->ecc.size = 512; + nand->ecc.strength = 8; /* first scan to find the device and get the page size */ err = nand_scan_ident(mtd, 1); diff --git a/drivers/mtd/nand/nand_omap_gpmc.c b/drivers/mtd/nand/nand_omap_gpmc.c index d4482518fb..9c1f3d7669 100644 --- a/drivers/mtd/nand/nand_omap_gpmc.c +++ b/drivers/mtd/nand/nand_omap_gpmc.c @@ -85,6 +85,9 @@ #define GPMC_ECC_SIZE_CONFIG_ECCSIZE0(x) ((x) << 12) #define GPMC_ECC_SIZE_CONFIG_ECCSIZE1(x) ((x) << 22) +#define BCH8_MAX_ERROR 8 /* upto 8 bit correctable */ +#define BCH4_MAX_ERROR 4 /* upto 4 bit correctable */ + int omap_gpmc_decode_bch(int select_4_8, unsigned char *ecc, unsigned int *err_loc); static char *ecc_mode_strings[] = { @@ -785,6 +788,7 @@ static int omap_gpmc_eccmode(struct gpmc_nand_info *oinfo, case OMAP_ECC_HAMMING_CODE_HW_ROMCODE: oinfo->nand.ecc.bytes = 3; oinfo->nand.ecc.size = 512; + oinfo->nand.ecc.strength = 1; oinfo->ecc_parity_pairs = 12; if (oinfo->nand.options & NAND_BUSWIDTH_16) { offset = 2; @@ -802,6 +806,7 @@ static int omap_gpmc_eccmode(struct gpmc_nand_info *oinfo, case OMAP_ECC_BCH4_CODE_HW: oinfo->nand.ecc.bytes = 4 * 7; oinfo->nand.ecc.size = 4 * 512; + oinfo->nand.ecc.strength = BCH4_MAX_ERROR; omap_oobinfo.oobfree->offset = offset; omap_oobinfo.oobfree->length = minfo->oobsize - offset - omap_oobinfo.eccbytes; @@ -812,6 +817,7 @@ static int omap_gpmc_eccmode(struct gpmc_nand_info *oinfo, case OMAP_ECC_BCH8_CODE_HW: oinfo->nand.ecc.bytes = 4 * 13; oinfo->nand.ecc.size = 4 * 512; + oinfo->nand.ecc.strength = BCH8_MAX_ERROR; omap_oobinfo.oobfree->offset = offset; omap_oobinfo.oobfree->length = minfo->oobsize - offset - omap_oobinfo.eccbytes; @@ -822,6 +828,7 @@ static int omap_gpmc_eccmode(struct gpmc_nand_info *oinfo, case OMAP_ECC_BCH8_CODE_HW_ROMCODE: oinfo->nand.ecc.bytes = 4 * 13; oinfo->nand.ecc.size = 4 * 512; + oinfo->nand.ecc.strength = BCH8_MAX_ERROR; nand->ecc.read_page = omap_gpmc_read_page_bch_rom_mode; omap_oobinfo.oobfree->length = 0; j = 0; @@ -837,6 +844,7 @@ static int omap_gpmc_eccmode(struct gpmc_nand_info *oinfo, case OMAP_ECC_SOFT: nand->ecc.layout = NULL; nand->ecc.mode = NAND_ECC_SOFT; + oinfo->nand.ecc.strength = 1; break; default: return -EINVAL; diff --git a/drivers/mtd/nand/nand_s3c24xx.c b/drivers/mtd/nand/nand_s3c24xx.c index a3f947a60e..44063523f9 100644 --- a/drivers/mtd/nand/nand_s3c24xx.c +++ b/drivers/mtd/nand/nand_s3c24xx.c @@ -456,6 +456,8 @@ static int s3c24x0_nand_probe(struct device_d *dev) */ chip->ecc.mode = NAND_ECC_HW; chip->ecc.bytes = 3; /* always 24 bit ECC per turn */ + chip->ecc.strength = 1; + #ifdef CONFIG_CPU_S3C2440 if (readl(host->base) & 0x8) { /* large page (2048 bytes per page) */ diff --git a/drivers/mtd/nand/nand_swecc.c b/drivers/mtd/nand/nand_swecc.c index 95dfbd8083..35f84690cc 100644 --- a/drivers/mtd/nand/nand_swecc.c +++ b/drivers/mtd/nand/nand_swecc.c @@ -91,4 +91,5 @@ void nand_init_ecc_soft(struct nand_chip *chip) #endif chip->ecc.size = 256; chip->ecc.bytes = 3; + chip->ecc.strength = 1; } diff --git a/drivers/mtd/nand/nomadik_nand.c b/drivers/mtd/nand/nomadik_nand.c index afdbef12fd..fbd8ecd487 100644 --- a/drivers/mtd/nand/nomadik_nand.c +++ b/drivers/mtd/nand/nomadik_nand.c @@ -209,6 +209,7 @@ static int nomadik_nand_probe(struct device_d *dev) nand->ecc.hwctl = nomadik_ecc_control; nand->ecc.size = 512; nand->ecc.bytes = 3; + nand->ecc.strength = 1; nand->options = pdata->options; |