diff options
Diffstat (limited to 'drivers/mtd')
| -rw-r--r-- | drivers/mtd/nand/fsl_ifc_nand.c | 22 | ||||
| -rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 33 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 5 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_bbt.c | 13 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_util.c | 2 | 
5 files changed, 61 insertions, 14 deletions
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c index 5cac78b29..b3b7c705e 100644 --- a/drivers/mtd/nand/fsl_ifc_nand.c +++ b/drivers/mtd/nand/fsl_ifc_nand.c @@ -384,19 +384,30 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,  	/* READID must read all possible bytes while CEB is active */  	case NAND_CMD_READID: +	case NAND_CMD_PARAM: { +		int timing = IFC_FIR_OP_RB; +		if (command == NAND_CMD_PARAM) +			timing = IFC_FIR_OP_RBCD; +  		out_be32(&ifc->ifc_nand.nand_fir0,  				(IFC_FIR_OP_CMD0 << IFC_NAND_FIR0_OP0_SHIFT) |  				(IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) | -				(IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT)); +				(timing << IFC_NAND_FIR0_OP2_SHIFT));  		out_be32(&ifc->ifc_nand.nand_fcr0, -				NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT); -		/* 4 bytes for manuf, device and exts */ -		out_be32(&ifc->ifc_nand.nand_fbcr, 4); -		ctrl->read_bytes = 4; +				command << IFC_NAND_FCR0_CMD0_SHIFT); +		out_be32(&ifc->ifc_nand.row3, column); + +		/* +		 * although currently it's 8 bytes for READID, we always read +		 * the maximum 256 bytes(for PARAM) +		 */ +		out_be32(&ifc->ifc_nand.nand_fbcr, 256); +		ctrl->read_bytes = 256;  		set_addr(mtd, 0, 0, 0);  		fsl_ifc_run_command(mtd);  		return; +	}  	/* ERASE1 stores the block and page address */  	case NAND_CMD_ERASE1: @@ -764,6 +775,7 @@ int board_nand_init(struct nand_chip *nand)  	if (priv->bank >= MAX_BANKS) {  		printf("%s: address did not match any "  		       "chip selects\n", __func__); +		kfree(priv);  		return -ENODEV;  	} diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 35e89a0f4..936186f75 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1302,12 +1302,45 @@ static void mxc_setup_config1(void)  #define mxc_setup_config1()  #endif +#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT + +static u8 bbt_pattern[] = {'B', 'b', 't', '0' }; +static u8 mirror_pattern[] = {'1', 't', 'b', 'B' }; + +static struct nand_bbt_descr bbt_main_descr = { +	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | +		   NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, +	.offs =	0, +	.len = 4, +	.veroffs = 4, +	.maxblocks = 4, +	.pattern = bbt_pattern, +}; + +static struct nand_bbt_descr bbt_mirror_descr = { +	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | +		   NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, +	.offs =	0, +	.len = 4, +	.veroffs = 4, +	.maxblocks = 4, +	.pattern = mirror_pattern, +}; + +#endif +  int board_nand_init(struct nand_chip *this)  {  	struct mtd_info *mtd;  	uint16_t tmp;  	int err = 0; +#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT +	this->options |= NAND_USE_FLASH_BBT; +	this->bbt_td = &bbt_main_descr; +	this->bbt_md = &bbt_mirror_descr; +#endif +  	/* structures must be linked */  	mtd = &host->mtd;  	mtd->priv = this; diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index bef79bed0..bfd668fa0 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2530,13 +2530,14 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,  		chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I')  		return 0; -	printk(KERN_INFO "ONFI flash detected\n"); +	MTDDEBUG(MTD_DEBUG_LEVEL0, "ONFI flash detected\n");  	chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1);  	for (i = 0; i < 3; i++) {  		chip->read_buf(mtd, (uint8_t *)p, sizeof(*p));  		if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 254) ==  				le16_to_cpu(p->crc)) { -			printk(KERN_INFO "ONFI param page %d valid\n", i); +			MTDDEBUG(MTD_DEBUG_LEVEL0, +				 "ONFI param page %d valid\n", i);  			break;  		}  	} diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c index dc6c6480e..74a7061b0 100644 --- a/drivers/mtd/nand/nand_bbt.c +++ b/drivers/mtd/nand/nand_bbt.c @@ -259,10 +259,10 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,  					mtd->ecc_stats.bbtblocks++;  					continue;  				} -				/* Leave it for now, if its matured we can move this -				 * message to MTD_DEBUG_LEVEL0 */ -				printk(KERN_DEBUG "nand_read_bbt: Bad block at 0x%012llx\n", -				       (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift); +				MTDDEBUG(MTD_DEBUG_LEVEL0, "nand_read_bbt: " \ +					"Bad block at 0x%012llx\n", +					(loff_t)((offs << 2) + (act >> 1)) +					<< this->bbt_erase_shift);  				/* Factory marked bad or worn out ? */  				if (tmp == 0)  					this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06); @@ -651,8 +651,9 @@ static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr  		if (td->pages[i] == -1)  			printk(KERN_WARNING "Bad block table not found for chip %d\n", i);  		else -			printk(KERN_DEBUG "Bad block table found at page %d, version 0x%02X\n", td->pages[i], -			       td->version[i]); +			MTDDEBUG(MTD_DEBUG_LEVEL0, "Bad block table found " \ +				"at page %d, version 0x%02X\n", td->pages[i], +				td->version[i]);  	}  	return 0;  } diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 60c778e63..7ed8b1891 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -564,7 +564,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,  				ops.oobbuf = ops.datbuf + pagesize;  				rval = nand->write_oob(nand, offset, &ops); -				if (!rval) +				if (rval != 0)  					break;  				offset += pagesize;  |