--- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -573,6 +573,7 @@ int chip_delay; unsigned int options; const char **part_probe_types; + int (*chip_fixup)(struct mtd_info *mtd); void *priv; }; --- a/drivers/mtd/nand/plat_nand.c +++ b/drivers/mtd/nand/plat_nand.c @@ -70,7 +70,18 @@ platform_set_drvdata(pdev, data); /* Scan to find existance of the device */ - if (nand_scan(&data->mtd, 1)) { + if (nand_scan_ident(&data->mtd, 1)) { + res = -ENXIO; + goto out; + } + + if (pdata->chip.chip_fixup) { + res = pdata->chip.chip_fixup(&data->mtd); + if (res) + goto out; + } + + if (nand_scan_tail(&data->mtd)) { res = -ENXIO; goto out; }