|
@@ -42,23 +42,33 @@ static inline struct spinand_state *mtd_to_state(struct mtd_info *mtd)
|
|
|
static int enable_hw_ecc;
|
|
|
static int enable_read_hw_ecc;
|
|
|
|
|
|
-static struct nand_ecclayout spinand_oob_64 = {
|
|
|
- .eccbytes = 24,
|
|
|
- .eccpos = {
|
|
|
- 1, 2, 3, 4, 5, 6,
|
|
|
- 17, 18, 19, 20, 21, 22,
|
|
|
- 33, 34, 35, 36, 37, 38,
|
|
|
- 49, 50, 51, 52, 53, 54, },
|
|
|
- .oobfree = {
|
|
|
- {.offset = 8,
|
|
|
- .length = 8},
|
|
|
- {.offset = 24,
|
|
|
- .length = 8},
|
|
|
- {.offset = 40,
|
|
|
- .length = 8},
|
|
|
- {.offset = 56,
|
|
|
- .length = 8},
|
|
|
- }
|
|
|
+static int spinand_ooblayout_64_ecc(struct mtd_info *mtd, int section,
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
+{
|
|
|
+ if (section > 3)
|
|
|
+ return -ERANGE;
|
|
|
+
|
|
|
+ oobregion->offset = (section * 16) + 1;
|
|
|
+ oobregion->length = 6;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int spinand_ooblayout_64_free(struct mtd_info *mtd, int section,
|
|
|
+ struct mtd_oob_region *oobregion)
|
|
|
+{
|
|
|
+ if (section > 3)
|
|
|
+ return -ERANGE;
|
|
|
+
|
|
|
+ oobregion->offset = (section * 16) + 8;
|
|
|
+ oobregion->length = 8;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct mtd_ooblayout_ops spinand_oob_64_ops = {
|
|
|
+ .ecc = spinand_ooblayout_64_ecc,
|
|
|
+ .free = spinand_ooblayout_64_free,
|
|
|
};
|
|
|
#endif
|
|
|
|
|
@@ -886,7 +896,6 @@ static int spinand_probe(struct spi_device *spi_nand)
|
|
|
|
|
|
chip->ecc.strength = 1;
|
|
|
chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
|
|
|
- chip->ecc.layout = &spinand_oob_64;
|
|
|
chip->ecc.read_page = spinand_read_page_hwecc;
|
|
|
chip->ecc.write_page = spinand_write_page_hwecc;
|
|
|
#else
|
|
@@ -912,6 +921,9 @@ static int spinand_probe(struct spi_device *spi_nand)
|
|
|
|
|
|
mtd->dev.parent = &spi_nand->dev;
|
|
|
mtd->oobsize = 64;
|
|
|
+#ifdef CONFIG_MTD_SPINAND_ONDIEECC
|
|
|
+ mtd_set_ooblayout(mtd, &spinand_oob_64_ops);
|
|
|
+#endif
|
|
|
|
|
|
if (nand_scan(mtd, 1))
|
|
|
return -ENXIO;
|