diff options
Diffstat (limited to 'drivers/mtd/nand/nand_util.c')
| -rw-r--r-- | drivers/mtd/nand/nand_util.c | 26 | 
1 files changed, 15 insertions, 11 deletions
| diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 7ed8b1891..c4752a7cb 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -207,12 +207,6 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)   * Support for locking / unlocking operations of some NAND devices   *****************************************************************************/ -#define NAND_CMD_LOCK		0x2a -#define NAND_CMD_LOCK_TIGHT	0x2c -#define NAND_CMD_UNLOCK1	0x23 -#define NAND_CMD_UNLOCK2	0x24 -#define NAND_CMD_LOCK_STATUS	0x7a -  /**   * nand_lock: Set all pages of NAND flash chip to the LOCK or LOCK-TIGHT   *	      state @@ -271,7 +265,6 @@ int nand_lock(struct mtd_info *mtd, int tight)   *			>0 lock status:   *			  bitfield with the following combinations:   *			  NAND_LOCK_STATUS_TIGHT: page in tight state - *			  NAND_LOCK_STATUS_LOCK:  page locked   *			  NAND_LOCK_STATUS_UNLOCK: page unlocked   *   */ @@ -300,7 +293,6 @@ int nand_get_lock_status(struct mtd_info *mtd, loff_t offset)  	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask);  	ret = chip->read_byte(mtd) & (NAND_LOCK_STATUS_TIGHT -					  | NAND_LOCK_STATUS_LOCK  					  | NAND_LOCK_STATUS_UNLOCK);   out: @@ -317,18 +309,21 @@ 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, loff_t start, size_t 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: %08llx, length: %d!\n", +		allexcept ? " (allexcept)" : "", start, length);  	/* select the NAND device */  	chipnr = (int)(start >> chip->chip_shift); @@ -368,6 +363,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 */ |