Commit af37d2c3 authored by Boris Brezillon's avatar Boris Brezillon Committed by Miquel Raynal

mtd: rawnand: Pass a nand_chip object to ecc->calculate()

Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one.

Now is ecc->calculate()'s turn.
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
parent ec47636c
...@@ -164,10 +164,10 @@ static void cs_enable_hwecc(struct nand_chip *this, int mode) ...@@ -164,10 +164,10 @@ static void cs_enable_hwecc(struct nand_chip *this, int mode)
writeb(0x07, mmio_base + MM_NAND_ECC_CTL); writeb(0x07, mmio_base + MM_NAND_ECC_CTL);
} }
static int cs_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) static int cs_calculate_ecc(struct nand_chip *this, const u_char *dat,
u_char *ecc_code)
{ {
uint32_t ecc; uint32_t ecc;
struct nand_chip *this = mtd_to_nand(mtd);
void __iomem *mmio_base = this->IO_ADDR_R; void __iomem *mmio_base = this->IO_ADDR_R;
ecc = readl(mmio_base + MM_NAND_STS); ecc = readl(mmio_base + MM_NAND_STS);
......
...@@ -170,10 +170,10 @@ static void nand_davinci_hwctl_1bit(struct nand_chip *chip, int mode) ...@@ -170,10 +170,10 @@ static void nand_davinci_hwctl_1bit(struct nand_chip *chip, int mode)
/* /*
* Read hardware ECC value and pack into three bytes * Read hardware ECC value and pack into three bytes
*/ */
static int nand_davinci_calculate_1bit(struct mtd_info *mtd, static int nand_davinci_calculate_1bit(struct nand_chip *chip,
const u_char *dat, u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
unsigned int ecc_val = nand_davinci_readecc_1bit(mtd); unsigned int ecc_val = nand_davinci_readecc_1bit(nand_to_mtd(chip));
unsigned int ecc24 = (ecc_val & 0x0fff) | ((ecc_val & 0x0fff0000) >> 4); unsigned int ecc24 = (ecc_val & 0x0fff) | ((ecc_val & 0x0fff0000) >> 4);
/* invert so that erased block ecc is correct */ /* invert so that erased block ecc is correct */
...@@ -266,10 +266,10 @@ nand_davinci_readecc_4bit(struct davinci_nand_info *info, u32 code[4]) ...@@ -266,10 +266,10 @@ nand_davinci_readecc_4bit(struct davinci_nand_info *info, u32 code[4])
} }
/* Terminate read ECC; or return ECC (as bytes) of data written to NAND. */ /* Terminate read ECC; or return ECC (as bytes) of data written to NAND. */
static int nand_davinci_calculate_4bit(struct mtd_info *mtd, static int nand_davinci_calculate_4bit(struct nand_chip *chip,
const u_char *dat, u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
struct davinci_nand_info *info = to_davinci_nand(mtd); struct davinci_nand_info *info = to_davinci_nand(nand_to_mtd(chip));
u32 raw_ecc[4], *p; u32 raw_ecc[4], *p;
unsigned i; unsigned i;
......
...@@ -834,9 +834,9 @@ static void doc2001plus_enable_hwecc(struct nand_chip *this, int mode) ...@@ -834,9 +834,9 @@ static void doc2001plus_enable_hwecc(struct nand_chip *this, int mode)
} }
/* This code is only called on write */ /* This code is only called on write */
static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsigned char *ecc_code) static int doc200x_calculate_ecc(struct nand_chip *this, const u_char *dat,
unsigned char *ecc_code)
{ {
struct nand_chip *this = mtd_to_nand(mtd);
struct doc_priv *doc = nand_get_controller_data(this); struct doc_priv *doc = nand_get_controller_data(this);
void __iomem *docptr = doc->virtadr; void __iomem *docptr = doc->virtadr;
int i; int i;
......
...@@ -385,10 +385,10 @@ static void fsmc_enable_hwecc(struct nand_chip *chip, int mode) ...@@ -385,10 +385,10 @@ static void fsmc_enable_hwecc(struct nand_chip *chip, int mode)
* FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to * FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to
* max of 8-bits) * max of 8-bits)
*/ */
static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data, static int fsmc_read_hwecc_ecc4(struct nand_chip *chip, const uint8_t *data,
uint8_t *ecc) uint8_t *ecc)
{ {
struct fsmc_nand_data *host = mtd_to_fsmc(mtd); struct fsmc_nand_data *host = mtd_to_fsmc(nand_to_mtd(chip));
uint32_t ecc_tmp; uint32_t ecc_tmp;
unsigned long deadline = jiffies + FSMC_BUSY_WAIT_TIMEOUT; unsigned long deadline = jiffies + FSMC_BUSY_WAIT_TIMEOUT;
...@@ -433,10 +433,10 @@ static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data, ...@@ -433,10 +433,10 @@ static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data,
* FSMC. ECC is 3 bytes for 512 bytes of data (supports error correction up to * FSMC. ECC is 3 bytes for 512 bytes of data (supports error correction up to
* max of 1-bit) * max of 1-bit)
*/ */
static int fsmc_read_hwecc_ecc1(struct mtd_info *mtd, const uint8_t *data, static int fsmc_read_hwecc_ecc1(struct nand_chip *chip, const uint8_t *data,
uint8_t *ecc) uint8_t *ecc)
{ {
struct fsmc_nand_data *host = mtd_to_fsmc(mtd); struct fsmc_nand_data *host = mtd_to_fsmc(nand_to_mtd(chip));
uint32_t ecc_tmp; uint32_t ecc_tmp;
ecc_tmp = readl_relaxed(host->regs_va + ECC1); ecc_tmp = readl_relaxed(host->regs_va + ECC1);
...@@ -767,7 +767,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -767,7 +767,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
} }
memcpy(&ecc_code[i], oob, chip->ecc.bytes); memcpy(&ecc_code[i], oob, chip->ecc.bytes);
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
if (stat < 0) { if (stat < 0) {
......
...@@ -162,10 +162,10 @@ static void jz_nand_hwctl(struct nand_chip *chip, int mode) ...@@ -162,10 +162,10 @@ static void jz_nand_hwctl(struct nand_chip *chip, int mode)
writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL); writel(reg, nand->base + JZ_REG_NAND_ECC_CTRL);
} }
static int jz_nand_calculate_ecc_rs(struct mtd_info *mtd, const uint8_t *dat, static int jz_nand_calculate_ecc_rs(struct nand_chip *chip, const uint8_t *dat,
uint8_t *ecc_code) uint8_t *ecc_code)
{ {
struct jz_nand *nand = mtd_to_jz_nand(mtd); struct jz_nand *nand = mtd_to_jz_nand(nand_to_mtd(chip));
uint32_t reg, status; uint32_t reg, status;
int i; int i;
unsigned int timeout = 1000; unsigned int timeout = 1000;
......
...@@ -123,10 +123,10 @@ static void jz4780_nand_ecc_hwctl(struct nand_chip *chip, int mode) ...@@ -123,10 +123,10 @@ static void jz4780_nand_ecc_hwctl(struct nand_chip *chip, int mode)
nand->reading = (mode == NAND_ECC_READ); nand->reading = (mode == NAND_ECC_READ);
} }
static int jz4780_nand_ecc_calculate(struct mtd_info *mtd, const u8 *dat, static int jz4780_nand_ecc_calculate(struct nand_chip *chip, const u8 *dat,
u8 *ecc_code) u8 *ecc_code)
{ {
struct jz4780_nand_chip *nand = to_jz4780_nand_chip(mtd); struct jz4780_nand_chip *nand = to_jz4780_nand_chip(nand_to_mtd(chip));
struct jz4780_nand_controller *nfc = to_jz4780_nand_controller(nand->chip.controller); struct jz4780_nand_controller *nfc = to_jz4780_nand_controller(nand->chip.controller);
struct jz4780_bch_params params; struct jz4780_bch_params params;
......
...@@ -345,7 +345,7 @@ static void lpc32xx_nand_ecc_enable(struct nand_chip *chip, int mode) ...@@ -345,7 +345,7 @@ static void lpc32xx_nand_ecc_enable(struct nand_chip *chip, int mode)
/* /*
* Calculates the ECC for the data * Calculates the ECC for the data
*/ */
static int lpc32xx_nand_ecc_calculate(struct mtd_info *mtd, static int lpc32xx_nand_ecc_calculate(struct nand_chip *chip,
const unsigned char *buf, const unsigned char *buf,
unsigned char *code) unsigned char *code)
{ {
......
...@@ -3110,7 +3110,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -3110,7 +3110,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
chip->ecc.read_page_raw(mtd, chip, buf, 1, page); chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0, ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0,
chip->ecc.total); chip->ecc.total);
...@@ -3175,7 +3175,7 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -3175,7 +3175,7 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
/* Calculate ECC */ /* Calculate ECC */
for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size) for (i = 0; i < eccfrag_len ; i += chip->ecc.bytes, p += chip->ecc.size)
chip->ecc.calculate(mtd, p, &chip->ecc.calc_buf[i]); chip->ecc.calculate(chip, p, &chip->ecc.calc_buf[i]);
/* /*
* The performance is faster if we position offsets according to * The performance is faster if we position offsets according to
...@@ -3278,7 +3278,7 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -3278,7 +3278,7 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
if (ret) if (ret)
return ret; return ret;
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
} }
ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false); ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
...@@ -3364,7 +3364,7 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd, ...@@ -3364,7 +3364,7 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
if (ret) if (ret)
return ret; return ret;
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL); stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
if (stat == -EBADMSG && if (stat == -EBADMSG &&
...@@ -4118,7 +4118,7 @@ static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -4118,7 +4118,7 @@ static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
/* Software ECC calculation */ /* Software ECC calculation */
for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0, ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
chip->ecc.total); chip->ecc.total);
...@@ -4157,7 +4157,7 @@ static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -4157,7 +4157,7 @@ static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
if (ret) if (ret)
return ret; return ret;
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(chip, p, &ecc_calc[i]);
} }
ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0, ret = mtd_ooblayout_set_eccbytes(mtd, ecc_calc, chip->oob_poi, 0,
...@@ -4215,7 +4215,7 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd, ...@@ -4215,7 +4215,7 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
if ((step < start_step) || (step > end_step)) if ((step < start_step) || (step > end_step))
memset(ecc_calc, 0xff, ecc_bytes); memset(ecc_calc, 0xff, ecc_bytes);
else else
chip->ecc.calculate(mtd, buf, ecc_calc); chip->ecc.calculate(chip, buf, ecc_calc);
/* mask OOB of un-touched subpages by padding 0xFF */ /* mask OOB of un-touched subpages by padding 0xFF */
/* if oob_required, preserve OOB metadata of written subpage */ /* if oob_required, preserve OOB metadata of written subpage */
...@@ -4287,7 +4287,7 @@ static int nand_write_page_syndrome(struct mtd_info *mtd, ...@@ -4287,7 +4287,7 @@ static int nand_write_page_syndrome(struct mtd_info *mtd,
oob += chip->ecc.prepad; oob += chip->ecc.prepad;
} }
chip->ecc.calculate(mtd, p, oob); chip->ecc.calculate(chip, p, oob);
ret = nand_write_data_op(chip, oob, eccbytes, false); ret = nand_write_data_op(chip, oob, eccbytes, false);
if (ret) if (ret)
......
...@@ -43,14 +43,13 @@ struct nand_bch_control { ...@@ -43,14 +43,13 @@ struct nand_bch_control {
/** /**
* nand_bch_calculate_ecc - [NAND Interface] Calculate ECC for data block * nand_bch_calculate_ecc - [NAND Interface] Calculate ECC for data block
* @mtd: MTD block structure * @chip: NAND chip object
* @buf: input buffer with raw data * @buf: input buffer with raw data
* @code: output buffer with ECC * @code: output buffer with ECC
*/ */
int nand_bch_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf, int nand_bch_calculate_ecc(struct nand_chip *chip, const unsigned char *buf,
unsigned char *code) unsigned char *code)
{ {
const struct nand_chip *chip = mtd_to_nand(mtd);
struct nand_bch_control *nbc = chip->ecc.priv; struct nand_bch_control *nbc = chip->ecc.priv;
unsigned int i; unsigned int i;
......
...@@ -398,11 +398,10 @@ EXPORT_SYMBOL(__nand_calculate_ecc); ...@@ -398,11 +398,10 @@ EXPORT_SYMBOL(__nand_calculate_ecc);
* @buf: input buffer with raw data * @buf: input buffer with raw data
* @code: output buffer with ECC * @code: output buffer with ECC
*/ */
int nand_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf, int nand_calculate_ecc(struct nand_chip *chip, const unsigned char *buf,
unsigned char *code) unsigned char *code)
{ {
__nand_calculate_ecc(buf, __nand_calculate_ecc(buf, chip->ecc.size, code);
mtd_to_nand(mtd)->ecc.size, code);
return 0; return 0;
} }
......
...@@ -92,10 +92,9 @@ static void ndfc_enable_hwecc(struct nand_chip *chip, int mode) ...@@ -92,10 +92,9 @@ static void ndfc_enable_hwecc(struct nand_chip *chip, int mode)
wmb(); wmb();
} }
static int ndfc_calculate_ecc(struct mtd_info *mtd, static int ndfc_calculate_ecc(struct nand_chip *chip,
const u_char *dat, u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
struct nand_chip *chip = mtd_to_nand(mtd);
struct ndfc_controller *ndfc = nand_get_controller_data(chip); struct ndfc_controller *ndfc = nand_get_controller_data(chip);
uint32_t ecc; uint32_t ecc;
uint8_t *p = (uint8_t *)&ecc; uint8_t *p = (uint8_t *)&ecc;
......
...@@ -900,7 +900,7 @@ static int omap_correct_data(struct mtd_info *mtd, u_char *dat, ...@@ -900,7 +900,7 @@ static int omap_correct_data(struct mtd_info *mtd, u_char *dat,
/** /**
* omap_calcuate_ecc - Generate non-inverted ECC bytes. * omap_calcuate_ecc - Generate non-inverted ECC bytes.
* @mtd: MTD device structure * @chip: NAND chip object
* @dat: The pointer to data on which ecc is computed * @dat: The pointer to data on which ecc is computed
* @ecc_code: The ecc_code buffer * @ecc_code: The ecc_code buffer
* *
...@@ -910,10 +910,10 @@ static int omap_correct_data(struct mtd_info *mtd, u_char *dat, ...@@ -910,10 +910,10 @@ static int omap_correct_data(struct mtd_info *mtd, u_char *dat,
* an erased page will produce an ECC mismatch between generated and read * an erased page will produce an ECC mismatch between generated and read
* ECC bytes that has to be dealt with separately. * ECC bytes that has to be dealt with separately.
*/ */
static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat, static int omap_calculate_ecc(struct nand_chip *chip, const u_char *dat,
u_char *ecc_code) u_char *ecc_code)
{ {
struct omap_nand_info *info = mtd_to_omap(mtd); struct omap_nand_info *info = mtd_to_omap(nand_to_mtd(chip));
u32 val; u32 val;
val = readl(info->reg.gpmc_ecc_config); val = readl(info->reg.gpmc_ecc_config);
...@@ -1255,7 +1255,7 @@ static int _omap_calculate_ecc_bch(struct mtd_info *mtd, ...@@ -1255,7 +1255,7 @@ static int _omap_calculate_ecc_bch(struct mtd_info *mtd,
/** /**
* omap_calculate_ecc_bch_sw - ECC generator for sector for SW based correction * omap_calculate_ecc_bch_sw - ECC generator for sector for SW based correction
* @mtd: MTD device structure * @chip: NAND chip object
* @dat: The pointer to data on which ecc is computed * @dat: The pointer to data on which ecc is computed
* @ecc_code: The ecc_code buffer * @ecc_code: The ecc_code buffer
* *
...@@ -1263,10 +1263,10 @@ static int _omap_calculate_ecc_bch(struct mtd_info *mtd, ...@@ -1263,10 +1263,10 @@ static int _omap_calculate_ecc_bch(struct mtd_info *mtd,
* when SW based correction is required as ECC is required for one sector * when SW based correction is required as ECC is required for one sector
* at a time. * at a time.
*/ */
static int omap_calculate_ecc_bch_sw(struct mtd_info *mtd, static int omap_calculate_ecc_bch_sw(struct nand_chip *chip,
const u_char *dat, u_char *ecc_calc) const u_char *dat, u_char *ecc_calc)
{ {
return _omap_calculate_ecc_bch(mtd, dat, ecc_calc, 0); return _omap_calculate_ecc_bch(nand_to_mtd(chip), dat, ecc_calc, 0);
} }
/** /**
......
...@@ -433,10 +433,10 @@ static void r852_ecc_hwctl(struct nand_chip *chip, int mode) ...@@ -433,10 +433,10 @@ static void r852_ecc_hwctl(struct nand_chip *chip, int mode)
* Calculate ECC, only used for writes * Calculate ECC, only used for writes
*/ */
static int r852_ecc_calculate(struct mtd_info *mtd, const uint8_t *dat, static int r852_ecc_calculate(struct nand_chip *chip, const uint8_t *dat,
uint8_t *ecc_code) uint8_t *ecc_code)
{ {
struct r852_device *dev = r852_get_dev(mtd); struct r852_device *dev = r852_get_dev(nand_to_mtd(chip));
struct sm_oob *oob = (struct sm_oob *)ecc_code; struct sm_oob *oob = (struct sm_oob *)ecc_code;
uint32_t ecc1, ecc2; uint32_t ecc1, ecc2;
......
...@@ -623,9 +623,10 @@ static void s3c2440_nand_enable_hwecc(struct nand_chip *chip, int mode) ...@@ -623,9 +623,10 @@ static void s3c2440_nand_enable_hwecc(struct nand_chip *chip, int mode)
writel(ctrl | S3C2440_NFCONT_INITECC, info->regs + S3C2440_NFCONT); writel(ctrl | S3C2440_NFCONT_INITECC, info->regs + S3C2440_NFCONT);
} }
static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, static int s3c2410_nand_calculate_ecc(struct nand_chip *chip,
u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
struct mtd_info *mtd = nand_to_mtd(chip);
struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
ecc_code[0] = readb(info->regs + S3C2410_NFECC + 0); ecc_code[0] = readb(info->regs + S3C2410_NFECC + 0);
...@@ -637,9 +638,10 @@ static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, ...@@ -637,9 +638,10 @@ static int s3c2410_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
return 0; return 0;
} }
static int s3c2412_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, static int s3c2412_nand_calculate_ecc(struct nand_chip *chip,
u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
struct mtd_info *mtd = nand_to_mtd(chip);
struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
unsigned long ecc = readl(info->regs + S3C2412_NFMECC0); unsigned long ecc = readl(info->regs + S3C2412_NFMECC0);
...@@ -652,9 +654,10 @@ static int s3c2412_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, ...@@ -652,9 +654,10 @@ static int s3c2412_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
return 0; return 0;
} }
static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, static int s3c2440_nand_calculate_ecc(struct nand_chip *chip,
u_char *ecc_code) const u_char *dat, u_char *ecc_code)
{ {
struct mtd_info *mtd = nand_to_mtd(chip);
struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
unsigned long ecc = readl(info->regs + S3C2440_NFMECC0); unsigned long ecc = readl(info->regs + S3C2440_NFMECC0);
......
...@@ -91,9 +91,10 @@ static void sharpsl_nand_enable_hwecc(struct nand_chip *chip, int mode) ...@@ -91,9 +91,10 @@ static void sharpsl_nand_enable_hwecc(struct nand_chip *chip, int mode)
writeb(0, sharpsl->io + ECCCLRR); writeb(0, sharpsl->io + ECCCLRR);
} }
static int sharpsl_nand_calculate_ecc(struct mtd_info *mtd, const u_char * dat, u_char * ecc_code) static int sharpsl_nand_calculate_ecc(struct nand_chip *chip,
const u_char * dat, u_char * ecc_code)
{ {
struct sharpsl_nand *sharpsl = mtd_to_sharpsl(mtd); struct sharpsl_nand *sharpsl = mtd_to_sharpsl(nand_to_mtd(chip));
ecc_code[0] = ~readb(sharpsl->io + ECCLPUB); ecc_code[0] = ~readb(sharpsl->io + ECCLPUB);
ecc_code[1] = ~readb(sharpsl->io + ECCLPLB); ecc_code[1] = ~readb(sharpsl->io + ECCLPLB);
ecc_code[2] = (~readb(sharpsl->io + ECCCP) << 2) | 0x03; ecc_code[2] = (~readb(sharpsl->io + ECCCP) << 2) | 0x03;
......
...@@ -268,10 +268,10 @@ static void tmio_nand_enable_hwecc(struct nand_chip *chip, int mode) ...@@ -268,10 +268,10 @@ static void tmio_nand_enable_hwecc(struct nand_chip *chip, int mode)
tmio_iowrite8(FCR_MODE_HWECC_CALC, tmio->fcr + FCR_MODE); tmio_iowrite8(FCR_MODE_HWECC_CALC, tmio->fcr + FCR_MODE);
} }
static int tmio_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, static int tmio_nand_calculate_ecc(struct nand_chip *chip, const u_char *dat,
u_char *ecc_code) u_char *ecc_code)
{ {
struct tmio_nand *tmio = mtd_to_tmio(mtd); struct tmio_nand *tmio = mtd_to_tmio(nand_to_mtd(chip));
unsigned int ecc; unsigned int ecc;
tmio_iowrite8(FCR_MODE_HWECC_RESULT, tmio->fcr + FCR_MODE); tmio_iowrite8(FCR_MODE_HWECC_RESULT, tmio->fcr + FCR_MODE);
......
...@@ -170,11 +170,10 @@ static int txx9ndfmc_dev_ready(struct mtd_info *mtd) ...@@ -170,11 +170,10 @@ static int txx9ndfmc_dev_ready(struct mtd_info *mtd)
return !(txx9ndfmc_read(dev, TXX9_NDFSR) & TXX9_NDFSR_BUSY); return !(txx9ndfmc_read(dev, TXX9_NDFSR) & TXX9_NDFSR_BUSY);
} }
static int txx9ndfmc_calculate_ecc(struct mtd_info *mtd, const uint8_t *dat, static int txx9ndfmc_calculate_ecc(struct nand_chip *chip, const uint8_t *dat,
uint8_t *ecc_code) uint8_t *ecc_code)
{ {
struct platform_device *dev = mtd_to_platdev(mtd); struct platform_device *dev = mtd_to_platdev(nand_to_mtd(chip));
struct nand_chip *chip = mtd_to_nand(mtd);
int eccbytes; int eccbytes;
u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR); u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#define __MTD_NAND_BCH_H__ #define __MTD_NAND_BCH_H__
struct mtd_info; struct mtd_info;
struct nand_chip;
struct nand_bch_control; struct nand_bch_control;
#if defined(CONFIG_MTD_NAND_ECC_BCH) #if defined(CONFIG_MTD_NAND_ECC_BCH)
...@@ -21,7 +22,7 @@ static inline int mtd_nand_has_bch(void) { return 1; } ...@@ -21,7 +22,7 @@ static inline int mtd_nand_has_bch(void) { return 1; }
/* /*
* Calculate BCH ecc code * Calculate BCH ecc code
*/ */
int nand_bch_calculate_ecc(struct mtd_info *mtd, const u_char *dat, int nand_bch_calculate_ecc(struct nand_chip *chip, const u_char *dat,
u_char *ecc_code); u_char *ecc_code);
/* /*
...@@ -43,7 +44,7 @@ void nand_bch_free(struct nand_bch_control *nbc); ...@@ -43,7 +44,7 @@ void nand_bch_free(struct nand_bch_control *nbc);
static inline int mtd_nand_has_bch(void) { return 0; } static inline int mtd_nand_has_bch(void) { return 0; }
static inline int static inline int
nand_bch_calculate_ecc(struct mtd_info *mtd, const u_char *dat, nand_bch_calculate_ecc(struct nand_chip *chip, const u_char *dat,
u_char *ecc_code) u_char *ecc_code)
{ {
return -1; return -1;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#define __MTD_NAND_ECC_H__ #define __MTD_NAND_ECC_H__
struct mtd_info; struct mtd_info;
struct nand_chip;
/* /*
* Calculate 3 byte ECC code for eccsize byte block * Calculate 3 byte ECC code for eccsize byte block
...@@ -24,7 +25,8 @@ void __nand_calculate_ecc(const u_char *dat, unsigned int eccsize, ...@@ -24,7 +25,8 @@ void __nand_calculate_ecc(const u_char *dat, unsigned int eccsize,
/* /*
* Calculate 3 byte ECC code for 256/512 byte block * Calculate 3 byte ECC code for 256/512 byte block
*/ */
int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code); int nand_calculate_ecc(struct nand_chip *chip, const u_char *dat,
u_char *ecc_code);
/* /*
* Detect and correct a 1 bit error for eccsize byte block * Detect and correct a 1 bit error for eccsize byte block
......
...@@ -648,8 +648,8 @@ struct nand_ecc_ctrl { ...@@ -648,8 +648,8 @@ struct nand_ecc_ctrl {
u8 *calc_buf; u8 *calc_buf;
u8 *code_buf; u8 *code_buf;
void (*hwctl)(struct nand_chip *chip, int mode); void (*hwctl)(struct nand_chip *chip, int mode);
int (*calculate)(struct mtd_info *mtd, const uint8_t *dat, int (*calculate)(struct nand_chip *chip, const uint8_t *dat,
uint8_t *ecc_code); uint8_t *ecc_code);
int (*correct)(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc, int (*correct)(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc,
uint8_t *calc_ecc); uint8_t *calc_ecc);
int (*read_page_raw)(struct mtd_info *mtd, struct nand_chip *chip, int (*read_page_raw)(struct mtd_info *mtd, struct nand_chip *chip,
......
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