diff options
| author | Tom Rini <trini@ti.com> | 2013-05-31 18:28:47 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-05-31 18:28:47 -0400 | 
| commit | d6639d10dbfa42dc888f8917012550b632a88959 (patch) | |
| tree | 3c971dcfad4d7ad58570e8d5b0318f58370f9d3d /drivers/mtd/mtdpart.c | |
| parent | 3da0e5750b24a9491058df6126c7be577a276c09 (diff) | |
| parent | dfe64e2c89731a3f9950d7acd8681b68df2bae03 (diff) | |
| download | olio-uboot-2014.01-d6639d10dbfa42dc888f8917012550b632a88959.tar.xz olio-uboot-2014.01-d6639d10dbfa42dc888f8917012550b632a88959.zip | |
Merge branch 'master' of git://git.denx.de/u-boot-nand-flash
Diffstat (limited to 'drivers/mtd/mtdpart.c')
| -rw-r--r-- | drivers/mtd/mtdpart.c | 156 | 
1 files changed, 53 insertions, 103 deletions
| diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index cbfc6796c..9dfe7bbc9 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -52,17 +52,11 @@ static int part_read(struct mtd_info *mtd, loff_t from, size_t len,  	int res;  	stats = part->master->ecc_stats; - -	if (from >= mtd->size) -		len = 0; -	else if (from + len > mtd->size) -		len = mtd->size - from; -	res = part->master->read(part->master, from + part->offset, -				   len, retlen, buf); +	res = mtd_read(part->master, from + part->offset, len, retlen, buf);  	if (unlikely(res)) { -		if (res == -EUCLEAN) +		if (mtd_is_bitflip(res))  			mtd->ecc_stats.corrected += part->master->ecc_stats.corrected - stats.corrected; -		if (res == -EBADMSG) +		if (mtd_is_eccerr(res))  			mtd->ecc_stats.failed += part->master->ecc_stats.failed - stats.failed;  	}  	return res; @@ -78,12 +72,12 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from,  		return -EINVAL;  	if (ops->datbuf && from + ops->len > mtd->size)  		return -EINVAL; -	res = part->master->read_oob(part->master, from + part->offset, ops); +	res = mtd_read_oob(part->master, from + part->offset, ops);  	if (unlikely(res)) { -		if (res == -EUCLEAN) +		if (mtd_is_bitflip(res))  			mtd->ecc_stats.corrected++; -		if (res == -EBADMSG) +		if (mtd_is_eccerr(res))  			mtd->ecc_stats.failed++;  	}  	return res; @@ -93,58 +87,35 @@ static int part_read_user_prot_reg(struct mtd_info *mtd, loff_t from,  		size_t len, size_t *retlen, u_char *buf)  {  	struct mtd_part *part = PART(mtd); -	return part->master->read_user_prot_reg(part->master, from, -					len, retlen, buf); +	return mtd_read_user_prot_reg(part->master, from, len, retlen, buf);  }  static int part_get_user_prot_info(struct mtd_info *mtd,  		struct otp_info *buf, size_t len)  {  	struct mtd_part *part = PART(mtd); -	return part->master->get_user_prot_info(part->master, buf, len); +	return mtd_get_user_prot_info(part->master, buf, len);  }  static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,  		size_t len, size_t *retlen, u_char *buf)  {  	struct mtd_part *part = PART(mtd); -	return part->master->read_fact_prot_reg(part->master, from, -					len, retlen, buf); +	return mtd_read_fact_prot_reg(part->master, from, len, retlen, buf);  }  static int part_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,  		size_t len)  {  	struct mtd_part *part = PART(mtd); -	return part->master->get_fact_prot_info(part->master, buf, len); +	return mtd_get_fact_prot_info(part->master, buf, len);  }  static int part_write(struct mtd_info *mtd, loff_t to, size_t len,  		size_t *retlen, const u_char *buf)  {  	struct mtd_part *part = PART(mtd); -	if (!(mtd->flags & MTD_WRITEABLE)) -		return -EROFS; -	if (to >= mtd->size) -		len = 0; -	else if (to + len > mtd->size) -		len = mtd->size - to; -	return part->master->write(part->master, to + part->offset, -				    len, retlen, buf); -} - -static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len, -		size_t *retlen, const u_char *buf) -{ -	struct mtd_part *part = PART(mtd); -	if (!(mtd->flags & MTD_WRITEABLE)) -		return -EROFS; -	if (to >= mtd->size) -		len = 0; -	else if (to + len > mtd->size) -		len = mtd->size - to; -	return part->master->panic_write(part->master, to + part->offset, -				    len, retlen, buf); +	return mtd_write(part->master, to + part->offset, len, retlen, buf);  }  static int part_write_oob(struct mtd_info *mtd, loff_t to, @@ -152,41 +123,34 @@ static int part_write_oob(struct mtd_info *mtd, loff_t to,  {  	struct mtd_part *part = PART(mtd); -	if (!(mtd->flags & MTD_WRITEABLE)) -		return -EROFS; -  	if (to >= mtd->size)  		return -EINVAL;  	if (ops->datbuf && to + ops->len > mtd->size)  		return -EINVAL; -	return part->master->write_oob(part->master, to + part->offset, ops); +	return mtd_write_oob(part->master, to + part->offset, ops);  }  static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from,  		size_t len, size_t *retlen, u_char *buf)  {  	struct mtd_part *part = PART(mtd); -	return part->master->write_user_prot_reg(part->master, from, -					len, retlen, buf); +	return mtd_write_user_prot_reg(part->master, from, len, retlen, buf);  }  static int part_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,  		size_t len)  {  	struct mtd_part *part = PART(mtd); -	return part->master->lock_user_prot_reg(part->master, from, len); +	return mtd_lock_user_prot_reg(part->master, from, len);  }  static int part_erase(struct mtd_info *mtd, struct erase_info *instr)  {  	struct mtd_part *part = PART(mtd);  	int ret; -	if (!(mtd->flags & MTD_WRITEABLE)) -		return -EROFS; -	if (instr->addr >= mtd->size) -		return -EINVAL; +  	instr->addr += part->offset; -	ret = part->master->erase(part->master, instr); +	ret = mtd_erase(part->master, instr);  	if (ret) {  		if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)  			instr->fail_addr -= part->offset; @@ -197,7 +161,7 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr)  void mtd_erase_callback(struct erase_info *instr)  { -	if (instr->mtd->erase == part_erase) { +	if (instr->mtd->_erase == part_erase) {  		struct mtd_part *part = PART(instr->mtd);  		if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) @@ -211,32 +175,26 @@ void mtd_erase_callback(struct erase_info *instr)  static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  {  	struct mtd_part *part = PART(mtd); -	if ((len + ofs) > mtd->size) -		return -EINVAL; -	return part->master->lock(part->master, ofs + part->offset, len); +	return mtd_lock(part->master, ofs + part->offset, len);  }  static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)  {  	struct mtd_part *part = PART(mtd); -	if ((len + ofs) > mtd->size) -		return -EINVAL; -	return part->master->unlock(part->master, ofs + part->offset, len); +	return mtd_unlock(part->master, ofs + part->offset, len);  }  static void part_sync(struct mtd_info *mtd)  {  	struct mtd_part *part = PART(mtd); -	part->master->sync(part->master); +	mtd_sync(part->master);  }  static int part_block_isbad(struct mtd_info *mtd, loff_t ofs)  {  	struct mtd_part *part = PART(mtd); -	if (ofs >= mtd->size) -		return -EINVAL;  	ofs += part->offset; -	return part->master->block_isbad(part->master, ofs); +	return mtd_block_isbad(part->master, ofs);  }  static int part_block_markbad(struct mtd_info *mtd, loff_t ofs) @@ -244,12 +202,8 @@ static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)  	struct mtd_part *part = PART(mtd);  	int res; -	if (!(mtd->flags & MTD_WRITEABLE)) -		return -EROFS; -	if (ofs >= mtd->size) -		return -EINVAL;  	ofs += part->offset; -	res = part->master->block_markbad(part->master, ofs); +	res = mtd_block_markbad(part->master, ofs);  	if (!res)  		mtd->ecc_stats.badblocks++;  	return res; @@ -303,39 +257,36 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,  	slave->mtd.name = part->name;  	slave->mtd.owner = master->owner; -	slave->mtd.read = part_read; -	slave->mtd.write = part_write; - -	if (master->panic_write) -		slave->mtd.panic_write = part_panic_write; +	slave->mtd._read = part_read; +	slave->mtd._write = part_write; -	if (master->read_oob) -		slave->mtd.read_oob = part_read_oob; -	if (master->write_oob) -		slave->mtd.write_oob = part_write_oob; -	if (master->read_user_prot_reg) -		slave->mtd.read_user_prot_reg = part_read_user_prot_reg; -	if (master->read_fact_prot_reg) -		slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg; -	if (master->write_user_prot_reg) -		slave->mtd.write_user_prot_reg = part_write_user_prot_reg; -	if (master->lock_user_prot_reg) -		slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg; -	if (master->get_user_prot_info) -		slave->mtd.get_user_prot_info = part_get_user_prot_info; -	if (master->get_fact_prot_info) -		slave->mtd.get_fact_prot_info = part_get_fact_prot_info; -	if (master->sync) -		slave->mtd.sync = part_sync; -	if (master->lock) -		slave->mtd.lock = part_lock; -	if (master->unlock) -		slave->mtd.unlock = part_unlock; -	if (master->block_isbad) -		slave->mtd.block_isbad = part_block_isbad; -	if (master->block_markbad) -		slave->mtd.block_markbad = part_block_markbad; -	slave->mtd.erase = part_erase; +	if (master->_read_oob) +		slave->mtd._read_oob = part_read_oob; +	if (master->_write_oob) +		slave->mtd._write_oob = part_write_oob; +	if (master->_read_user_prot_reg) +		slave->mtd._read_user_prot_reg = part_read_user_prot_reg; +	if (master->_read_fact_prot_reg) +		slave->mtd._read_fact_prot_reg = part_read_fact_prot_reg; +	if (master->_write_user_prot_reg) +		slave->mtd._write_user_prot_reg = part_write_user_prot_reg; +	if (master->_lock_user_prot_reg) +		slave->mtd._lock_user_prot_reg = part_lock_user_prot_reg; +	if (master->_get_user_prot_info) +		slave->mtd._get_user_prot_info = part_get_user_prot_info; +	if (master->_get_fact_prot_info) +		slave->mtd._get_fact_prot_info = part_get_fact_prot_info; +	if (master->_sync) +		slave->mtd._sync = part_sync; +	if (master->_lock) +		slave->mtd._lock = part_lock; +	if (master->_unlock) +		slave->mtd._unlock = part_unlock; +	if (master->_block_isbad) +		slave->mtd._block_isbad = part_block_isbad; +	if (master->_block_markbad) +		slave->mtd._block_markbad = part_block_markbad; +	slave->mtd._erase = part_erase;  	slave->master = master;  	slave->offset = part->offset;  	slave->index = partno; @@ -416,12 +367,11 @@ static struct mtd_part *add_one_partition(struct mtd_info *master,  	}  	slave->mtd.ecclayout = master->ecclayout; -	if (master->block_isbad) { +	if (master->_block_isbad) {  		uint64_t offs = 0;  		while (offs < slave->mtd.size) { -			if (master->block_isbad(master, -						offs + slave->offset)) +			if (mtd_block_isbad(master, offs + slave->offset))  				slave->mtd.ecc_stats.badblocks++;  			offs += slave->mtd.erasesize;  		} |