|
@@ -2501,23 +2501,24 @@ out:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * onenand_probe - [OneNAND Interface] Probe the OneNAND device
|
|
|
+ * onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip
|
|
|
* @param mtd MTD device structure
|
|
|
*
|
|
|
* OneNAND detection method:
|
|
|
* Compare the the values from command with ones from register
|
|
|
*/
|
|
|
-static int onenand_probe(struct mtd_info *mtd)
|
|
|
+static int onenand_chip_probe(struct mtd_info *mtd)
|
|
|
{
|
|
|
struct onenand_chip *this = mtd->priv;
|
|
|
- int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id;
|
|
|
- int density;
|
|
|
+ int bram_maf_id, bram_dev_id, maf_id, dev_id;
|
|
|
int syscfg;
|
|
|
|
|
|
/* Save system configuration 1 */
|
|
|
syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
|
|
|
+
|
|
|
/* Clear Sync. Burst Read mode to read BootRAM */
|
|
|
- this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), this->base + ONENAND_REG_SYS_CFG1);
|
|
|
+ this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ),
|
|
|
+ this->base + ONENAND_REG_SYS_CFG1);
|
|
|
|
|
|
/* Send the command for reading device ID from BootRAM */
|
|
|
this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
|
|
@@ -2542,13 +2543,38 @@ static int onenand_probe(struct mtd_info *mtd)
|
|
|
/* Read manufacturer and device IDs from Register */
|
|
|
maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
|
|
|
dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
|
|
|
- ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
|
|
|
- this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
|
|
|
|
|
|
/* Check OneNAND device */
|
|
|
if (maf_id != bram_maf_id || dev_id != bram_dev_id)
|
|
|
return -ENXIO;
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * onenand_probe - [OneNAND Interface] Probe the OneNAND device
|
|
|
+ * @param mtd MTD device structure
|
|
|
+ *
|
|
|
+ * OneNAND detection method:
|
|
|
+ * Compare the the values from command with ones from register
|
|
|
+ */
|
|
|
+int onenand_probe(struct mtd_info *mtd)
|
|
|
+{
|
|
|
+ struct onenand_chip *this = mtd->priv;
|
|
|
+ int maf_id, dev_id, ver_id;
|
|
|
+ int density;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = this->chip_probe(mtd);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /* Read manufacturer and device IDs from Register */
|
|
|
+ maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
|
|
|
+ dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
|
|
|
+ ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
|
|
|
+ this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
|
|
|
+
|
|
|
/* Flash device information */
|
|
|
mtd->name = onenand_print_device_info(dev_id, ver_id);
|
|
|
this->device_id = dev_id;
|
|
@@ -2655,6 +2681,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
|
|
|
if (!this->write_bufferram)
|
|
|
this->write_bufferram = onenand_write_bufferram;
|
|
|
|
|
|
+ if (!this->chip_probe)
|
|
|
+ this->chip_probe = onenand_chip_probe;
|
|
|
+
|
|
|
if (!this->block_markbad)
|
|
|
this->block_markbad = onenand_default_block_markbad;
|
|
|
if (!this->scan_bbt)
|