diff options
| author | Joe Hershberger <joe.hershberger@ni.com> | 2012-08-22 16:49:42 -0500 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2012-09-17 17:32:10 -0500 | 
| commit | eee623a5049963d0c085be37128bbd22bee1ba1e (patch) | |
| tree | 315346f1597dbeebd2a0d071325bac7fea9de16f /drivers/mtd/nand/nand_util.c | |
| parent | d62e9caaaf7e6f5c7d86c9ea19170bfa5adda8be (diff) | |
| download | olio-uboot-2014.01-eee623a5049963d0c085be37128bbd22bee1ba1e.tar.xz olio-uboot-2014.01-eee623a5049963d0c085be37128bbd22bee1ba1e.zip | |
nand: Add support for unlock.invert
NAND unlock command allows an invert bit to be set to unlock all but
the selected page range.
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
[scottwood@freescale.com: updated docs and added comment about invert bit]
Signed-off-by: Scott Wood <scottwood@freescale.com>
Diffstat (limited to 'drivers/mtd/nand/nand_util.c')
| -rw-r--r-- | drivers/mtd/nand/nand_util.c | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 7ed8b1891..c66eeefcb 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -317,18 +317,20 @@ int nand_get_lock_status(struct mtd_info *mtd, loff_t offset)   * @param start		start byte address   * @param length	number of bytes to unlock (must be a multiple of   *			page size nand->writesize) + * @param allexcept	if set, unlock everything not selected   *   * @return		0 on success, -1 in case of error   */ -int nand_unlock(struct mtd_info *mtd, ulong start, ulong length) +int nand_unlock(struct mtd_info *mtd, ulong start, ulong length, int allexcept)  {  	int ret = 0;  	int chipnr;  	int status;  	int page;  	struct nand_chip *chip = mtd->priv; -	printf ("nand_unlock: start: %08x, length: %d!\n", -		(int)start, (int)length); + +	debug("nand_unlock%s: start: %08x, length: %d!\n", +		allexcept ? " (allexcept)" : "", start, length);  	/* select the NAND device */  	chipnr = (int)(start >> chip->chip_shift); @@ -368,6 +370,15 @@ int nand_unlock(struct mtd_info *mtd, ulong start, ulong length)  	/* submit ADDRESS of LAST page to unlock */  	page += (int)(length >> chip->page_shift); + +	/* +	 * Page addresses for unlocking are supposed to be block-aligned. +	 * At least some NAND chips use the low bit to indicate that the +	 * page range should be inverted. +	 */ +	if (allexcept) +		page |= 1; +  	chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, page & chip->pagemask);  	/* call wait ready function */ |