forked from OERV-BSP/u-boot
mtd: resync with Linux-3.7.1
This patch is essentially an update of u-boot MTD subsystem to the state of Linux-3.7.1 with exclusion of some bits: - the update is concentrated on NAND, no onenand or CFI/NOR/SPI flashes interfaces are updated EXCEPT for API changes. - new large NAND chips support is there, though some updates have got in Linux-3.8.-rc1, (which will follow on top of this patch). To produce this update I used tag v3.7.1 of linux-stable repository. The update was made using application of relevant patches, with changes relevant to U-Boot-only stuff sticked together to keep bisectability. Then all changes were grouped together to this patch. Signed-off-by: Sergey Lapin <slapin@ossfans.org> [scottwood@freescale.com: some eccstrength and build fixes] Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
@@ -743,7 +743,7 @@ static void onenand_release_device(struct mtd_info *mtd)
|
||||
}
|
||||
|
||||
/**
|
||||
* onenand_transfer_auto_oob - [Internal] oob auto-placement transfer
|
||||
* onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
|
||||
* @param mtd MTD device structure
|
||||
* @param buf destination address
|
||||
* @param column oob offset to read from
|
||||
@@ -807,7 +807,7 @@ static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
|
||||
return status;
|
||||
|
||||
/* check if we failed due to uncorrectable error */
|
||||
if (status != -EBADMSG && status != ONENAND_BBT_READ_ECC_ERROR)
|
||||
if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
|
||||
return status;
|
||||
|
||||
/* check if address lies in MLC region */
|
||||
@@ -847,7 +847,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
|
||||
|
||||
MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_read_ops_nolock: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len);
|
||||
|
||||
if (ops->mode == MTD_OOB_AUTO)
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
oobsize = this->ecclayout->oobavail;
|
||||
else
|
||||
oobsize = mtd->oobsize;
|
||||
@@ -914,7 +914,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
|
||||
thisooblen = oobsize - oobcolumn;
|
||||
thisooblen = min_t(int, thisooblen, ooblen - oobread);
|
||||
|
||||
if (ops->mode == MTD_OOB_AUTO)
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
|
||||
else
|
||||
this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
|
||||
@@ -929,7 +929,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
|
||||
if (unlikely(ret))
|
||||
ret = onenand_recover_lsb(mtd, from, ret);
|
||||
onenand_update_bufferram(mtd, from, !ret);
|
||||
if (ret == -EBADMSG)
|
||||
if (mtd_is_eccerr(ret))
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
@@ -950,7 +950,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
|
||||
/* Now wait for load */
|
||||
ret = this->wait(mtd, FL_READING);
|
||||
onenand_update_bufferram(mtd, from, !ret);
|
||||
if (ret == -EBADMSG)
|
||||
if (mtd_is_eccerr(ret))
|
||||
ret = 0;
|
||||
}
|
||||
}
|
||||
@@ -987,7 +987,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
|
||||
struct mtd_ecc_stats stats;
|
||||
int read = 0, thislen, column, oobsize;
|
||||
size_t len = ops->ooblen;
|
||||
mtd_oob_mode_t mode = ops->mode;
|
||||
unsigned int mode = ops->mode;
|
||||
u_char *buf = ops->oobbuf;
|
||||
int ret = 0, readcmd;
|
||||
|
||||
@@ -998,7 +998,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
|
||||
/* Initialize return length value */
|
||||
ops->oobretlen = 0;
|
||||
|
||||
if (mode == MTD_OOB_AUTO)
|
||||
if (mode == MTD_OPS_AUTO_OOB)
|
||||
oobsize = this->ecclayout->oobavail;
|
||||
else
|
||||
oobsize = mtd->oobsize;
|
||||
@@ -1041,7 +1041,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
|
||||
break;
|
||||
}
|
||||
|
||||
if (mode == MTD_OOB_AUTO)
|
||||
if (mode == MTD_OPS_AUTO_OOB)
|
||||
onenand_transfer_auto_oob(mtd, buf, column, thislen);
|
||||
else
|
||||
this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen);
|
||||
@@ -1115,10 +1115,10 @@ int onenand_read_oob(struct mtd_info *mtd, loff_t from,
|
||||
int ret;
|
||||
|
||||
switch (ops->mode) {
|
||||
case MTD_OOB_PLACE:
|
||||
case MTD_OOB_AUTO:
|
||||
case MTD_OPS_PLACE_OOB:
|
||||
case MTD_OPS_AUTO_OOB:
|
||||
break;
|
||||
case MTD_OOB_RAW:
|
||||
case MTD_OPS_RAW:
|
||||
/* Not implemented yet */
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -1337,7 +1337,7 @@ static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr,
|
||||
#define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
|
||||
|
||||
/**
|
||||
* onenand_fill_auto_oob - [Internal] oob auto-placement transfer
|
||||
* onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
|
||||
* @param mtd MTD device structure
|
||||
* @param oob_buf oob buffer
|
||||
* @param buf source address
|
||||
@@ -1404,19 +1404,13 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
|
||||
ops->retlen = 0;
|
||||
ops->oobretlen = 0;
|
||||
|
||||
/* Do not allow writes past end of device */
|
||||
if (unlikely((to + len) > mtd->size)) {
|
||||
printk(KERN_ERR "onenand_write_ops_nolock: Attempt write to past end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Reject writes, which are not page aligned */
|
||||
if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
|
||||
printk(KERN_ERR "onenand_write_ops_nolock: Attempt to write not page aligned data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ops->mode == MTD_OOB_AUTO)
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
oobsize = this->ecclayout->oobavail;
|
||||
else
|
||||
oobsize = mtd->oobsize;
|
||||
@@ -1450,7 +1444,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
|
||||
/* We send data to spare ram with oobsize
|
||||
* * to prevent byte access */
|
||||
memset(oobbuf, 0xff, mtd->oobsize);
|
||||
if (ops->mode == MTD_OOB_AUTO)
|
||||
if (ops->mode == MTD_OPS_AUTO_OOB)
|
||||
onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
|
||||
else
|
||||
memcpy(oobbuf + oobcolumn, oob, thisooblen);
|
||||
@@ -1502,7 +1496,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
|
||||
}
|
||||
|
||||
/**
|
||||
* onenand_write_oob_nolock - [Internal] OneNAND write out-of-band
|
||||
* onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
|
||||
* @param mtd MTD device structure
|
||||
* @param to offset to write to
|
||||
* @param len number of bytes to write
|
||||
@@ -1521,7 +1515,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
|
||||
u_char *oobbuf;
|
||||
size_t len = ops->ooblen;
|
||||
const u_char *buf = ops->oobbuf;
|
||||
mtd_oob_mode_t mode = ops->mode;
|
||||
unsigned int mode = ops->mode;
|
||||
|
||||
to += ops->ooboffs;
|
||||
|
||||
@@ -1530,7 +1524,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
|
||||
/* Initialize retlen, in case of early exit */
|
||||
ops->oobretlen = 0;
|
||||
|
||||
if (mode == MTD_OOB_AUTO)
|
||||
if (mode == MTD_OPS_AUTO_OOB)
|
||||
oobsize = this->ecclayout->oobavail;
|
||||
else
|
||||
oobsize = mtd->oobsize;
|
||||
@@ -1571,7 +1565,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
|
||||
/* We send data to spare ram with oobsize
|
||||
* to prevent byte access */
|
||||
memset(oobbuf, 0xff, mtd->oobsize);
|
||||
if (mode == MTD_OOB_AUTO)
|
||||
if (mode == MTD_OPS_AUTO_OOB)
|
||||
onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
|
||||
else
|
||||
memcpy(oobbuf + column, buf, thislen);
|
||||
@@ -1661,10 +1655,10 @@ int onenand_write_oob(struct mtd_info *mtd, loff_t to,
|
||||
int ret;
|
||||
|
||||
switch (ops->mode) {
|
||||
case MTD_OOB_PLACE:
|
||||
case MTD_OOB_AUTO:
|
||||
case MTD_OPS_PLACE_OOB:
|
||||
case MTD_OPS_AUTO_OOB:
|
||||
break;
|
||||
case MTD_OOB_RAW:
|
||||
case MTD_OPS_RAW:
|
||||
/* Not implemented yet */
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -1720,13 +1714,6 @@ int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
|
||||
MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_erase: start = 0x%08x, len = %i\n",
|
||||
(unsigned int) addr, len);
|
||||
|
||||
/* Do not allow erase past end of device */
|
||||
if (unlikely((len + addr) > mtd->size)) {
|
||||
MTDDEBUG(MTD_DEBUG_LEVEL0, "onenand_erase:"
|
||||
"Erase past end of device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (FLEXONENAND(this)) {
|
||||
/* Find the eraseregion of this address */
|
||||
i = flexonenand_region(mtd, addr);
|
||||
@@ -1762,8 +1749,6 @@ int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
instr->fail_addr = 0xffffffff;
|
||||
|
||||
/* Grab the lock and see if the device is available */
|
||||
onenand_get_device(mtd, FL_ERASING);
|
||||
|
||||
@@ -1889,7 +1874,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||
struct bbm_info *bbm = this->bbm;
|
||||
u_char buf[2] = {0, 0};
|
||||
struct mtd_oob_ops ops = {
|
||||
.mode = MTD_OOB_PLACE,
|
||||
.mode = MTD_OPS_PLACE_OOB,
|
||||
.ooblen = 2,
|
||||
.oobbuf = buf,
|
||||
.ooboffs = 0,
|
||||
@@ -1915,7 +1900,6 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||
*/
|
||||
int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||
{
|
||||
struct onenand_chip *this = mtd->priv;
|
||||
int ret;
|
||||
|
||||
ret = onenand_block_isbad(mtd, ofs);
|
||||
@@ -1926,7 +1910,7 @@ int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = this->block_markbad(mtd, ofs);
|
||||
ret = mtd_block_markbad(mtd, ofs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2386,7 +2370,7 @@ static int flexonenand_check_blocks_erased(struct mtd_info *mtd,
|
||||
int i, ret;
|
||||
int block;
|
||||
struct mtd_oob_ops ops = {
|
||||
.mode = MTD_OOB_PLACE,
|
||||
.mode = MTD_OPS_PLACE_OOB,
|
||||
.ooboffs = 0,
|
||||
.ooblen = mtd->oobsize,
|
||||
.datbuf = NULL,
|
||||
@@ -2645,14 +2629,14 @@ int onenand_probe(struct mtd_info *mtd)
|
||||
mtd->size = this->chipsize;
|
||||
|
||||
mtd->flags = MTD_CAP_NANDFLASH;
|
||||
mtd->erase = onenand_erase;
|
||||
mtd->read = onenand_read;
|
||||
mtd->write = onenand_write;
|
||||
mtd->read_oob = onenand_read_oob;
|
||||
mtd->write_oob = onenand_write_oob;
|
||||
mtd->sync = onenand_sync;
|
||||
mtd->block_isbad = onenand_block_isbad;
|
||||
mtd->block_markbad = onenand_block_markbad;
|
||||
mtd->_erase = onenand_erase;
|
||||
mtd->_read = onenand_read;
|
||||
mtd->_write = onenand_write;
|
||||
mtd->_read_oob = onenand_read_oob;
|
||||
mtd->_write_oob = onenand_write_oob;
|
||||
mtd->_sync = onenand_sync;
|
||||
mtd->_block_isbad = onenand_block_isbad;
|
||||
mtd->_block_markbad = onenand_block_markbad;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user