diff mbox

mtd/nand: Spansion S30MLxxxP support

Message ID 1281652958-2354-1-git-send-email-norris@broadcom.com
State New, archived
Headers show

Commit Message

Brian Norris Aug. 12, 2010, 10:42 p.m. UTC
Some Spansion chips have a method for determining eraseblock size that
is incompatible with similar ID chips of other sizes. This implements
some heuristic detection of these differences.

Note that I am unsure about the wraparound nature of the ID string here.
I have not been able to fully test this with the physical chip.
Essentially, the rule is correct, but the ID string detection may fail
here. Let me know if anyone can fix this.

Signed-off-by: Brian Norris <norris@broadcom.com>
---
 drivers/mtd/nand/nand_base.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

Comments

Hoyler, Gernot Aug. 18, 2010, 1:03 p.m. UTC | #1
> Note that I am unsure about the wraparound nature of the ID string
 > here. I have not been able to fully test this with the physical chip.
 > Essentially, the rule is correct, but the ID string detection may fail
 > here. Let me know if anyone can fix this.

I have just tested this on a physical device (S30ML512P30TFE51).
Unfortunately, the extended device IDs are a little bit different so
the patch does not work yet. With a S30ML512P30TFE51, the device IDs
are as follows:

   id_data[0]=0x01
   id_data[1]=0x56
   id_data[2]=0x00
   id_data[3]=0x01
   id_data[4]=0x10
   id_data[5]=0x00
   id_data[6]=0x00
   id_data[7]=0x00

My suggestion would be to check the page size instead of the extended
IDs (seems like the patch applies to all Spansion S30ML devices with
small pages, i.e. 512 bytes). So you might write:

+		if (*maf_id == NAND_MFR_AMD && type->pagesize == 512) {
...

This works for me.
diff mbox

Patch

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index a3c7473..66f4412 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2899,6 +2899,17 @@  static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 		mtd->writesize = type->pagesize;
 		mtd->oobsize = mtd->writesize / 32;
 		busw = type->options & NAND_BUSWIDTH_16;
+
+		/*
+		 * Check for Spansion/AMD ID + repeating 5th, 6th byte since
+		 * some Spansion chips have erasesize that conflicts with size
+		 * listed in nand_ids table
+		 * Data sheet (5 byte ID): Spansion S30ML-P ORNAND (p.39)
+		 */
+		if (*maf_id == NAND_MFR_AMD && id_data[5] == 0x01 &&
+				id_data[6] == 0x01)
+			mtd->erasesize = (128 * 1024) << ((id_data[3] & 0x03)
+					<< 1);
 	}
 
 	/* Try to identify manufacturer */