|
@@ -931,7 +931,7 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
|
|
|
u32 val;
|
|
|
|
|
|
val = readl(info->reg.gpmc_ecc_config);
|
|
|
- if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs)
|
|
|
+ if (((val >> ECC_CONFIG_CS_SHIFT) & CS_MASK) != info->gpmc_cs)
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* read ecc result */
|
|
@@ -1794,9 +1794,12 @@ static int omap_nand_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
|
|
|
/* populate MTD interface based on ECC scheme */
|
|
|
- nand_chip->ecc.layout = &omap_oobinfo;
|
|
|
ecclayout = &omap_oobinfo;
|
|
|
switch (info->ecc_opt) {
|
|
|
+ case OMAP_ECC_HAM1_CODE_SW:
|
|
|
+ nand_chip->ecc.mode = NAND_ECC_SOFT;
|
|
|
+ break;
|
|
|
+
|
|
|
case OMAP_ECC_HAM1_CODE_HW:
|
|
|
pr_info("nand: using OMAP_ECC_HAM1_CODE_HW\n");
|
|
|
nand_chip->ecc.mode = NAND_ECC_HW;
|
|
@@ -1848,7 +1851,7 @@ static int omap_nand_probe(struct platform_device *pdev)
|
|
|
nand_chip->ecc.priv = nand_bch_init(mtd,
|
|
|
nand_chip->ecc.size,
|
|
|
nand_chip->ecc.bytes,
|
|
|
- &nand_chip->ecc.layout);
|
|
|
+ &ecclayout);
|
|
|
if (!nand_chip->ecc.priv) {
|
|
|
pr_err("nand: error: unable to use s/w BCH library\n");
|
|
|
err = -EINVAL;
|
|
@@ -1923,7 +1926,7 @@ static int omap_nand_probe(struct platform_device *pdev)
|
|
|
nand_chip->ecc.priv = nand_bch_init(mtd,
|
|
|
nand_chip->ecc.size,
|
|
|
nand_chip->ecc.bytes,
|
|
|
- &nand_chip->ecc.layout);
|
|
|
+ &ecclayout);
|
|
|
if (!nand_chip->ecc.priv) {
|
|
|
pr_err("nand: error: unable to use s/w BCH library\n");
|
|
|
err = -EINVAL;
|
|
@@ -2012,6 +2015,9 @@ static int omap_nand_probe(struct platform_device *pdev)
|
|
|
goto return_error;
|
|
|
}
|
|
|
|
|
|
+ if (info->ecc_opt == OMAP_ECC_HAM1_CODE_SW)
|
|
|
+ goto scan_tail;
|
|
|
+
|
|
|
/* all OOB bytes from oobfree->offset till end off OOB are free */
|
|
|
ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
|
|
|
/* check if NAND device's OOB is enough to store ECC signatures */
|
|
@@ -2021,7 +2027,9 @@ static int omap_nand_probe(struct platform_device *pdev)
|
|
|
err = -EINVAL;
|
|
|
goto return_error;
|
|
|
}
|
|
|
+ nand_chip->ecc.layout = ecclayout;
|
|
|
|
|
|
+scan_tail:
|
|
|
/* second phase scan */
|
|
|
if (nand_scan_tail(mtd)) {
|
|
|
err = -ENXIO;
|