Support up to 7 banks for ids as specified in JEDEC JEP106Z
authorNiklaus Giger <niklaus.giger@member.fsf.org>
Wed, 22 Jul 2009 15:13:24 +0000 (17:13 +0200)
committerStefan Roese <sr@denx.de>
Wed, 26 Aug 2009 06:58:27 +0000 (08:58 +0200)
see http://www.jedec.org/download/search/jep106Z.pdf
Add some second source legacy flash chips 256x8.

Signed-off-by: Niklaus Giger <niklaus.giger@member.fsf.org>
Signed-off-by: Stefan Roese <sr@denx.de>
drivers/mtd/cfi_flash.c
drivers/mtd/jedec_flash.c
include/flash.h

index 3ca73e3caef1bb5710d4abb467980e8dc9419438..6eea49a11ea752c1b77ccade8447ea8b9a601984 100644 (file)
 #define ATM_CMD_SOFTLOCK_START         0x80
 #define ATM_CMD_LOCK_SECT              0x40
 
+#define FLASH_CONTINUATION_CODE                0x7F
+
 #define FLASH_OFFSET_MANUFACTURER_ID   0x00
 #define FLASH_OFFSET_DEVICE_ID         0x01
 #define FLASH_OFFSET_DEVICE_ID2                0x0E
@@ -1541,13 +1543,22 @@ static int cmdset_intel_init(flash_info_t *info, struct cfi_qry *qry)
 
 static void cmdset_amd_read_jedec_ids(flash_info_t *info)
 {
+       ushort bankId = 0;
+       uchar  manuId;
+
        flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
        flash_unlock_seq(info, 0);
        flash_write_cmd(info, 0, info->addr_unlock1, FLASH_CMD_READ_ID);
        udelay(1000); /* some flash are slow to respond */
 
-       info->manufacturer_id = flash_read_uchar (info,
-                                       FLASH_OFFSET_MANUFACTURER_ID);
+       manuId = flash_read_uchar (info, FLASH_OFFSET_MANUFACTURER_ID);
+       /* JEDEC JEP106Z specifies ID codes up to bank 7 */
+       while (manuId == FLASH_CONTINUATION_CODE && bankId < 0x800) {
+               bankId += 0x100;
+               manuId = flash_read_uchar (info,
+                       bankId | FLASH_OFFSET_MANUFACTURER_ID);
+       }
+       info->manufacturer_id = manuId;
 
        switch (info->chipwidth){
        case FLASH_CFI_8BIT:
index e48aceceae66adb309068b629604420eb9b30d17..223fb71145365fbf149d44430eaf53e36cc8a051 100644 (file)
 #define SST39SF010A    0x00B5
 #define SST39SF020A    0x00B6
 
+/* MXIC */
+#define MX29LV040      0x004F
+
+/* WINBOND */
+#define W39L040A       0x00D6
+
+/* AMIC */
+#define A29L040                0x0092
+
+/* EON */
+#define EN29LV040A     0x004F
 
 /*
  * Unlock address sets for AMD command sets.
@@ -225,6 +236,62 @@ static const struct amd_flash_info jedec_table[] = {
                        ERASEINFO(0x10000,8),
                }
        },
+       {
+               .mfr_id         = (u16)MX_MANUFACT,
+               .dev_id         = MX29LV040,
+               .name           = "MXIC MX29LV040",
+               .uaddr          = {
+                       [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
+               },
+               .DevSize        = SIZE_512KiB,
+               .CmdSet         = P_ID_AMD_STD,
+               .NumEraseRegions= 1,
+               .regions        = {
+                       ERASEINFO(0x10000, 8),
+               }
+       },
+       {
+               .mfr_id         = (u16)WINB_MANUFACT,
+               .dev_id         = W39L040A,
+               .name           = "WINBOND W39L040A",
+               .uaddr          = {
+                       [0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
+               },
+               .DevSize        = SIZE_512KiB,
+               .CmdSet         = P_ID_AMD_STD,
+               .NumEraseRegions= 1,
+               .regions        = {
+                       ERASEINFO(0x10000, 8),
+               }
+       },
+       {
+               .mfr_id         = (u16)AMIC_MANUFACT,
+               .dev_id         = A29L040,
+               .name           = "AMIC A29L040",
+               .uaddr          = {
+                       [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
+               },
+               .DevSize        = SIZE_512KiB,
+               .CmdSet         = P_ID_AMD_STD,
+               .NumEraseRegions= 1,
+               .regions        = {
+                       ERASEINFO(0x10000, 8),
+               }
+       },
+       {
+               .mfr_id         = (u16)EON_MANUFACT,
+               .dev_id         = EN29LV040A,
+               .name           = "EON EN29LV040A",
+               .uaddr          = {
+                       [0] = MTD_UADDR_0x0555_0x02AA /* x8 */
+               },
+               .DevSize        = SIZE_512KiB,
+               .CmdSet         = P_ID_AMD_STD,
+               .NumEraseRegions= 1,
+               .regions        = {
+                       ERASEINFO(0x10000, 8),
+               }
+       },
 #endif
 #ifdef CONFIG_SYS_FLASH_LEGACY_512Kx16
        {
index b016162009fa244ab9f1250b8b9309c0976b48a2..8feca1b5fad5a700c9eb73a63e1f6f921a541332 100644 (file)
@@ -46,7 +46,7 @@ typedef struct {
        ushort  cmd_reset;              /* vendor specific reset command        */
        ushort  interface;              /* used for x8/x16 adjustments          */
        ushort  legacy_unlock;          /* support Intel legacy (un)locking     */
-       uchar   manufacturer_id;        /* manufacturer id                      */
+       ushort  manufacturer_id;        /* manufacturer id                      */
        ushort  device_id;              /* device id                            */
        ushort  device_id2;             /* extended device id                   */
        ushort  ext_addr;               /* extended query table address         */
@@ -154,6 +154,7 @@ extern flash_info_t *flash_get_info(ulong base);
  * Device IDs
  */
 
+/* Manufacturers inside bank 0 have ids like 0x00xx00xx */
 #define AMD_MANUFACT   0x00010001      /* AMD     manuf. ID in D23..D16, D7..D0 */
 #define FUJ_MANUFACT   0x00040004      /* FUJITSU manuf. ID in D23..D16, D7..D0 */
 #define ATM_MANUFACT   0x001F001F      /* ATMEL */
@@ -166,6 +167,13 @@ extern flash_info_t *flash_get_info(ulong base);
 #define TOSH_MANUFACT  0x00980098      /* TOSHIBA manuf. ID in D23..D16, D7..D0 */
 #define MT2_MANUFACT   0x002C002C      /* alternate MICRON manufacturer ID*/
 #define EXCEL_MANUFACT 0x004A004A      /* Excel Semiconductor                  */
+#define AMIC_MANUFACT  0x00370037      /* AMIC    manuf. ID in D23..D16, D7..D0 */
+#define WINB_MANUFACT  0x00DA00DA      /* Winbond manuf. ID in D23..D16, D7..D0 */
+
+/* Manufacturers inside bank 1 have ids like 0x01xx01xx */
+#define EON_MANUFACT   0x011C011C      /* EON     manuf. ID in D23..D16, D7..D0 */
+
+/* Manufacturers inside bank 2 have ids like 0x02xx02xx */
 
                                        /* Micron Technologies (INTEL compat.)  */
 #define MT_ID_28F400_T 0x44704470      /* 28F400B3 ID ( 4 M, top boot sector)  */