Add Eon EN29SL800 flash
PATCH 1/1 Add Eon EN29SL800 flash
This patch adds support for Eon EN29SL800 flashes
drivers/mtd/chips/jedec_probe.c | 58 ++++++++++++++++++++++++++++++++++++--- 1 files changed, 54 insertions(+), 4 deletions(-)
drivers/mtd/chips/jedec_probe.c +39 -1
@@ -38,7 +38,7 @@#define MANUFACTURER_ST 0x0020#define MANUFACTURER_TOSHIBA 0x0098#define MANUFACTURER_WINBOND 0x00da - +#define CONTINUATION_CODE 0x007f/* AMD */ #define AM29DL800BB 0x22C8
@@ -68,6 +68,10 @@#define AT49BV32X 0x00C8#define AT49BV32XT 0x00C9 +/* Eon */ +#define EN29SL800BB 0x226B +#define EN29SL800BT 0x22EA +/* Fujitsu */ #define MBM29F040C 0x00A4#define MBM29LV650UE 0x22D7
@@ -632,6 +636,40 @@ static const struct amd_flash_info jedec_table[] = { ERASEINFO(0x02000,8) } }, { + .mfr_id = 0x1c, + .dev_id = EN29SL800BT, + .name = "Eon EN29SL800BT", + .uaddr = { + [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ + [1 ] = MTD_UADDR_0x0555_0x02AA,/* x16 */ + }, + .DevSize = SIZE_1MiB, + .CmdSet = P_ID_AMD_STD, + .NumEraseRegions= 4, + .regions = { +ERASEINFO (0x10000 ,15 ), +ERASEINFO (0x08000 ,1 ), +ERASEINFO (0x02000 ,2 ), + ERASEINFO(0x04000, 1), + } + }, { + .mfr_id =0x1c , + .dev_id = EN29SL800BB, + .name = "Eon EN29SL800BB", + .uaddr = { + [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ + [1 ] = MTD_UADDR_0x0555_0x02AA,/* x16 */ + }, + .DevSize = SIZE_1MiB, + .CmdSet = P_ID_AMD_STD, + .NumEraseRegions= 4, + .regions = { +ERASEINFO (0x04000 ,1 ), +ERASEINFO (0x02000 ,2 ), +ERASEINFO (0x08000 ,1 ), + ERASEINFO(0x10000, 15), + } + }, { .mfr_id =MANUFACTURER_FUJITSU , .dev_id = MBM29F040C, .name = "Fujitsu MBM29F040C",
@@ -1769,9 +1807,21 @@ static inline u32 jedec_read_mfr(struct map_info *map,
__u32 base,
{
map_word result;
unsigned long mask;
- u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type);
- mask = (1 << (cfi->device_type * 8)) -1;
- result = map_read(map, base + ofs);
+ int bank = 0;
+
+ /* According to JEDEC "Standard Manufacturer's Identification Code"
+ * (http://www.jedec.org/download/search/jep106W.pdf)
+ * several first banks can contain 0x7f instead of actual ID
+ */
+ do {
+ u32 ofs = cfi_build_cmd_addr(0 + (bank << 8),
+ cfi_interleave(cfi),
+ cfi->device_type);
+ mask = (1 << (cfi->device_type * 8)) -1;
+ result = map_read(map, base + ofs);
+ bank++;
+ } while ((result.x[0] & mask) == CONTINUATION_CODE);
+
return result.x[0] & mask;
}