From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx1.sonologic.nl ([82.94.245.21]) by canuck.infradead.org with esmtp (Exim 4.43 #1 (Red Hat Linux)) id 1DpoTx-0006vJ-Ae for linux-mtd@lists.infradead.org; Tue, 05 Jul 2005 10:33:06 -0400 Received: from [127.0.0.1] (mx1.sonologic.nl [82.94.245.21]) (authenticated bits=0) by mx1.sonologic.nl (8.13.3/8.13.3) with ESMTP id j65EG49K066332 for ; Tue, 5 Jul 2005 14:16:05 GMT Message-ID: <42CA962D.8060605@sonologic.nl> Date: Tue, 05 Jul 2005 16:16:13 +0200 From: Koen Martens MIME-Version: 1.0 To: linux-mtd@lists.infradead.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [PATCH] support for broken EON chips List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Ok, here goes nothing. Go ahead, kill me :) Comments very welcome, since i don't have a clue atm about how to do this nicely. If all goes well i might have some time to add more EON chips to jedec_probe soon. The patch below is against cvs.. diff -Naur mtd-orig/drivers/mtd/chips/cfi_probe.c mtd/drivers/mtd/chips/cfi_probe.c --- mtd-orig/drivers/mtd/chips/cfi_probe.c 2004-11-16 19:19:02.000000000 +0100 +++ mtd/drivers/mtd/chips/cfi_probe.c 2005-07-05 15:35:19.000000000 +0200 @@ -231,7 +231,19 @@ cfi_send_gen_cmd(0x55, 0x2aa, base, map, cfi, cfi->device_type, NULL); cfi_send_gen_cmd(0x90, 0x555, base, map, cfi, cfi->device_type, NULL); cfi->mfr = cfi_read_query(map, base); +#ifdef CONFIG_MTD_EON + if(cfi->mfr==0x7f) { + cfi->mfr = cfi_read_query(map, base + (0x100*ofs_factor)); + } +#endif cfi->id = cfi_read_query(map, base + ofs_factor); +#ifdef CONFIG_MTD_EON + if(cfi->mfr==0x1c && (cfi->id==0xb9 || cfi->id==0xba)) { + kfree(cfi->cfiq); + return 0; + } +#endif + /* Put it back into Read Mode */ cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi->device_type, NULL); diff -Naur mtd-orig/drivers/mtd/chips/jedec_probe.c mtd/drivers/mtd/chips/jedec_probe.c --- mtd-orig/drivers/mtd/chips/jedec_probe.c 2005-03-17 21:09:51.000000000 +0100 +++ mtd/drivers/mtd/chips/jedec_probe.c 2005-07-05 15:32:33.000000000 +0200 @@ -38,6 +38,7 @@ #define MANUFACTURER_ST 0x0020 #define MANUFACTURER_TOSHIBA 0x0098 #define MANUFACTURER_WINBOND 0x00da +#define MANUFACTURER_EON 0x001c /* AMD */ @@ -166,6 +167,8 @@ /* Winbond */ #define W49V002A 0x00b0 +/* EON */ +#define EON29LV400BB 0x22BA /* * Unlock address sets for AMD command sets. @@ -1710,6 +1713,23 @@ ERASEINFO(0x02000, 2), ERASEINFO(0x04000, 1), } + },{ + .mfr_id = MANUFACTURER_EON, /* TomTom GO */ + .dev_id = EON29LV400BB, + .name = "EON AM29LV400BB", + .uaddr = { + [1] = MTD_UADDR_0x0AAA_0x0555, /* x16 */ + [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ + }, + .DevSize = SIZE_512KiB, + .CmdSet = P_ID_AMD_STD, + .NumEraseRegions= 4, + .regions = { + ERASEINFO(0x04000,1), + ERASEINFO(0x02000,2), + ERASEINFO(0x08000,1), + ERASEINFO(0x10000,7), + } } }; @@ -1729,6 +1749,14 @@ 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); +#ifdef CONFIG_MTD_EON + if( (result.x[0] & mask) == 0x7f ) { + ofs = cfi_build_cmd_addr(0x100, cfi_interleave(cfi), cfi->device_type); + mask = (1 << (cfi->device_type * 8)) -1; + result = map_read(map, base + ofs); + } +#endif + return result.x[0] & mask; } diff -Naur mtd-orig/drivers/mtd/chips/Kconfig mtd/drivers/mtd/chips/Kconfig --- mtd-orig/drivers/mtd/chips/Kconfig 2005-06-07 01:04:35.000000000 +0200 +++ mtd/drivers/mtd/chips/Kconfig 2005-07-05 15:38:25.000000000 +0200 @@ -221,6 +221,16 @@ be set to at least 1. This can also be adjusted at driver load time with the retry_cmd_max module parameter. +config MTD_EON + depends on MTD_CFI_AMDSTD + bool "Work-arounds for broken EON chips" + help + This option enables workarounds for the broken chips produced + by EON. Chips for which this workaround is necessary include + EN29LV400AB/T and EN29LV800BB/T. If you have such a chip, and + are experiencing problems (eg. incorrect CFI detection), say + 'Y' here. Otherwise you should probably say 'N' here. + config MTD_CFI_STAA tristate "Support for ST (Advanced Architecture) flash chips" depends on MTD_GEN_PROBE