|
@@ -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;
|