There was a bug logically in the order of nand_flash_detect_onfi and checking nand_flash_ids. We should get NAND devices related informations first by ONFI method instead of querying nand_flash_ids table, if ONFI fails, then query nand_flash_ids table.
Signed-off-by: Shengzhou Liu <shengzhou....@freescale.com> --- drivers/mtd/nand/nand_base.c | 48 +++++++++++++++++++++-------------------- 1 files changed, 25 insertions(+), 23 deletions(-) diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 6aac6a2..8d03f54 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2585,36 +2585,38 @@ static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, return ERR_PTR(-ENODEV); } - if (!type) - type = nand_flash_ids; + ret = nand_flash_detect_onfi(mtd, chip, &busw); + if (!ret) { + if (!type) + type = nand_flash_ids; - for (; type->name != NULL; type++) - if (*dev_id == type->id) - break; + for (; type->name != NULL; type++) + if (*dev_id == type->id) + break; - if (!type->name) { - /* supress warning if there is no nand */ - if (*maf_id != 0x00 && *maf_id != 0xff && - *dev_id != 0x00 && *dev_id != 0xff) - printk(KERN_INFO "%s: unknown NAND device: " - "Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n", - __func__, *maf_id, *dev_id); - return ERR_PTR(-ENODEV); - } + if (!type->name) { + /* supress warning if there is no nand */ + if (*maf_id != 0x00 && *maf_id != 0xff && + *dev_id != 0x00 && *dev_id != 0xff) { + printk(KERN_INFO "%s: unknown NAND device: " + "Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n", + __func__, *maf_id, *dev_id); + } + return ERR_PTR(-ENODEV); + } - if (!mtd->name) - mtd->name = type->name; + if (!mtd->name) + mtd->name = type->name; - chip->chipsize = (uint64_t)type->chipsize << 20; - chip->onfi_version = 0; + chip->chipsize = (uint64_t)type->chipsize << 20; + chip->onfi_version = 0; - ret = nand_flash_detect_onfi(mtd, chip, &busw); - if (!ret) nand_flash_detect_non_onfi(mtd, chip, type, &busw); - /* Get chip options, preserve non chip based options */ - chip->options &= ~NAND_CHIPOPTIONS_MSK; - chip->options |= type->options & NAND_CHIPOPTIONS_MSK; + /* Get chip options, preserve non chip based options */ + chip->options &= ~NAND_CHIPOPTIONS_MSK; + chip->options |= type->options & NAND_CHIPOPTIONS_MSK; + } /* * Set chip as a default. Board drivers can override it, if necessary -- 1.6.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot