diff options
| author | Sergey Lapin <slapin@ossfans.org> | 2013-01-14 03:46:50 +0000 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2013-05-31 17:12:03 -0500 | 
| commit | dfe64e2c89731a3f9950d7acd8681b68df2bae03 (patch) | |
| tree | 880eae93d5f4bd3e9747960eea71502c67e49d8e /drivers/mtd/onenand/onenand_base.c | |
| parent | a1b81ab26fbbdcbaa6e2a096397c75415181c298 (diff) | |
| download | olio-uboot-2014.01-dfe64e2c89731a3f9950d7acd8681b68df2bae03.tar.xz olio-uboot-2014.01-dfe64e2c89731a3f9950d7acd8681b68df2bae03.zip | |
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>
Diffstat (limited to 'drivers/mtd/onenand/onenand_base.c')
| -rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 82 | 
1 files changed, 33 insertions, 49 deletions
| diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index 858e32274..ddfe7e7c7 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c @@ -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;  } |