mtd: onenand: add workaround for SYNC_WRITE mode
authorKyungmin Park <kyungmin.park@samsung.com>
Wed, 28 Apr 2010 15:46:48 +0000 (17:46 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 14 May 2010 00:50:21 +0000 (01:50 +0100)
Some chips fails to identify properly when SYNC_WRITE mode is enabled
(the example is OneNAND on S5PC110 SoC). This patch adds a workaround
for such chips.

Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/onenand/onenand_base.c

index 9827ab7..26caf25 100644 (file)
@@ -3763,6 +3763,12 @@ static int onenand_probe(struct mtd_info *mtd)
        /* Restore system configuration 1 */
        this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
 
+       /* Workaround */
+       if (syscfg & ONENAND_SYS_CFG1_SYNC_WRITE) {
+               bram_maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
+               bram_dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
+       }
+
        /* Check manufacturer ID */
        if (onenand_check_maf(bram_maf_id))
                return -ENXIO;
@@ -3782,6 +3788,9 @@ static int onenand_probe(struct mtd_info *mtd)
        this->device_id = dev_id;
        this->version_id = ver_id;
 
+       /* Check OneNAND features */
+       onenand_check_features(mtd);
+
        density = onenand_get_density(dev_id);
        if (FLEXONENAND(this)) {
                this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
@@ -3833,9 +3842,6 @@ static int onenand_probe(struct mtd_info *mtd)
        else
                mtd->size = this->chipsize;
 
-       /* Check OneNAND features */
-       onenand_check_features(mtd);
-
        /*
         * We emulate the 4KiB page and 256KiB erase block size
         * But oobsize is still 64 bytes.