Commit 04a123a9 authored by Boris Brezillon's avatar Boris Brezillon

mtd: nand: fsmc: get rid of the fsmc_nand_eccplace struct

Now that mtd_ooblayout_ecc() returns the ECC byte position using the
OOB free method, we can get rid of the fsmc_nand_eccplace struct.
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
parent 22b46957
...@@ -39,35 +39,6 @@ ...@@ -39,35 +39,6 @@
#include <linux/amba/bus.h> #include <linux/amba/bus.h>
#include <mtd/mtd-abi.h> #include <mtd/mtd-abi.h>
/*
* ECC placement definitions in oobfree type format.
* There are 13 bytes of ecc for every 512 byte block and it has to be read
* consecutively and immediately after the 512 byte data block for hardware to
* generate the error bit offsets in 512 byte data.
* Managing the ecc bytes in the following way makes it easier for software to
* read ecc bytes consecutive to data bytes. This way is similar to
* oobfree structure maintained already in generic nand driver
*/
static struct fsmc_eccplace fsmc_ecc4_lp_place = {
.eccplace = {
{.offset = 2, .length = 13},
{.offset = 18, .length = 13},
{.offset = 34, .length = 13},
{.offset = 50, .length = 13},
{.offset = 66, .length = 13},
{.offset = 82, .length = 13},
{.offset = 98, .length = 13},
{.offset = 114, .length = 13}
}
};
static struct fsmc_eccplace fsmc_ecc4_sp_place = {
.eccplace = {
{.offset = 0, .length = 4},
{.offset = 6, .length = 9}
}
};
static int fsmc_ecc1_ooblayout_ecc(struct mtd_info *mtd, int section, static int fsmc_ecc1_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion) struct mtd_oob_region *oobregion)
{ {
...@@ -105,6 +76,12 @@ static const struct mtd_ooblayout_ops fsmc_ecc1_ooblayout_ops = { ...@@ -105,6 +76,12 @@ static const struct mtd_ooblayout_ops fsmc_ecc1_ooblayout_ops = {
.free = fsmc_ecc1_ooblayout_free, .free = fsmc_ecc1_ooblayout_free,
}; };
/*
* ECC placement definitions in oobfree type format.
* There are 13 bytes of ecc for every 512 byte block and it has to be read
* consecutively and immediately after the 512 byte data block for hardware to
* generate the error bit offsets in 512 byte data.
*/
static int fsmc_ecc4_ooblayout_ecc(struct mtd_info *mtd, int section, static int fsmc_ecc4_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *oobregion) struct mtd_oob_region *oobregion)
{ {
...@@ -155,7 +132,6 @@ static const struct mtd_ooblayout_ops fsmc_ecc4_ooblayout_ops = { ...@@ -155,7 +132,6 @@ static const struct mtd_ooblayout_ops fsmc_ecc4_ooblayout_ops = {
* @partitions: Partition info for a NAND Flash. * @partitions: Partition info for a NAND Flash.
* @nr_partitions: Total number of partition of a NAND flash. * @nr_partitions: Total number of partition of a NAND flash.
* *
* @ecc_place: ECC placing locations in oobfree type format.
* @bank: Bank number for probed device. * @bank: Bank number for probed device.
* @clk: Clock structure for FSMC. * @clk: Clock structure for FSMC.
* *
...@@ -175,7 +151,6 @@ struct fsmc_nand_data { ...@@ -175,7 +151,6 @@ struct fsmc_nand_data {
struct mtd_partition *partitions; struct mtd_partition *partitions;
unsigned int nr_partitions; unsigned int nr_partitions;
struct fsmc_eccplace *ecc_place;
unsigned int bank; unsigned int bank;
struct device *dev; struct device *dev;
enum access_mode mode; enum access_mode mode;
...@@ -582,8 +557,6 @@ static void fsmc_write_buf_dma(struct mtd_info *mtd, const uint8_t *buf, ...@@ -582,8 +557,6 @@ static void fsmc_write_buf_dma(struct mtd_info *mtd, const uint8_t *buf,
static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
uint8_t *buf, int oob_required, int page) uint8_t *buf, int oob_required, int page)
{ {
struct fsmc_nand_data *host = mtd_to_fsmc(mtd);
struct fsmc_eccplace *ecc_place = host->ecc_place;
int i, j, s, stat, eccsize = chip->ecc.size; int i, j, s, stat, eccsize = chip->ecc.size;
int eccbytes = chip->ecc.bytes; int eccbytes = chip->ecc.bytes;
int eccsteps = chip->ecc.steps; int eccsteps = chip->ecc.steps;
...@@ -606,9 +579,15 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -606,9 +579,15 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
chip->read_buf(mtd, p, eccsize); chip->read_buf(mtd, p, eccsize);
for (j = 0; j < eccbytes;) { for (j = 0; j < eccbytes;) {
off = ecc_place->eccplace[group].offset; struct mtd_oob_region oobregion;
len = ecc_place->eccplace[group].length; int ret;
group++;
ret = mtd_ooblayout_ecc(mtd, group++, &oobregion);
if (ret)
return ret;
off = oobregion.offset;
len = oobregion.length;
/* /*
* length is intentionally kept a higher multiple of 2 * length is intentionally kept a higher multiple of 2
...@@ -956,19 +935,10 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) ...@@ -956,19 +935,10 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)
if (AMBA_REV_BITS(host->pid) >= 8) { if (AMBA_REV_BITS(host->pid) >= 8) {
switch (mtd->oobsize) { switch (mtd->oobsize) {
case 16: case 16:
host->ecc_place = &fsmc_ecc4_sp_place;
break;
case 64: case 64:
host->ecc_place = &fsmc_ecc4_lp_place;
break;
case 128: case 128:
host->ecc_place = &fsmc_ecc4_lp_place;
break;
case 224: case 224:
host->ecc_place = &fsmc_ecc4_lp_place;
break;
case 256: case 256:
host->ecc_place = &fsmc_ecc4_lp_place;
break; break;
default: default:
dev_warn(&pdev->dev, "No oob scheme defined for oobsize %d\n", dev_warn(&pdev->dev, "No oob scheme defined for oobsize %d\n",
......
...@@ -103,24 +103,6 @@ ...@@ -103,24 +103,6 @@
#define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ) #define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ)
/*
* There are 13 bytes of ecc for every 512 byte block in FSMC version 8
* and it has to be read consecutively and immediately after the 512
* byte data block for hardware to generate the error bit offsets
* Managing the ecc bytes in the following way is easier. This way is
* similar to oobfree structure maintained already in u-boot nand driver
*/
#define MAX_ECCPLACE_ENTRIES 32
struct fsmc_nand_eccplace {
uint8_t offset;
uint8_t length;
};
struct fsmc_eccplace {
struct fsmc_nand_eccplace eccplace[MAX_ECCPLACE_ENTRIES];
};
struct fsmc_nand_timings { struct fsmc_nand_timings {
uint8_t tclr; uint8_t tclr;
uint8_t tar; uint8_t tar;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment