diff options
| -rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/nand_base.c | 29 | ||||
| -rw-r--r-- | include/linux/mtd/nand.h | 4 | 
3 files changed, 19 insertions, 16 deletions
| diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index d5eb54ad8..ab8bbb3ae 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -296,7 +296,7 @@ int board_nand_init(struct nand_chip *nand)  	mtd->priv = nand;  	/* Detect NAND chips */ -	if (nand_scan_ident(mtd, 1)) { +	if (nand_scan_ident(mtd, 1, NULL)) {  		printk(KERN_WARNING "NAND Flash not found !\n");  		return -ENXIO;  	} diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 5239c1fcf..3b96b0e2a 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2414,10 +2414,10 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)   */  static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  						  struct nand_chip *chip, -						  int busw, int *maf_id) +						  int busw, int *maf_id, +						  const struct nand_flash_dev *type)  { -	const struct nand_flash_dev *type = NULL; -	int i, dev_id, maf_idx; +	int dev_id, maf_idx;  	int tmp_id, tmp_manf;  	/* Select the device */ @@ -2456,15 +2456,14 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,  		return ERR_PTR(-ENODEV);  	} -	/* Lookup the flash id */ -	for (i = 0; nand_flash_ids[i].name != NULL; i++) { -		if (dev_id == nand_flash_ids[i].id) { -			type =  &nand_flash_ids[i]; -			break; -		} -	} +	if (!type) +		type = nand_flash_ids; + +	for (; type->name != NULL; type++) +		if (dev_id == type->id) +                        break; -	if (!type) { +	if (!type->name) {  		/* supress warning if there is no nand */  		if (*maf_id != 0x00 && *maf_id != 0xff &&  		    dev_id  != 0x00 && dev_id  != 0xff) @@ -2580,13 +2579,15 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,   * nand_scan_ident - [NAND Interface] Scan for the NAND device   * @mtd:	     MTD device structure   * @maxchips:	     Number of chips to scan for + * @table:	     Alternative NAND ID table   *   * This is the first phase of the normal nand_scan() function. It   * reads the flash ID and sets up MTD fields accordingly.   *   * The mtd->owner field must be set to the module of the caller.   */ -int nand_scan_ident(struct mtd_info *mtd, int maxchips) +int nand_scan_ident(struct mtd_info *mtd, int maxchips, +		    const struct nand_flash_dev *table)  {  	int i, busw, nand_maf_id;  	struct nand_chip *chip = mtd->priv; @@ -2598,7 +2599,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips)  	nand_set_defaults(chip, busw);  	/* Read the flash type */ -	type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id); +	type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id, table);  	if (IS_ERR(type)) {  #ifndef CONFIG_SYS_NAND_QUIET_TEST @@ -2869,7 +2870,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)  {  	int ret; -	ret = nand_scan_ident(mtd, maxchips); +	ret = nand_scan_ident(mtd, maxchips, NULL);  	if (!ret)  		ret = nand_scan_tail(mtd);  	return ret; diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 1128f5ae1..d299929ab 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -33,11 +33,13 @@  struct mtd_info; +struct nand_flash_dev;  /* Scan and identify a NAND device */  extern int nand_scan (struct mtd_info *mtd, int max_chips);  /* Separate phases of nand_scan(), allowing board driver to intervene   * and override command or ECC setup according to flash type */ -extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); +extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, +			   const struct nand_flash_dev *table);  extern int nand_scan_tail(struct mtd_info *mtd);  /* Free resources held by the NAND device */ |