1*87194abaSLinus Walleij // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds Common Flash Interface probe code.
4*87194abaSLinus Walleij (C) 2000 Red Hat.
51da177e4SLinus Torvalds See JEDEC (http://www.jedec.org/) standard JESD21C (section 3.5)
61da177e4SLinus Torvalds for the standard this probe goes back to.
71da177e4SLinus Torvalds
81da177e4SLinus Torvalds Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com
91da177e4SLinus Torvalds */
101da177e4SLinus Torvalds
111da177e4SLinus Torvalds #include <linux/module.h>
121da177e4SLinus Torvalds #include <linux/init.h>
131da177e4SLinus Torvalds #include <linux/types.h>
141da177e4SLinus Torvalds #include <linux/kernel.h>
151da177e4SLinus Torvalds #include <asm/io.h>
161da177e4SLinus Torvalds #include <asm/byteorder.h>
171da177e4SLinus Torvalds #include <linux/errno.h>
181da177e4SLinus Torvalds #include <linux/slab.h>
191da177e4SLinus Torvalds #include <linux/interrupt.h>
201da177e4SLinus Torvalds
211da177e4SLinus Torvalds #include <linux/mtd/mtd.h>
221da177e4SLinus Torvalds #include <linux/mtd/map.h>
231da177e4SLinus Torvalds #include <linux/mtd/cfi.h>
241da177e4SLinus Torvalds #include <linux/mtd/gen_probe.h>
251da177e4SLinus Torvalds
261da177e4SLinus Torvalds /* AMD */
274a22442fSJerry Hicks #define AM29DL800BB 0x22CB
281da177e4SLinus Torvalds #define AM29DL800BT 0x224A
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds #define AM29F800BB 0x2258
311da177e4SLinus Torvalds #define AM29F800BT 0x22D6
321da177e4SLinus Torvalds #define AM29LV400BB 0x22BA
331da177e4SLinus Torvalds #define AM29LV400BT 0x22B9
341da177e4SLinus Torvalds #define AM29LV800BB 0x225B
351da177e4SLinus Torvalds #define AM29LV800BT 0x22DA
361da177e4SLinus Torvalds #define AM29LV160DT 0x22C4
371da177e4SLinus Torvalds #define AM29LV160DB 0x2249
381da177e4SLinus Torvalds #define AM29F017D 0x003D
391da177e4SLinus Torvalds #define AM29F016D 0x00AD
401da177e4SLinus Torvalds #define AM29F080 0x00D5
411da177e4SLinus Torvalds #define AM29F040 0x00A4
421da177e4SLinus Torvalds #define AM29LV040B 0x004F
431da177e4SLinus Torvalds #define AM29F032B 0x0041
441da177e4SLinus Torvalds #define AM29F002T 0x00B0
458fd310a1SMike Rapoport #define AM29SL800DB 0x226B
468fd310a1SMike Rapoport #define AM29SL800DT 0x22EA
471da177e4SLinus Torvalds
481da177e4SLinus Torvalds /* Atmel */
491da177e4SLinus Torvalds #define AT49BV512 0x0003
501da177e4SLinus Torvalds #define AT29LV512 0x003d
511da177e4SLinus Torvalds #define AT49BV16X 0x00C0
521da177e4SLinus Torvalds #define AT49BV16XT 0x00C2
531da177e4SLinus Torvalds #define AT49BV32X 0x00C8
541da177e4SLinus Torvalds #define AT49BV32XT 0x00C9
551da177e4SLinus Torvalds
561b0b30acSMike Rapoport /* Eon */
57974f2936SLinus Walleij #define EN29LV400AT 0x22B9
58974f2936SLinus Walleij #define EN29LV400AB 0x22BA
591b0b30acSMike Rapoport #define EN29SL800BB 0x226B
601b0b30acSMike Rapoport #define EN29SL800BT 0x22EA
611b0b30acSMike Rapoport
621da177e4SLinus Torvalds /* Fujitsu */
631da177e4SLinus Torvalds #define MBM29F040C 0x00A4
64c9856e39SPhilippe De Muyter #define MBM29F800BA 0x2258
651da177e4SLinus Torvalds #define MBM29LV650UE 0x22D7
661da177e4SLinus Torvalds #define MBM29LV320TE 0x22F6
671da177e4SLinus Torvalds #define MBM29LV320BE 0x22F9
681da177e4SLinus Torvalds #define MBM29LV160TE 0x22C4
691da177e4SLinus Torvalds #define MBM29LV160BE 0x2249
701da177e4SLinus Torvalds #define MBM29LV800BA 0x225B
711da177e4SLinus Torvalds #define MBM29LV800TA 0x22DA
721da177e4SLinus Torvalds #define MBM29LV400TC 0x22B9
731da177e4SLinus Torvalds #define MBM29LV400BC 0x22BA
741da177e4SLinus Torvalds
751da177e4SLinus Torvalds /* Hyundai */
761da177e4SLinus Torvalds #define HY29F002T 0x00B0
771da177e4SLinus Torvalds
781da177e4SLinus Torvalds /* Intel */
791da177e4SLinus Torvalds #define I28F004B3T 0x00d4
801da177e4SLinus Torvalds #define I28F004B3B 0x00d5
811da177e4SLinus Torvalds #define I28F400B3T 0x8894
821da177e4SLinus Torvalds #define I28F400B3B 0x8895
831da177e4SLinus Torvalds #define I28F008S5 0x00a6
841da177e4SLinus Torvalds #define I28F016S5 0x00a0
851da177e4SLinus Torvalds #define I28F008SA 0x00a2
861da177e4SLinus Torvalds #define I28F008B3T 0x00d2
871da177e4SLinus Torvalds #define I28F008B3B 0x00d3
881da177e4SLinus Torvalds #define I28F800B3T 0x8892
891da177e4SLinus Torvalds #define I28F800B3B 0x8893
901da177e4SLinus Torvalds #define I28F016S3 0x00aa
911da177e4SLinus Torvalds #define I28F016B3T 0x00d0
921da177e4SLinus Torvalds #define I28F016B3B 0x00d1
931da177e4SLinus Torvalds #define I28F160B3T 0x8890
941da177e4SLinus Torvalds #define I28F160B3B 0x8891
951da177e4SLinus Torvalds #define I28F320B3T 0x8896
961da177e4SLinus Torvalds #define I28F320B3B 0x8897
971da177e4SLinus Torvalds #define I28F640B3T 0x8898
981da177e4SLinus Torvalds #define I28F640B3B 0x8899
99b4c8c8cfSStefan Roese #define I28F640C3B 0x88CD
100b4c8c8cfSStefan Roese #define I28F160F3T 0x88F3
101b4c8c8cfSStefan Roese #define I28F160F3B 0x88F4
102b4c8c8cfSStefan Roese #define I28F160C3T 0x88C2
103b4c8c8cfSStefan Roese #define I28F160C3B 0x88C3
1041da177e4SLinus Torvalds #define I82802AB 0x00ad
1051da177e4SLinus Torvalds #define I82802AC 0x00ac
1061da177e4SLinus Torvalds
1071da177e4SLinus Torvalds /* Macronix */
1081da177e4SLinus Torvalds #define MX29LV040C 0x004F
1091da177e4SLinus Torvalds #define MX29LV160T 0x22C4
1101da177e4SLinus Torvalds #define MX29LV160B 0x2249
111c4e6952fSTakashi YOSHI #define MX29F040 0x00A4
1121da177e4SLinus Torvalds #define MX29F016 0x00AD
1131da177e4SLinus Torvalds #define MX29F002T 0x00B0
1141da177e4SLinus Torvalds #define MX29F004T 0x0045
1151da177e4SLinus Torvalds #define MX29F004B 0x0046
1161da177e4SLinus Torvalds
1171da177e4SLinus Torvalds /* NEC */
1181da177e4SLinus Torvalds #define UPD29F064115 0x221C
1191da177e4SLinus Torvalds
1201da177e4SLinus Torvalds /* PMC */
1211da177e4SLinus Torvalds #define PM49FL002 0x006D
1221da177e4SLinus Torvalds #define PM49FL004 0x006E
1231da177e4SLinus Torvalds #define PM49FL008 0x006A
1241da177e4SLinus Torvalds
125a63ec1b7SPavel Machek /* Sharp */
126fe2f4c8eSAndrea Adami #define LH28F640BF 0x00B0
127a63ec1b7SPavel Machek
1281da177e4SLinus Torvalds /* ST - www.st.com */
129c9856e39SPhilippe De Muyter #define M29F800AB 0x0058
130db5432dbSLadislav Michl #define M29W800DT 0x22D7
131db5432dbSLadislav Michl #define M29W800DB 0x225B
13230d6a24eSGordon Farquharson #define M29W400DT 0x00EE
13330d6a24eSGordon Farquharson #define M29W400DB 0x00EF
1341da177e4SLinus Torvalds #define M29W160DT 0x22C4
1351da177e4SLinus Torvalds #define M29W160DB 0x2249
1361da177e4SLinus Torvalds #define M29W040B 0x00E3
1371da177e4SLinus Torvalds #define M50FW040 0x002C
1381da177e4SLinus Torvalds #define M50FW080 0x002D
1391da177e4SLinus Torvalds #define M50FW016 0x002E
1401da177e4SLinus Torvalds #define M50LPW080 0x002F
141deb1a5f1SNate Case #define M50FLW080A 0x0080
142deb1a5f1SNate Case #define M50FLW080B 0x0081
143e1070211SMike Frysinger #define PSD4256G6V 0x00e9
1441da177e4SLinus Torvalds
1451da177e4SLinus Torvalds /* SST */
1461da177e4SLinus Torvalds #define SST29EE020 0x0010
1471da177e4SLinus Torvalds #define SST29LE020 0x0012
1481da177e4SLinus Torvalds #define SST29EE512 0x005d
1491da177e4SLinus Torvalds #define SST29LE512 0x003d
1501da177e4SLinus Torvalds #define SST39LF800 0x2781
1511da177e4SLinus Torvalds #define SST39LF160 0x2782
15288ec7c50SBen Dooks #define SST39VF1601 0x234b
153bd50a0ffSYegor Yefremov #define SST39VF3201 0x235b
154087acaf1SWolfram Sang #define SST39WF1601 0x274b
155087acaf1SWolfram Sang #define SST39WF1602 0x274a
1561da177e4SLinus Torvalds #define SST39LF512 0x00D4
1571da177e4SLinus Torvalds #define SST39LF010 0x00D5
1581da177e4SLinus Torvalds #define SST39LF020 0x00D6
1591da177e4SLinus Torvalds #define SST39LF040 0x00D7
1601da177e4SLinus Torvalds #define SST39SF010A 0x00B5
1611da177e4SLinus Torvalds #define SST39SF020A 0x00B6
162a0645ce9SMichał Mirosław #define SST39SF040 0x00B7
1631da177e4SLinus Torvalds #define SST49LF004B 0x0060
16489072ef9SRyan Jackson #define SST49LF040B 0x0050
1651da177e4SLinus Torvalds #define SST49LF008A 0x005a
1661da177e4SLinus Torvalds #define SST49LF030A 0x001C
1671da177e4SLinus Torvalds #define SST49LF040A 0x0051
1681da177e4SLinus Torvalds #define SST49LF080A 0x005B
1691b0a062bSAndrei Dolnikov #define SST36VF3203 0x7354
1701da177e4SLinus Torvalds
1711da177e4SLinus Torvalds /* Toshiba */
1721da177e4SLinus Torvalds #define TC58FVT160 0x00C2
1731da177e4SLinus Torvalds #define TC58FVB160 0x0043
1741da177e4SLinus Torvalds #define TC58FVT321 0x009A
1751da177e4SLinus Torvalds #define TC58FVB321 0x009C
1761da177e4SLinus Torvalds #define TC58FVT641 0x0093
1771da177e4SLinus Torvalds #define TC58FVB641 0x0095
1781da177e4SLinus Torvalds
1791da177e4SLinus Torvalds /* Winbond */
1801da177e4SLinus Torvalds #define W49V002A 0x00b0
1811da177e4SLinus Torvalds
1821da177e4SLinus Torvalds
1831da177e4SLinus Torvalds /*
1841da177e4SLinus Torvalds * Unlock address sets for AMD command sets.
1851da177e4SLinus Torvalds * Intel command sets use the MTD_UADDR_UNNECESSARY.
1861da177e4SLinus Torvalds * Each identifier, except MTD_UADDR_UNNECESSARY, and
1871da177e4SLinus Torvalds * MTD_UADDR_NO_SUPPORT must be defined below in unlock_addrs[].
1881da177e4SLinus Torvalds * MTD_UADDR_NOT_SUPPORTED must be 0 so that structure
1891da177e4SLinus Torvalds * initialization need not require initializing all of the
1901da177e4SLinus Torvalds * unlock addresses for all bit widths.
1911da177e4SLinus Torvalds */
1921da177e4SLinus Torvalds enum uaddr {
1931da177e4SLinus Torvalds MTD_UADDR_NOT_SUPPORTED = 0, /* data width not supported */
1941da177e4SLinus Torvalds MTD_UADDR_0x0555_0x02AA,
1951da177e4SLinus Torvalds MTD_UADDR_0x0555_0x0AAA,
1961da177e4SLinus Torvalds MTD_UADDR_0x5555_0x2AAA,
197e1070211SMike Frysinger MTD_UADDR_0x0AAA_0x0554,
1981da177e4SLinus Torvalds MTD_UADDR_0x0AAA_0x0555,
199ca6f12c6SAtsushi Nemoto MTD_UADDR_0xAAAA_0x5555,
2001da177e4SLinus Torvalds MTD_UADDR_DONT_CARE, /* Requires an arbitrary address */
2011da177e4SLinus Torvalds MTD_UADDR_UNNECESSARY, /* Does not require any address */
2021da177e4SLinus Torvalds };
2031da177e4SLinus Torvalds
2041da177e4SLinus Torvalds
2051da177e4SLinus Torvalds struct unlock_addr {
2065d3cce3bSDavid Woodhouse uint32_t addr1;
2075d3cce3bSDavid Woodhouse uint32_t addr2;
2081da177e4SLinus Torvalds };
2091da177e4SLinus Torvalds
2101da177e4SLinus Torvalds
2111da177e4SLinus Torvalds /*
2121da177e4SLinus Torvalds * I don't like the fact that the first entry in unlock_addrs[]
2131da177e4SLinus Torvalds * exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore,
2141da177e4SLinus Torvalds * should not be used. The problem is that structures with
2151da177e4SLinus Torvalds * initializers have extra fields initialized to 0. It is _very_
2163ad2f3fbSDaniel Mack * desirable to have the unlock address entries for unsupported
2171da177e4SLinus Torvalds * data widths automatically initialized - that means that
2181da177e4SLinus Torvalds * MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here
2191da177e4SLinus Torvalds * must go unused.
2201da177e4SLinus Torvalds */
2211da177e4SLinus Torvalds static const struct unlock_addr unlock_addrs[] = {
2221da177e4SLinus Torvalds [MTD_UADDR_NOT_SUPPORTED] = {
2231da177e4SLinus Torvalds .addr1 = 0xffff,
2241da177e4SLinus Torvalds .addr2 = 0xffff
2251da177e4SLinus Torvalds },
2261da177e4SLinus Torvalds
2271da177e4SLinus Torvalds [MTD_UADDR_0x0555_0x02AA] = {
2281da177e4SLinus Torvalds .addr1 = 0x0555,
2291da177e4SLinus Torvalds .addr2 = 0x02aa
2301da177e4SLinus Torvalds },
2311da177e4SLinus Torvalds
2321da177e4SLinus Torvalds [MTD_UADDR_0x0555_0x0AAA] = {
2331da177e4SLinus Torvalds .addr1 = 0x0555,
2341da177e4SLinus Torvalds .addr2 = 0x0aaa
2351da177e4SLinus Torvalds },
2361da177e4SLinus Torvalds
2371da177e4SLinus Torvalds [MTD_UADDR_0x5555_0x2AAA] = {
2381da177e4SLinus Torvalds .addr1 = 0x5555,
2391da177e4SLinus Torvalds .addr2 = 0x2aaa
2401da177e4SLinus Torvalds },
2411da177e4SLinus Torvalds
242e1070211SMike Frysinger [MTD_UADDR_0x0AAA_0x0554] = {
243e1070211SMike Frysinger .addr1 = 0x0AAA,
244e1070211SMike Frysinger .addr2 = 0x0554
245e1070211SMike Frysinger },
246e1070211SMike Frysinger
2471da177e4SLinus Torvalds [MTD_UADDR_0x0AAA_0x0555] = {
2481da177e4SLinus Torvalds .addr1 = 0x0AAA,
2491da177e4SLinus Torvalds .addr2 = 0x0555
2501da177e4SLinus Torvalds },
2511da177e4SLinus Torvalds
252ca6f12c6SAtsushi Nemoto [MTD_UADDR_0xAAAA_0x5555] = {
253ca6f12c6SAtsushi Nemoto .addr1 = 0xaaaa,
254ca6f12c6SAtsushi Nemoto .addr2 = 0x5555
255ca6f12c6SAtsushi Nemoto },
256ca6f12c6SAtsushi Nemoto
2571da177e4SLinus Torvalds [MTD_UADDR_DONT_CARE] = {
2581da177e4SLinus Torvalds .addr1 = 0x0000, /* Doesn't matter which address */
2591da177e4SLinus Torvalds .addr2 = 0x0000 /* is used - must be last entry */
2601da177e4SLinus Torvalds },
2611da177e4SLinus Torvalds
2621da177e4SLinus Torvalds [MTD_UADDR_UNNECESSARY] = {
2631da177e4SLinus Torvalds .addr1 = 0x0000,
2641da177e4SLinus Torvalds .addr2 = 0x0000
2651da177e4SLinus Torvalds }
2661da177e4SLinus Torvalds };
2671da177e4SLinus Torvalds
2681da177e4SLinus Torvalds struct amd_flash_info {
2691da177e4SLinus Torvalds const char *name;
2705d3cce3bSDavid Woodhouse const uint16_t mfr_id;
2715d3cce3bSDavid Woodhouse const uint16_t dev_id;
2725d3cce3bSDavid Woodhouse const uint8_t dev_size;
2735d3cce3bSDavid Woodhouse const uint8_t nr_regions;
2745d3cce3bSDavid Woodhouse const uint16_t cmd_set;
2755d3cce3bSDavid Woodhouse const uint32_t regions[6];
2765d3cce3bSDavid Woodhouse const uint8_t devtypes; /* Bitmask for x8, x16 etc. */
2775d3cce3bSDavid Woodhouse const uint8_t uaddr; /* unlock addrs for 8, 16, 32, 64 */
2781da177e4SLinus Torvalds };
2791da177e4SLinus Torvalds
2801da177e4SLinus Torvalds #define ERASEINFO(size,blocks) (size<<8)|(blocks-1)
2811da177e4SLinus Torvalds
2821da177e4SLinus Torvalds #define SIZE_64KiB 16
2831da177e4SLinus Torvalds #define SIZE_128KiB 17
2841da177e4SLinus Torvalds #define SIZE_256KiB 18
2851da177e4SLinus Torvalds #define SIZE_512KiB 19
2861da177e4SLinus Torvalds #define SIZE_1MiB 20
2871da177e4SLinus Torvalds #define SIZE_2MiB 21
2881da177e4SLinus Torvalds #define SIZE_4MiB 22
2891da177e4SLinus Torvalds #define SIZE_8MiB 23
2901da177e4SLinus Torvalds
2911da177e4SLinus Torvalds
2921da177e4SLinus Torvalds /*
2931da177e4SLinus Torvalds * Please keep this list ordered by manufacturer!
2941da177e4SLinus Torvalds * Fortunately, the list isn't searched often and so a
2951da177e4SLinus Torvalds * slow, linear search isn't so bad.
2961da177e4SLinus Torvalds */
2971da177e4SLinus Torvalds static const struct amd_flash_info jedec_table[] = {
2981da177e4SLinus Torvalds {
299ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3001da177e4SLinus Torvalds .dev_id = AM29F032B,
3011da177e4SLinus Torvalds .name = "AMD AM29F032B",
3025d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
3035d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
3045d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
3055d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3065d3cce3bSDavid Woodhouse .nr_regions = 1,
3071da177e4SLinus Torvalds .regions = {
3081da177e4SLinus Torvalds ERASEINFO(0x10000,64)
3091da177e4SLinus Torvalds }
3101da177e4SLinus Torvalds }, {
311ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3121da177e4SLinus Torvalds .dev_id = AM29LV160DT,
3131da177e4SLinus Torvalds .name = "AMD AM29LV160DT",
3145d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3155d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3165d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
3175d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3185d3cce3bSDavid Woodhouse .nr_regions = 4,
3191da177e4SLinus Torvalds .regions = {
3201da177e4SLinus Torvalds ERASEINFO(0x10000,31),
3211da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3221da177e4SLinus Torvalds ERASEINFO(0x02000,2),
3231da177e4SLinus Torvalds ERASEINFO(0x04000,1)
3241da177e4SLinus Torvalds }
3251da177e4SLinus Torvalds }, {
326ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3271da177e4SLinus Torvalds .dev_id = AM29LV160DB,
3281da177e4SLinus Torvalds .name = "AMD AM29LV160DB",
3295d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3305d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3315d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
3325d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3335d3cce3bSDavid Woodhouse .nr_regions = 4,
3341da177e4SLinus Torvalds .regions = {
3351da177e4SLinus Torvalds ERASEINFO(0x04000,1),
3361da177e4SLinus Torvalds ERASEINFO(0x02000,2),
3371da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3381da177e4SLinus Torvalds ERASEINFO(0x10000,31)
3391da177e4SLinus Torvalds }
3401da177e4SLinus Torvalds }, {
341ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3421da177e4SLinus Torvalds .dev_id = AM29LV400BB,
3431da177e4SLinus Torvalds .name = "AMD AM29LV400BB",
3445d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3455d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3465d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
3475d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3485d3cce3bSDavid Woodhouse .nr_regions = 4,
3491da177e4SLinus Torvalds .regions = {
3501da177e4SLinus Torvalds ERASEINFO(0x04000,1),
3511da177e4SLinus Torvalds ERASEINFO(0x02000,2),
3521da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3531da177e4SLinus Torvalds ERASEINFO(0x10000,7)
3541da177e4SLinus Torvalds }
3551da177e4SLinus Torvalds }, {
356ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3571da177e4SLinus Torvalds .dev_id = AM29LV400BT,
3581da177e4SLinus Torvalds .name = "AMD AM29LV400BT",
3595d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3605d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3615d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
3625d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3635d3cce3bSDavid Woodhouse .nr_regions = 4,
3641da177e4SLinus Torvalds .regions = {
3651da177e4SLinus Torvalds ERASEINFO(0x10000,7),
3661da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3671da177e4SLinus Torvalds ERASEINFO(0x02000,2),
3681da177e4SLinus Torvalds ERASEINFO(0x04000,1)
3691da177e4SLinus Torvalds }
3701da177e4SLinus Torvalds }, {
371ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3721da177e4SLinus Torvalds .dev_id = AM29LV800BB,
3731da177e4SLinus Torvalds .name = "AMD AM29LV800BB",
3745d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3755d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3765d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
3775d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3785d3cce3bSDavid Woodhouse .nr_regions = 4,
3791da177e4SLinus Torvalds .regions = {
3801da177e4SLinus Torvalds ERASEINFO(0x04000,1),
3811da177e4SLinus Torvalds ERASEINFO(0x02000,2),
3821da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3831da177e4SLinus Torvalds ERASEINFO(0x10000,15),
3841da177e4SLinus Torvalds }
3851da177e4SLinus Torvalds }, {
3861da177e4SLinus Torvalds /* add DL */
387ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
3881da177e4SLinus Torvalds .dev_id = AM29DL800BB,
3891da177e4SLinus Torvalds .name = "AMD AM29DL800BB",
3905d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3915d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
3925d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
3935d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
3945d3cce3bSDavid Woodhouse .nr_regions = 6,
3951da177e4SLinus Torvalds .regions = {
3961da177e4SLinus Torvalds ERASEINFO(0x04000,1),
3971da177e4SLinus Torvalds ERASEINFO(0x08000,1),
3981da177e4SLinus Torvalds ERASEINFO(0x02000,4),
3991da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4001da177e4SLinus Torvalds ERASEINFO(0x04000,1),
4011da177e4SLinus Torvalds ERASEINFO(0x10000,14)
4021da177e4SLinus Torvalds }
4031da177e4SLinus Torvalds }, {
404ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4051da177e4SLinus Torvalds .dev_id = AM29DL800BT,
4061da177e4SLinus Torvalds .name = "AMD AM29DL800BT",
4075d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4085d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
4095d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
4105d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4115d3cce3bSDavid Woodhouse .nr_regions = 6,
4121da177e4SLinus Torvalds .regions = {
4131da177e4SLinus Torvalds ERASEINFO(0x10000,14),
4141da177e4SLinus Torvalds ERASEINFO(0x04000,1),
4151da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4161da177e4SLinus Torvalds ERASEINFO(0x02000,4),
4171da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4181da177e4SLinus Torvalds ERASEINFO(0x04000,1)
4191da177e4SLinus Torvalds }
4201da177e4SLinus Torvalds }, {
421ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4221da177e4SLinus Torvalds .dev_id = AM29F800BB,
4231da177e4SLinus Torvalds .name = "AMD AM29F800BB",
4245d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4255d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
4265d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
4275d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4285d3cce3bSDavid Woodhouse .nr_regions = 4,
4291da177e4SLinus Torvalds .regions = {
4301da177e4SLinus Torvalds ERASEINFO(0x04000,1),
4311da177e4SLinus Torvalds ERASEINFO(0x02000,2),
4321da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4331da177e4SLinus Torvalds ERASEINFO(0x10000,15),
4341da177e4SLinus Torvalds }
4351da177e4SLinus Torvalds }, {
436ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4371da177e4SLinus Torvalds .dev_id = AM29LV800BT,
4381da177e4SLinus Torvalds .name = "AMD AM29LV800BT",
4395d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4405d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
4415d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
4425d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4435d3cce3bSDavid Woodhouse .nr_regions = 4,
4441da177e4SLinus Torvalds .regions = {
4451da177e4SLinus Torvalds ERASEINFO(0x10000,15),
4461da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4471da177e4SLinus Torvalds ERASEINFO(0x02000,2),
4481da177e4SLinus Torvalds ERASEINFO(0x04000,1)
4491da177e4SLinus Torvalds }
4501da177e4SLinus Torvalds }, {
451ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4521da177e4SLinus Torvalds .dev_id = AM29F800BT,
4531da177e4SLinus Torvalds .name = "AMD AM29F800BT",
4545d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4555d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
4565d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
4575d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4585d3cce3bSDavid Woodhouse .nr_regions = 4,
4591da177e4SLinus Torvalds .regions = {
4601da177e4SLinus Torvalds ERASEINFO(0x10000,15),
4611da177e4SLinus Torvalds ERASEINFO(0x08000,1),
4621da177e4SLinus Torvalds ERASEINFO(0x02000,2),
4631da177e4SLinus Torvalds ERASEINFO(0x04000,1)
4641da177e4SLinus Torvalds }
4651da177e4SLinus Torvalds }, {
466ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4671da177e4SLinus Torvalds .dev_id = AM29F017D,
4681da177e4SLinus Torvalds .name = "AMD AM29F017D",
4695d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
4705d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_DONT_CARE,
4715d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
4725d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4735d3cce3bSDavid Woodhouse .nr_regions = 1,
4741da177e4SLinus Torvalds .regions = {
4751da177e4SLinus Torvalds ERASEINFO(0x10000,32),
4761da177e4SLinus Torvalds }
4771da177e4SLinus Torvalds }, {
478ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4791da177e4SLinus Torvalds .dev_id = AM29F016D,
4801da177e4SLinus Torvalds .name = "AMD AM29F016D",
4815d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
4825d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
4835d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
4845d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4855d3cce3bSDavid Woodhouse .nr_regions = 1,
4861da177e4SLinus Torvalds .regions = {
4871da177e4SLinus Torvalds ERASEINFO(0x10000,32),
4881da177e4SLinus Torvalds }
4891da177e4SLinus Torvalds }, {
490ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
4911da177e4SLinus Torvalds .dev_id = AM29F080,
4921da177e4SLinus Torvalds .name = "AMD AM29F080",
4935d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
4945d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
4955d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
4965d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
4975d3cce3bSDavid Woodhouse .nr_regions = 1,
4981da177e4SLinus Torvalds .regions = {
4991da177e4SLinus Torvalds ERASEINFO(0x10000,16),
5001da177e4SLinus Torvalds }
5011da177e4SLinus Torvalds }, {
502ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
5031da177e4SLinus Torvalds .dev_id = AM29F040,
5041da177e4SLinus Torvalds .name = "AMD AM29F040",
5055d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
5065d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
5075d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
5085d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
5095d3cce3bSDavid Woodhouse .nr_regions = 1,
5101da177e4SLinus Torvalds .regions = {
5111da177e4SLinus Torvalds ERASEINFO(0x10000,8),
5121da177e4SLinus Torvalds }
5131da177e4SLinus Torvalds }, {
514ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
5151da177e4SLinus Torvalds .dev_id = AM29LV040B,
5161da177e4SLinus Torvalds .name = "AMD AM29LV040B",
5175d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
5185d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
5195d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
5205d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
5215d3cce3bSDavid Woodhouse .nr_regions = 1,
5221da177e4SLinus Torvalds .regions = {
5231da177e4SLinus Torvalds ERASEINFO(0x10000,8),
5241da177e4SLinus Torvalds }
5251da177e4SLinus Torvalds }, {
526ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
5271da177e4SLinus Torvalds .dev_id = AM29F002T,
5281da177e4SLinus Torvalds .name = "AMD AM29F002T",
5295d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
5305d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
5315d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
5325d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
5335d3cce3bSDavid Woodhouse .nr_regions = 4,
5341da177e4SLinus Torvalds .regions = {
5351da177e4SLinus Torvalds ERASEINFO(0x10000,3),
5361da177e4SLinus Torvalds ERASEINFO(0x08000,1),
5371da177e4SLinus Torvalds ERASEINFO(0x02000,2),
5381da177e4SLinus Torvalds ERASEINFO(0x04000,1),
5391da177e4SLinus Torvalds }
5401da177e4SLinus Torvalds }, {
541ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
5428fd310a1SMike Rapoport .dev_id = AM29SL800DT,
5438fd310a1SMike Rapoport .name = "AMD AM29SL800DT",
5448fd310a1SMike Rapoport .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
5458fd310a1SMike Rapoport .uaddr = MTD_UADDR_0x0AAA_0x0555,
5468fd310a1SMike Rapoport .dev_size = SIZE_1MiB,
5478fd310a1SMike Rapoport .cmd_set = P_ID_AMD_STD,
5488fd310a1SMike Rapoport .nr_regions = 4,
5498fd310a1SMike Rapoport .regions = {
5508fd310a1SMike Rapoport ERASEINFO(0x10000,15),
5518fd310a1SMike Rapoport ERASEINFO(0x08000,1),
5528fd310a1SMike Rapoport ERASEINFO(0x02000,2),
5538fd310a1SMike Rapoport ERASEINFO(0x04000,1),
5548fd310a1SMike Rapoport }
5558fd310a1SMike Rapoport }, {
556ae731822SWolfram Sang .mfr_id = CFI_MFR_AMD,
5578fd310a1SMike Rapoport .dev_id = AM29SL800DB,
5588fd310a1SMike Rapoport .name = "AMD AM29SL800DB",
5598fd310a1SMike Rapoport .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
5608fd310a1SMike Rapoport .uaddr = MTD_UADDR_0x0AAA_0x0555,
5618fd310a1SMike Rapoport .dev_size = SIZE_1MiB,
5628fd310a1SMike Rapoport .cmd_set = P_ID_AMD_STD,
5638fd310a1SMike Rapoport .nr_regions = 4,
5648fd310a1SMike Rapoport .regions = {
5658fd310a1SMike Rapoport ERASEINFO(0x04000,1),
5668fd310a1SMike Rapoport ERASEINFO(0x02000,2),
5678fd310a1SMike Rapoport ERASEINFO(0x08000,1),
5688fd310a1SMike Rapoport ERASEINFO(0x10000,15),
5698fd310a1SMike Rapoport }
5708fd310a1SMike Rapoport }, {
571ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
5721da177e4SLinus Torvalds .dev_id = AT49BV512,
5731da177e4SLinus Torvalds .name = "Atmel AT49BV512",
5745d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
5755d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
5765d3cce3bSDavid Woodhouse .dev_size = SIZE_64KiB,
5775d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
5785d3cce3bSDavid Woodhouse .nr_regions = 1,
5791da177e4SLinus Torvalds .regions = {
5801da177e4SLinus Torvalds ERASEINFO(0x10000,1)
5811da177e4SLinus Torvalds }
5821da177e4SLinus Torvalds }, {
583ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
5841da177e4SLinus Torvalds .dev_id = AT29LV512,
5851da177e4SLinus Torvalds .name = "Atmel AT29LV512",
5865d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
5875d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
5885d3cce3bSDavid Woodhouse .dev_size = SIZE_64KiB,
5895d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
5905d3cce3bSDavid Woodhouse .nr_regions = 1,
5911da177e4SLinus Torvalds .regions = {
5921da177e4SLinus Torvalds ERASEINFO(0x80,256),
5931da177e4SLinus Torvalds ERASEINFO(0x80,256)
5941da177e4SLinus Torvalds }
5951da177e4SLinus Torvalds }, {
596ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
5971da177e4SLinus Torvalds .dev_id = AT49BV16X,
5981da177e4SLinus Torvalds .name = "Atmel AT49BV16X",
5995d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
600cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */
6015d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
6025d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
6035d3cce3bSDavid Woodhouse .nr_regions = 2,
6041da177e4SLinus Torvalds .regions = {
6051da177e4SLinus Torvalds ERASEINFO(0x02000,8),
6061da177e4SLinus Torvalds ERASEINFO(0x10000,31)
6071da177e4SLinus Torvalds }
6081da177e4SLinus Torvalds }, {
609ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
6101da177e4SLinus Torvalds .dev_id = AT49BV16XT,
6111da177e4SLinus Torvalds .name = "Atmel AT49BV16XT",
6125d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
613cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */
6145d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
6155d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
6165d3cce3bSDavid Woodhouse .nr_regions = 2,
6171da177e4SLinus Torvalds .regions = {
6181da177e4SLinus Torvalds ERASEINFO(0x10000,31),
6191da177e4SLinus Torvalds ERASEINFO(0x02000,8)
6201da177e4SLinus Torvalds }
6211da177e4SLinus Torvalds }, {
622ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
6231da177e4SLinus Torvalds .dev_id = AT49BV32X,
6241da177e4SLinus Torvalds .name = "Atmel AT49BV32X",
6255d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
626cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */
6275d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
6285d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
6295d3cce3bSDavid Woodhouse .nr_regions = 2,
6301da177e4SLinus Torvalds .regions = {
6311da177e4SLinus Torvalds ERASEINFO(0x02000,8),
6321da177e4SLinus Torvalds ERASEINFO(0x10000,63)
6331da177e4SLinus Torvalds }
6341da177e4SLinus Torvalds }, {
635ae731822SWolfram Sang .mfr_id = CFI_MFR_ATMEL,
6361da177e4SLinus Torvalds .dev_id = AT49BV32XT,
6371da177e4SLinus Torvalds .name = "Atmel AT49BV32XT",
6385d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
639cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */
6405d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
6415d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
6425d3cce3bSDavid Woodhouse .nr_regions = 2,
6431da177e4SLinus Torvalds .regions = {
6441da177e4SLinus Torvalds ERASEINFO(0x10000,63),
6451da177e4SLinus Torvalds ERASEINFO(0x02000,8)
6461da177e4SLinus Torvalds }
6471da177e4SLinus Torvalds }, {
648ae731822SWolfram Sang .mfr_id = CFI_MFR_EON,
649974f2936SLinus Walleij .dev_id = EN29LV400AT,
650974f2936SLinus Walleij .name = "Eon EN29LV400AT",
651974f2936SLinus Walleij .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
652974f2936SLinus Walleij .uaddr = MTD_UADDR_0x0AAA_0x0555,
653974f2936SLinus Walleij .dev_size = SIZE_512KiB,
654974f2936SLinus Walleij .cmd_set = P_ID_AMD_STD,
655974f2936SLinus Walleij .nr_regions = 4,
656974f2936SLinus Walleij .regions = {
657974f2936SLinus Walleij ERASEINFO(0x10000,7),
658974f2936SLinus Walleij ERASEINFO(0x08000,1),
659974f2936SLinus Walleij ERASEINFO(0x02000,2),
660974f2936SLinus Walleij ERASEINFO(0x04000,1),
661974f2936SLinus Walleij }
662974f2936SLinus Walleij }, {
663974f2936SLinus Walleij .mfr_id = CFI_MFR_EON,
664974f2936SLinus Walleij .dev_id = EN29LV400AB,
665974f2936SLinus Walleij .name = "Eon EN29LV400AB",
666974f2936SLinus Walleij .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
667974f2936SLinus Walleij .uaddr = MTD_UADDR_0x0AAA_0x0555,
668974f2936SLinus Walleij .dev_size = SIZE_512KiB,
669974f2936SLinus Walleij .cmd_set = P_ID_AMD_STD,
670974f2936SLinus Walleij .nr_regions = 4,
671974f2936SLinus Walleij .regions = {
672974f2936SLinus Walleij ERASEINFO(0x04000,1),
673974f2936SLinus Walleij ERASEINFO(0x02000,2),
674974f2936SLinus Walleij ERASEINFO(0x08000,1),
675974f2936SLinus Walleij ERASEINFO(0x10000,7),
676974f2936SLinus Walleij }
677974f2936SLinus Walleij }, {
678974f2936SLinus Walleij .mfr_id = CFI_MFR_EON,
6791b0b30acSMike Rapoport .dev_id = EN29SL800BT,
6801b0b30acSMike Rapoport .name = "Eon EN29SL800BT",
6811b0b30acSMike Rapoport .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
6821b0b30acSMike Rapoport .uaddr = MTD_UADDR_0x0AAA_0x0555,
6831b0b30acSMike Rapoport .dev_size = SIZE_1MiB,
6841b0b30acSMike Rapoport .cmd_set = P_ID_AMD_STD,
6851b0b30acSMike Rapoport .nr_regions = 4,
6861b0b30acSMike Rapoport .regions = {
6871b0b30acSMike Rapoport ERASEINFO(0x10000,15),
6881b0b30acSMike Rapoport ERASEINFO(0x08000,1),
6891b0b30acSMike Rapoport ERASEINFO(0x02000,2),
6901b0b30acSMike Rapoport ERASEINFO(0x04000,1),
6911b0b30acSMike Rapoport }
6921b0b30acSMike Rapoport }, {
693ae731822SWolfram Sang .mfr_id = CFI_MFR_EON,
6941b0b30acSMike Rapoport .dev_id = EN29SL800BB,
6951b0b30acSMike Rapoport .name = "Eon EN29SL800BB",
6961b0b30acSMike Rapoport .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
6971b0b30acSMike Rapoport .uaddr = MTD_UADDR_0x0AAA_0x0555,
6981b0b30acSMike Rapoport .dev_size = SIZE_1MiB,
6991b0b30acSMike Rapoport .cmd_set = P_ID_AMD_STD,
7001b0b30acSMike Rapoport .nr_regions = 4,
7011b0b30acSMike Rapoport .regions = {
7021b0b30acSMike Rapoport ERASEINFO(0x04000,1),
7031b0b30acSMike Rapoport ERASEINFO(0x02000,2),
7041b0b30acSMike Rapoport ERASEINFO(0x08000,1),
7051b0b30acSMike Rapoport ERASEINFO(0x10000,15),
7061b0b30acSMike Rapoport }
7071b0b30acSMike Rapoport }, {
708ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7091da177e4SLinus Torvalds .dev_id = MBM29F040C,
7101da177e4SLinus Torvalds .name = "Fujitsu MBM29F040C",
7115d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
7125d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7135d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
7145d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7155d3cce3bSDavid Woodhouse .nr_regions = 1,
7161da177e4SLinus Torvalds .regions = {
7171da177e4SLinus Torvalds ERASEINFO(0x10000,8)
7181da177e4SLinus Torvalds }
7191da177e4SLinus Torvalds }, {
720ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
721c9856e39SPhilippe De Muyter .dev_id = MBM29F800BA,
722c9856e39SPhilippe De Muyter .name = "Fujitsu MBM29F800BA",
7235d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7245d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7255d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
7265d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7275d3cce3bSDavid Woodhouse .nr_regions = 4,
728c9856e39SPhilippe De Muyter .regions = {
729c9856e39SPhilippe De Muyter ERASEINFO(0x04000,1),
730c9856e39SPhilippe De Muyter ERASEINFO(0x02000,2),
731c9856e39SPhilippe De Muyter ERASEINFO(0x08000,1),
732c9856e39SPhilippe De Muyter ERASEINFO(0x10000,15),
733c9856e39SPhilippe De Muyter }
734c9856e39SPhilippe De Muyter }, {
735ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7361da177e4SLinus Torvalds .dev_id = MBM29LV650UE,
7371da177e4SLinus Torvalds .name = "Fujitsu MBM29LV650UE",
7385d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
7395d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_DONT_CARE,
7405d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
7415d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7425d3cce3bSDavid Woodhouse .nr_regions = 1,
7431da177e4SLinus Torvalds .regions = {
7441da177e4SLinus Torvalds ERASEINFO(0x10000,128)
7451da177e4SLinus Torvalds }
7461da177e4SLinus Torvalds }, {
747ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7481da177e4SLinus Torvalds .dev_id = MBM29LV320TE,
7491da177e4SLinus Torvalds .name = "Fujitsu MBM29LV320TE",
7505d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7515d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7525d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
7535d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7545d3cce3bSDavid Woodhouse .nr_regions = 2,
7551da177e4SLinus Torvalds .regions = {
7561da177e4SLinus Torvalds ERASEINFO(0x10000,63),
7571da177e4SLinus Torvalds ERASEINFO(0x02000,8)
7581da177e4SLinus Torvalds }
7591da177e4SLinus Torvalds }, {
760ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7611da177e4SLinus Torvalds .dev_id = MBM29LV320BE,
7621da177e4SLinus Torvalds .name = "Fujitsu MBM29LV320BE",
7635d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7645d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7655d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
7665d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7675d3cce3bSDavid Woodhouse .nr_regions = 2,
7681da177e4SLinus Torvalds .regions = {
7691da177e4SLinus Torvalds ERASEINFO(0x02000,8),
7701da177e4SLinus Torvalds ERASEINFO(0x10000,63)
7711da177e4SLinus Torvalds }
7721da177e4SLinus Torvalds }, {
773ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7741da177e4SLinus Torvalds .dev_id = MBM29LV160TE,
7751da177e4SLinus Torvalds .name = "Fujitsu MBM29LV160TE",
7765d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7775d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7785d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
7795d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7805d3cce3bSDavid Woodhouse .nr_regions = 4,
7811da177e4SLinus Torvalds .regions = {
7821da177e4SLinus Torvalds ERASEINFO(0x10000,31),
7831da177e4SLinus Torvalds ERASEINFO(0x08000,1),
7841da177e4SLinus Torvalds ERASEINFO(0x02000,2),
7851da177e4SLinus Torvalds ERASEINFO(0x04000,1)
7861da177e4SLinus Torvalds }
7871da177e4SLinus Torvalds }, {
788ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
7891da177e4SLinus Torvalds .dev_id = MBM29LV160BE,
7901da177e4SLinus Torvalds .name = "Fujitsu MBM29LV160BE",
7915d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7925d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
7935d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
7945d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
7955d3cce3bSDavid Woodhouse .nr_regions = 4,
7961da177e4SLinus Torvalds .regions = {
7971da177e4SLinus Torvalds ERASEINFO(0x04000,1),
7981da177e4SLinus Torvalds ERASEINFO(0x02000,2),
7991da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8001da177e4SLinus Torvalds ERASEINFO(0x10000,31)
8011da177e4SLinus Torvalds }
8021da177e4SLinus Torvalds }, {
803ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
8041da177e4SLinus Torvalds .dev_id = MBM29LV800BA,
8051da177e4SLinus Torvalds .name = "Fujitsu MBM29LV800BA",
8065d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8075d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
8085d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
8095d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
8105d3cce3bSDavid Woodhouse .nr_regions = 4,
8111da177e4SLinus Torvalds .regions = {
8121da177e4SLinus Torvalds ERASEINFO(0x04000,1),
8131da177e4SLinus Torvalds ERASEINFO(0x02000,2),
8141da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8151da177e4SLinus Torvalds ERASEINFO(0x10000,15)
8161da177e4SLinus Torvalds }
8171da177e4SLinus Torvalds }, {
818ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
8191da177e4SLinus Torvalds .dev_id = MBM29LV800TA,
8201da177e4SLinus Torvalds .name = "Fujitsu MBM29LV800TA",
8215d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8225d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
8235d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
8245d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
8255d3cce3bSDavid Woodhouse .nr_regions = 4,
8261da177e4SLinus Torvalds .regions = {
8271da177e4SLinus Torvalds ERASEINFO(0x10000,15),
8281da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8291da177e4SLinus Torvalds ERASEINFO(0x02000,2),
8301da177e4SLinus Torvalds ERASEINFO(0x04000,1)
8311da177e4SLinus Torvalds }
8321da177e4SLinus Torvalds }, {
833ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
8341da177e4SLinus Torvalds .dev_id = MBM29LV400BC,
8351da177e4SLinus Torvalds .name = "Fujitsu MBM29LV400BC",
8365d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8375d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
8385d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
8395d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
8405d3cce3bSDavid Woodhouse .nr_regions = 4,
8411da177e4SLinus Torvalds .regions = {
8421da177e4SLinus Torvalds ERASEINFO(0x04000,1),
8431da177e4SLinus Torvalds ERASEINFO(0x02000,2),
8441da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8451da177e4SLinus Torvalds ERASEINFO(0x10000,7)
8461da177e4SLinus Torvalds }
8471da177e4SLinus Torvalds }, {
848ae731822SWolfram Sang .mfr_id = CFI_MFR_FUJITSU,
8491da177e4SLinus Torvalds .dev_id = MBM29LV400TC,
8501da177e4SLinus Torvalds .name = "Fujitsu MBM29LV400TC",
8515d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8525d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
8535d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
8545d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
8555d3cce3bSDavid Woodhouse .nr_regions = 4,
8561da177e4SLinus Torvalds .regions = {
8571da177e4SLinus Torvalds ERASEINFO(0x10000,7),
8581da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8591da177e4SLinus Torvalds ERASEINFO(0x02000,2),
8601da177e4SLinus Torvalds ERASEINFO(0x04000,1)
8611da177e4SLinus Torvalds }
8621da177e4SLinus Torvalds }, {
863ae731822SWolfram Sang .mfr_id = CFI_MFR_HYUNDAI,
8641da177e4SLinus Torvalds .dev_id = HY29F002T,
8651da177e4SLinus Torvalds .name = "Hyundai HY29F002T",
8665d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
8675d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
8685d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
8695d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
8705d3cce3bSDavid Woodhouse .nr_regions = 4,
8711da177e4SLinus Torvalds .regions = {
8721da177e4SLinus Torvalds ERASEINFO(0x10000,3),
8731da177e4SLinus Torvalds ERASEINFO(0x08000,1),
8741da177e4SLinus Torvalds ERASEINFO(0x02000,2),
8751da177e4SLinus Torvalds ERASEINFO(0x04000,1),
8761da177e4SLinus Torvalds }
8771da177e4SLinus Torvalds }, {
878ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
8791da177e4SLinus Torvalds .dev_id = I28F004B3B,
8801da177e4SLinus Torvalds .name = "Intel 28F004B3B",
8815d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
8825d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
8835d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
8845d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
8855d3cce3bSDavid Woodhouse .nr_regions = 2,
8861da177e4SLinus Torvalds .regions = {
8871da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
8881da177e4SLinus Torvalds ERASEINFO(0x10000, 7),
8891da177e4SLinus Torvalds }
8901da177e4SLinus Torvalds }, {
891ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
8921da177e4SLinus Torvalds .dev_id = I28F004B3T,
8931da177e4SLinus Torvalds .name = "Intel 28F004B3T",
8945d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
8955d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
8965d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
8975d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
8985d3cce3bSDavid Woodhouse .nr_regions = 2,
8991da177e4SLinus Torvalds .regions = {
9001da177e4SLinus Torvalds ERASEINFO(0x10000, 7),
9011da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
9021da177e4SLinus Torvalds }
9031da177e4SLinus Torvalds }, {
904ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9051da177e4SLinus Torvalds .dev_id = I28F400B3B,
9061da177e4SLinus Torvalds .name = "Intel 28F400B3B",
9075d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
9085d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9095d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
9105d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9115d3cce3bSDavid Woodhouse .nr_regions = 2,
9121da177e4SLinus Torvalds .regions = {
9131da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
9141da177e4SLinus Torvalds ERASEINFO(0x10000, 7),
9151da177e4SLinus Torvalds }
9161da177e4SLinus Torvalds }, {
917ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9181da177e4SLinus Torvalds .dev_id = I28F400B3T,
9191da177e4SLinus Torvalds .name = "Intel 28F400B3T",
9205d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
9215d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9225d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
9235d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9245d3cce3bSDavid Woodhouse .nr_regions = 2,
9251da177e4SLinus Torvalds .regions = {
9261da177e4SLinus Torvalds ERASEINFO(0x10000, 7),
9271da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
9281da177e4SLinus Torvalds }
9291da177e4SLinus Torvalds }, {
930ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9311da177e4SLinus Torvalds .dev_id = I28F008B3B,
9321da177e4SLinus Torvalds .name = "Intel 28F008B3B",
9335d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
9345d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9355d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
9365d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9375d3cce3bSDavid Woodhouse .nr_regions = 2,
9381da177e4SLinus Torvalds .regions = {
9391da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
9401da177e4SLinus Torvalds ERASEINFO(0x10000, 15),
9411da177e4SLinus Torvalds }
9421da177e4SLinus Torvalds }, {
943ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9441da177e4SLinus Torvalds .dev_id = I28F008B3T,
9451da177e4SLinus Torvalds .name = "Intel 28F008B3T",
9465d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
9475d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9485d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
9495d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9505d3cce3bSDavid Woodhouse .nr_regions = 2,
9511da177e4SLinus Torvalds .regions = {
9521da177e4SLinus Torvalds ERASEINFO(0x10000, 15),
9531da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
9541da177e4SLinus Torvalds }
9551da177e4SLinus Torvalds }, {
956ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9571da177e4SLinus Torvalds .dev_id = I28F008S5,
9581da177e4SLinus Torvalds .name = "Intel 28F008S5",
9595d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
9605d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9615d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
9625d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
9635d3cce3bSDavid Woodhouse .nr_regions = 1,
9641da177e4SLinus Torvalds .regions = {
9651da177e4SLinus Torvalds ERASEINFO(0x10000,16),
9661da177e4SLinus Torvalds }
9671da177e4SLinus Torvalds }, {
968ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9691da177e4SLinus Torvalds .dev_id = I28F016S5,
9701da177e4SLinus Torvalds .name = "Intel 28F016S5",
9715d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
9725d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9735d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
9745d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
9755d3cce3bSDavid Woodhouse .nr_regions = 1,
9761da177e4SLinus Torvalds .regions = {
9771da177e4SLinus Torvalds ERASEINFO(0x10000,32),
9781da177e4SLinus Torvalds }
9791da177e4SLinus Torvalds }, {
980ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9811da177e4SLinus Torvalds .dev_id = I28F008SA,
9821da177e4SLinus Torvalds .name = "Intel 28F008SA",
9835d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
9845d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9855d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
9865d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9875d3cce3bSDavid Woodhouse .nr_regions = 1,
9881da177e4SLinus Torvalds .regions = {
9891da177e4SLinus Torvalds ERASEINFO(0x10000, 16),
9901da177e4SLinus Torvalds }
9911da177e4SLinus Torvalds }, {
992ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
9931da177e4SLinus Torvalds .dev_id = I28F800B3B,
9941da177e4SLinus Torvalds .name = "Intel 28F800B3B",
9955d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
9965d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
9975d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
9985d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
9995d3cce3bSDavid Woodhouse .nr_regions = 2,
10001da177e4SLinus Torvalds .regions = {
10011da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10021da177e4SLinus Torvalds ERASEINFO(0x10000, 15),
10031da177e4SLinus Torvalds }
10041da177e4SLinus Torvalds }, {
1005ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10061da177e4SLinus Torvalds .dev_id = I28F800B3T,
10071da177e4SLinus Torvalds .name = "Intel 28F800B3T",
10085d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
10095d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10105d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
10115d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10125d3cce3bSDavid Woodhouse .nr_regions = 2,
10131da177e4SLinus Torvalds .regions = {
10141da177e4SLinus Torvalds ERASEINFO(0x10000, 15),
10151da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10161da177e4SLinus Torvalds }
10171da177e4SLinus Torvalds }, {
1018ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10191da177e4SLinus Torvalds .dev_id = I28F016B3B,
10201da177e4SLinus Torvalds .name = "Intel 28F016B3B",
10215d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
10225d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10235d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
10245d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10255d3cce3bSDavid Woodhouse .nr_regions = 2,
10261da177e4SLinus Torvalds .regions = {
10271da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10281da177e4SLinus Torvalds ERASEINFO(0x10000, 31),
10291da177e4SLinus Torvalds }
10301da177e4SLinus Torvalds }, {
1031ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10321da177e4SLinus Torvalds .dev_id = I28F016S3,
10331da177e4SLinus Torvalds .name = "Intel I28F016S3",
10345d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
10355d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10365d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
10375d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10385d3cce3bSDavid Woodhouse .nr_regions = 1,
10391da177e4SLinus Torvalds .regions = {
10401da177e4SLinus Torvalds ERASEINFO(0x10000, 32),
10411da177e4SLinus Torvalds }
10421da177e4SLinus Torvalds }, {
1043ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10441da177e4SLinus Torvalds .dev_id = I28F016B3T,
10451da177e4SLinus Torvalds .name = "Intel 28F016B3T",
10465d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
10475d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10485d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
10495d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10505d3cce3bSDavid Woodhouse .nr_regions = 2,
10511da177e4SLinus Torvalds .regions = {
10521da177e4SLinus Torvalds ERASEINFO(0x10000, 31),
10531da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10541da177e4SLinus Torvalds }
10551da177e4SLinus Torvalds }, {
1056ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10571da177e4SLinus Torvalds .dev_id = I28F160B3B,
10581da177e4SLinus Torvalds .name = "Intel 28F160B3B",
10595d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
10605d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10615d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
10625d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10635d3cce3bSDavid Woodhouse .nr_regions = 2,
10641da177e4SLinus Torvalds .regions = {
10651da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10661da177e4SLinus Torvalds ERASEINFO(0x10000, 31),
10671da177e4SLinus Torvalds }
10681da177e4SLinus Torvalds }, {
1069ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10701da177e4SLinus Torvalds .dev_id = I28F160B3T,
10711da177e4SLinus Torvalds .name = "Intel 28F160B3T",
10725d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
10735d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10745d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
10755d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10765d3cce3bSDavid Woodhouse .nr_regions = 2,
10771da177e4SLinus Torvalds .regions = {
10781da177e4SLinus Torvalds ERASEINFO(0x10000, 31),
10791da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10801da177e4SLinus Torvalds }
10811da177e4SLinus Torvalds }, {
1082ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10831da177e4SLinus Torvalds .dev_id = I28F320B3B,
10841da177e4SLinus Torvalds .name = "Intel 28F320B3B",
10855d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
10865d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
10875d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
10885d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
10895d3cce3bSDavid Woodhouse .nr_regions = 2,
10901da177e4SLinus Torvalds .regions = {
10911da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
10921da177e4SLinus Torvalds ERASEINFO(0x10000, 63),
10931da177e4SLinus Torvalds }
10941da177e4SLinus Torvalds }, {
1095ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
10961da177e4SLinus Torvalds .dev_id = I28F320B3T,
10971da177e4SLinus Torvalds .name = "Intel 28F320B3T",
10985d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
10995d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
11005d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
11015d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
11025d3cce3bSDavid Woodhouse .nr_regions = 2,
11031da177e4SLinus Torvalds .regions = {
11041da177e4SLinus Torvalds ERASEINFO(0x10000, 63),
11051da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
11061da177e4SLinus Torvalds }
11071da177e4SLinus Torvalds }, {
1108ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
11091da177e4SLinus Torvalds .dev_id = I28F640B3B,
11101da177e4SLinus Torvalds .name = "Intel 28F640B3B",
11115d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
11125d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
11135d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
11145d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
11155d3cce3bSDavid Woodhouse .nr_regions = 2,
11161da177e4SLinus Torvalds .regions = {
11171da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
11181da177e4SLinus Torvalds ERASEINFO(0x10000, 127),
11191da177e4SLinus Torvalds }
11201da177e4SLinus Torvalds }, {
1121ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
11221da177e4SLinus Torvalds .dev_id = I28F640B3T,
11231da177e4SLinus Torvalds .name = "Intel 28F640B3T",
11245d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16,
11255d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
11265d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
11275d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_STD,
11285d3cce3bSDavid Woodhouse .nr_regions = 2,
11291da177e4SLinus Torvalds .regions = {
11301da177e4SLinus Torvalds ERASEINFO(0x10000, 127),
11311da177e4SLinus Torvalds ERASEINFO(0x02000, 8),
11321da177e4SLinus Torvalds }
11331da177e4SLinus Torvalds }, {
1134ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
1135b4c8c8cfSStefan Roese .dev_id = I28F640C3B,
1136b4c8c8cfSStefan Roese .name = "Intel 28F640C3B",
1137b4c8c8cfSStefan Roese .devtypes = CFI_DEVICETYPE_X16,
1138b4c8c8cfSStefan Roese .uaddr = MTD_UADDR_UNNECESSARY,
1139b4c8c8cfSStefan Roese .dev_size = SIZE_8MiB,
1140b4c8c8cfSStefan Roese .cmd_set = P_ID_INTEL_STD,
1141b4c8c8cfSStefan Roese .nr_regions = 2,
1142b4c8c8cfSStefan Roese .regions = {
1143b4c8c8cfSStefan Roese ERASEINFO(0x02000, 8),
1144b4c8c8cfSStefan Roese ERASEINFO(0x10000, 127),
1145b4c8c8cfSStefan Roese }
1146b4c8c8cfSStefan Roese }, {
1147ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
11481da177e4SLinus Torvalds .dev_id = I82802AB,
11491da177e4SLinus Torvalds .name = "Intel 82802AB",
11505d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
11515d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
11525d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
11535d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
11545d3cce3bSDavid Woodhouse .nr_regions = 1,
11551da177e4SLinus Torvalds .regions = {
11561da177e4SLinus Torvalds ERASEINFO(0x10000,8),
11571da177e4SLinus Torvalds }
11581da177e4SLinus Torvalds }, {
1159ae731822SWolfram Sang .mfr_id = CFI_MFR_INTEL,
11601da177e4SLinus Torvalds .dev_id = I82802AC,
11611da177e4SLinus Torvalds .name = "Intel 82802AC",
11625d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
11635d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
11645d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
11655d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
11665d3cce3bSDavid Woodhouse .nr_regions = 1,
11671da177e4SLinus Torvalds .regions = {
11681da177e4SLinus Torvalds ERASEINFO(0x10000,16),
11691da177e4SLinus Torvalds }
11701da177e4SLinus Torvalds }, {
1171ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
11721da177e4SLinus Torvalds .dev_id = MX29LV040C,
11731da177e4SLinus Torvalds .name = "Macronix MX29LV040C",
11745d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
11755d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
11765d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
11775d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
11785d3cce3bSDavid Woodhouse .nr_regions = 1,
11791da177e4SLinus Torvalds .regions = {
11801da177e4SLinus Torvalds ERASEINFO(0x10000,8),
11811da177e4SLinus Torvalds }
11821da177e4SLinus Torvalds }, {
1183ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
11841da177e4SLinus Torvalds .dev_id = MX29LV160T,
11851da177e4SLinus Torvalds .name = "MXIC MX29LV160T",
11865d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
11875d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
11885d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
11895d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
11905d3cce3bSDavid Woodhouse .nr_regions = 4,
11911da177e4SLinus Torvalds .regions = {
11921da177e4SLinus Torvalds ERASEINFO(0x10000,31),
11931da177e4SLinus Torvalds ERASEINFO(0x08000,1),
11941da177e4SLinus Torvalds ERASEINFO(0x02000,2),
11951da177e4SLinus Torvalds ERASEINFO(0x04000,1)
11961da177e4SLinus Torvalds }
11971da177e4SLinus Torvalds }, {
1198ae731822SWolfram Sang .mfr_id = CFI_MFR_NEC,
11991da177e4SLinus Torvalds .dev_id = UPD29F064115,
12001da177e4SLinus Torvalds .name = "NEC uPD29F064115",
12019aff1b1aSHiroshi Ito .devtypes = CFI_DEVICETYPE_X16,
12029aff1b1aSHiroshi Ito .uaddr = MTD_UADDR_0xAAAA_0x5555,
12035d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
12045d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12055d3cce3bSDavid Woodhouse .nr_regions = 3,
12061da177e4SLinus Torvalds .regions = {
12071da177e4SLinus Torvalds ERASEINFO(0x2000,8),
12081da177e4SLinus Torvalds ERASEINFO(0x10000,126),
12091da177e4SLinus Torvalds ERASEINFO(0x2000,8),
12101da177e4SLinus Torvalds }
12111da177e4SLinus Torvalds }, {
1212ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
12131da177e4SLinus Torvalds .dev_id = MX29LV160B,
12141da177e4SLinus Torvalds .name = "MXIC MX29LV160B",
12155d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
12165d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
12175d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
12185d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12195d3cce3bSDavid Woodhouse .nr_regions = 4,
12201da177e4SLinus Torvalds .regions = {
12211da177e4SLinus Torvalds ERASEINFO(0x04000,1),
12221da177e4SLinus Torvalds ERASEINFO(0x02000,2),
12231da177e4SLinus Torvalds ERASEINFO(0x08000,1),
12241da177e4SLinus Torvalds ERASEINFO(0x10000,31)
12251da177e4SLinus Torvalds }
12261da177e4SLinus Torvalds }, {
1227ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
1228c4e6952fSTakashi YOSHI .dev_id = MX29F040,
1229c4e6952fSTakashi YOSHI .name = "Macronix MX29F040",
12305d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
12315d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
12325d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
12335d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12345d3cce3bSDavid Woodhouse .nr_regions = 1,
1235c4e6952fSTakashi YOSHI .regions = {
1236c4e6952fSTakashi YOSHI ERASEINFO(0x10000,8),
1237c4e6952fSTakashi YOSHI }
1238c4e6952fSTakashi YOSHI }, {
1239ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
12401da177e4SLinus Torvalds .dev_id = MX29F016,
12411da177e4SLinus Torvalds .name = "Macronix MX29F016",
12425d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
12435d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
12445d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
12455d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12465d3cce3bSDavid Woodhouse .nr_regions = 1,
12471da177e4SLinus Torvalds .regions = {
12481da177e4SLinus Torvalds ERASEINFO(0x10000,32),
12491da177e4SLinus Torvalds }
12501da177e4SLinus Torvalds }, {
1251ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
12521da177e4SLinus Torvalds .dev_id = MX29F004T,
12531da177e4SLinus Torvalds .name = "Macronix MX29F004T",
12545d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
12555d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
12565d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
12575d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12585d3cce3bSDavid Woodhouse .nr_regions = 4,
12591da177e4SLinus Torvalds .regions = {
12601da177e4SLinus Torvalds ERASEINFO(0x10000,7),
12611da177e4SLinus Torvalds ERASEINFO(0x08000,1),
12621da177e4SLinus Torvalds ERASEINFO(0x02000,2),
12631da177e4SLinus Torvalds ERASEINFO(0x04000,1),
12641da177e4SLinus Torvalds }
12651da177e4SLinus Torvalds }, {
1266ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
12671da177e4SLinus Torvalds .dev_id = MX29F004B,
12681da177e4SLinus Torvalds .name = "Macronix MX29F004B",
12695d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
12705d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
12715d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
12725d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12735d3cce3bSDavid Woodhouse .nr_regions = 4,
12741da177e4SLinus Torvalds .regions = {
12751da177e4SLinus Torvalds ERASEINFO(0x04000,1),
12761da177e4SLinus Torvalds ERASEINFO(0x02000,2),
12771da177e4SLinus Torvalds ERASEINFO(0x08000,1),
12781da177e4SLinus Torvalds ERASEINFO(0x10000,7),
12791da177e4SLinus Torvalds }
12801da177e4SLinus Torvalds }, {
1281ae731822SWolfram Sang .mfr_id = CFI_MFR_MACRONIX,
12821da177e4SLinus Torvalds .dev_id = MX29F002T,
12831da177e4SLinus Torvalds .name = "Macronix MX29F002T",
12845d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
12855d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
12865d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
12875d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
12885d3cce3bSDavid Woodhouse .nr_regions = 4,
12891da177e4SLinus Torvalds .regions = {
12901da177e4SLinus Torvalds ERASEINFO(0x10000,3),
12911da177e4SLinus Torvalds ERASEINFO(0x08000,1),
12921da177e4SLinus Torvalds ERASEINFO(0x02000,2),
12931da177e4SLinus Torvalds ERASEINFO(0x04000,1),
12941da177e4SLinus Torvalds }
12951da177e4SLinus Torvalds }, {
1296ae731822SWolfram Sang .mfr_id = CFI_MFR_PMC,
12971da177e4SLinus Torvalds .dev_id = PM49FL002,
12981da177e4SLinus Torvalds .name = "PMC Pm49FL002",
12995d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13005d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13015d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
13025d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13035d3cce3bSDavid Woodhouse .nr_regions = 1,
13041da177e4SLinus Torvalds .regions = {
13051da177e4SLinus Torvalds ERASEINFO( 0x01000, 64 )
13061da177e4SLinus Torvalds }
13071da177e4SLinus Torvalds }, {
1308ae731822SWolfram Sang .mfr_id = CFI_MFR_PMC,
13091da177e4SLinus Torvalds .dev_id = PM49FL004,
13101da177e4SLinus Torvalds .name = "PMC Pm49FL004",
13115d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13125d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13135d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
13145d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13155d3cce3bSDavid Woodhouse .nr_regions = 1,
13161da177e4SLinus Torvalds .regions = {
13171da177e4SLinus Torvalds ERASEINFO( 0x01000, 128 )
13181da177e4SLinus Torvalds }
13191da177e4SLinus Torvalds }, {
1320ae731822SWolfram Sang .mfr_id = CFI_MFR_PMC,
13211da177e4SLinus Torvalds .dev_id = PM49FL008,
13221da177e4SLinus Torvalds .name = "PMC Pm49FL008",
13235d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13245d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13255d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
13265d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13275d3cce3bSDavid Woodhouse .nr_regions = 1,
13281da177e4SLinus Torvalds .regions = {
13291da177e4SLinus Torvalds ERASEINFO( 0x01000, 256 )
13301da177e4SLinus Torvalds }
13311da177e4SLinus Torvalds }, {
1332ae731822SWolfram Sang .mfr_id = CFI_MFR_SHARP,
1333a63ec1b7SPavel Machek .dev_id = LH28F640BF,
1334a63ec1b7SPavel Machek .name = "LH28F640BF",
1335fe2f4c8eSAndrea Adami .devtypes = CFI_DEVICETYPE_X16,
13365d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
1337fe2f4c8eSAndrea Adami .dev_size = SIZE_8MiB,
1338fe2f4c8eSAndrea Adami .cmd_set = P_ID_INTEL_EXT,
1339fe2f4c8eSAndrea Adami .nr_regions = 2,
1340a63ec1b7SPavel Machek .regions = {
1341fe2f4c8eSAndrea Adami ERASEINFO(0x10000, 127),
1342fe2f4c8eSAndrea Adami ERASEINFO(0x02000, 8),
1343a63ec1b7SPavel Machek }
1344a63ec1b7SPavel Machek }, {
1345ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
13461da177e4SLinus Torvalds .dev_id = SST39LF512,
13471da177e4SLinus Torvalds .name = "SST 39LF512",
13485d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13495d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13505d3cce3bSDavid Woodhouse .dev_size = SIZE_64KiB,
13515d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13525d3cce3bSDavid Woodhouse .nr_regions = 1,
13531da177e4SLinus Torvalds .regions = {
13541da177e4SLinus Torvalds ERASEINFO(0x01000,16),
13551da177e4SLinus Torvalds }
13561da177e4SLinus Torvalds }, {
1357ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
13581da177e4SLinus Torvalds .dev_id = SST39LF010,
13591da177e4SLinus Torvalds .name = "SST 39LF010",
13605d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13615d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13625d3cce3bSDavid Woodhouse .dev_size = SIZE_128KiB,
13635d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13645d3cce3bSDavid Woodhouse .nr_regions = 1,
13651da177e4SLinus Torvalds .regions = {
13661da177e4SLinus Torvalds ERASEINFO(0x01000,32),
13671da177e4SLinus Torvalds }
13681da177e4SLinus Torvalds }, {
1369ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
13701da177e4SLinus Torvalds .dev_id = SST29EE020,
13711da177e4SLinus Torvalds .name = "SST 29EE020",
13725d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13735d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13745d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
13755d3cce3bSDavid Woodhouse .cmd_set = P_ID_SST_PAGE,
13765d3cce3bSDavid Woodhouse .nr_regions = 1,
13771da177e4SLinus Torvalds .regions = {ERASEINFO(0x01000,64),
13781da177e4SLinus Torvalds }
13791da177e4SLinus Torvalds }, {
1380ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
13811da177e4SLinus Torvalds .dev_id = SST29LE020,
13821da177e4SLinus Torvalds .name = "SST 29LE020",
13835d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13845d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13855d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
13865d3cce3bSDavid Woodhouse .cmd_set = P_ID_SST_PAGE,
13875d3cce3bSDavid Woodhouse .nr_regions = 1,
13881da177e4SLinus Torvalds .regions = {ERASEINFO(0x01000,64),
13891da177e4SLinus Torvalds }
13901da177e4SLinus Torvalds }, {
1391ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
13921da177e4SLinus Torvalds .dev_id = SST39LF020,
13931da177e4SLinus Torvalds .name = "SST 39LF020",
13945d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
13955d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
13965d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
13975d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
13985d3cce3bSDavid Woodhouse .nr_regions = 1,
13991da177e4SLinus Torvalds .regions = {
14001da177e4SLinus Torvalds ERASEINFO(0x01000,64),
14011da177e4SLinus Torvalds }
14021da177e4SLinus Torvalds }, {
1403ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14041da177e4SLinus Torvalds .dev_id = SST39LF040,
14051da177e4SLinus Torvalds .name = "SST 39LF040",
14065d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14075d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14085d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
14095d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14105d3cce3bSDavid Woodhouse .nr_regions = 1,
14111da177e4SLinus Torvalds .regions = {
14121da177e4SLinus Torvalds ERASEINFO(0x01000,128),
14131da177e4SLinus Torvalds }
14141da177e4SLinus Torvalds }, {
1415ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14161da177e4SLinus Torvalds .dev_id = SST39SF010A,
14171da177e4SLinus Torvalds .name = "SST 39SF010A",
14185d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14195d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14205d3cce3bSDavid Woodhouse .dev_size = SIZE_128KiB,
14215d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14225d3cce3bSDavid Woodhouse .nr_regions = 1,
14231da177e4SLinus Torvalds .regions = {
14241da177e4SLinus Torvalds ERASEINFO(0x01000,32),
14251da177e4SLinus Torvalds }
14261da177e4SLinus Torvalds }, {
1427ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14281da177e4SLinus Torvalds .dev_id = SST39SF020A,
14291da177e4SLinus Torvalds .name = "SST 39SF020A",
14305d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14315d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14325d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
14335d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14345d3cce3bSDavid Woodhouse .nr_regions = 1,
14351da177e4SLinus Torvalds .regions = {
14361da177e4SLinus Torvalds ERASEINFO(0x01000,64),
14371da177e4SLinus Torvalds }
14381da177e4SLinus Torvalds }, {
1439ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
1440a0645ce9SMichał Mirosław .dev_id = SST39SF040,
1441a0645ce9SMichał Mirosław .name = "SST 39SF040",
1442a0645ce9SMichał Mirosław .devtypes = CFI_DEVICETYPE_X8,
1443a0645ce9SMichał Mirosław .uaddr = MTD_UADDR_0x5555_0x2AAA,
1444a0645ce9SMichał Mirosław .dev_size = SIZE_512KiB,
1445a0645ce9SMichał Mirosław .cmd_set = P_ID_AMD_STD,
1446a0645ce9SMichał Mirosław .nr_regions = 1,
1447a0645ce9SMichał Mirosław .regions = {
1448a0645ce9SMichał Mirosław ERASEINFO(0x01000,128),
1449a0645ce9SMichał Mirosław }
1450a0645ce9SMichał Mirosław }, {
1451ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
145289072ef9SRyan Jackson .dev_id = SST49LF040B,
145389072ef9SRyan Jackson .name = "SST 49LF040B",
14545d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14555d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14565d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
14575d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14585d3cce3bSDavid Woodhouse .nr_regions = 1,
145989072ef9SRyan Jackson .regions = {
146089072ef9SRyan Jackson ERASEINFO(0x01000,128),
146189072ef9SRyan Jackson }
146289072ef9SRyan Jackson }, {
146389072ef9SRyan Jackson
1464ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14651da177e4SLinus Torvalds .dev_id = SST49LF004B,
14661da177e4SLinus Torvalds .name = "SST 49LF004B",
14675d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14685d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14695d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
14705d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14715d3cce3bSDavid Woodhouse .nr_regions = 1,
14721da177e4SLinus Torvalds .regions = {
14731da177e4SLinus Torvalds ERASEINFO(0x01000,128),
14741da177e4SLinus Torvalds }
14751da177e4SLinus Torvalds }, {
1476ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14771da177e4SLinus Torvalds .dev_id = SST49LF008A,
14781da177e4SLinus Torvalds .name = "SST 49LF008A",
14795d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14805d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14815d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
14825d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14835d3cce3bSDavid Woodhouse .nr_regions = 1,
14841da177e4SLinus Torvalds .regions = {
14851da177e4SLinus Torvalds ERASEINFO(0x01000,256),
14861da177e4SLinus Torvalds }
14871da177e4SLinus Torvalds }, {
1488ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
14891da177e4SLinus Torvalds .dev_id = SST49LF030A,
14901da177e4SLinus Torvalds .name = "SST 49LF030A",
14915d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
14925d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
14935d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
14945d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
14955d3cce3bSDavid Woodhouse .nr_regions = 1,
14961da177e4SLinus Torvalds .regions = {
14971da177e4SLinus Torvalds ERASEINFO(0x01000,96),
14981da177e4SLinus Torvalds }
14991da177e4SLinus Torvalds }, {
1500ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
15011da177e4SLinus Torvalds .dev_id = SST49LF040A,
15021da177e4SLinus Torvalds .name = "SST 49LF040A",
15035d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
15045d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
15055d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
15065d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
15075d3cce3bSDavid Woodhouse .nr_regions = 1,
15081da177e4SLinus Torvalds .regions = {
15091da177e4SLinus Torvalds ERASEINFO(0x01000,128),
15101da177e4SLinus Torvalds }
15111da177e4SLinus Torvalds }, {
1512ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
15131da177e4SLinus Torvalds .dev_id = SST49LF080A,
15141da177e4SLinus Torvalds .name = "SST 49LF080A",
15155d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
15165d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
15175d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
15185d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
15195d3cce3bSDavid Woodhouse .nr_regions = 1,
15201da177e4SLinus Torvalds .regions = {
15211da177e4SLinus Torvalds ERASEINFO(0x01000,256),
15221da177e4SLinus Torvalds }
15231da177e4SLinus Torvalds }, {
1524ae731822SWolfram Sang .mfr_id = CFI_MFR_SST, /* should be CFI */
15251da177e4SLinus Torvalds .dev_id = SST39LF160,
15261da177e4SLinus Torvalds .name = "SST 39LF160",
1527ca6f12c6SAtsushi Nemoto .devtypes = CFI_DEVICETYPE_X16,
1528ca6f12c6SAtsushi Nemoto .uaddr = MTD_UADDR_0xAAAA_0x5555,
15295d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
15305d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
15315d3cce3bSDavid Woodhouse .nr_regions = 2,
15321da177e4SLinus Torvalds .regions = {
15331da177e4SLinus Torvalds ERASEINFO(0x1000,256),
15341da177e4SLinus Torvalds ERASEINFO(0x1000,256)
15351da177e4SLinus Torvalds }
153688ec7c50SBen Dooks }, {
1537ae731822SWolfram Sang .mfr_id = CFI_MFR_SST, /* should be CFI */
153888ec7c50SBen Dooks .dev_id = SST39VF1601,
153988ec7c50SBen Dooks .name = "SST 39VF1601",
1540ca6f12c6SAtsushi Nemoto .devtypes = CFI_DEVICETYPE_X16,
1541ca6f12c6SAtsushi Nemoto .uaddr = MTD_UADDR_0xAAAA_0x5555,
15425d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
15435d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
15445d3cce3bSDavid Woodhouse .nr_regions = 2,
154588ec7c50SBen Dooks .regions = {
154688ec7c50SBen Dooks ERASEINFO(0x1000,256),
154788ec7c50SBen Dooks ERASEINFO(0x1000,256)
154888ec7c50SBen Dooks }
15498547e583SDavid Howells }, {
1550087acaf1SWolfram Sang /* CFI is broken: reports AMD_STD, but needs custom uaddr */
1551087acaf1SWolfram Sang .mfr_id = CFI_MFR_SST,
1552087acaf1SWolfram Sang .dev_id = SST39WF1601,
1553087acaf1SWolfram Sang .name = "SST 39WF1601",
1554087acaf1SWolfram Sang .devtypes = CFI_DEVICETYPE_X16,
1555087acaf1SWolfram Sang .uaddr = MTD_UADDR_0xAAAA_0x5555,
1556087acaf1SWolfram Sang .dev_size = SIZE_2MiB,
1557087acaf1SWolfram Sang .cmd_set = P_ID_AMD_STD,
1558087acaf1SWolfram Sang .nr_regions = 2,
1559087acaf1SWolfram Sang .regions = {
1560087acaf1SWolfram Sang ERASEINFO(0x1000,256),
1561087acaf1SWolfram Sang ERASEINFO(0x1000,256)
1562087acaf1SWolfram Sang }
1563087acaf1SWolfram Sang }, {
1564087acaf1SWolfram Sang /* CFI is broken: reports AMD_STD, but needs custom uaddr */
1565087acaf1SWolfram Sang .mfr_id = CFI_MFR_SST,
1566087acaf1SWolfram Sang .dev_id = SST39WF1602,
1567087acaf1SWolfram Sang .name = "SST 39WF1602",
1568087acaf1SWolfram Sang .devtypes = CFI_DEVICETYPE_X16,
1569087acaf1SWolfram Sang .uaddr = MTD_UADDR_0xAAAA_0x5555,
1570087acaf1SWolfram Sang .dev_size = SIZE_2MiB,
1571087acaf1SWolfram Sang .cmd_set = P_ID_AMD_STD,
1572087acaf1SWolfram Sang .nr_regions = 2,
1573087acaf1SWolfram Sang .regions = {
1574087acaf1SWolfram Sang ERASEINFO(0x1000,256),
1575087acaf1SWolfram Sang ERASEINFO(0x1000,256)
1576087acaf1SWolfram Sang }
1577087acaf1SWolfram Sang }, {
1578ae731822SWolfram Sang .mfr_id = CFI_MFR_SST, /* should be CFI */
1579bd50a0ffSYegor Yefremov .dev_id = SST39VF3201,
1580bd50a0ffSYegor Yefremov .name = "SST 39VF3201",
1581bd50a0ffSYegor Yefremov .devtypes = CFI_DEVICETYPE_X16,
1582bd50a0ffSYegor Yefremov .uaddr = MTD_UADDR_0xAAAA_0x5555,
1583bd50a0ffSYegor Yefremov .dev_size = SIZE_4MiB,
1584bd50a0ffSYegor Yefremov .cmd_set = P_ID_AMD_STD,
1585bd50a0ffSYegor Yefremov .nr_regions = 4,
1586bd50a0ffSYegor Yefremov .regions = {
1587bd50a0ffSYegor Yefremov ERASEINFO(0x1000,256),
1588bd50a0ffSYegor Yefremov ERASEINFO(0x1000,256),
1589bd50a0ffSYegor Yefremov ERASEINFO(0x1000,256),
1590bd50a0ffSYegor Yefremov ERASEINFO(0x1000,256)
1591bd50a0ffSYegor Yefremov }
1592bd50a0ffSYegor Yefremov }, {
1593ae731822SWolfram Sang .mfr_id = CFI_MFR_SST,
15941b0a062bSAndrei Dolnikov .dev_id = SST36VF3203,
15951b0a062bSAndrei Dolnikov .name = "SST 36VF3203",
15961b0a062bSAndrei Dolnikov .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
15971b0a062bSAndrei Dolnikov .uaddr = MTD_UADDR_0x0AAA_0x0555,
15981b0a062bSAndrei Dolnikov .dev_size = SIZE_4MiB,
15991b0a062bSAndrei Dolnikov .cmd_set = P_ID_AMD_STD,
16001b0a062bSAndrei Dolnikov .nr_regions = 1,
16011b0a062bSAndrei Dolnikov .regions = {
16021b0a062bSAndrei Dolnikov ERASEINFO(0x10000,64),
16031b0a062bSAndrei Dolnikov }
16041b0a062bSAndrei Dolnikov }, {
1605ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
1606c9856e39SPhilippe De Muyter .dev_id = M29F800AB,
1607c9856e39SPhilippe De Muyter .name = "ST M29F800AB",
16085d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
16095d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
16105d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
16115d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
16125d3cce3bSDavid Woodhouse .nr_regions = 4,
1613c9856e39SPhilippe De Muyter .regions = {
1614c9856e39SPhilippe De Muyter ERASEINFO(0x04000,1),
1615c9856e39SPhilippe De Muyter ERASEINFO(0x02000,2),
1616c9856e39SPhilippe De Muyter ERASEINFO(0x08000,1),
1617c9856e39SPhilippe De Muyter ERASEINFO(0x10000,15),
1618c9856e39SPhilippe De Muyter }
1619c9856e39SPhilippe De Muyter }, {
1620ae731822SWolfram Sang .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */
16211da177e4SLinus Torvalds .dev_id = M29W800DT,
16221da177e4SLinus Torvalds .name = "ST M29W800DT",
16235d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1624db5432dbSLadislav Michl .uaddr = MTD_UADDR_0x0AAA_0x0555,
16255d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
16265d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
16275d3cce3bSDavid Woodhouse .nr_regions = 4,
16281da177e4SLinus Torvalds .regions = {
16291da177e4SLinus Torvalds ERASEINFO(0x10000,15),
16301da177e4SLinus Torvalds ERASEINFO(0x08000,1),
16311da177e4SLinus Torvalds ERASEINFO(0x02000,2),
16321da177e4SLinus Torvalds ERASEINFO(0x04000,1)
16331da177e4SLinus Torvalds }
16341da177e4SLinus Torvalds }, {
1635ae731822SWolfram Sang .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */
16361da177e4SLinus Torvalds .dev_id = M29W800DB,
16371da177e4SLinus Torvalds .name = "ST M29W800DB",
16385d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1639db5432dbSLadislav Michl .uaddr = MTD_UADDR_0x0AAA_0x0555,
16405d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
16415d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
16425d3cce3bSDavid Woodhouse .nr_regions = 4,
16431da177e4SLinus Torvalds .regions = {
16441da177e4SLinus Torvalds ERASEINFO(0x04000,1),
16451da177e4SLinus Torvalds ERASEINFO(0x02000,2),
16461da177e4SLinus Torvalds ERASEINFO(0x08000,1),
16471da177e4SLinus Torvalds ERASEINFO(0x10000,15)
16481da177e4SLinus Torvalds }
16491da177e4SLinus Torvalds }, {
1650ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
165130d6a24eSGordon Farquharson .dev_id = M29W400DT,
165230d6a24eSGordon Farquharson .name = "ST M29W400DT",
165330d6a24eSGordon Farquharson .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
165430d6a24eSGordon Farquharson .uaddr = MTD_UADDR_0x0AAA_0x0555,
165530d6a24eSGordon Farquharson .dev_size = SIZE_512KiB,
165630d6a24eSGordon Farquharson .cmd_set = P_ID_AMD_STD,
165730d6a24eSGordon Farquharson .nr_regions = 4,
165830d6a24eSGordon Farquharson .regions = {
165930d6a24eSGordon Farquharson ERASEINFO(0x04000,7),
166030d6a24eSGordon Farquharson ERASEINFO(0x02000,1),
166130d6a24eSGordon Farquharson ERASEINFO(0x08000,2),
166230d6a24eSGordon Farquharson ERASEINFO(0x10000,1)
166330d6a24eSGordon Farquharson }
166430d6a24eSGordon Farquharson }, {
1665ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
166630d6a24eSGordon Farquharson .dev_id = M29W400DB,
166730d6a24eSGordon Farquharson .name = "ST M29W400DB",
166830d6a24eSGordon Farquharson .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
166930d6a24eSGordon Farquharson .uaddr = MTD_UADDR_0x0AAA_0x0555,
167030d6a24eSGordon Farquharson .dev_size = SIZE_512KiB,
167130d6a24eSGordon Farquharson .cmd_set = P_ID_AMD_STD,
167230d6a24eSGordon Farquharson .nr_regions = 4,
167330d6a24eSGordon Farquharson .regions = {
167430d6a24eSGordon Farquharson ERASEINFO(0x04000,1),
167530d6a24eSGordon Farquharson ERASEINFO(0x02000,2),
167630d6a24eSGordon Farquharson ERASEINFO(0x08000,1),
167730d6a24eSGordon Farquharson ERASEINFO(0x10000,7)
167830d6a24eSGordon Farquharson }
167930d6a24eSGordon Farquharson }, {
1680ae731822SWolfram Sang .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */
16811da177e4SLinus Torvalds .dev_id = M29W160DT,
16821da177e4SLinus Torvalds .name = "ST M29W160DT",
16835d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1684cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA, /* ???? */
16855d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
16865d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
16875d3cce3bSDavid Woodhouse .nr_regions = 4,
16881da177e4SLinus Torvalds .regions = {
16891da177e4SLinus Torvalds ERASEINFO(0x10000,31),
16901da177e4SLinus Torvalds ERASEINFO(0x08000,1),
16911da177e4SLinus Torvalds ERASEINFO(0x02000,2),
16921da177e4SLinus Torvalds ERASEINFO(0x04000,1)
16931da177e4SLinus Torvalds }
16941da177e4SLinus Torvalds }, {
1695ae731822SWolfram Sang .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */
16961da177e4SLinus Torvalds .dev_id = M29W160DB,
16971da177e4SLinus Torvalds .name = "ST M29W160DB",
16985d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1699cec80bf2SDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA, /* ???? */
17005d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
17015d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
17025d3cce3bSDavid Woodhouse .nr_regions = 4,
17031da177e4SLinus Torvalds .regions = {
17041da177e4SLinus Torvalds ERASEINFO(0x04000,1),
17051da177e4SLinus Torvalds ERASEINFO(0x02000,2),
17061da177e4SLinus Torvalds ERASEINFO(0x08000,1),
17071da177e4SLinus Torvalds ERASEINFO(0x10000,31)
17081da177e4SLinus Torvalds }
17091da177e4SLinus Torvalds }, {
1710ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
17111da177e4SLinus Torvalds .dev_id = M29W040B,
17121da177e4SLinus Torvalds .name = "ST M29W040B",
17135d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
17145d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0555_0x02AA,
17155d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
17165d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
17175d3cce3bSDavid Woodhouse .nr_regions = 1,
17181da177e4SLinus Torvalds .regions = {
17191da177e4SLinus Torvalds ERASEINFO(0x10000,8),
17201da177e4SLinus Torvalds }
17211da177e4SLinus Torvalds }, {
1722ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
17231da177e4SLinus Torvalds .dev_id = M50FW040,
17241da177e4SLinus Torvalds .name = "ST M50FW040",
17255d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
17265d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
17275d3cce3bSDavid Woodhouse .dev_size = SIZE_512KiB,
17285d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
17295d3cce3bSDavid Woodhouse .nr_regions = 1,
17301da177e4SLinus Torvalds .regions = {
17311da177e4SLinus Torvalds ERASEINFO(0x10000,8),
17321da177e4SLinus Torvalds }
17331da177e4SLinus Torvalds }, {
1734ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
17351da177e4SLinus Torvalds .dev_id = M50FW080,
17361da177e4SLinus Torvalds .name = "ST M50FW080",
17375d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
17385d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
17395d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
17405d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
17415d3cce3bSDavid Woodhouse .nr_regions = 1,
17421da177e4SLinus Torvalds .regions = {
17431da177e4SLinus Torvalds ERASEINFO(0x10000,16),
17441da177e4SLinus Torvalds }
17451da177e4SLinus Torvalds }, {
1746ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
17471da177e4SLinus Torvalds .dev_id = M50FW016,
17481da177e4SLinus Torvalds .name = "ST M50FW016",
17495d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
17505d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
17515d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
17525d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
17535d3cce3bSDavid Woodhouse .nr_regions = 1,
17541da177e4SLinus Torvalds .regions = {
17551da177e4SLinus Torvalds ERASEINFO(0x10000,32),
17561da177e4SLinus Torvalds }
17571da177e4SLinus Torvalds }, {
1758ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
17591da177e4SLinus Torvalds .dev_id = M50LPW080,
17601da177e4SLinus Torvalds .name = "ST M50LPW080",
17615d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
17625d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_UNNECESSARY,
17635d3cce3bSDavid Woodhouse .dev_size = SIZE_1MiB,
17645d3cce3bSDavid Woodhouse .cmd_set = P_ID_INTEL_EXT,
17655d3cce3bSDavid Woodhouse .nr_regions = 1,
17661da177e4SLinus Torvalds .regions = {
17671da177e4SLinus Torvalds ERASEINFO(0x10000,16),
1768deb1a5f1SNate Case },
1769deb1a5f1SNate Case }, {
1770ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
1771deb1a5f1SNate Case .dev_id = M50FLW080A,
1772deb1a5f1SNate Case .name = "ST M50FLW080A",
1773deb1a5f1SNate Case .devtypes = CFI_DEVICETYPE_X8,
1774deb1a5f1SNate Case .uaddr = MTD_UADDR_UNNECESSARY,
1775deb1a5f1SNate Case .dev_size = SIZE_1MiB,
1776deb1a5f1SNate Case .cmd_set = P_ID_INTEL_EXT,
1777deb1a5f1SNate Case .nr_regions = 4,
1778deb1a5f1SNate Case .regions = {
1779deb1a5f1SNate Case ERASEINFO(0x1000,16),
1780deb1a5f1SNate Case ERASEINFO(0x10000,13),
1781deb1a5f1SNate Case ERASEINFO(0x1000,16),
1782deb1a5f1SNate Case ERASEINFO(0x1000,16),
1783deb1a5f1SNate Case }
1784deb1a5f1SNate Case }, {
1785ae731822SWolfram Sang .mfr_id = CFI_MFR_ST,
1786deb1a5f1SNate Case .dev_id = M50FLW080B,
1787deb1a5f1SNate Case .name = "ST M50FLW080B",
1788deb1a5f1SNate Case .devtypes = CFI_DEVICETYPE_X8,
1789deb1a5f1SNate Case .uaddr = MTD_UADDR_UNNECESSARY,
1790deb1a5f1SNate Case .dev_size = SIZE_1MiB,
1791deb1a5f1SNate Case .cmd_set = P_ID_INTEL_EXT,
1792deb1a5f1SNate Case .nr_regions = 4,
1793deb1a5f1SNate Case .regions = {
1794deb1a5f1SNate Case ERASEINFO(0x1000,16),
1795deb1a5f1SNate Case ERASEINFO(0x1000,16),
1796deb1a5f1SNate Case ERASEINFO(0x10000,13),
1797deb1a5f1SNate Case ERASEINFO(0x1000,16),
17981da177e4SLinus Torvalds }
17991da177e4SLinus Torvalds }, {
1800ae731822SWolfram Sang .mfr_id = 0xff00 | CFI_MFR_ST,
1801e1070211SMike Frysinger .dev_id = 0xff00 | PSD4256G6V,
1802e1070211SMike Frysinger .name = "ST PSD4256G6V",
1803e1070211SMike Frysinger .devtypes = CFI_DEVICETYPE_X16,
1804e1070211SMike Frysinger .uaddr = MTD_UADDR_0x0AAA_0x0554,
1805e1070211SMike Frysinger .dev_size = SIZE_1MiB,
1806e1070211SMike Frysinger .cmd_set = P_ID_AMD_STD,
1807e1070211SMike Frysinger .nr_regions = 1,
1808e1070211SMike Frysinger .regions = {
1809e1070211SMike Frysinger ERASEINFO(0x10000,16),
1810e1070211SMike Frysinger }
1811e1070211SMike Frysinger }, {
1812ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18131da177e4SLinus Torvalds .dev_id = TC58FVT160,
18141da177e4SLinus Torvalds .name = "Toshiba TC58FVT160",
18155d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18165d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18175d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
18185d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18195d3cce3bSDavid Woodhouse .nr_regions = 4,
18201da177e4SLinus Torvalds .regions = {
18211da177e4SLinus Torvalds ERASEINFO(0x10000,31),
18221da177e4SLinus Torvalds ERASEINFO(0x08000,1),
18231da177e4SLinus Torvalds ERASEINFO(0x02000,2),
18241da177e4SLinus Torvalds ERASEINFO(0x04000,1)
18251da177e4SLinus Torvalds }
18261da177e4SLinus Torvalds }, {
1827ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18281da177e4SLinus Torvalds .dev_id = TC58FVB160,
18291da177e4SLinus Torvalds .name = "Toshiba TC58FVB160",
18305d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18315d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18325d3cce3bSDavid Woodhouse .dev_size = SIZE_2MiB,
18335d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18345d3cce3bSDavid Woodhouse .nr_regions = 4,
18351da177e4SLinus Torvalds .regions = {
18361da177e4SLinus Torvalds ERASEINFO(0x04000,1),
18371da177e4SLinus Torvalds ERASEINFO(0x02000,2),
18381da177e4SLinus Torvalds ERASEINFO(0x08000,1),
18391da177e4SLinus Torvalds ERASEINFO(0x10000,31)
18401da177e4SLinus Torvalds }
18411da177e4SLinus Torvalds }, {
1842ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18431da177e4SLinus Torvalds .dev_id = TC58FVB321,
18441da177e4SLinus Torvalds .name = "Toshiba TC58FVB321",
18455d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18465d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18475d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
18485d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18495d3cce3bSDavid Woodhouse .nr_regions = 2,
18501da177e4SLinus Torvalds .regions = {
18511da177e4SLinus Torvalds ERASEINFO(0x02000,8),
18521da177e4SLinus Torvalds ERASEINFO(0x10000,63)
18531da177e4SLinus Torvalds }
18541da177e4SLinus Torvalds }, {
1855ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18561da177e4SLinus Torvalds .dev_id = TC58FVT321,
18571da177e4SLinus Torvalds .name = "Toshiba TC58FVT321",
18585d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18595d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18605d3cce3bSDavid Woodhouse .dev_size = SIZE_4MiB,
18615d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18625d3cce3bSDavid Woodhouse .nr_regions = 2,
18631da177e4SLinus Torvalds .regions = {
18641da177e4SLinus Torvalds ERASEINFO(0x10000,63),
18651da177e4SLinus Torvalds ERASEINFO(0x02000,8)
18661da177e4SLinus Torvalds }
18671da177e4SLinus Torvalds }, {
1868ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18691da177e4SLinus Torvalds .dev_id = TC58FVB641,
18701da177e4SLinus Torvalds .name = "Toshiba TC58FVB641",
18715d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18725d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18735d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
18745d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18755d3cce3bSDavid Woodhouse .nr_regions = 2,
18761da177e4SLinus Torvalds .regions = {
18771da177e4SLinus Torvalds ERASEINFO(0x02000,8),
18781da177e4SLinus Torvalds ERASEINFO(0x10000,127)
18791da177e4SLinus Torvalds }
18801da177e4SLinus Torvalds }, {
1881ae731822SWolfram Sang .mfr_id = CFI_MFR_TOSHIBA,
18821da177e4SLinus Torvalds .dev_id = TC58FVT641,
18831da177e4SLinus Torvalds .name = "Toshiba TC58FVT641",
18845d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18855d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x0AAA_0x0555,
18865d3cce3bSDavid Woodhouse .dev_size = SIZE_8MiB,
18875d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
18885d3cce3bSDavid Woodhouse .nr_regions = 2,
18891da177e4SLinus Torvalds .regions = {
18901da177e4SLinus Torvalds ERASEINFO(0x10000,127),
18911da177e4SLinus Torvalds ERASEINFO(0x02000,8)
18921da177e4SLinus Torvalds }
18931da177e4SLinus Torvalds }, {
1894ae731822SWolfram Sang .mfr_id = CFI_MFR_WINBOND,
18951da177e4SLinus Torvalds .dev_id = W49V002A,
18961da177e4SLinus Torvalds .name = "Winbond W49V002A",
18975d3cce3bSDavid Woodhouse .devtypes = CFI_DEVICETYPE_X8,
18985d3cce3bSDavid Woodhouse .uaddr = MTD_UADDR_0x5555_0x2AAA,
18995d3cce3bSDavid Woodhouse .dev_size = SIZE_256KiB,
19005d3cce3bSDavid Woodhouse .cmd_set = P_ID_AMD_STD,
19015d3cce3bSDavid Woodhouse .nr_regions = 4,
19021da177e4SLinus Torvalds .regions = {
19031da177e4SLinus Torvalds ERASEINFO(0x10000, 3),
19041da177e4SLinus Torvalds ERASEINFO(0x08000, 1),
19051da177e4SLinus Torvalds ERASEINFO(0x02000, 2),
19061da177e4SLinus Torvalds ERASEINFO(0x04000, 1),
19071da177e4SLinus Torvalds }
19081da177e4SLinus Torvalds }
19091da177e4SLinus Torvalds };
19101da177e4SLinus Torvalds
jedec_read_mfr(struct map_info * map,uint32_t base,struct cfi_private * cfi)19115d3cce3bSDavid Woodhouse static inline u32 jedec_read_mfr(struct map_info *map, uint32_t base,
19121da177e4SLinus Torvalds struct cfi_private *cfi)
19131da177e4SLinus Torvalds {
19141da177e4SLinus Torvalds map_word result;
19151da177e4SLinus Torvalds unsigned long mask;
19165c9c11e1SMike Rapoport int bank = 0;
19175c9c11e1SMike Rapoport
19185c9c11e1SMike Rapoport /* According to JEDEC "Standard Manufacturer's Identification Code"
19195c9c11e1SMike Rapoport * (http://www.jedec.org/download/search/jep106W.pdf)
19205c9c11e1SMike Rapoport * several first banks can contain 0x7f instead of actual ID
19215c9c11e1SMike Rapoport */
19225c9c11e1SMike Rapoport do {
1923467622efSEric W. Biederman uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi);
19241da177e4SLinus Torvalds mask = (1 << (cfi->device_type * 8)) - 1;
192587a73eb5SLinus Walleij if (ofs >= map->size)
192687a73eb5SLinus Walleij return 0;
19271da177e4SLinus Torvalds result = map_read(map, base + ofs);
19285c9c11e1SMike Rapoport bank++;
1929ae731822SWolfram Sang } while ((result.x[0] & mask) == CFI_MFR_CONTINUATION);
19305c9c11e1SMike Rapoport
19311da177e4SLinus Torvalds return result.x[0] & mask;
19321da177e4SLinus Torvalds }
19331da177e4SLinus Torvalds
jedec_read_id(struct map_info * map,uint32_t base,struct cfi_private * cfi)19345d3cce3bSDavid Woodhouse static inline u32 jedec_read_id(struct map_info *map, uint32_t base,
19351da177e4SLinus Torvalds struct cfi_private *cfi)
19361da177e4SLinus Torvalds {
19371da177e4SLinus Torvalds map_word result;
19381da177e4SLinus Torvalds unsigned long mask;
1939467622efSEric W. Biederman u32 ofs = cfi_build_cmd_addr(1, map, cfi);
19401da177e4SLinus Torvalds mask = (1 << (cfi->device_type * 8)) -1;
19411da177e4SLinus Torvalds result = map_read(map, base + ofs);
19421da177e4SLinus Torvalds return result.x[0] & mask;
19431da177e4SLinus Torvalds }
19441da177e4SLinus Torvalds
jedec_reset(u32 base,struct map_info * map,struct cfi_private * cfi)194553d88553SIlpo Järvinen static void jedec_reset(u32 base, struct map_info *map, struct cfi_private *cfi)
19461da177e4SLinus Torvalds {
19471da177e4SLinus Torvalds /* Reset */
19481da177e4SLinus Torvalds
19491da177e4SLinus Torvalds /* after checking the datasheets for SST, MACRONIX and ATMEL
19501da177e4SLinus Torvalds * (oh and incidentaly the jedec spec - 3.5.3.3) the reset
19511da177e4SLinus Torvalds * sequence is *supposed* to be 0xaa at 0x5555, 0x55 at
19521da177e4SLinus Torvalds * 0x2aaa, 0xF0 at 0x5555 this will not affect the AMD chips
19537854d3f7SBrian Norris * as they will ignore the writes and don't care what address
19541da177e4SLinus Torvalds * the F0 is written to */
19551da177e4SLinus Torvalds if (cfi->addr_unlock1) {
1956289c0522SBrian Norris pr_debug( "reset unlock called %x %x \n",
19571da177e4SLinus Torvalds cfi->addr_unlock1,cfi->addr_unlock2);
19581da177e4SLinus Torvalds cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
19591da177e4SLinus Torvalds cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
19601da177e4SLinus Torvalds }
19611da177e4SLinus Torvalds
19621da177e4SLinus Torvalds cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
1963cec80bf2SDavid Woodhouse /* Some misdesigned Intel chips do not respond for 0xF0 for a reset,
19641da177e4SLinus Torvalds * so ensure we're in read mode. Send both the Intel and the AMD command
19651da177e4SLinus Torvalds * for this. Intel uses 0xff for this, AMD uses 0xff for NOP, so
19661da177e4SLinus Torvalds * this should be safe.
19671da177e4SLinus Torvalds */
19681da177e4SLinus Torvalds cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL);
19691da177e4SLinus Torvalds /* FIXME - should have reset delay before continuing */
19701da177e4SLinus Torvalds }
19711da177e4SLinus Torvalds
19721da177e4SLinus Torvalds
cfi_jedec_setup(struct map_info * map,struct cfi_private * cfi,int index)1973ceabebb2SAntony Pavlov static int cfi_jedec_setup(struct map_info *map, struct cfi_private *cfi, int index)
19741da177e4SLinus Torvalds {
19751da177e4SLinus Torvalds int i,num_erase_regions;
19765d3cce3bSDavid Woodhouse uint8_t uaddr;
19771da177e4SLinus Torvalds
1978efba2e31SAntony Pavlov if (!(jedec_table[index].devtypes & cfi->device_type)) {
1979289c0522SBrian Norris pr_debug("Rejecting potential %s with incompatible %d-bit device type\n",
1980efba2e31SAntony Pavlov jedec_table[index].name, 4 * (1<<cfi->device_type));
19815d3cce3bSDavid Woodhouse return 0;
19825d3cce3bSDavid Woodhouse }
19831da177e4SLinus Torvalds
19845d3cce3bSDavid Woodhouse printk(KERN_INFO "Found: %s\n",jedec_table[index].name);
19855d3cce3bSDavid Woodhouse
19865d3cce3bSDavid Woodhouse num_erase_regions = jedec_table[index].nr_regions;
19871da177e4SLinus Torvalds
1988efba2e31SAntony Pavlov cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + num_erase_regions * 4, GFP_KERNEL);
1989efba2e31SAntony Pavlov if (!cfi->cfiq) {
19901da177e4SLinus Torvalds //xx printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure\n", map->name);
19911da177e4SLinus Torvalds return 0;
19921da177e4SLinus Torvalds }
19931da177e4SLinus Torvalds
1994efba2e31SAntony Pavlov memset(cfi->cfiq, 0, sizeof(struct cfi_ident));
19951da177e4SLinus Torvalds
1996efba2e31SAntony Pavlov cfi->cfiq->P_ID = jedec_table[index].cmd_set;
1997efba2e31SAntony Pavlov cfi->cfiq->NumEraseRegions = jedec_table[index].nr_regions;
1998efba2e31SAntony Pavlov cfi->cfiq->DevSize = jedec_table[index].dev_size;
1999efba2e31SAntony Pavlov cfi->cfi_mode = CFI_MODE_JEDEC;
2000ceabebb2SAntony Pavlov cfi->sector_erase_cmd = CMD(0x30);
20011da177e4SLinus Torvalds
20021da177e4SLinus Torvalds for (i=0; i<num_erase_regions; i++){
2003efba2e31SAntony Pavlov cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i];
20041da177e4SLinus Torvalds }
2005efba2e31SAntony Pavlov cfi->cmdset_priv = NULL;
20061da177e4SLinus Torvalds
20071da177e4SLinus Torvalds /* This may be redundant for some cases, but it doesn't hurt */
2008efba2e31SAntony Pavlov cfi->mfr = jedec_table[index].mfr_id;
2009efba2e31SAntony Pavlov cfi->id = jedec_table[index].dev_id;
20101da177e4SLinus Torvalds
20115d3cce3bSDavid Woodhouse uaddr = jedec_table[index].uaddr;
20121da177e4SLinus Torvalds
2013cec80bf2SDavid Woodhouse /* The table has unlock addresses in _bytes_, and we try not to let
2014cec80bf2SDavid Woodhouse our brains explode when we see the datasheets talking about address
2015cec80bf2SDavid Woodhouse lines numbered from A-1 to A18. The CFI table has unlock addresses
2016cec80bf2SDavid Woodhouse in device-words according to the mode the device is connected in */
2017efba2e31SAntony Pavlov cfi->addr_unlock1 = unlock_addrs[uaddr].addr1 / cfi->device_type;
2018efba2e31SAntony Pavlov cfi->addr_unlock2 = unlock_addrs[uaddr].addr2 / cfi->device_type;
20191da177e4SLinus Torvalds
20201da177e4SLinus Torvalds return 1; /* ok */
20211da177e4SLinus Torvalds }
20221da177e4SLinus Torvalds
20231da177e4SLinus Torvalds
20241da177e4SLinus Torvalds /*
2025f33686b5SAlexey Dobriyan * There is a BIG problem properly ID'ing the JEDEC device and guaranteeing
20261da177e4SLinus Torvalds * the mapped address, unlock addresses, and proper chip ID. This function
20271da177e4SLinus Torvalds * attempts to minimize errors. It is doubtfull that this probe will ever
20281da177e4SLinus Torvalds * be perfect - consequently there should be some module parameters that
20291da177e4SLinus Torvalds * could be manually specified to force the chip info.
20301da177e4SLinus Torvalds */
jedec_match(uint32_t base,struct map_info * map,struct cfi_private * cfi,const struct amd_flash_info * finfo)20315d3cce3bSDavid Woodhouse static inline int jedec_match( uint32_t base,
20321da177e4SLinus Torvalds struct map_info *map,
20331da177e4SLinus Torvalds struct cfi_private *cfi,
20341da177e4SLinus Torvalds const struct amd_flash_info *finfo )
20351da177e4SLinus Torvalds {
20361da177e4SLinus Torvalds int rc = 0; /* failure until all tests pass */
20371da177e4SLinus Torvalds u32 mfr, id;
20385d3cce3bSDavid Woodhouse uint8_t uaddr;
20391da177e4SLinus Torvalds
20401da177e4SLinus Torvalds /*
20411da177e4SLinus Torvalds * The IDs must match. For X16 and X32 devices operating in
20421da177e4SLinus Torvalds * a lower width ( X8 or X16 ), the device ID's are usually just
20431da177e4SLinus Torvalds * the lower byte(s) of the larger device ID for wider mode. If
20441da177e4SLinus Torvalds * a part is found that doesn't fit this assumption (device id for
20451da177e4SLinus Torvalds * smaller width mode is completely unrealated to full-width mode)
20461da177e4SLinus Torvalds * then the jedec_table[] will have to be augmented with the IDs
20471da177e4SLinus Torvalds * for different widths.
20481da177e4SLinus Torvalds */
20491da177e4SLinus Torvalds switch (cfi->device_type) {
20501da177e4SLinus Torvalds case CFI_DEVICETYPE_X8:
20515d3cce3bSDavid Woodhouse mfr = (uint8_t)finfo->mfr_id;
20525d3cce3bSDavid Woodhouse id = (uint8_t)finfo->dev_id;
2053011b2a36SBen Dooks
2054011b2a36SBen Dooks /* bjd: it seems that if we do this, we can end up
2055011b2a36SBen Dooks * detecting 16bit flashes as an 8bit device, even though
2056011b2a36SBen Dooks * there aren't.
2057011b2a36SBen Dooks */
2058011b2a36SBen Dooks if (finfo->dev_id > 0xff) {
2059289c0522SBrian Norris pr_debug("%s(): ID is not 8bit\n",
2060011b2a36SBen Dooks __func__);
2061011b2a36SBen Dooks goto match_done;
2062011b2a36SBen Dooks }
20631da177e4SLinus Torvalds break;
20641da177e4SLinus Torvalds case CFI_DEVICETYPE_X16:
20655d3cce3bSDavid Woodhouse mfr = (uint16_t)finfo->mfr_id;
20665d3cce3bSDavid Woodhouse id = (uint16_t)finfo->dev_id;
20671da177e4SLinus Torvalds break;
20681da177e4SLinus Torvalds case CFI_DEVICETYPE_X32:
20695d3cce3bSDavid Woodhouse mfr = (uint16_t)finfo->mfr_id;
20705d3cce3bSDavid Woodhouse id = (uint32_t)finfo->dev_id;
20711da177e4SLinus Torvalds break;
20721da177e4SLinus Torvalds default:
20731da177e4SLinus Torvalds printk(KERN_WARNING
20741da177e4SLinus Torvalds "MTD %s(): Unsupported device type %d\n",
20751da177e4SLinus Torvalds __func__, cfi->device_type);
20761da177e4SLinus Torvalds goto match_done;
20771da177e4SLinus Torvalds }
20781da177e4SLinus Torvalds if ( cfi->mfr != mfr || cfi->id != id ) {
20791da177e4SLinus Torvalds goto match_done;
20801da177e4SLinus Torvalds }
20811da177e4SLinus Torvalds
20821da177e4SLinus Torvalds /* the part size must fit in the memory window */
2083289c0522SBrian Norris pr_debug("MTD %s(): Check fit 0x%.8x + 0x%.8x = 0x%.8x\n",
20845d3cce3bSDavid Woodhouse __func__, base, 1 << finfo->dev_size, base + (1 << finfo->dev_size) );
20855d3cce3bSDavid Woodhouse if ( base + cfi_interleave(cfi) * ( 1 << finfo->dev_size ) > map->size ) {
2086289c0522SBrian Norris pr_debug("MTD %s(): 0x%.4x 0x%.4x %dKiB doesn't fit\n",
20871da177e4SLinus Torvalds __func__, finfo->mfr_id, finfo->dev_id,
20885d3cce3bSDavid Woodhouse 1 << finfo->dev_size );
20891da177e4SLinus Torvalds goto match_done;
20901da177e4SLinus Torvalds }
20911da177e4SLinus Torvalds
20925d3cce3bSDavid Woodhouse if (! (finfo->devtypes & cfi->device_type))
20931da177e4SLinus Torvalds goto match_done;
20945d3cce3bSDavid Woodhouse
20955d3cce3bSDavid Woodhouse uaddr = finfo->uaddr;
20961da177e4SLinus Torvalds
2097289c0522SBrian Norris pr_debug("MTD %s(): check unlock addrs 0x%.4x 0x%.4x\n",
20981da177e4SLinus Torvalds __func__, cfi->addr_unlock1, cfi->addr_unlock2 );
20991da177e4SLinus Torvalds if ( MTD_UADDR_UNNECESSARY != uaddr && MTD_UADDR_DONT_CARE != uaddr
2100cec80bf2SDavid Woodhouse && ( unlock_addrs[uaddr].addr1 / cfi->device_type != cfi->addr_unlock1 ||
2101cec80bf2SDavid Woodhouse unlock_addrs[uaddr].addr2 / cfi->device_type != cfi->addr_unlock2 ) ) {
2102289c0522SBrian Norris pr_debug("MTD %s(): 0x%.4x 0x%.4x did not match\n",
21031da177e4SLinus Torvalds __func__,
21041da177e4SLinus Torvalds unlock_addrs[uaddr].addr1,
21051da177e4SLinus Torvalds unlock_addrs[uaddr].addr2);
21061da177e4SLinus Torvalds goto match_done;
21071da177e4SLinus Torvalds }
21081da177e4SLinus Torvalds
21091da177e4SLinus Torvalds /*
211025985edcSLucas De Marchi * Make sure the ID's disappear when the device is taken out of
21111da177e4SLinus Torvalds * ID mode. The only time this should fail when it should succeed
21121da177e4SLinus Torvalds * is when the ID's are written as data to the same
21131da177e4SLinus Torvalds * addresses. For this rare and unfortunate case the chip
21141da177e4SLinus Torvalds * cannot be probed correctly.
21151da177e4SLinus Torvalds * FIXME - write a driver that takes all of the chip info as
21161da177e4SLinus Torvalds * module parameters, doesn't probe but forces a load.
21171da177e4SLinus Torvalds */
2118289c0522SBrian Norris pr_debug("MTD %s(): check ID's disappear when not in ID mode\n",
21191da177e4SLinus Torvalds __func__ );
21201da177e4SLinus Torvalds jedec_reset( base, map, cfi );
21211da177e4SLinus Torvalds mfr = jedec_read_mfr( map, base, cfi );
21221da177e4SLinus Torvalds id = jedec_read_id( map, base, cfi );
21231da177e4SLinus Torvalds if ( mfr == cfi->mfr && id == cfi->id ) {
2124289c0522SBrian Norris pr_debug("MTD %s(): ID 0x%.2x:0x%.2x did not change after reset:\n"
21251da177e4SLinus Torvalds "You might need to manually specify JEDEC parameters.\n",
21261da177e4SLinus Torvalds __func__, cfi->mfr, cfi->id );
21271da177e4SLinus Torvalds goto match_done;
21281da177e4SLinus Torvalds }
21291da177e4SLinus Torvalds
21301da177e4SLinus Torvalds /* all tests passed - mark as success */
21311da177e4SLinus Torvalds rc = 1;
21321da177e4SLinus Torvalds
21331da177e4SLinus Torvalds /*
21341da177e4SLinus Torvalds * Put the device back in ID mode - only need to do this if we
21351da177e4SLinus Torvalds * were truly frobbing a real device.
21361da177e4SLinus Torvalds */
2137289c0522SBrian Norris pr_debug("MTD %s(): return to ID mode\n", __func__ );
21381da177e4SLinus Torvalds if (cfi->addr_unlock1) {
21391da177e4SLinus Torvalds cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21401da177e4SLinus Torvalds cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
21411da177e4SLinus Torvalds }
21421da177e4SLinus Torvalds cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21431da177e4SLinus Torvalds /* FIXME - should have a delay before continuing */
21441da177e4SLinus Torvalds
21451da177e4SLinus Torvalds match_done:
21461da177e4SLinus Torvalds return rc;
21471da177e4SLinus Torvalds }
21481da177e4SLinus Torvalds
21491da177e4SLinus Torvalds
jedec_probe_chip(struct map_info * map,__u32 base,unsigned long * chip_map,struct cfi_private * cfi)21501da177e4SLinus Torvalds static int jedec_probe_chip(struct map_info *map, __u32 base,
21511da177e4SLinus Torvalds unsigned long *chip_map, struct cfi_private *cfi)
21521da177e4SLinus Torvalds {
21531da177e4SLinus Torvalds int i;
21541da177e4SLinus Torvalds enum uaddr uaddr_idx = MTD_UADDR_NOT_SUPPORTED;
21551da177e4SLinus Torvalds u32 probe_offset1, probe_offset2;
21561da177e4SLinus Torvalds
21571da177e4SLinus Torvalds retry:
21581da177e4SLinus Torvalds if (!cfi->numchips) {
21591da177e4SLinus Torvalds uaddr_idx++;
21601da177e4SLinus Torvalds
21611da177e4SLinus Torvalds if (MTD_UADDR_UNNECESSARY == uaddr_idx)
21621da177e4SLinus Torvalds return 0;
21631da177e4SLinus Torvalds
2164cec80bf2SDavid Woodhouse cfi->addr_unlock1 = unlock_addrs[uaddr_idx].addr1 / cfi->device_type;
2165cec80bf2SDavid Woodhouse cfi->addr_unlock2 = unlock_addrs[uaddr_idx].addr2 / cfi->device_type;
21661da177e4SLinus Torvalds }
21671da177e4SLinus Torvalds
21681da177e4SLinus Torvalds /* Make certain we aren't probing past the end of map */
21691da177e4SLinus Torvalds if (base >= map->size) {
21701da177e4SLinus Torvalds printk(KERN_NOTICE
21711da177e4SLinus Torvalds "Probe at base(0x%08x) past the end of the map(0x%08lx)\n",
21721da177e4SLinus Torvalds base, map->size -1);
21731da177e4SLinus Torvalds return 0;
21741da177e4SLinus Torvalds
21751da177e4SLinus Torvalds }
21761da177e4SLinus Torvalds /* Ensure the unlock addresses we try stay inside the map */
2177467622efSEric W. Biederman probe_offset1 = cfi_build_cmd_addr(cfi->addr_unlock1, map, cfi);
2178467622efSEric W. Biederman probe_offset2 = cfi_build_cmd_addr(cfi->addr_unlock2, map, cfi);
21791da177e4SLinus Torvalds if ( ((base + probe_offset1 + map_bankwidth(map)) >= map->size) ||
21801da177e4SLinus Torvalds ((base + probe_offset2 + map_bankwidth(map)) >= map->size))
21811da177e4SLinus Torvalds goto retry;
21821da177e4SLinus Torvalds
21831da177e4SLinus Torvalds /* Reset */
21841da177e4SLinus Torvalds jedec_reset(base, map, cfi);
21851da177e4SLinus Torvalds
21861da177e4SLinus Torvalds /* Autoselect Mode */
21871da177e4SLinus Torvalds if(cfi->addr_unlock1) {
21881da177e4SLinus Torvalds cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21891da177e4SLinus Torvalds cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
21901da177e4SLinus Torvalds }
21911da177e4SLinus Torvalds cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21921da177e4SLinus Torvalds /* FIXME - should have a delay before continuing */
21931da177e4SLinus Torvalds
21941da177e4SLinus Torvalds if (!cfi->numchips) {
21951da177e4SLinus Torvalds /* This is the first time we're called. Set up the CFI
21961da177e4SLinus Torvalds stuff accordingly and return */
21971da177e4SLinus Torvalds
21981da177e4SLinus Torvalds cfi->mfr = jedec_read_mfr(map, base, cfi);
21991da177e4SLinus Torvalds cfi->id = jedec_read_id(map, base, cfi);
2200289c0522SBrian Norris pr_debug("Search for id:(%02x %02x) interleave(%d) type(%d)\n",
22011da177e4SLinus Torvalds cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type);
220287d10f3cSTobias Klauser for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {
22031da177e4SLinus Torvalds if ( jedec_match( base, map, cfi, &jedec_table[i] ) ) {
2204289c0522SBrian Norris pr_debug("MTD %s(): matched device 0x%x,0x%x unlock_addrs: 0x%.4x 0x%.4x\n",
22051da177e4SLinus Torvalds __func__, cfi->mfr, cfi->id,
22061da177e4SLinus Torvalds cfi->addr_unlock1, cfi->addr_unlock2 );
2207ceabebb2SAntony Pavlov if (!cfi_jedec_setup(map, cfi, i))
22081da177e4SLinus Torvalds return 0;
22091da177e4SLinus Torvalds goto ok_out;
22101da177e4SLinus Torvalds }
22111da177e4SLinus Torvalds }
22121da177e4SLinus Torvalds goto retry;
22131da177e4SLinus Torvalds } else {
22145d3cce3bSDavid Woodhouse uint16_t mfr;
22155d3cce3bSDavid Woodhouse uint16_t id;
22161da177e4SLinus Torvalds
22171da177e4SLinus Torvalds /* Make sure it is a chip of the same manufacturer and id */
22181da177e4SLinus Torvalds mfr = jedec_read_mfr(map, base, cfi);
22191da177e4SLinus Torvalds id = jedec_read_id(map, base, cfi);
22201da177e4SLinus Torvalds
22211da177e4SLinus Torvalds if ((mfr != cfi->mfr) || (id != cfi->id)) {
22221da177e4SLinus Torvalds printk(KERN_DEBUG "%s: Found different chip or no chip at all (mfr 0x%x, id 0x%x) at 0x%x\n",
22231da177e4SLinus Torvalds map->name, mfr, id, base);
22241da177e4SLinus Torvalds jedec_reset(base, map, cfi);
22251da177e4SLinus Torvalds return 0;
22261da177e4SLinus Torvalds }
22271da177e4SLinus Torvalds }
22281da177e4SLinus Torvalds
22291da177e4SLinus Torvalds /* Check each previous chip locations to see if it's an alias */
22301da177e4SLinus Torvalds for (i=0; i < (base >> cfi->chipshift); i++) {
22311da177e4SLinus Torvalds unsigned long start;
22321da177e4SLinus Torvalds if(!test_bit(i, chip_map)) {
22331da177e4SLinus Torvalds continue; /* Skip location; no valid chip at this address */
22341da177e4SLinus Torvalds }
22351da177e4SLinus Torvalds start = i << cfi->chipshift;
22361da177e4SLinus Torvalds if (jedec_read_mfr(map, start, cfi) == cfi->mfr &&
22371da177e4SLinus Torvalds jedec_read_id(map, start, cfi) == cfi->id) {
22381da177e4SLinus Torvalds /* Eep. This chip also looks like it's in autoselect mode.
22391da177e4SLinus Torvalds Is it an alias for the new one? */
22401da177e4SLinus Torvalds jedec_reset(start, map, cfi);
22411da177e4SLinus Torvalds
22421da177e4SLinus Torvalds /* If the device IDs go away, it's an alias */
22431da177e4SLinus Torvalds if (jedec_read_mfr(map, base, cfi) != cfi->mfr ||
22441da177e4SLinus Torvalds jedec_read_id(map, base, cfi) != cfi->id) {
22451da177e4SLinus Torvalds printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
22461da177e4SLinus Torvalds map->name, base, start);
22471da177e4SLinus Torvalds return 0;
22481da177e4SLinus Torvalds }
22491da177e4SLinus Torvalds
22501da177e4SLinus Torvalds /* Yes, it's actually got the device IDs as data. Most
22511da177e4SLinus Torvalds * unfortunate. Stick the new chip in read mode
22521da177e4SLinus Torvalds * too and if it's the same, assume it's an alias. */
22531da177e4SLinus Torvalds /* FIXME: Use other modes to do a proper check */
22541da177e4SLinus Torvalds jedec_reset(base, map, cfi);
22551da177e4SLinus Torvalds if (jedec_read_mfr(map, base, cfi) == cfi->mfr &&
22561da177e4SLinus Torvalds jedec_read_id(map, base, cfi) == cfi->id) {
22571da177e4SLinus Torvalds printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
22581da177e4SLinus Torvalds map->name, base, start);
22591da177e4SLinus Torvalds return 0;
22601da177e4SLinus Torvalds }
22611da177e4SLinus Torvalds }
22621da177e4SLinus Torvalds }
22631da177e4SLinus Torvalds
22641da177e4SLinus Torvalds /* OK, if we got to here, then none of the previous chips appear to
22651da177e4SLinus Torvalds be aliases for the current one. */
22661da177e4SLinus Torvalds set_bit((base >> cfi->chipshift), chip_map); /* Update chip map */
22671da177e4SLinus Torvalds cfi->numchips++;
22681da177e4SLinus Torvalds
22691da177e4SLinus Torvalds ok_out:
22701da177e4SLinus Torvalds /* Put it back into Read Mode */
22711da177e4SLinus Torvalds jedec_reset(base, map, cfi);
22721da177e4SLinus Torvalds
22731da177e4SLinus Torvalds printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n",
22741da177e4SLinus Torvalds map->name, cfi_interleave(cfi), cfi->device_type*8, base,
22751da177e4SLinus Torvalds map->bankwidth*8);
22761da177e4SLinus Torvalds
22771da177e4SLinus Torvalds return 1;
22781da177e4SLinus Torvalds }
22791da177e4SLinus Torvalds
22801da177e4SLinus Torvalds static struct chip_probe jedec_chip_probe = {
22811da177e4SLinus Torvalds .name = "JEDEC",
22821da177e4SLinus Torvalds .probe_chip = jedec_probe_chip
22831da177e4SLinus Torvalds };
22841da177e4SLinus Torvalds
jedec_probe(struct map_info * map)22851da177e4SLinus Torvalds static struct mtd_info *jedec_probe(struct map_info *map)
22861da177e4SLinus Torvalds {
22871da177e4SLinus Torvalds /*
22881da177e4SLinus Torvalds * Just use the generic probe stuff to call our CFI-specific
22891da177e4SLinus Torvalds * chip_probe routine in all the possible permutations, etc.
22901da177e4SLinus Torvalds */
22911da177e4SLinus Torvalds return mtd_do_chip_probe(map, &jedec_chip_probe);
22921da177e4SLinus Torvalds }
22931da177e4SLinus Torvalds
22941da177e4SLinus Torvalds static struct mtd_chip_driver jedec_chipdrv = {
22951da177e4SLinus Torvalds .probe = jedec_probe,
22961da177e4SLinus Torvalds .name = "jedec_probe",
22971da177e4SLinus Torvalds .module = THIS_MODULE
22981da177e4SLinus Torvalds };
22991da177e4SLinus Torvalds
jedec_probe_init(void)23001da177e4SLinus Torvalds static int __init jedec_probe_init(void)
23011da177e4SLinus Torvalds {
23021da177e4SLinus Torvalds register_mtd_chip_driver(&jedec_chipdrv);
23031da177e4SLinus Torvalds return 0;
23041da177e4SLinus Torvalds }
23051da177e4SLinus Torvalds
jedec_probe_exit(void)23061da177e4SLinus Torvalds static void __exit jedec_probe_exit(void)
23071da177e4SLinus Torvalds {
23081da177e4SLinus Torvalds unregister_mtd_chip_driver(&jedec_chipdrv);
23091da177e4SLinus Torvalds }
23101da177e4SLinus Torvalds
23111da177e4SLinus Torvalds module_init(jedec_probe_init);
23121da177e4SLinus Torvalds module_exit(jedec_probe_exit);
23131da177e4SLinus Torvalds
23141da177e4SLinus Torvalds MODULE_LICENSE("GPL");
23151da177e4SLinus Torvalds MODULE_AUTHOR("Erwin Authried <eauth@softsys.co.at> et al.");
23161da177e4SLinus Torvalds MODULE_DESCRIPTION("Probe code for JEDEC-compliant flash chips");
2317