xref: /linux/drivers/mtd/chips/jedec_probe.c (revision c1144d29f405ce1f4e6ede6482beb3d0d09750c6)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds    Common Flash Interface probe code.
31da177e4SLinus Torvalds    (C) 2000 Red Hat. GPL'd.
41da177e4SLinus Torvalds    See JEDEC (http://www.jedec.org/) standard JESD21C (section 3.5)
51da177e4SLinus Torvalds    for the standard this probe goes back to.
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds    Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com
81da177e4SLinus Torvalds */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include <linux/module.h>
111da177e4SLinus Torvalds #include <linux/init.h>
121da177e4SLinus Torvalds #include <linux/types.h>
131da177e4SLinus Torvalds #include <linux/kernel.h>
141da177e4SLinus Torvalds #include <asm/io.h>
151da177e4SLinus Torvalds #include <asm/byteorder.h>
161da177e4SLinus Torvalds #include <linux/errno.h>
171da177e4SLinus Torvalds #include <linux/slab.h>
181da177e4SLinus Torvalds #include <linux/interrupt.h>
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds #include <linux/mtd/mtd.h>
211da177e4SLinus Torvalds #include <linux/mtd/map.h>
221da177e4SLinus Torvalds #include <linux/mtd/cfi.h>
231da177e4SLinus Torvalds #include <linux/mtd/gen_probe.h>
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds /* AMD */
264a22442fSJerry Hicks #define AM29DL800BB	0x22CB
271da177e4SLinus Torvalds #define AM29DL800BT	0x224A
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #define AM29F800BB	0x2258
301da177e4SLinus Torvalds #define AM29F800BT	0x22D6
311da177e4SLinus Torvalds #define AM29LV400BB	0x22BA
321da177e4SLinus Torvalds #define AM29LV400BT	0x22B9
331da177e4SLinus Torvalds #define AM29LV800BB	0x225B
341da177e4SLinus Torvalds #define AM29LV800BT	0x22DA
351da177e4SLinus Torvalds #define AM29LV160DT	0x22C4
361da177e4SLinus Torvalds #define AM29LV160DB	0x2249
371da177e4SLinus Torvalds #define AM29F017D	0x003D
381da177e4SLinus Torvalds #define AM29F016D	0x00AD
391da177e4SLinus Torvalds #define AM29F080	0x00D5
401da177e4SLinus Torvalds #define AM29F040	0x00A4
411da177e4SLinus Torvalds #define AM29LV040B	0x004F
421da177e4SLinus Torvalds #define AM29F032B	0x0041
431da177e4SLinus Torvalds #define AM29F002T	0x00B0
448fd310a1SMike Rapoport #define AM29SL800DB	0x226B
458fd310a1SMike Rapoport #define AM29SL800DT	0x22EA
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds /* Atmel */
481da177e4SLinus Torvalds #define AT49BV512	0x0003
491da177e4SLinus Torvalds #define AT29LV512	0x003d
501da177e4SLinus Torvalds #define AT49BV16X	0x00C0
511da177e4SLinus Torvalds #define AT49BV16XT	0x00C2
521da177e4SLinus Torvalds #define AT49BV32X	0x00C8
531da177e4SLinus Torvalds #define AT49BV32XT	0x00C9
541da177e4SLinus Torvalds 
551b0b30acSMike Rapoport /* Eon */
56974f2936SLinus Walleij #define EN29LV400AT	0x22B9
57974f2936SLinus Walleij #define EN29LV400AB	0x22BA
581b0b30acSMike Rapoport #define EN29SL800BB	0x226B
591b0b30acSMike Rapoport #define EN29SL800BT	0x22EA
601b0b30acSMike Rapoport 
611da177e4SLinus Torvalds /* Fujitsu */
621da177e4SLinus Torvalds #define MBM29F040C	0x00A4
63c9856e39SPhilippe De Muyter #define MBM29F800BA	0x2258
641da177e4SLinus Torvalds #define MBM29LV650UE	0x22D7
651da177e4SLinus Torvalds #define MBM29LV320TE	0x22F6
661da177e4SLinus Torvalds #define MBM29LV320BE	0x22F9
671da177e4SLinus Torvalds #define MBM29LV160TE	0x22C4
681da177e4SLinus Torvalds #define MBM29LV160BE	0x2249
691da177e4SLinus Torvalds #define MBM29LV800BA	0x225B
701da177e4SLinus Torvalds #define MBM29LV800TA	0x22DA
711da177e4SLinus Torvalds #define MBM29LV400TC	0x22B9
721da177e4SLinus Torvalds #define MBM29LV400BC	0x22BA
731da177e4SLinus Torvalds 
741da177e4SLinus Torvalds /* Hyundai */
751da177e4SLinus Torvalds #define HY29F002T	0x00B0
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds /* Intel */
781da177e4SLinus Torvalds #define I28F004B3T	0x00d4
791da177e4SLinus Torvalds #define I28F004B3B	0x00d5
801da177e4SLinus Torvalds #define I28F400B3T	0x8894
811da177e4SLinus Torvalds #define I28F400B3B	0x8895
821da177e4SLinus Torvalds #define I28F008S5	0x00a6
831da177e4SLinus Torvalds #define I28F016S5	0x00a0
841da177e4SLinus Torvalds #define I28F008SA	0x00a2
851da177e4SLinus Torvalds #define I28F008B3T	0x00d2
861da177e4SLinus Torvalds #define I28F008B3B	0x00d3
871da177e4SLinus Torvalds #define I28F800B3T	0x8892
881da177e4SLinus Torvalds #define I28F800B3B	0x8893
891da177e4SLinus Torvalds #define I28F016S3	0x00aa
901da177e4SLinus Torvalds #define I28F016B3T	0x00d0
911da177e4SLinus Torvalds #define I28F016B3B	0x00d1
921da177e4SLinus Torvalds #define I28F160B3T	0x8890
931da177e4SLinus Torvalds #define I28F160B3B	0x8891
941da177e4SLinus Torvalds #define I28F320B3T	0x8896
951da177e4SLinus Torvalds #define I28F320B3B	0x8897
961da177e4SLinus Torvalds #define I28F640B3T	0x8898
971da177e4SLinus Torvalds #define I28F640B3B	0x8899
98b4c8c8cfSStefan Roese #define I28F640C3B	0x88CD
99b4c8c8cfSStefan Roese #define I28F160F3T	0x88F3
100b4c8c8cfSStefan Roese #define I28F160F3B	0x88F4
101b4c8c8cfSStefan Roese #define I28F160C3T	0x88C2
102b4c8c8cfSStefan Roese #define I28F160C3B	0x88C3
1031da177e4SLinus Torvalds #define I82802AB	0x00ad
1041da177e4SLinus Torvalds #define I82802AC	0x00ac
1051da177e4SLinus Torvalds 
1061da177e4SLinus Torvalds /* Macronix */
1071da177e4SLinus Torvalds #define MX29LV040C	0x004F
1081da177e4SLinus Torvalds #define MX29LV160T	0x22C4
1091da177e4SLinus Torvalds #define MX29LV160B	0x2249
110c4e6952fSTakashi YOSHI #define MX29F040	0x00A4
1111da177e4SLinus Torvalds #define MX29F016	0x00AD
1121da177e4SLinus Torvalds #define MX29F002T	0x00B0
1131da177e4SLinus Torvalds #define MX29F004T	0x0045
1141da177e4SLinus Torvalds #define MX29F004B	0x0046
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds /* NEC */
1171da177e4SLinus Torvalds #define UPD29F064115	0x221C
1181da177e4SLinus Torvalds 
1191da177e4SLinus Torvalds /* PMC */
1201da177e4SLinus Torvalds #define PM49FL002	0x006D
1211da177e4SLinus Torvalds #define PM49FL004	0x006E
1221da177e4SLinus Torvalds #define PM49FL008	0x006A
1231da177e4SLinus Torvalds 
124a63ec1b7SPavel Machek /* Sharp */
125fe2f4c8eSAndrea Adami #define LH28F640BF	0x00B0
126a63ec1b7SPavel Machek 
1271da177e4SLinus Torvalds /* ST - www.st.com */
128c9856e39SPhilippe De Muyter #define M29F800AB	0x0058
129db5432dbSLadislav Michl #define M29W800DT	0x22D7
130db5432dbSLadislav Michl #define M29W800DB	0x225B
13130d6a24eSGordon Farquharson #define M29W400DT	0x00EE
13230d6a24eSGordon Farquharson #define M29W400DB	0x00EF
1331da177e4SLinus Torvalds #define M29W160DT	0x22C4
1341da177e4SLinus Torvalds #define M29W160DB	0x2249
1351da177e4SLinus Torvalds #define M29W040B	0x00E3
1361da177e4SLinus Torvalds #define M50FW040	0x002C
1371da177e4SLinus Torvalds #define M50FW080	0x002D
1381da177e4SLinus Torvalds #define M50FW016	0x002E
1391da177e4SLinus Torvalds #define M50LPW080       0x002F
140deb1a5f1SNate Case #define M50FLW080A	0x0080
141deb1a5f1SNate Case #define M50FLW080B	0x0081
142e1070211SMike Frysinger #define PSD4256G6V	0x00e9
1431da177e4SLinus Torvalds 
1441da177e4SLinus Torvalds /* SST */
1451da177e4SLinus Torvalds #define SST29EE020	0x0010
1461da177e4SLinus Torvalds #define SST29LE020	0x0012
1471da177e4SLinus Torvalds #define SST29EE512	0x005d
1481da177e4SLinus Torvalds #define SST29LE512	0x003d
1491da177e4SLinus Torvalds #define SST39LF800	0x2781
1501da177e4SLinus Torvalds #define SST39LF160	0x2782
15188ec7c50SBen Dooks #define SST39VF1601	0x234b
152bd50a0ffSYegor Yefremov #define SST39VF3201	0x235b
153087acaf1SWolfram Sang #define SST39WF1601	0x274b
154087acaf1SWolfram Sang #define SST39WF1602	0x274a
1551da177e4SLinus Torvalds #define SST39LF512	0x00D4
1561da177e4SLinus Torvalds #define SST39LF010	0x00D5
1571da177e4SLinus Torvalds #define SST39LF020	0x00D6
1581da177e4SLinus Torvalds #define SST39LF040	0x00D7
1591da177e4SLinus Torvalds #define SST39SF010A	0x00B5
1601da177e4SLinus Torvalds #define SST39SF020A	0x00B6
161a0645ce9SMichał Mirosław #define SST39SF040	0x00B7
1621da177e4SLinus Torvalds #define SST49LF004B	0x0060
16389072ef9SRyan Jackson #define SST49LF040B	0x0050
1641da177e4SLinus Torvalds #define SST49LF008A	0x005a
1651da177e4SLinus Torvalds #define SST49LF030A	0x001C
1661da177e4SLinus Torvalds #define SST49LF040A	0x0051
1671da177e4SLinus Torvalds #define SST49LF080A	0x005B
1681b0a062bSAndrei Dolnikov #define SST36VF3203	0x7354
1691da177e4SLinus Torvalds 
1701da177e4SLinus Torvalds /* Toshiba */
1711da177e4SLinus Torvalds #define TC58FVT160	0x00C2
1721da177e4SLinus Torvalds #define TC58FVB160	0x0043
1731da177e4SLinus Torvalds #define TC58FVT321	0x009A
1741da177e4SLinus Torvalds #define TC58FVB321	0x009C
1751da177e4SLinus Torvalds #define TC58FVT641	0x0093
1761da177e4SLinus Torvalds #define TC58FVB641	0x0095
1771da177e4SLinus Torvalds 
1781da177e4SLinus Torvalds /* Winbond */
1791da177e4SLinus Torvalds #define W49V002A	0x00b0
1801da177e4SLinus Torvalds 
1811da177e4SLinus Torvalds 
1821da177e4SLinus Torvalds /*
1831da177e4SLinus Torvalds  * Unlock address sets for AMD command sets.
1841da177e4SLinus Torvalds  * Intel command sets use the MTD_UADDR_UNNECESSARY.
1851da177e4SLinus Torvalds  * Each identifier, except MTD_UADDR_UNNECESSARY, and
1861da177e4SLinus Torvalds  * MTD_UADDR_NO_SUPPORT must be defined below in unlock_addrs[].
1871da177e4SLinus Torvalds  * MTD_UADDR_NOT_SUPPORTED must be 0 so that structure
1881da177e4SLinus Torvalds  * initialization need not require initializing all of the
1891da177e4SLinus Torvalds  * unlock addresses for all bit widths.
1901da177e4SLinus Torvalds  */
1911da177e4SLinus Torvalds enum uaddr {
1921da177e4SLinus Torvalds 	MTD_UADDR_NOT_SUPPORTED = 0,	/* data width not supported */
1931da177e4SLinus Torvalds 	MTD_UADDR_0x0555_0x02AA,
1941da177e4SLinus Torvalds 	MTD_UADDR_0x0555_0x0AAA,
1951da177e4SLinus Torvalds 	MTD_UADDR_0x5555_0x2AAA,
196e1070211SMike Frysinger 	MTD_UADDR_0x0AAA_0x0554,
1971da177e4SLinus Torvalds 	MTD_UADDR_0x0AAA_0x0555,
198ca6f12c6SAtsushi Nemoto 	MTD_UADDR_0xAAAA_0x5555,
1991da177e4SLinus Torvalds 	MTD_UADDR_DONT_CARE,		/* Requires an arbitrary address */
2001da177e4SLinus Torvalds 	MTD_UADDR_UNNECESSARY,		/* Does not require any address */
2011da177e4SLinus Torvalds };
2021da177e4SLinus Torvalds 
2031da177e4SLinus Torvalds 
2041da177e4SLinus Torvalds struct unlock_addr {
2055d3cce3bSDavid Woodhouse 	uint32_t addr1;
2065d3cce3bSDavid Woodhouse 	uint32_t addr2;
2071da177e4SLinus Torvalds };
2081da177e4SLinus Torvalds 
2091da177e4SLinus Torvalds 
2101da177e4SLinus Torvalds /*
2111da177e4SLinus Torvalds  * I don't like the fact that the first entry in unlock_addrs[]
2121da177e4SLinus Torvalds  * exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore,
2131da177e4SLinus Torvalds  * should not be used.  The  problem is that structures with
2141da177e4SLinus Torvalds  * initializers have extra fields initialized to 0.  It is _very_
2153ad2f3fbSDaniel Mack  * desirable to have the unlock address entries for unsupported
2161da177e4SLinus Torvalds  * data widths automatically initialized - that means that
2171da177e4SLinus Torvalds  * MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here
2181da177e4SLinus Torvalds  * must go unused.
2191da177e4SLinus Torvalds  */
2201da177e4SLinus Torvalds static const struct unlock_addr  unlock_addrs[] = {
2211da177e4SLinus Torvalds 	[MTD_UADDR_NOT_SUPPORTED] = {
2221da177e4SLinus Torvalds 		.addr1 = 0xffff,
2231da177e4SLinus Torvalds 		.addr2 = 0xffff
2241da177e4SLinus Torvalds 	},
2251da177e4SLinus Torvalds 
2261da177e4SLinus Torvalds 	[MTD_UADDR_0x0555_0x02AA] = {
2271da177e4SLinus Torvalds 		.addr1 = 0x0555,
2281da177e4SLinus Torvalds 		.addr2 = 0x02aa
2291da177e4SLinus Torvalds 	},
2301da177e4SLinus Torvalds 
2311da177e4SLinus Torvalds 	[MTD_UADDR_0x0555_0x0AAA] = {
2321da177e4SLinus Torvalds 		.addr1 = 0x0555,
2331da177e4SLinus Torvalds 		.addr2 = 0x0aaa
2341da177e4SLinus Torvalds 	},
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds 	[MTD_UADDR_0x5555_0x2AAA] = {
2371da177e4SLinus Torvalds 		.addr1 = 0x5555,
2381da177e4SLinus Torvalds 		.addr2 = 0x2aaa
2391da177e4SLinus Torvalds 	},
2401da177e4SLinus Torvalds 
241e1070211SMike Frysinger 	[MTD_UADDR_0x0AAA_0x0554] = {
242e1070211SMike Frysinger 		.addr1 = 0x0AAA,
243e1070211SMike Frysinger 		.addr2 = 0x0554
244e1070211SMike Frysinger 	},
245e1070211SMike Frysinger 
2461da177e4SLinus Torvalds 	[MTD_UADDR_0x0AAA_0x0555] = {
2471da177e4SLinus Torvalds 		.addr1 = 0x0AAA,
2481da177e4SLinus Torvalds 		.addr2 = 0x0555
2491da177e4SLinus Torvalds 	},
2501da177e4SLinus Torvalds 
251ca6f12c6SAtsushi Nemoto 	[MTD_UADDR_0xAAAA_0x5555] = {
252ca6f12c6SAtsushi Nemoto 		.addr1 = 0xaaaa,
253ca6f12c6SAtsushi Nemoto 		.addr2 = 0x5555
254ca6f12c6SAtsushi Nemoto 	},
255ca6f12c6SAtsushi Nemoto 
2561da177e4SLinus Torvalds 	[MTD_UADDR_DONT_CARE] = {
2571da177e4SLinus Torvalds 		.addr1 = 0x0000,      /* Doesn't matter which address */
2581da177e4SLinus Torvalds 		.addr2 = 0x0000       /* is used - must be last entry */
2591da177e4SLinus Torvalds 	},
2601da177e4SLinus Torvalds 
2611da177e4SLinus Torvalds 	[MTD_UADDR_UNNECESSARY] = {
2621da177e4SLinus Torvalds 		.addr1 = 0x0000,
2631da177e4SLinus Torvalds 		.addr2 = 0x0000
2641da177e4SLinus Torvalds 	}
2651da177e4SLinus Torvalds };
2661da177e4SLinus Torvalds 
2671da177e4SLinus Torvalds struct amd_flash_info {
2681da177e4SLinus Torvalds 	const char *name;
2695d3cce3bSDavid Woodhouse 	const uint16_t mfr_id;
2705d3cce3bSDavid Woodhouse 	const uint16_t dev_id;
2715d3cce3bSDavid Woodhouse 	const uint8_t dev_size;
2725d3cce3bSDavid Woodhouse 	const uint8_t nr_regions;
2735d3cce3bSDavid Woodhouse 	const uint16_t cmd_set;
2745d3cce3bSDavid Woodhouse 	const uint32_t regions[6];
2755d3cce3bSDavid Woodhouse 	const uint8_t devtypes;		/* Bitmask for x8, x16 etc. */
2765d3cce3bSDavid Woodhouse 	const uint8_t uaddr;		/* unlock addrs for 8, 16, 32, 64 */
2771da177e4SLinus Torvalds };
2781da177e4SLinus Torvalds 
2791da177e4SLinus Torvalds #define ERASEINFO(size,blocks) (size<<8)|(blocks-1)
2801da177e4SLinus Torvalds 
2811da177e4SLinus Torvalds #define SIZE_64KiB  16
2821da177e4SLinus Torvalds #define SIZE_128KiB 17
2831da177e4SLinus Torvalds #define SIZE_256KiB 18
2841da177e4SLinus Torvalds #define SIZE_512KiB 19
2851da177e4SLinus Torvalds #define SIZE_1MiB   20
2861da177e4SLinus Torvalds #define SIZE_2MiB   21
2871da177e4SLinus Torvalds #define SIZE_4MiB   22
2881da177e4SLinus Torvalds #define SIZE_8MiB   23
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds 
2911da177e4SLinus Torvalds /*
2921da177e4SLinus Torvalds  * Please keep this list ordered by manufacturer!
2931da177e4SLinus Torvalds  * Fortunately, the list isn't searched often and so a
2941da177e4SLinus Torvalds  * slow, linear search isn't so bad.
2951da177e4SLinus Torvalds  */
2961da177e4SLinus Torvalds static const struct amd_flash_info jedec_table[] = {
2971da177e4SLinus Torvalds 	{
298ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
2991da177e4SLinus Torvalds 		.dev_id		= AM29F032B,
3001da177e4SLinus Torvalds 		.name		= "AMD AM29F032B",
3015d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
3025d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
3035d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
3045d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3055d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
3061da177e4SLinus Torvalds 		.regions	= {
3071da177e4SLinus Torvalds 			ERASEINFO(0x10000,64)
3081da177e4SLinus Torvalds 		}
3091da177e4SLinus Torvalds 	}, {
310ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3111da177e4SLinus Torvalds 		.dev_id		= AM29LV160DT,
3121da177e4SLinus Torvalds 		.name		= "AMD AM29LV160DT",
3135d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3145d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3155d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
3165d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3175d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
3181da177e4SLinus Torvalds 		.regions	= {
3191da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
3201da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3211da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
3221da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
3231da177e4SLinus Torvalds 		}
3241da177e4SLinus Torvalds 	}, {
325ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3261da177e4SLinus Torvalds 		.dev_id		= AM29LV160DB,
3271da177e4SLinus Torvalds 		.name		= "AMD AM29LV160DB",
3285d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3295d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3305d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
3315d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3325d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
3331da177e4SLinus Torvalds 		.regions	= {
3341da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
3351da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
3361da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3371da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
3381da177e4SLinus Torvalds 		}
3391da177e4SLinus Torvalds 	}, {
340ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3411da177e4SLinus Torvalds 		.dev_id		= AM29LV400BB,
3421da177e4SLinus Torvalds 		.name		= "AMD AM29LV400BB",
3435d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3445d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3455d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
3465d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3475d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
3481da177e4SLinus Torvalds 		.regions	= {
3491da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
3501da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
3511da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3521da177e4SLinus Torvalds 			ERASEINFO(0x10000,7)
3531da177e4SLinus Torvalds 		}
3541da177e4SLinus Torvalds 	}, {
355ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3561da177e4SLinus Torvalds 		.dev_id		= AM29LV400BT,
3571da177e4SLinus Torvalds 		.name		= "AMD AM29LV400BT",
3585d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3595d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3605d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
3615d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3625d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
3631da177e4SLinus Torvalds 		.regions	= {
3641da177e4SLinus Torvalds 			ERASEINFO(0x10000,7),
3651da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3661da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
3671da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
3681da177e4SLinus Torvalds 		}
3691da177e4SLinus Torvalds 	}, {
370ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3711da177e4SLinus Torvalds 		.dev_id		= AM29LV800BB,
3721da177e4SLinus Torvalds 		.name		= "AMD AM29LV800BB",
3735d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3745d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3755d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
3765d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3775d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
3781da177e4SLinus Torvalds 		.regions	= {
3791da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
3801da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
3811da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3821da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
3831da177e4SLinus Torvalds 		}
3841da177e4SLinus Torvalds 	}, {
3851da177e4SLinus Torvalds /* add DL */
386ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
3871da177e4SLinus Torvalds 		.dev_id		= AM29DL800BB,
3881da177e4SLinus Torvalds 		.name		= "AMD AM29DL800BB",
3895d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
3905d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
3915d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
3925d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
3935d3cce3bSDavid Woodhouse 		.nr_regions	= 6,
3941da177e4SLinus Torvalds 		.regions	= {
3951da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
3961da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3971da177e4SLinus Torvalds 			ERASEINFO(0x02000,4),
3981da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
3991da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
4001da177e4SLinus Torvalds 			ERASEINFO(0x10000,14)
4011da177e4SLinus Torvalds 		}
4021da177e4SLinus Torvalds 	}, {
403ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4041da177e4SLinus Torvalds 		.dev_id		= AM29DL800BT,
4051da177e4SLinus Torvalds 		.name		= "AMD AM29DL800BT",
4065d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4075d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
4085d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
4095d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4105d3cce3bSDavid Woodhouse 		.nr_regions	= 6,
4111da177e4SLinus Torvalds 		.regions	= {
4121da177e4SLinus Torvalds 			ERASEINFO(0x10000,14),
4131da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
4141da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
4151da177e4SLinus Torvalds 			ERASEINFO(0x02000,4),
4161da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
4171da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
4181da177e4SLinus Torvalds 		}
4191da177e4SLinus Torvalds 	}, {
420ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4211da177e4SLinus Torvalds 		.dev_id		= AM29F800BB,
4221da177e4SLinus Torvalds 		.name		= "AMD AM29F800BB",
4235d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4245d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
4255d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
4265d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4275d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
4281da177e4SLinus Torvalds 		.regions	= {
4291da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
4301da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
4311da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
4321da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
4331da177e4SLinus Torvalds 		}
4341da177e4SLinus Torvalds 	}, {
435ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4361da177e4SLinus Torvalds 		.dev_id		= AM29LV800BT,
4371da177e4SLinus Torvalds 		.name		= "AMD AM29LV800BT",
4385d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4395d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
4405d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
4415d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4425d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
4431da177e4SLinus Torvalds 		.regions	= {
4441da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
4451da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
4461da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
4471da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
4481da177e4SLinus Torvalds 		}
4491da177e4SLinus Torvalds 	}, {
450ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4511da177e4SLinus Torvalds 		.dev_id		= AM29F800BT,
4521da177e4SLinus Torvalds 		.name		= "AMD AM29F800BT",
4535d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
4545d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
4555d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
4565d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4575d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
4581da177e4SLinus Torvalds 		.regions	= {
4591da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
4601da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
4611da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
4621da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
4631da177e4SLinus Torvalds 		}
4641da177e4SLinus Torvalds 	}, {
465ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4661da177e4SLinus Torvalds 		.dev_id		= AM29F017D,
4671da177e4SLinus Torvalds 		.name		= "AMD AM29F017D",
4685d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
4695d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_DONT_CARE,
4705d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
4715d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4725d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
4731da177e4SLinus Torvalds 		.regions	= {
4741da177e4SLinus Torvalds 			ERASEINFO(0x10000,32),
4751da177e4SLinus Torvalds 		}
4761da177e4SLinus Torvalds 	}, {
477ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4781da177e4SLinus Torvalds 		.dev_id		= AM29F016D,
4791da177e4SLinus Torvalds 		.name		= "AMD AM29F016D",
4805d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
4815d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
4825d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
4835d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4845d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
4851da177e4SLinus Torvalds 		.regions	= {
4861da177e4SLinus Torvalds 			ERASEINFO(0x10000,32),
4871da177e4SLinus Torvalds 		}
4881da177e4SLinus Torvalds 	}, {
489ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
4901da177e4SLinus Torvalds 		.dev_id		= AM29F080,
4911da177e4SLinus Torvalds 		.name		= "AMD AM29F080",
4925d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
4935d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
4945d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
4955d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
4965d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
4971da177e4SLinus Torvalds 		.regions	= {
4981da177e4SLinus Torvalds 			ERASEINFO(0x10000,16),
4991da177e4SLinus Torvalds 		}
5001da177e4SLinus Torvalds 	}, {
501ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
5021da177e4SLinus Torvalds 		.dev_id		= AM29F040,
5031da177e4SLinus Torvalds 		.name		= "AMD AM29F040",
5045d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
5055d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
5065d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
5075d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
5085d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
5091da177e4SLinus Torvalds 		.regions	= {
5101da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
5111da177e4SLinus Torvalds 		}
5121da177e4SLinus Torvalds 	}, {
513ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
5141da177e4SLinus Torvalds 		.dev_id		= AM29LV040B,
5151da177e4SLinus Torvalds 		.name		= "AMD AM29LV040B",
5165d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
5175d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
5185d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
5195d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
5205d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
5211da177e4SLinus Torvalds 		.regions	= {
5221da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
5231da177e4SLinus Torvalds 		}
5241da177e4SLinus Torvalds 	}, {
525ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
5261da177e4SLinus Torvalds 		.dev_id		= AM29F002T,
5271da177e4SLinus Torvalds 		.name		= "AMD AM29F002T",
5285d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
5295d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
5305d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
5315d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
5325d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
5331da177e4SLinus Torvalds 		.regions	= {
5341da177e4SLinus Torvalds 			ERASEINFO(0x10000,3),
5351da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
5361da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
5371da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
5381da177e4SLinus Torvalds 		}
5391da177e4SLinus Torvalds 	}, {
540ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
5418fd310a1SMike Rapoport 		.dev_id		= AM29SL800DT,
5428fd310a1SMike Rapoport 		.name		= "AMD AM29SL800DT",
5438fd310a1SMike Rapoport 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
5448fd310a1SMike Rapoport 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
5458fd310a1SMike Rapoport 		.dev_size	= SIZE_1MiB,
5468fd310a1SMike Rapoport 		.cmd_set	= P_ID_AMD_STD,
5478fd310a1SMike Rapoport 		.nr_regions	= 4,
5488fd310a1SMike Rapoport 		.regions	= {
5498fd310a1SMike Rapoport 			ERASEINFO(0x10000,15),
5508fd310a1SMike Rapoport 			ERASEINFO(0x08000,1),
5518fd310a1SMike Rapoport 			ERASEINFO(0x02000,2),
5528fd310a1SMike Rapoport 			ERASEINFO(0x04000,1),
5538fd310a1SMike Rapoport 		}
5548fd310a1SMike Rapoport 	}, {
555ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_AMD,
5568fd310a1SMike Rapoport 		.dev_id		= AM29SL800DB,
5578fd310a1SMike Rapoport 		.name		= "AMD AM29SL800DB",
5588fd310a1SMike Rapoport 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
5598fd310a1SMike Rapoport 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
5608fd310a1SMike Rapoport 		.dev_size	= SIZE_1MiB,
5618fd310a1SMike Rapoport 		.cmd_set	= P_ID_AMD_STD,
5628fd310a1SMike Rapoport 		.nr_regions	= 4,
5638fd310a1SMike Rapoport 		.regions	= {
5648fd310a1SMike Rapoport 			ERASEINFO(0x04000,1),
5658fd310a1SMike Rapoport 			ERASEINFO(0x02000,2),
5668fd310a1SMike Rapoport 			ERASEINFO(0x08000,1),
5678fd310a1SMike Rapoport 			ERASEINFO(0x10000,15),
5688fd310a1SMike Rapoport 		}
5698fd310a1SMike Rapoport 	}, {
570ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
5711da177e4SLinus Torvalds 		.dev_id		= AT49BV512,
5721da177e4SLinus Torvalds 		.name		= "Atmel AT49BV512",
5735d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
5745d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
5755d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_64KiB,
5765d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
5775d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
5781da177e4SLinus Torvalds 		.regions	= {
5791da177e4SLinus Torvalds 			ERASEINFO(0x10000,1)
5801da177e4SLinus Torvalds 		}
5811da177e4SLinus Torvalds 	}, {
582ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
5831da177e4SLinus Torvalds 		.dev_id		= AT29LV512,
5841da177e4SLinus Torvalds 		.name		= "Atmel AT29LV512",
5855d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
5865d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
5875d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_64KiB,
5885d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
5895d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
5901da177e4SLinus Torvalds 		.regions	= {
5911da177e4SLinus Torvalds 			ERASEINFO(0x80,256),
5921da177e4SLinus Torvalds 			ERASEINFO(0x80,256)
5931da177e4SLinus Torvalds 		}
5941da177e4SLinus Torvalds 	}, {
595ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
5961da177e4SLinus Torvalds 		.dev_id		= AT49BV16X,
5971da177e4SLinus Torvalds 		.name		= "Atmel AT49BV16X",
5985d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
599cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x0AAA,	/* ???? */
6005d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
6015d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
6025d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
6031da177e4SLinus Torvalds 		.regions	= {
6041da177e4SLinus Torvalds 			ERASEINFO(0x02000,8),
6051da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
6061da177e4SLinus Torvalds 		}
6071da177e4SLinus Torvalds 	}, {
608ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
6091da177e4SLinus Torvalds 		.dev_id		= AT49BV16XT,
6101da177e4SLinus Torvalds 		.name		= "Atmel AT49BV16XT",
6115d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
612cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x0AAA,	/* ???? */
6135d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
6145d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
6155d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
6161da177e4SLinus Torvalds 		.regions	= {
6171da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
6181da177e4SLinus Torvalds 			ERASEINFO(0x02000,8)
6191da177e4SLinus Torvalds 		}
6201da177e4SLinus Torvalds 	}, {
621ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
6221da177e4SLinus Torvalds 		.dev_id		= AT49BV32X,
6231da177e4SLinus Torvalds 		.name		= "Atmel AT49BV32X",
6245d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
625cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x0AAA,	/* ???? */
6265d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
6275d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
6285d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
6291da177e4SLinus Torvalds 		.regions	= {
6301da177e4SLinus Torvalds 			ERASEINFO(0x02000,8),
6311da177e4SLinus Torvalds 			ERASEINFO(0x10000,63)
6321da177e4SLinus Torvalds 		}
6331da177e4SLinus Torvalds 	}, {
634ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ATMEL,
6351da177e4SLinus Torvalds 		.dev_id		= AT49BV32XT,
6361da177e4SLinus Torvalds 		.name		= "Atmel AT49BV32XT",
6375d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
638cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x0AAA,	/* ???? */
6395d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
6405d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
6415d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
6421da177e4SLinus Torvalds 		.regions	= {
6431da177e4SLinus Torvalds 			ERASEINFO(0x10000,63),
6441da177e4SLinus Torvalds 			ERASEINFO(0x02000,8)
6451da177e4SLinus Torvalds 		}
6461da177e4SLinus Torvalds 	}, {
647ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_EON,
648974f2936SLinus Walleij 		.dev_id		= EN29LV400AT,
649974f2936SLinus Walleij 		.name		= "Eon EN29LV400AT",
650974f2936SLinus Walleij 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
651974f2936SLinus Walleij 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
652974f2936SLinus Walleij 		.dev_size	= SIZE_512KiB,
653974f2936SLinus Walleij 		.cmd_set	= P_ID_AMD_STD,
654974f2936SLinus Walleij 		.nr_regions	= 4,
655974f2936SLinus Walleij 		.regions	= {
656974f2936SLinus Walleij 			ERASEINFO(0x10000,7),
657974f2936SLinus Walleij 			ERASEINFO(0x08000,1),
658974f2936SLinus Walleij 			ERASEINFO(0x02000,2),
659974f2936SLinus Walleij 			ERASEINFO(0x04000,1),
660974f2936SLinus Walleij 		}
661974f2936SLinus Walleij 	}, {
662974f2936SLinus Walleij 		.mfr_id		= CFI_MFR_EON,
663974f2936SLinus Walleij 		.dev_id		= EN29LV400AB,
664974f2936SLinus Walleij 		.name		= "Eon EN29LV400AB",
665974f2936SLinus Walleij 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
666974f2936SLinus Walleij 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
667974f2936SLinus Walleij 		.dev_size	= SIZE_512KiB,
668974f2936SLinus Walleij 		.cmd_set	= P_ID_AMD_STD,
669974f2936SLinus Walleij 		.nr_regions	= 4,
670974f2936SLinus Walleij 		.regions	= {
671974f2936SLinus Walleij 			ERASEINFO(0x04000,1),
672974f2936SLinus Walleij 			ERASEINFO(0x02000,2),
673974f2936SLinus Walleij 			ERASEINFO(0x08000,1),
674974f2936SLinus Walleij 			ERASEINFO(0x10000,7),
675974f2936SLinus Walleij 		}
676974f2936SLinus Walleij 	}, {
677974f2936SLinus Walleij 		.mfr_id		= CFI_MFR_EON,
6781b0b30acSMike Rapoport 		.dev_id		= EN29SL800BT,
6791b0b30acSMike Rapoport 		.name		= "Eon EN29SL800BT",
6801b0b30acSMike Rapoport 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
6811b0b30acSMike Rapoport 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
6821b0b30acSMike Rapoport 		.dev_size	= SIZE_1MiB,
6831b0b30acSMike Rapoport 		.cmd_set	= P_ID_AMD_STD,
6841b0b30acSMike Rapoport 		.nr_regions	= 4,
6851b0b30acSMike Rapoport 		.regions	= {
6861b0b30acSMike Rapoport 			ERASEINFO(0x10000,15),
6871b0b30acSMike Rapoport 			ERASEINFO(0x08000,1),
6881b0b30acSMike Rapoport 			ERASEINFO(0x02000,2),
6891b0b30acSMike Rapoport 			ERASEINFO(0x04000,1),
6901b0b30acSMike Rapoport 		}
6911b0b30acSMike Rapoport 	}, {
692ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_EON,
6931b0b30acSMike Rapoport 		.dev_id		= EN29SL800BB,
6941b0b30acSMike Rapoport 		.name		= "Eon EN29SL800BB",
6951b0b30acSMike Rapoport 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
6961b0b30acSMike Rapoport 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
6971b0b30acSMike Rapoport 		.dev_size	= SIZE_1MiB,
6981b0b30acSMike Rapoport 		.cmd_set	= P_ID_AMD_STD,
6991b0b30acSMike Rapoport 		.nr_regions	= 4,
7001b0b30acSMike Rapoport 		.regions	= {
7011b0b30acSMike Rapoport 			ERASEINFO(0x04000,1),
7021b0b30acSMike Rapoport 			ERASEINFO(0x02000,2),
7031b0b30acSMike Rapoport 			ERASEINFO(0x08000,1),
7041b0b30acSMike Rapoport 			ERASEINFO(0x10000,15),
7051b0b30acSMike Rapoport 		}
7061b0b30acSMike Rapoport 	}, {
707ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7081da177e4SLinus Torvalds 		.dev_id		= MBM29F040C,
7091da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29F040C",
7105d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
7115d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7125d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
7135d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7145d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
7151da177e4SLinus Torvalds 		.regions	= {
7161da177e4SLinus Torvalds 			ERASEINFO(0x10000,8)
7171da177e4SLinus Torvalds 		}
7181da177e4SLinus Torvalds 	}, {
719ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
720c9856e39SPhilippe De Muyter 		.dev_id		= MBM29F800BA,
721c9856e39SPhilippe De Muyter 		.name		= "Fujitsu MBM29F800BA",
7225d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7235d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7245d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
7255d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7265d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
727c9856e39SPhilippe De Muyter 		.regions	= {
728c9856e39SPhilippe De Muyter 			ERASEINFO(0x04000,1),
729c9856e39SPhilippe De Muyter 			ERASEINFO(0x02000,2),
730c9856e39SPhilippe De Muyter 			ERASEINFO(0x08000,1),
731c9856e39SPhilippe De Muyter 			ERASEINFO(0x10000,15),
732c9856e39SPhilippe De Muyter 		}
733c9856e39SPhilippe De Muyter 	}, {
734ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7351da177e4SLinus Torvalds 		.dev_id		= MBM29LV650UE,
7361da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV650UE",
7375d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
7385d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_DONT_CARE,
7395d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
7405d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7415d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
7421da177e4SLinus Torvalds 		.regions	= {
7431da177e4SLinus Torvalds 			ERASEINFO(0x10000,128)
7441da177e4SLinus Torvalds 		}
7451da177e4SLinus Torvalds 	}, {
746ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7471da177e4SLinus Torvalds 		.dev_id		= MBM29LV320TE,
7481da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV320TE",
7495d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7505d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7515d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
7525d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7535d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
7541da177e4SLinus Torvalds 		.regions	= {
7551da177e4SLinus Torvalds 			ERASEINFO(0x10000,63),
7561da177e4SLinus Torvalds 			ERASEINFO(0x02000,8)
7571da177e4SLinus Torvalds 		}
7581da177e4SLinus Torvalds 	}, {
759ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7601da177e4SLinus Torvalds 		.dev_id		= MBM29LV320BE,
7611da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV320BE",
7625d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7635d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7645d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
7655d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7665d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
7671da177e4SLinus Torvalds 		.regions	= {
7681da177e4SLinus Torvalds 			ERASEINFO(0x02000,8),
7691da177e4SLinus Torvalds 			ERASEINFO(0x10000,63)
7701da177e4SLinus Torvalds 		}
7711da177e4SLinus Torvalds 	}, {
772ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7731da177e4SLinus Torvalds 		.dev_id		= MBM29LV160TE,
7741da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV160TE",
7755d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7765d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7775d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
7785d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7795d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
7801da177e4SLinus Torvalds 		.regions	= {
7811da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
7821da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
7831da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
7841da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
7851da177e4SLinus Torvalds 		}
7861da177e4SLinus Torvalds 	}, {
787ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
7881da177e4SLinus Torvalds 		.dev_id		= MBM29LV160BE,
7891da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV160BE",
7905d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
7915d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
7925d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
7935d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
7945d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
7951da177e4SLinus Torvalds 		.regions	= {
7961da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
7971da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
7981da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
7991da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
8001da177e4SLinus Torvalds 		}
8011da177e4SLinus Torvalds 	}, {
802ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
8031da177e4SLinus Torvalds 		.dev_id		= MBM29LV800BA,
8041da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV800BA",
8055d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8065d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
8075d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
8085d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
8095d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
8101da177e4SLinus Torvalds 		.regions	= {
8111da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
8121da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
8131da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
8141da177e4SLinus Torvalds 			ERASEINFO(0x10000,15)
8151da177e4SLinus Torvalds 		}
8161da177e4SLinus Torvalds 	}, {
817ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
8181da177e4SLinus Torvalds 		.dev_id		= MBM29LV800TA,
8191da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV800TA",
8205d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8215d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
8225d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
8235d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
8245d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
8251da177e4SLinus Torvalds 		.regions	= {
8261da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
8271da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
8281da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
8291da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
8301da177e4SLinus Torvalds 		}
8311da177e4SLinus Torvalds 	}, {
832ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
8331da177e4SLinus Torvalds 		.dev_id		= MBM29LV400BC,
8341da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV400BC",
8355d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8365d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
8375d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
8385d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
8395d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
8401da177e4SLinus Torvalds 		.regions	= {
8411da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
8421da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
8431da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
8441da177e4SLinus Torvalds 			ERASEINFO(0x10000,7)
8451da177e4SLinus Torvalds 		}
8461da177e4SLinus Torvalds 	}, {
847ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_FUJITSU,
8481da177e4SLinus Torvalds 		.dev_id		= MBM29LV400TC,
8491da177e4SLinus Torvalds 		.name		= "Fujitsu MBM29LV400TC",
8505d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
8515d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
8525d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
8535d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
8545d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
8551da177e4SLinus Torvalds 		.regions	= {
8561da177e4SLinus Torvalds 			ERASEINFO(0x10000,7),
8571da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
8581da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
8591da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
8601da177e4SLinus Torvalds 		}
8611da177e4SLinus Torvalds 	}, {
862ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_HYUNDAI,
8631da177e4SLinus Torvalds 		.dev_id		= HY29F002T,
8641da177e4SLinus Torvalds 		.name		= "Hyundai HY29F002T",
8655d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
8665d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
8675d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
8685d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
8695d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
8701da177e4SLinus Torvalds 		.regions	= {
8711da177e4SLinus Torvalds 			ERASEINFO(0x10000,3),
8721da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
8731da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
8741da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
8751da177e4SLinus Torvalds 		}
8761da177e4SLinus Torvalds 	}, {
877ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
8781da177e4SLinus Torvalds 		.dev_id		= I28F004B3B,
8791da177e4SLinus Torvalds 		.name		= "Intel 28F004B3B",
8805d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
8815d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
8825d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
8835d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
8845d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
8851da177e4SLinus Torvalds 		.regions	= {
8861da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
8871da177e4SLinus Torvalds 			ERASEINFO(0x10000, 7),
8881da177e4SLinus Torvalds 		}
8891da177e4SLinus Torvalds 	}, {
890ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
8911da177e4SLinus Torvalds 		.dev_id		= I28F004B3T,
8921da177e4SLinus Torvalds 		.name		= "Intel 28F004B3T",
8935d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
8945d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
8955d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
8965d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
8975d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
8981da177e4SLinus Torvalds 		.regions	= {
8991da177e4SLinus Torvalds 			ERASEINFO(0x10000, 7),
9001da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
9011da177e4SLinus Torvalds 		}
9021da177e4SLinus Torvalds 	}, {
903ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9041da177e4SLinus Torvalds 		.dev_id		= I28F400B3B,
9051da177e4SLinus Torvalds 		.name		= "Intel 28F400B3B",
9065d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
9075d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9085d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
9095d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9105d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
9111da177e4SLinus Torvalds 		.regions	= {
9121da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
9131da177e4SLinus Torvalds 			ERASEINFO(0x10000, 7),
9141da177e4SLinus Torvalds 		}
9151da177e4SLinus Torvalds 	}, {
916ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9171da177e4SLinus Torvalds 		.dev_id		= I28F400B3T,
9181da177e4SLinus Torvalds 		.name		= "Intel 28F400B3T",
9195d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
9205d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9215d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
9225d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9235d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
9241da177e4SLinus Torvalds 		.regions	= {
9251da177e4SLinus Torvalds 			ERASEINFO(0x10000, 7),
9261da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
9271da177e4SLinus Torvalds 		}
9281da177e4SLinus Torvalds 	}, {
929ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9301da177e4SLinus Torvalds 		.dev_id		= I28F008B3B,
9311da177e4SLinus Torvalds 		.name		= "Intel 28F008B3B",
9325d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
9335d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9345d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
9355d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9365d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
9371da177e4SLinus Torvalds 		.regions	= {
9381da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
9391da177e4SLinus Torvalds 			ERASEINFO(0x10000, 15),
9401da177e4SLinus Torvalds 		}
9411da177e4SLinus Torvalds 	}, {
942ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9431da177e4SLinus Torvalds 		.dev_id		= I28F008B3T,
9441da177e4SLinus Torvalds 		.name		= "Intel 28F008B3T",
9455d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
9465d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9475d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
9485d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9495d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
9501da177e4SLinus Torvalds 		.regions	= {
9511da177e4SLinus Torvalds 			ERASEINFO(0x10000, 15),
9521da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
9531da177e4SLinus Torvalds 		}
9541da177e4SLinus Torvalds 	}, {
955ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9561da177e4SLinus Torvalds 		.dev_id		= I28F008S5,
9571da177e4SLinus Torvalds 		.name		= "Intel 28F008S5",
9585d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
9595d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9605d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
9615d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
9625d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
9631da177e4SLinus Torvalds 		.regions	= {
9641da177e4SLinus Torvalds 			ERASEINFO(0x10000,16),
9651da177e4SLinus Torvalds 		}
9661da177e4SLinus Torvalds 	}, {
967ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9681da177e4SLinus Torvalds 		.dev_id		= I28F016S5,
9691da177e4SLinus Torvalds 		.name		= "Intel 28F016S5",
9705d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
9715d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9725d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
9735d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
9745d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
9751da177e4SLinus Torvalds 		.regions	= {
9761da177e4SLinus Torvalds 			ERASEINFO(0x10000,32),
9771da177e4SLinus Torvalds 		}
9781da177e4SLinus Torvalds 	}, {
979ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9801da177e4SLinus Torvalds 		.dev_id		= I28F008SA,
9811da177e4SLinus Torvalds 		.name		= "Intel 28F008SA",
9825d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
9835d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9845d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
9855d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9865d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
9871da177e4SLinus Torvalds 		.regions	= {
9881da177e4SLinus Torvalds 			ERASEINFO(0x10000, 16),
9891da177e4SLinus Torvalds 		}
9901da177e4SLinus Torvalds 	}, {
991ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
9921da177e4SLinus Torvalds 		.dev_id		= I28F800B3B,
9931da177e4SLinus Torvalds 		.name		= "Intel 28F800B3B",
9945d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
9955d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
9965d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
9975d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
9985d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
9991da177e4SLinus Torvalds 		.regions	= {
10001da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10011da177e4SLinus Torvalds 			ERASEINFO(0x10000, 15),
10021da177e4SLinus Torvalds 		}
10031da177e4SLinus Torvalds 	}, {
1004ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10051da177e4SLinus Torvalds 		.dev_id		= I28F800B3T,
10061da177e4SLinus Torvalds 		.name		= "Intel 28F800B3T",
10075d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
10085d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10095d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
10105d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10115d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10121da177e4SLinus Torvalds 		.regions	= {
10131da177e4SLinus Torvalds 			ERASEINFO(0x10000, 15),
10141da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10151da177e4SLinus Torvalds 		}
10161da177e4SLinus Torvalds 	}, {
1017ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10181da177e4SLinus Torvalds 		.dev_id		= I28F016B3B,
10191da177e4SLinus Torvalds 		.name		= "Intel 28F016B3B",
10205d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
10215d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10225d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
10235d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10245d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10251da177e4SLinus Torvalds 		.regions	= {
10261da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10271da177e4SLinus Torvalds 			ERASEINFO(0x10000, 31),
10281da177e4SLinus Torvalds 		}
10291da177e4SLinus Torvalds 	}, {
1030ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10311da177e4SLinus Torvalds 		.dev_id		= I28F016S3,
10321da177e4SLinus Torvalds 		.name		= "Intel I28F016S3",
10335d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
10345d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10355d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
10365d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10375d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
10381da177e4SLinus Torvalds 		.regions	= {
10391da177e4SLinus Torvalds 			ERASEINFO(0x10000, 32),
10401da177e4SLinus Torvalds 		}
10411da177e4SLinus Torvalds 	}, {
1042ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10431da177e4SLinus Torvalds 		.dev_id		= I28F016B3T,
10441da177e4SLinus Torvalds 		.name		= "Intel 28F016B3T",
10455d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
10465d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10475d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
10485d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10495d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10501da177e4SLinus Torvalds 		.regions	= {
10511da177e4SLinus Torvalds 			ERASEINFO(0x10000, 31),
10521da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10531da177e4SLinus Torvalds 		}
10541da177e4SLinus Torvalds 	}, {
1055ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10561da177e4SLinus Torvalds 		.dev_id		= I28F160B3B,
10571da177e4SLinus Torvalds 		.name		= "Intel 28F160B3B",
10585d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
10595d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10605d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
10615d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10625d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10631da177e4SLinus Torvalds 		.regions	= {
10641da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10651da177e4SLinus Torvalds 			ERASEINFO(0x10000, 31),
10661da177e4SLinus Torvalds 		}
10671da177e4SLinus Torvalds 	}, {
1068ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10691da177e4SLinus Torvalds 		.dev_id		= I28F160B3T,
10701da177e4SLinus Torvalds 		.name		= "Intel 28F160B3T",
10715d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
10725d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10735d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
10745d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10755d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10761da177e4SLinus Torvalds 		.regions	= {
10771da177e4SLinus Torvalds 			ERASEINFO(0x10000, 31),
10781da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10791da177e4SLinus Torvalds 		}
10801da177e4SLinus Torvalds 	}, {
1081ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10821da177e4SLinus Torvalds 		.dev_id		= I28F320B3B,
10831da177e4SLinus Torvalds 		.name		= "Intel 28F320B3B",
10845d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
10855d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10865d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
10875d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
10885d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
10891da177e4SLinus Torvalds 		.regions	= {
10901da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
10911da177e4SLinus Torvalds 			ERASEINFO(0x10000, 63),
10921da177e4SLinus Torvalds 		}
10931da177e4SLinus Torvalds 	}, {
1094ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
10951da177e4SLinus Torvalds 		.dev_id		= I28F320B3T,
10961da177e4SLinus Torvalds 		.name		= "Intel 28F320B3T",
10975d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
10985d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
10995d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
11005d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
11015d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
11021da177e4SLinus Torvalds 		.regions	= {
11031da177e4SLinus Torvalds 			ERASEINFO(0x10000, 63),
11041da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
11051da177e4SLinus Torvalds 		}
11061da177e4SLinus Torvalds 	}, {
1107ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
11081da177e4SLinus Torvalds 		.dev_id		= I28F640B3B,
11091da177e4SLinus Torvalds 		.name		= "Intel 28F640B3B",
11105d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
11115d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
11125d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
11135d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
11145d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
11151da177e4SLinus Torvalds 		.regions	= {
11161da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
11171da177e4SLinus Torvalds 			ERASEINFO(0x10000, 127),
11181da177e4SLinus Torvalds 		}
11191da177e4SLinus Torvalds 	}, {
1120ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
11211da177e4SLinus Torvalds 		.dev_id		= I28F640B3T,
11221da177e4SLinus Torvalds 		.name		= "Intel 28F640B3T",
11235d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16,
11245d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
11255d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
11265d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_STD,
11275d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
11281da177e4SLinus Torvalds 		.regions	= {
11291da177e4SLinus Torvalds 			ERASEINFO(0x10000, 127),
11301da177e4SLinus Torvalds 			ERASEINFO(0x02000, 8),
11311da177e4SLinus Torvalds 		}
11321da177e4SLinus Torvalds 	}, {
1133ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
1134b4c8c8cfSStefan Roese 		.dev_id		= I28F640C3B,
1135b4c8c8cfSStefan Roese 		.name		= "Intel 28F640C3B",
1136b4c8c8cfSStefan Roese 		.devtypes	= CFI_DEVICETYPE_X16,
1137b4c8c8cfSStefan Roese 		.uaddr		= MTD_UADDR_UNNECESSARY,
1138b4c8c8cfSStefan Roese 		.dev_size	= SIZE_8MiB,
1139b4c8c8cfSStefan Roese 		.cmd_set	= P_ID_INTEL_STD,
1140b4c8c8cfSStefan Roese 		.nr_regions	= 2,
1141b4c8c8cfSStefan Roese 		.regions	= {
1142b4c8c8cfSStefan Roese 			ERASEINFO(0x02000, 8),
1143b4c8c8cfSStefan Roese 			ERASEINFO(0x10000, 127),
1144b4c8c8cfSStefan Roese 		}
1145b4c8c8cfSStefan Roese 	}, {
1146ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
11471da177e4SLinus Torvalds 		.dev_id		= I82802AB,
11481da177e4SLinus Torvalds 		.name		= "Intel 82802AB",
11495d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
11505d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
11515d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
11525d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
11535d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
11541da177e4SLinus Torvalds 		.regions	= {
11551da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
11561da177e4SLinus Torvalds 		}
11571da177e4SLinus Torvalds 	}, {
1158ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_INTEL,
11591da177e4SLinus Torvalds 		.dev_id		= I82802AC,
11601da177e4SLinus Torvalds 		.name		= "Intel 82802AC",
11615d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
11625d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
11635d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
11645d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
11655d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
11661da177e4SLinus Torvalds 		.regions	= {
11671da177e4SLinus Torvalds 			ERASEINFO(0x10000,16),
11681da177e4SLinus Torvalds 		}
11691da177e4SLinus Torvalds 	}, {
1170ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
11711da177e4SLinus Torvalds 		.dev_id		= MX29LV040C,
11721da177e4SLinus Torvalds 		.name		= "Macronix MX29LV040C",
11735d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
11745d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
11755d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
11765d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
11775d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
11781da177e4SLinus Torvalds 		.regions	= {
11791da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
11801da177e4SLinus Torvalds 		}
11811da177e4SLinus Torvalds 	}, {
1182ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
11831da177e4SLinus Torvalds 		.dev_id		= MX29LV160T,
11841da177e4SLinus Torvalds 		.name		= "MXIC MX29LV160T",
11855d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
11865d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
11875d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
11885d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
11895d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
11901da177e4SLinus Torvalds 		.regions	= {
11911da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
11921da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
11931da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
11941da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
11951da177e4SLinus Torvalds 		}
11961da177e4SLinus Torvalds 	}, {
1197ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_NEC,
11981da177e4SLinus Torvalds 		.dev_id		= UPD29F064115,
11991da177e4SLinus Torvalds 		.name		= "NEC uPD29F064115",
12009aff1b1aSHiroshi Ito 		.devtypes	= CFI_DEVICETYPE_X16,
12019aff1b1aSHiroshi Ito 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
12025d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
12035d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12045d3cce3bSDavid Woodhouse 		.nr_regions	= 3,
12051da177e4SLinus Torvalds 		.regions	= {
12061da177e4SLinus Torvalds 			ERASEINFO(0x2000,8),
12071da177e4SLinus Torvalds 			ERASEINFO(0x10000,126),
12081da177e4SLinus Torvalds 			ERASEINFO(0x2000,8),
12091da177e4SLinus Torvalds 		}
12101da177e4SLinus Torvalds 	}, {
1211ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
12121da177e4SLinus Torvalds 		.dev_id		= MX29LV160B,
12131da177e4SLinus Torvalds 		.name		= "MXIC MX29LV160B",
12145d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
12155d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
12165d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
12175d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12185d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
12191da177e4SLinus Torvalds 		.regions	= {
12201da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
12211da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
12221da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
12231da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
12241da177e4SLinus Torvalds 		}
12251da177e4SLinus Torvalds 	}, {
1226ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
1227c4e6952fSTakashi YOSHI 		.dev_id		= MX29F040,
1228c4e6952fSTakashi YOSHI 		.name		= "Macronix MX29F040",
12295d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12305d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
12315d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
12325d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12335d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
1234c4e6952fSTakashi YOSHI 		.regions	= {
1235c4e6952fSTakashi YOSHI 			ERASEINFO(0x10000,8),
1236c4e6952fSTakashi YOSHI 		}
1237c4e6952fSTakashi YOSHI 	}, {
1238ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
12391da177e4SLinus Torvalds 		.dev_id		= MX29F016,
12401da177e4SLinus Torvalds 		.name		= "Macronix MX29F016",
12415d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12425d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
12435d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
12445d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12455d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
12461da177e4SLinus Torvalds 		.regions	= {
12471da177e4SLinus Torvalds 			ERASEINFO(0x10000,32),
12481da177e4SLinus Torvalds 		}
12491da177e4SLinus Torvalds 	}, {
1250ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
12511da177e4SLinus Torvalds 		.dev_id		= MX29F004T,
12521da177e4SLinus Torvalds 		.name		= "Macronix MX29F004T",
12535d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12545d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
12555d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
12565d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12575d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
12581da177e4SLinus Torvalds 		.regions	= {
12591da177e4SLinus Torvalds 			ERASEINFO(0x10000,7),
12601da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
12611da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
12621da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
12631da177e4SLinus Torvalds 		}
12641da177e4SLinus Torvalds 	}, {
1265ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
12661da177e4SLinus Torvalds 		.dev_id		= MX29F004B,
12671da177e4SLinus Torvalds 		.name		= "Macronix MX29F004B",
12685d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12695d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
12705d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
12715d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12725d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
12731da177e4SLinus Torvalds 		.regions	= {
12741da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
12751da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
12761da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
12771da177e4SLinus Torvalds 			ERASEINFO(0x10000,7),
12781da177e4SLinus Torvalds 		}
12791da177e4SLinus Torvalds 	}, {
1280ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_MACRONIX,
12811da177e4SLinus Torvalds 		.dev_id		= MX29F002T,
12821da177e4SLinus Torvalds 		.name		= "Macronix MX29F002T",
12835d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12845d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
12855d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
12865d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
12875d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
12881da177e4SLinus Torvalds 		.regions	= {
12891da177e4SLinus Torvalds 			ERASEINFO(0x10000,3),
12901da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
12911da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
12921da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
12931da177e4SLinus Torvalds 		}
12941da177e4SLinus Torvalds 	}, {
1295ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_PMC,
12961da177e4SLinus Torvalds 		.dev_id		= PM49FL002,
12971da177e4SLinus Torvalds 		.name		= "PMC Pm49FL002",
12985d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
12995d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13005d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
13015d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13025d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13031da177e4SLinus Torvalds 		.regions	= {
13041da177e4SLinus Torvalds 			ERASEINFO( 0x01000, 64 )
13051da177e4SLinus Torvalds 		}
13061da177e4SLinus Torvalds 	}, {
1307ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_PMC,
13081da177e4SLinus Torvalds 		.dev_id		= PM49FL004,
13091da177e4SLinus Torvalds 		.name		= "PMC Pm49FL004",
13105d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13115d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13125d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
13135d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13145d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13151da177e4SLinus Torvalds 		.regions	= {
13161da177e4SLinus Torvalds 			ERASEINFO( 0x01000, 128 )
13171da177e4SLinus Torvalds 		}
13181da177e4SLinus Torvalds 	}, {
1319ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_PMC,
13201da177e4SLinus Torvalds 		.dev_id		= PM49FL008,
13211da177e4SLinus Torvalds 		.name		= "PMC Pm49FL008",
13225d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13235d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13245d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
13255d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13265d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13271da177e4SLinus Torvalds 		.regions	= {
13281da177e4SLinus Torvalds 			ERASEINFO( 0x01000, 256 )
13291da177e4SLinus Torvalds 		}
13301da177e4SLinus Torvalds 	}, {
1331ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SHARP,
1332a63ec1b7SPavel Machek 		.dev_id		= LH28F640BF,
1333a63ec1b7SPavel Machek 		.name		= "LH28F640BF",
1334fe2f4c8eSAndrea Adami 		.devtypes	= CFI_DEVICETYPE_X16,
13355d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
1336fe2f4c8eSAndrea Adami 		.dev_size	= SIZE_8MiB,
1337fe2f4c8eSAndrea Adami 		.cmd_set	= P_ID_INTEL_EXT,
1338fe2f4c8eSAndrea Adami 		.nr_regions	= 2,
1339a63ec1b7SPavel Machek 		.regions	= {
1340fe2f4c8eSAndrea Adami 			ERASEINFO(0x10000, 127),
1341fe2f4c8eSAndrea Adami 			ERASEINFO(0x02000, 8),
1342a63ec1b7SPavel Machek 		}
1343a63ec1b7SPavel Machek 	}, {
1344ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
13451da177e4SLinus Torvalds 		.dev_id		= SST39LF512,
13461da177e4SLinus Torvalds 		.name		= "SST 39LF512",
13475d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13485d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13495d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_64KiB,
13505d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13515d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13521da177e4SLinus Torvalds 		.regions	= {
13531da177e4SLinus Torvalds 			ERASEINFO(0x01000,16),
13541da177e4SLinus Torvalds 		}
13551da177e4SLinus Torvalds 	}, {
1356ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
13571da177e4SLinus Torvalds 		.dev_id		= SST39LF010,
13581da177e4SLinus Torvalds 		.name		= "SST 39LF010",
13595d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13605d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13615d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_128KiB,
13625d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13635d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13641da177e4SLinus Torvalds 		.regions	= {
13651da177e4SLinus Torvalds 			ERASEINFO(0x01000,32),
13661da177e4SLinus Torvalds 		}
13671da177e4SLinus Torvalds 	}, {
1368ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
13691da177e4SLinus Torvalds 		.dev_id		= SST29EE020,
13701da177e4SLinus Torvalds 		.name		= "SST 29EE020",
13715d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13725d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13735d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
13745d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_SST_PAGE,
13755d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13761da177e4SLinus Torvalds 		.regions = {ERASEINFO(0x01000,64),
13771da177e4SLinus Torvalds 		}
13781da177e4SLinus Torvalds 	}, {
1379ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
13801da177e4SLinus Torvalds 		.dev_id		= SST29LE020,
13811da177e4SLinus Torvalds 		.name		= "SST 29LE020",
13825d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13835d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13845d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
13855d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_SST_PAGE,
13865d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13871da177e4SLinus Torvalds 		.regions = {ERASEINFO(0x01000,64),
13881da177e4SLinus Torvalds 		}
13891da177e4SLinus Torvalds 	}, {
1390ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
13911da177e4SLinus Torvalds 		.dev_id		= SST39LF020,
13921da177e4SLinus Torvalds 		.name		= "SST 39LF020",
13935d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
13945d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
13955d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
13965d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
13975d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
13981da177e4SLinus Torvalds 		.regions	= {
13991da177e4SLinus Torvalds 			ERASEINFO(0x01000,64),
14001da177e4SLinus Torvalds 		}
14011da177e4SLinus Torvalds 	}, {
1402ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14031da177e4SLinus Torvalds 		.dev_id		= SST39LF040,
14041da177e4SLinus Torvalds 		.name		= "SST 39LF040",
14055d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14065d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14075d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
14085d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14095d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14101da177e4SLinus Torvalds 		.regions	= {
14111da177e4SLinus Torvalds 			ERASEINFO(0x01000,128),
14121da177e4SLinus Torvalds 		}
14131da177e4SLinus Torvalds 	}, {
1414ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14151da177e4SLinus Torvalds 		.dev_id		= SST39SF010A,
14161da177e4SLinus Torvalds 		.name		= "SST 39SF010A",
14175d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14185d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14195d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_128KiB,
14205d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14215d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14221da177e4SLinus Torvalds 		.regions	= {
14231da177e4SLinus Torvalds 			ERASEINFO(0x01000,32),
14241da177e4SLinus Torvalds 		}
14251da177e4SLinus Torvalds 	}, {
1426ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14271da177e4SLinus Torvalds 		.dev_id		= SST39SF020A,
14281da177e4SLinus Torvalds 		.name		= "SST 39SF020A",
14295d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14305d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14315d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
14325d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14335d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14341da177e4SLinus Torvalds 		.regions	= {
14351da177e4SLinus Torvalds 			ERASEINFO(0x01000,64),
14361da177e4SLinus Torvalds 		}
14371da177e4SLinus Torvalds 	}, {
1438ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
1439a0645ce9SMichał Mirosław 		.dev_id		= SST39SF040,
1440a0645ce9SMichał Mirosław 		.name		= "SST 39SF040",
1441a0645ce9SMichał Mirosław 		.devtypes	= CFI_DEVICETYPE_X8,
1442a0645ce9SMichał Mirosław 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
1443a0645ce9SMichał Mirosław 		.dev_size	= SIZE_512KiB,
1444a0645ce9SMichał Mirosław 		.cmd_set	= P_ID_AMD_STD,
1445a0645ce9SMichał Mirosław 		.nr_regions	= 1,
1446a0645ce9SMichał Mirosław 		.regions	= {
1447a0645ce9SMichał Mirosław 			ERASEINFO(0x01000,128),
1448a0645ce9SMichał Mirosław 		}
1449a0645ce9SMichał Mirosław 	}, {
1450ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
145189072ef9SRyan Jackson 		.dev_id		= SST49LF040B,
145289072ef9SRyan Jackson 		.name		= "SST 49LF040B",
14535d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14545d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14555d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
14565d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14575d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
145889072ef9SRyan Jackson 		.regions	= {
145989072ef9SRyan Jackson 			ERASEINFO(0x01000,128),
146089072ef9SRyan Jackson 		}
146189072ef9SRyan Jackson 	}, {
146289072ef9SRyan Jackson 
1463ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14641da177e4SLinus Torvalds 		.dev_id		= SST49LF004B,
14651da177e4SLinus Torvalds 		.name		= "SST 49LF004B",
14665d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14675d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14685d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
14695d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14705d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14711da177e4SLinus Torvalds 		.regions	= {
14721da177e4SLinus Torvalds 			ERASEINFO(0x01000,128),
14731da177e4SLinus Torvalds 		}
14741da177e4SLinus Torvalds 	}, {
1475ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14761da177e4SLinus Torvalds 		.dev_id		= SST49LF008A,
14771da177e4SLinus Torvalds 		.name		= "SST 49LF008A",
14785d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14795d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14805d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
14815d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14825d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14831da177e4SLinus Torvalds 		.regions	= {
14841da177e4SLinus Torvalds 			ERASEINFO(0x01000,256),
14851da177e4SLinus Torvalds 		}
14861da177e4SLinus Torvalds 	}, {
1487ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
14881da177e4SLinus Torvalds 		.dev_id		= SST49LF030A,
14891da177e4SLinus Torvalds 		.name		= "SST 49LF030A",
14905d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
14915d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
14925d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
14935d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
14945d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
14951da177e4SLinus Torvalds 		.regions	= {
14961da177e4SLinus Torvalds 			ERASEINFO(0x01000,96),
14971da177e4SLinus Torvalds 		}
14981da177e4SLinus Torvalds 	}, {
1499ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
15001da177e4SLinus Torvalds 		.dev_id		= SST49LF040A,
15011da177e4SLinus Torvalds 		.name		= "SST 49LF040A",
15025d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
15035d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
15045d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
15055d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
15065d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
15071da177e4SLinus Torvalds 		.regions	= {
15081da177e4SLinus Torvalds 			ERASEINFO(0x01000,128),
15091da177e4SLinus Torvalds 		}
15101da177e4SLinus Torvalds 	}, {
1511ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
15121da177e4SLinus Torvalds 		.dev_id		= SST49LF080A,
15131da177e4SLinus Torvalds 		.name		= "SST 49LF080A",
15145d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
15155d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
15165d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
15175d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
15185d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
15191da177e4SLinus Torvalds 		.regions	= {
15201da177e4SLinus Torvalds 			ERASEINFO(0x01000,256),
15211da177e4SLinus Torvalds 		}
15221da177e4SLinus Torvalds 	}, {
1523ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,     /* should be CFI */
15241da177e4SLinus Torvalds 		.dev_id		= SST39LF160,
15251da177e4SLinus Torvalds 		.name		= "SST 39LF160",
1526ca6f12c6SAtsushi Nemoto 		.devtypes	= CFI_DEVICETYPE_X16,
1527ca6f12c6SAtsushi Nemoto 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
15285d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
15295d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
15305d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
15311da177e4SLinus Torvalds 		.regions	= {
15321da177e4SLinus Torvalds 			ERASEINFO(0x1000,256),
15331da177e4SLinus Torvalds 			ERASEINFO(0x1000,256)
15341da177e4SLinus Torvalds 		}
153588ec7c50SBen Dooks 	}, {
1536ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,     /* should be CFI */
153788ec7c50SBen Dooks 		.dev_id		= SST39VF1601,
153888ec7c50SBen Dooks 		.name		= "SST 39VF1601",
1539ca6f12c6SAtsushi Nemoto 		.devtypes	= CFI_DEVICETYPE_X16,
1540ca6f12c6SAtsushi Nemoto 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
15415d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
15425d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
15435d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
154488ec7c50SBen Dooks 		.regions	= {
154588ec7c50SBen Dooks 			ERASEINFO(0x1000,256),
154688ec7c50SBen Dooks 			ERASEINFO(0x1000,256)
154788ec7c50SBen Dooks 		}
15488547e583SDavid Howells 	}, {
1549087acaf1SWolfram Sang 		/* CFI is broken: reports AMD_STD, but needs custom uaddr */
1550087acaf1SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
1551087acaf1SWolfram Sang 		.dev_id		= SST39WF1601,
1552087acaf1SWolfram Sang 		.name		= "SST 39WF1601",
1553087acaf1SWolfram Sang 		.devtypes	= CFI_DEVICETYPE_X16,
1554087acaf1SWolfram Sang 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
1555087acaf1SWolfram Sang 		.dev_size	= SIZE_2MiB,
1556087acaf1SWolfram Sang 		.cmd_set	= P_ID_AMD_STD,
1557087acaf1SWolfram Sang 		.nr_regions	= 2,
1558087acaf1SWolfram Sang 		.regions	= {
1559087acaf1SWolfram Sang 			ERASEINFO(0x1000,256),
1560087acaf1SWolfram Sang 			ERASEINFO(0x1000,256)
1561087acaf1SWolfram Sang 		}
1562087acaf1SWolfram Sang 	}, {
1563087acaf1SWolfram Sang 		/* CFI is broken: reports AMD_STD, but needs custom uaddr */
1564087acaf1SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
1565087acaf1SWolfram Sang 		.dev_id		= SST39WF1602,
1566087acaf1SWolfram Sang 		.name		= "SST 39WF1602",
1567087acaf1SWolfram Sang 		.devtypes	= CFI_DEVICETYPE_X16,
1568087acaf1SWolfram Sang 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
1569087acaf1SWolfram Sang 		.dev_size	= SIZE_2MiB,
1570087acaf1SWolfram Sang 		.cmd_set	= P_ID_AMD_STD,
1571087acaf1SWolfram Sang 		.nr_regions	= 2,
1572087acaf1SWolfram Sang 		.regions	= {
1573087acaf1SWolfram Sang 			ERASEINFO(0x1000,256),
1574087acaf1SWolfram Sang 			ERASEINFO(0x1000,256)
1575087acaf1SWolfram Sang 		}
1576087acaf1SWolfram Sang 	}, {
1577ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,     /* should be CFI */
1578bd50a0ffSYegor Yefremov 		.dev_id		= SST39VF3201,
1579bd50a0ffSYegor Yefremov 		.name		= "SST 39VF3201",
1580bd50a0ffSYegor Yefremov 		.devtypes	= CFI_DEVICETYPE_X16,
1581bd50a0ffSYegor Yefremov 		.uaddr		= MTD_UADDR_0xAAAA_0x5555,
1582bd50a0ffSYegor Yefremov 		.dev_size	= SIZE_4MiB,
1583bd50a0ffSYegor Yefremov 		.cmd_set	= P_ID_AMD_STD,
1584bd50a0ffSYegor Yefremov 		.nr_regions	= 4,
1585bd50a0ffSYegor Yefremov 		.regions	= {
1586bd50a0ffSYegor Yefremov 			ERASEINFO(0x1000,256),
1587bd50a0ffSYegor Yefremov 			ERASEINFO(0x1000,256),
1588bd50a0ffSYegor Yefremov 			ERASEINFO(0x1000,256),
1589bd50a0ffSYegor Yefremov 			ERASEINFO(0x1000,256)
1590bd50a0ffSYegor Yefremov 		}
1591bd50a0ffSYegor Yefremov 	}, {
1592ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_SST,
15931b0a062bSAndrei Dolnikov 		.dev_id		= SST36VF3203,
15941b0a062bSAndrei Dolnikov 		.name		= "SST 36VF3203",
15951b0a062bSAndrei Dolnikov 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
15961b0a062bSAndrei Dolnikov 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
15971b0a062bSAndrei Dolnikov 		.dev_size	= SIZE_4MiB,
15981b0a062bSAndrei Dolnikov 		.cmd_set	= P_ID_AMD_STD,
15991b0a062bSAndrei Dolnikov 		.nr_regions	= 1,
16001b0a062bSAndrei Dolnikov 		.regions	= {
16011b0a062bSAndrei Dolnikov 			ERASEINFO(0x10000,64),
16021b0a062bSAndrei Dolnikov 		}
16031b0a062bSAndrei Dolnikov 	}, {
1604ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
1605c9856e39SPhilippe De Muyter 		.dev_id		= M29F800AB,
1606c9856e39SPhilippe De Muyter 		.name		= "ST M29F800AB",
16075d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
16085d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
16095d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
16105d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
16115d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
1612c9856e39SPhilippe De Muyter 		.regions	= {
1613c9856e39SPhilippe De Muyter 			ERASEINFO(0x04000,1),
1614c9856e39SPhilippe De Muyter 			ERASEINFO(0x02000,2),
1615c9856e39SPhilippe De Muyter 			ERASEINFO(0x08000,1),
1616c9856e39SPhilippe De Muyter 			ERASEINFO(0x10000,15),
1617c9856e39SPhilippe De Muyter 		}
1618c9856e39SPhilippe De Muyter 	}, {
1619ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,	/* FIXME - CFI device? */
16201da177e4SLinus Torvalds 		.dev_id		= M29W800DT,
16211da177e4SLinus Torvalds 		.name		= "ST M29W800DT",
16225d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1623db5432dbSLadislav Michl 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
16245d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
16255d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
16265d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
16271da177e4SLinus Torvalds 		.regions	= {
16281da177e4SLinus Torvalds 			ERASEINFO(0x10000,15),
16291da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
16301da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
16311da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
16321da177e4SLinus Torvalds 		}
16331da177e4SLinus Torvalds 	}, {
1634ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,	/* FIXME - CFI device? */
16351da177e4SLinus Torvalds 		.dev_id		= M29W800DB,
16361da177e4SLinus Torvalds 		.name		= "ST M29W800DB",
16375d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1638db5432dbSLadislav Michl 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
16395d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
16405d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
16415d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
16421da177e4SLinus Torvalds 		.regions	= {
16431da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
16441da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
16451da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
16461da177e4SLinus Torvalds 			ERASEINFO(0x10000,15)
16471da177e4SLinus Torvalds 		}
16481da177e4SLinus Torvalds 	},  {
1649ae731822SWolfram Sang 		.mfr_id         = CFI_MFR_ST,
165030d6a24eSGordon Farquharson 		.dev_id         = M29W400DT,
165130d6a24eSGordon Farquharson 		.name           = "ST M29W400DT",
165230d6a24eSGordon Farquharson 		.devtypes       = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
165330d6a24eSGordon Farquharson 		.uaddr          = MTD_UADDR_0x0AAA_0x0555,
165430d6a24eSGordon Farquharson 		.dev_size       = SIZE_512KiB,
165530d6a24eSGordon Farquharson 		.cmd_set        = P_ID_AMD_STD,
165630d6a24eSGordon Farquharson 		.nr_regions     = 4,
165730d6a24eSGordon Farquharson 		.regions        = {
165830d6a24eSGordon Farquharson 			ERASEINFO(0x04000,7),
165930d6a24eSGordon Farquharson 			ERASEINFO(0x02000,1),
166030d6a24eSGordon Farquharson 			ERASEINFO(0x08000,2),
166130d6a24eSGordon Farquharson 			ERASEINFO(0x10000,1)
166230d6a24eSGordon Farquharson 		}
166330d6a24eSGordon Farquharson 	}, {
1664ae731822SWolfram Sang 		.mfr_id         = CFI_MFR_ST,
166530d6a24eSGordon Farquharson 		.dev_id         = M29W400DB,
166630d6a24eSGordon Farquharson 		.name           = "ST M29W400DB",
166730d6a24eSGordon Farquharson 		.devtypes       = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
166830d6a24eSGordon Farquharson 		.uaddr          = MTD_UADDR_0x0AAA_0x0555,
166930d6a24eSGordon Farquharson 		.dev_size       = SIZE_512KiB,
167030d6a24eSGordon Farquharson 		.cmd_set        = P_ID_AMD_STD,
167130d6a24eSGordon Farquharson 		.nr_regions     = 4,
167230d6a24eSGordon Farquharson 		.regions        = {
167330d6a24eSGordon Farquharson 			ERASEINFO(0x04000,1),
167430d6a24eSGordon Farquharson 			ERASEINFO(0x02000,2),
167530d6a24eSGordon Farquharson 			ERASEINFO(0x08000,1),
167630d6a24eSGordon Farquharson 			ERASEINFO(0x10000,7)
167730d6a24eSGordon Farquharson 		}
167830d6a24eSGordon Farquharson 	}, {
1679ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,	/* FIXME - CFI device? */
16801da177e4SLinus Torvalds 		.dev_id		= M29W160DT,
16811da177e4SLinus Torvalds 		.name		= "ST M29W160DT",
16825d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1683cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,	/* ???? */
16845d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
16855d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
16865d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
16871da177e4SLinus Torvalds 		.regions	= {
16881da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
16891da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
16901da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
16911da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
16921da177e4SLinus Torvalds 		}
16931da177e4SLinus Torvalds 	}, {
1694ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,	/* FIXME - CFI device? */
16951da177e4SLinus Torvalds 		.dev_id		= M29W160DB,
16961da177e4SLinus Torvalds 		.name		= "ST M29W160DB",
16975d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
1698cec80bf2SDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,	/* ???? */
16995d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
17005d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
17015d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
17021da177e4SLinus Torvalds 		.regions	= {
17031da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
17041da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
17051da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
17061da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
17071da177e4SLinus Torvalds 		}
17081da177e4SLinus Torvalds 	}, {
1709ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
17101da177e4SLinus Torvalds 		.dev_id		= M29W040B,
17111da177e4SLinus Torvalds 		.name		= "ST M29W040B",
17125d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
17135d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0555_0x02AA,
17145d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
17155d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
17165d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
17171da177e4SLinus Torvalds 		.regions	= {
17181da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
17191da177e4SLinus Torvalds 		}
17201da177e4SLinus Torvalds 	}, {
1721ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
17221da177e4SLinus Torvalds 		.dev_id		= M50FW040,
17231da177e4SLinus Torvalds 		.name		= "ST M50FW040",
17245d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
17255d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
17265d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_512KiB,
17275d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
17285d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
17291da177e4SLinus Torvalds 		.regions	= {
17301da177e4SLinus Torvalds 			ERASEINFO(0x10000,8),
17311da177e4SLinus Torvalds 		}
17321da177e4SLinus Torvalds 	}, {
1733ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
17341da177e4SLinus Torvalds 		.dev_id		= M50FW080,
17351da177e4SLinus Torvalds 		.name		= "ST M50FW080",
17365d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
17375d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
17385d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
17395d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
17405d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
17411da177e4SLinus Torvalds 		.regions	= {
17421da177e4SLinus Torvalds 			ERASEINFO(0x10000,16),
17431da177e4SLinus Torvalds 		}
17441da177e4SLinus Torvalds 	}, {
1745ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
17461da177e4SLinus Torvalds 		.dev_id		= M50FW016,
17471da177e4SLinus Torvalds 		.name		= "ST M50FW016",
17485d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
17495d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
17505d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
17515d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
17525d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
17531da177e4SLinus Torvalds 		.regions	= {
17541da177e4SLinus Torvalds 			ERASEINFO(0x10000,32),
17551da177e4SLinus Torvalds 		}
17561da177e4SLinus Torvalds 	}, {
1757ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
17581da177e4SLinus Torvalds 		.dev_id		= M50LPW080,
17591da177e4SLinus Torvalds 		.name		= "ST M50LPW080",
17605d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
17615d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_UNNECESSARY,
17625d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_1MiB,
17635d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_INTEL_EXT,
17645d3cce3bSDavid Woodhouse 		.nr_regions	= 1,
17651da177e4SLinus Torvalds 		.regions	= {
17661da177e4SLinus Torvalds 			ERASEINFO(0x10000,16),
1767deb1a5f1SNate Case 		},
1768deb1a5f1SNate Case 	}, {
1769ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
1770deb1a5f1SNate Case 		.dev_id		= M50FLW080A,
1771deb1a5f1SNate Case 		.name		= "ST M50FLW080A",
1772deb1a5f1SNate Case 		.devtypes	= CFI_DEVICETYPE_X8,
1773deb1a5f1SNate Case 		.uaddr		= MTD_UADDR_UNNECESSARY,
1774deb1a5f1SNate Case 		.dev_size	= SIZE_1MiB,
1775deb1a5f1SNate Case 		.cmd_set	= P_ID_INTEL_EXT,
1776deb1a5f1SNate Case 		.nr_regions	= 4,
1777deb1a5f1SNate Case 		.regions	= {
1778deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
1779deb1a5f1SNate Case 			ERASEINFO(0x10000,13),
1780deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
1781deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
1782deb1a5f1SNate Case 		}
1783deb1a5f1SNate Case 	}, {
1784ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_ST,
1785deb1a5f1SNate Case 		.dev_id		= M50FLW080B,
1786deb1a5f1SNate Case 		.name		= "ST M50FLW080B",
1787deb1a5f1SNate Case 		.devtypes	= CFI_DEVICETYPE_X8,
1788deb1a5f1SNate Case 		.uaddr		= MTD_UADDR_UNNECESSARY,
1789deb1a5f1SNate Case 		.dev_size	= SIZE_1MiB,
1790deb1a5f1SNate Case 		.cmd_set	= P_ID_INTEL_EXT,
1791deb1a5f1SNate Case 		.nr_regions	= 4,
1792deb1a5f1SNate Case 		.regions	= {
1793deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
1794deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
1795deb1a5f1SNate Case 			ERASEINFO(0x10000,13),
1796deb1a5f1SNate Case 			ERASEINFO(0x1000,16),
17971da177e4SLinus Torvalds 		}
17981da177e4SLinus Torvalds 	}, {
1799ae731822SWolfram Sang 		.mfr_id		= 0xff00 | CFI_MFR_ST,
1800e1070211SMike Frysinger 		.dev_id		= 0xff00 | PSD4256G6V,
1801e1070211SMike Frysinger 		.name		= "ST PSD4256G6V",
1802e1070211SMike Frysinger 		.devtypes	= CFI_DEVICETYPE_X16,
1803e1070211SMike Frysinger 		.uaddr		= MTD_UADDR_0x0AAA_0x0554,
1804e1070211SMike Frysinger 		.dev_size	= SIZE_1MiB,
1805e1070211SMike Frysinger 		.cmd_set	= P_ID_AMD_STD,
1806e1070211SMike Frysinger 		.nr_regions	= 1,
1807e1070211SMike Frysinger 		.regions	= {
1808e1070211SMike Frysinger 			ERASEINFO(0x10000,16),
1809e1070211SMike Frysinger 		}
1810e1070211SMike Frysinger 	}, {
1811ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18121da177e4SLinus Torvalds 		.dev_id		= TC58FVT160,
18131da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVT160",
18145d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18155d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18165d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
18175d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18185d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
18191da177e4SLinus Torvalds 		.regions	= {
18201da177e4SLinus Torvalds 			ERASEINFO(0x10000,31),
18211da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
18221da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
18231da177e4SLinus Torvalds 			ERASEINFO(0x04000,1)
18241da177e4SLinus Torvalds 		}
18251da177e4SLinus Torvalds 	}, {
1826ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18271da177e4SLinus Torvalds 		.dev_id		= TC58FVB160,
18281da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVB160",
18295d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18305d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18315d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_2MiB,
18325d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18335d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
18341da177e4SLinus Torvalds 		.regions	= {
18351da177e4SLinus Torvalds 			ERASEINFO(0x04000,1),
18361da177e4SLinus Torvalds 			ERASEINFO(0x02000,2),
18371da177e4SLinus Torvalds 			ERASEINFO(0x08000,1),
18381da177e4SLinus Torvalds 			ERASEINFO(0x10000,31)
18391da177e4SLinus Torvalds 		}
18401da177e4SLinus Torvalds 	}, {
1841ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18421da177e4SLinus Torvalds 		.dev_id		= TC58FVB321,
18431da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVB321",
18445d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18455d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18465d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
18475d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18485d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
18491da177e4SLinus Torvalds 		.regions	= {
18501da177e4SLinus Torvalds 			ERASEINFO(0x02000,8),
18511da177e4SLinus Torvalds 			ERASEINFO(0x10000,63)
18521da177e4SLinus Torvalds 		}
18531da177e4SLinus Torvalds 	}, {
1854ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18551da177e4SLinus Torvalds 		.dev_id		= TC58FVT321,
18561da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVT321",
18575d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18585d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18595d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_4MiB,
18605d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18615d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
18621da177e4SLinus Torvalds 		.regions	= {
18631da177e4SLinus Torvalds 			ERASEINFO(0x10000,63),
18641da177e4SLinus Torvalds 			ERASEINFO(0x02000,8)
18651da177e4SLinus Torvalds 		}
18661da177e4SLinus Torvalds 	}, {
1867ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18681da177e4SLinus Torvalds 		.dev_id		= TC58FVB641,
18691da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVB641",
18705d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18715d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18725d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
18735d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18745d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
18751da177e4SLinus Torvalds 		.regions	= {
18761da177e4SLinus Torvalds 			ERASEINFO(0x02000,8),
18771da177e4SLinus Torvalds 			ERASEINFO(0x10000,127)
18781da177e4SLinus Torvalds 		}
18791da177e4SLinus Torvalds 	}, {
1880ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_TOSHIBA,
18811da177e4SLinus Torvalds 		.dev_id		= TC58FVT641,
18821da177e4SLinus Torvalds 		.name		= "Toshiba TC58FVT641",
18835d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8,
18845d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x0AAA_0x0555,
18855d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_8MiB,
18865d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
18875d3cce3bSDavid Woodhouse 		.nr_regions	= 2,
18881da177e4SLinus Torvalds 		.regions	= {
18891da177e4SLinus Torvalds 			ERASEINFO(0x10000,127),
18901da177e4SLinus Torvalds 			ERASEINFO(0x02000,8)
18911da177e4SLinus Torvalds 		}
18921da177e4SLinus Torvalds 	}, {
1893ae731822SWolfram Sang 		.mfr_id		= CFI_MFR_WINBOND,
18941da177e4SLinus Torvalds 		.dev_id		= W49V002A,
18951da177e4SLinus Torvalds 		.name		= "Winbond W49V002A",
18965d3cce3bSDavid Woodhouse 		.devtypes	= CFI_DEVICETYPE_X8,
18975d3cce3bSDavid Woodhouse 		.uaddr		= MTD_UADDR_0x5555_0x2AAA,
18985d3cce3bSDavid Woodhouse 		.dev_size	= SIZE_256KiB,
18995d3cce3bSDavid Woodhouse 		.cmd_set	= P_ID_AMD_STD,
19005d3cce3bSDavid Woodhouse 		.nr_regions	= 4,
19011da177e4SLinus Torvalds 		.regions	= {
19021da177e4SLinus Torvalds 			ERASEINFO(0x10000, 3),
19031da177e4SLinus Torvalds 			ERASEINFO(0x08000, 1),
19041da177e4SLinus Torvalds 			ERASEINFO(0x02000, 2),
19051da177e4SLinus Torvalds 			ERASEINFO(0x04000, 1),
19061da177e4SLinus Torvalds 		}
19071da177e4SLinus Torvalds 	}
19081da177e4SLinus Torvalds };
19091da177e4SLinus Torvalds 
19105d3cce3bSDavid Woodhouse static inline u32 jedec_read_mfr(struct map_info *map, uint32_t base,
19111da177e4SLinus Torvalds 	struct cfi_private *cfi)
19121da177e4SLinus Torvalds {
19131da177e4SLinus Torvalds 	map_word result;
19141da177e4SLinus Torvalds 	unsigned long mask;
19155c9c11e1SMike Rapoport 	int bank = 0;
19165c9c11e1SMike Rapoport 
19175c9c11e1SMike Rapoport 	/* According to JEDEC "Standard Manufacturer's Identification Code"
19185c9c11e1SMike Rapoport 	 * (http://www.jedec.org/download/search/jep106W.pdf)
19195c9c11e1SMike Rapoport 	 * several first banks can contain 0x7f instead of actual ID
19205c9c11e1SMike Rapoport 	 */
19215c9c11e1SMike Rapoport 	do {
1922467622efSEric W. Biederman 		uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi);
19231da177e4SLinus Torvalds 		mask = (1 << (cfi->device_type * 8)) - 1;
1924*87a73eb5SLinus Walleij 		if (ofs >= map->size)
1925*87a73eb5SLinus Walleij 			return 0;
19261da177e4SLinus Torvalds 		result = map_read(map, base + ofs);
19275c9c11e1SMike Rapoport 		bank++;
1928ae731822SWolfram Sang 	} while ((result.x[0] & mask) == CFI_MFR_CONTINUATION);
19295c9c11e1SMike Rapoport 
19301da177e4SLinus Torvalds 	return result.x[0] & mask;
19311da177e4SLinus Torvalds }
19321da177e4SLinus Torvalds 
19335d3cce3bSDavid Woodhouse static inline u32 jedec_read_id(struct map_info *map, uint32_t base,
19341da177e4SLinus Torvalds 	struct cfi_private *cfi)
19351da177e4SLinus Torvalds {
19361da177e4SLinus Torvalds 	map_word result;
19371da177e4SLinus Torvalds 	unsigned long mask;
1938467622efSEric W. Biederman 	u32 ofs = cfi_build_cmd_addr(1, map, cfi);
19391da177e4SLinus Torvalds 	mask = (1 << (cfi->device_type * 8)) -1;
19401da177e4SLinus Torvalds 	result = map_read(map, base + ofs);
19411da177e4SLinus Torvalds 	return result.x[0] & mask;
19421da177e4SLinus Torvalds }
19431da177e4SLinus Torvalds 
194453d88553SIlpo Järvinen static void jedec_reset(u32 base, struct map_info *map, struct cfi_private *cfi)
19451da177e4SLinus Torvalds {
19461da177e4SLinus Torvalds 	/* Reset */
19471da177e4SLinus Torvalds 
19481da177e4SLinus Torvalds 	/* after checking the datasheets for SST, MACRONIX and ATMEL
19491da177e4SLinus Torvalds 	 * (oh and incidentaly the jedec spec - 3.5.3.3) the reset
19501da177e4SLinus Torvalds 	 * sequence is *supposed* to be 0xaa at 0x5555, 0x55 at
19511da177e4SLinus Torvalds 	 * 0x2aaa, 0xF0 at 0x5555 this will not affect the AMD chips
19527854d3f7SBrian Norris 	 * as they will ignore the writes and don't care what address
19531da177e4SLinus Torvalds 	 * the F0 is written to */
19541da177e4SLinus Torvalds 	if (cfi->addr_unlock1) {
1955289c0522SBrian Norris 		pr_debug( "reset unlock called %x %x \n",
19561da177e4SLinus Torvalds 		       cfi->addr_unlock1,cfi->addr_unlock2);
19571da177e4SLinus Torvalds 		cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
19581da177e4SLinus Torvalds 		cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
19591da177e4SLinus Torvalds 	}
19601da177e4SLinus Torvalds 
19611da177e4SLinus Torvalds 	cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
1962cec80bf2SDavid Woodhouse 	/* Some misdesigned Intel chips do not respond for 0xF0 for a reset,
19631da177e4SLinus Torvalds 	 * so ensure we're in read mode.  Send both the Intel and the AMD command
19641da177e4SLinus Torvalds 	 * for this.  Intel uses 0xff for this, AMD uses 0xff for NOP, so
19651da177e4SLinus Torvalds 	 * this should be safe.
19661da177e4SLinus Torvalds 	 */
19671da177e4SLinus Torvalds 	cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL);
19681da177e4SLinus Torvalds 	/* FIXME - should have reset delay before continuing */
19691da177e4SLinus Torvalds }
19701da177e4SLinus Torvalds 
19711da177e4SLinus Torvalds 
1972ceabebb2SAntony Pavlov static int cfi_jedec_setup(struct map_info *map, struct cfi_private *cfi, int index)
19731da177e4SLinus Torvalds {
19741da177e4SLinus Torvalds 	int i,num_erase_regions;
19755d3cce3bSDavid Woodhouse 	uint8_t uaddr;
19761da177e4SLinus Torvalds 
1977efba2e31SAntony Pavlov 	if (!(jedec_table[index].devtypes & cfi->device_type)) {
1978289c0522SBrian Norris 		pr_debug("Rejecting potential %s with incompatible %d-bit device type\n",
1979efba2e31SAntony Pavlov 		      jedec_table[index].name, 4 * (1<<cfi->device_type));
19805d3cce3bSDavid Woodhouse 		return 0;
19815d3cce3bSDavid Woodhouse 	}
19821da177e4SLinus Torvalds 
19835d3cce3bSDavid Woodhouse 	printk(KERN_INFO "Found: %s\n",jedec_table[index].name);
19845d3cce3bSDavid Woodhouse 
19855d3cce3bSDavid Woodhouse 	num_erase_regions = jedec_table[index].nr_regions;
19861da177e4SLinus Torvalds 
1987efba2e31SAntony Pavlov 	cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + num_erase_regions * 4, GFP_KERNEL);
1988efba2e31SAntony Pavlov 	if (!cfi->cfiq) {
19891da177e4SLinus Torvalds 		//xx printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure\n", map->name);
19901da177e4SLinus Torvalds 		return 0;
19911da177e4SLinus Torvalds 	}
19921da177e4SLinus Torvalds 
1993efba2e31SAntony Pavlov 	memset(cfi->cfiq, 0, sizeof(struct cfi_ident));
19941da177e4SLinus Torvalds 
1995efba2e31SAntony Pavlov 	cfi->cfiq->P_ID = jedec_table[index].cmd_set;
1996efba2e31SAntony Pavlov 	cfi->cfiq->NumEraseRegions = jedec_table[index].nr_regions;
1997efba2e31SAntony Pavlov 	cfi->cfiq->DevSize = jedec_table[index].dev_size;
1998efba2e31SAntony Pavlov 	cfi->cfi_mode = CFI_MODE_JEDEC;
1999ceabebb2SAntony Pavlov 	cfi->sector_erase_cmd = CMD(0x30);
20001da177e4SLinus Torvalds 
20011da177e4SLinus Torvalds 	for (i=0; i<num_erase_regions; i++){
2002efba2e31SAntony Pavlov 		cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i];
20031da177e4SLinus Torvalds 	}
2004efba2e31SAntony Pavlov 	cfi->cmdset_priv = NULL;
20051da177e4SLinus Torvalds 
20061da177e4SLinus Torvalds 	/* This may be redundant for some cases, but it doesn't hurt */
2007efba2e31SAntony Pavlov 	cfi->mfr = jedec_table[index].mfr_id;
2008efba2e31SAntony Pavlov 	cfi->id = jedec_table[index].dev_id;
20091da177e4SLinus Torvalds 
20105d3cce3bSDavid Woodhouse 	uaddr = jedec_table[index].uaddr;
20111da177e4SLinus Torvalds 
2012cec80bf2SDavid Woodhouse 	/* The table has unlock addresses in _bytes_, and we try not to let
2013cec80bf2SDavid Woodhouse 	   our brains explode when we see the datasheets talking about address
2014cec80bf2SDavid Woodhouse 	   lines numbered from A-1 to A18. The CFI table has unlock addresses
2015cec80bf2SDavid Woodhouse 	   in device-words according to the mode the device is connected in */
2016efba2e31SAntony Pavlov 	cfi->addr_unlock1 = unlock_addrs[uaddr].addr1 / cfi->device_type;
2017efba2e31SAntony Pavlov 	cfi->addr_unlock2 = unlock_addrs[uaddr].addr2 / cfi->device_type;
20181da177e4SLinus Torvalds 
20191da177e4SLinus Torvalds 	return 1;	/* ok */
20201da177e4SLinus Torvalds }
20211da177e4SLinus Torvalds 
20221da177e4SLinus Torvalds 
20231da177e4SLinus Torvalds /*
2024f33686b5SAlexey Dobriyan  * There is a BIG problem properly ID'ing the JEDEC device and guaranteeing
20251da177e4SLinus Torvalds  * the mapped address, unlock addresses, and proper chip ID.  This function
20261da177e4SLinus Torvalds  * attempts to minimize errors.  It is doubtfull that this probe will ever
20271da177e4SLinus Torvalds  * be perfect - consequently there should be some module parameters that
20281da177e4SLinus Torvalds  * could be manually specified to force the chip info.
20291da177e4SLinus Torvalds  */
20305d3cce3bSDavid Woodhouse static inline int jedec_match( uint32_t base,
20311da177e4SLinus Torvalds 			       struct map_info *map,
20321da177e4SLinus Torvalds 			       struct cfi_private *cfi,
20331da177e4SLinus Torvalds 			       const struct amd_flash_info *finfo )
20341da177e4SLinus Torvalds {
20351da177e4SLinus Torvalds 	int rc = 0;           /* failure until all tests pass */
20361da177e4SLinus Torvalds 	u32 mfr, id;
20375d3cce3bSDavid Woodhouse 	uint8_t uaddr;
20381da177e4SLinus Torvalds 
20391da177e4SLinus Torvalds 	/*
20401da177e4SLinus Torvalds 	 * The IDs must match.  For X16 and X32 devices operating in
20411da177e4SLinus Torvalds 	 * a lower width ( X8 or X16 ), the device ID's are usually just
20421da177e4SLinus Torvalds 	 * the lower byte(s) of the larger device ID for wider mode.  If
20431da177e4SLinus Torvalds 	 * a part is found that doesn't fit this assumption (device id for
20441da177e4SLinus Torvalds 	 * smaller width mode is completely unrealated to full-width mode)
20451da177e4SLinus Torvalds 	 * then the jedec_table[] will have to be augmented with the IDs
20461da177e4SLinus Torvalds 	 * for different widths.
20471da177e4SLinus Torvalds 	 */
20481da177e4SLinus Torvalds 	switch (cfi->device_type) {
20491da177e4SLinus Torvalds 	case CFI_DEVICETYPE_X8:
20505d3cce3bSDavid Woodhouse 		mfr = (uint8_t)finfo->mfr_id;
20515d3cce3bSDavid Woodhouse 		id = (uint8_t)finfo->dev_id;
2052011b2a36SBen Dooks 
2053011b2a36SBen Dooks 		/* bjd: it seems that if we do this, we can end up
2054011b2a36SBen Dooks 		 * detecting 16bit flashes as an 8bit device, even though
2055011b2a36SBen Dooks 		 * there aren't.
2056011b2a36SBen Dooks 		 */
2057011b2a36SBen Dooks 		if (finfo->dev_id > 0xff) {
2058289c0522SBrian Norris 			pr_debug("%s(): ID is not 8bit\n",
2059011b2a36SBen Dooks 			       __func__);
2060011b2a36SBen Dooks 			goto match_done;
2061011b2a36SBen Dooks 		}
20621da177e4SLinus Torvalds 		break;
20631da177e4SLinus Torvalds 	case CFI_DEVICETYPE_X16:
20645d3cce3bSDavid Woodhouse 		mfr = (uint16_t)finfo->mfr_id;
20655d3cce3bSDavid Woodhouse 		id = (uint16_t)finfo->dev_id;
20661da177e4SLinus Torvalds 		break;
20671da177e4SLinus Torvalds 	case CFI_DEVICETYPE_X32:
20685d3cce3bSDavid Woodhouse 		mfr = (uint16_t)finfo->mfr_id;
20695d3cce3bSDavid Woodhouse 		id = (uint32_t)finfo->dev_id;
20701da177e4SLinus Torvalds 		break;
20711da177e4SLinus Torvalds 	default:
20721da177e4SLinus Torvalds 		printk(KERN_WARNING
20731da177e4SLinus Torvalds 		       "MTD %s(): Unsupported device type %d\n",
20741da177e4SLinus Torvalds 		       __func__, cfi->device_type);
20751da177e4SLinus Torvalds 		goto match_done;
20761da177e4SLinus Torvalds 	}
20771da177e4SLinus Torvalds 	if ( cfi->mfr != mfr || cfi->id != id ) {
20781da177e4SLinus Torvalds 		goto match_done;
20791da177e4SLinus Torvalds 	}
20801da177e4SLinus Torvalds 
20811da177e4SLinus Torvalds 	/* the part size must fit in the memory window */
2082289c0522SBrian Norris 	pr_debug("MTD %s(): Check fit 0x%.8x + 0x%.8x = 0x%.8x\n",
20835d3cce3bSDavid Woodhouse 	       __func__, base, 1 << finfo->dev_size, base + (1 << finfo->dev_size) );
20845d3cce3bSDavid Woodhouse 	if ( base + cfi_interleave(cfi) * ( 1 << finfo->dev_size ) > map->size ) {
2085289c0522SBrian Norris 		pr_debug("MTD %s(): 0x%.4x 0x%.4x %dKiB doesn't fit\n",
20861da177e4SLinus Torvalds 		       __func__, finfo->mfr_id, finfo->dev_id,
20875d3cce3bSDavid Woodhouse 		       1 << finfo->dev_size );
20881da177e4SLinus Torvalds 		goto match_done;
20891da177e4SLinus Torvalds 	}
20901da177e4SLinus Torvalds 
20915d3cce3bSDavid Woodhouse 	if (! (finfo->devtypes & cfi->device_type))
20921da177e4SLinus Torvalds 		goto match_done;
20935d3cce3bSDavid Woodhouse 
20945d3cce3bSDavid Woodhouse 	uaddr = finfo->uaddr;
20951da177e4SLinus Torvalds 
2096289c0522SBrian Norris 	pr_debug("MTD %s(): check unlock addrs 0x%.4x 0x%.4x\n",
20971da177e4SLinus Torvalds 	       __func__, cfi->addr_unlock1, cfi->addr_unlock2 );
20981da177e4SLinus Torvalds 	if ( MTD_UADDR_UNNECESSARY != uaddr && MTD_UADDR_DONT_CARE != uaddr
2099cec80bf2SDavid Woodhouse 	     && ( unlock_addrs[uaddr].addr1 / cfi->device_type != cfi->addr_unlock1 ||
2100cec80bf2SDavid Woodhouse 		  unlock_addrs[uaddr].addr2 / cfi->device_type != cfi->addr_unlock2 ) ) {
2101289c0522SBrian Norris 		pr_debug("MTD %s(): 0x%.4x 0x%.4x did not match\n",
21021da177e4SLinus Torvalds 			__func__,
21031da177e4SLinus Torvalds 			unlock_addrs[uaddr].addr1,
21041da177e4SLinus Torvalds 			unlock_addrs[uaddr].addr2);
21051da177e4SLinus Torvalds 		goto match_done;
21061da177e4SLinus Torvalds 	}
21071da177e4SLinus Torvalds 
21081da177e4SLinus Torvalds 	/*
210925985edcSLucas De Marchi 	 * Make sure the ID's disappear when the device is taken out of
21101da177e4SLinus Torvalds 	 * ID mode.  The only time this should fail when it should succeed
21111da177e4SLinus Torvalds 	 * is when the ID's are written as data to the same
21121da177e4SLinus Torvalds 	 * addresses.  For this rare and unfortunate case the chip
21131da177e4SLinus Torvalds 	 * cannot be probed correctly.
21141da177e4SLinus Torvalds 	 * FIXME - write a driver that takes all of the chip info as
21151da177e4SLinus Torvalds 	 * module parameters, doesn't probe but forces a load.
21161da177e4SLinus Torvalds 	 */
2117289c0522SBrian Norris 	pr_debug("MTD %s(): check ID's disappear when not in ID mode\n",
21181da177e4SLinus Torvalds 	       __func__ );
21191da177e4SLinus Torvalds 	jedec_reset( base, map, cfi );
21201da177e4SLinus Torvalds 	mfr = jedec_read_mfr( map, base, cfi );
21211da177e4SLinus Torvalds 	id = jedec_read_id( map, base, cfi );
21221da177e4SLinus Torvalds 	if ( mfr == cfi->mfr && id == cfi->id ) {
2123289c0522SBrian Norris 		pr_debug("MTD %s(): ID 0x%.2x:0x%.2x did not change after reset:\n"
21241da177e4SLinus Torvalds 		       "You might need to manually specify JEDEC parameters.\n",
21251da177e4SLinus Torvalds 			__func__, cfi->mfr, cfi->id );
21261da177e4SLinus Torvalds 		goto match_done;
21271da177e4SLinus Torvalds 	}
21281da177e4SLinus Torvalds 
21291da177e4SLinus Torvalds 	/* all tests passed - mark  as success */
21301da177e4SLinus Torvalds 	rc = 1;
21311da177e4SLinus Torvalds 
21321da177e4SLinus Torvalds 	/*
21331da177e4SLinus Torvalds 	 * Put the device back in ID mode - only need to do this if we
21341da177e4SLinus Torvalds 	 * were truly frobbing a real device.
21351da177e4SLinus Torvalds 	 */
2136289c0522SBrian Norris 	pr_debug("MTD %s(): return to ID mode\n", __func__ );
21371da177e4SLinus Torvalds 	if (cfi->addr_unlock1) {
21381da177e4SLinus Torvalds 		cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21391da177e4SLinus Torvalds 		cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
21401da177e4SLinus Torvalds 	}
21411da177e4SLinus Torvalds 	cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21421da177e4SLinus Torvalds 	/* FIXME - should have a delay before continuing */
21431da177e4SLinus Torvalds 
21441da177e4SLinus Torvalds  match_done:
21451da177e4SLinus Torvalds 	return rc;
21461da177e4SLinus Torvalds }
21471da177e4SLinus Torvalds 
21481da177e4SLinus Torvalds 
21491da177e4SLinus Torvalds static int jedec_probe_chip(struct map_info *map, __u32 base,
21501da177e4SLinus Torvalds 			    unsigned long *chip_map, struct cfi_private *cfi)
21511da177e4SLinus Torvalds {
21521da177e4SLinus Torvalds 	int i;
21531da177e4SLinus Torvalds 	enum uaddr uaddr_idx = MTD_UADDR_NOT_SUPPORTED;
21541da177e4SLinus Torvalds 	u32 probe_offset1, probe_offset2;
21551da177e4SLinus Torvalds 
21561da177e4SLinus Torvalds  retry:
21571da177e4SLinus Torvalds 	if (!cfi->numchips) {
21581da177e4SLinus Torvalds 		uaddr_idx++;
21591da177e4SLinus Torvalds 
21601da177e4SLinus Torvalds 		if (MTD_UADDR_UNNECESSARY == uaddr_idx)
21611da177e4SLinus Torvalds 			return 0;
21621da177e4SLinus Torvalds 
2163cec80bf2SDavid Woodhouse 		cfi->addr_unlock1 = unlock_addrs[uaddr_idx].addr1 / cfi->device_type;
2164cec80bf2SDavid Woodhouse 		cfi->addr_unlock2 = unlock_addrs[uaddr_idx].addr2 / cfi->device_type;
21651da177e4SLinus Torvalds 	}
21661da177e4SLinus Torvalds 
21671da177e4SLinus Torvalds 	/* Make certain we aren't probing past the end of map */
21681da177e4SLinus Torvalds 	if (base >= map->size) {
21691da177e4SLinus Torvalds 		printk(KERN_NOTICE
21701da177e4SLinus Torvalds 			"Probe at base(0x%08x) past the end of the map(0x%08lx)\n",
21711da177e4SLinus Torvalds 			base, map->size -1);
21721da177e4SLinus Torvalds 		return 0;
21731da177e4SLinus Torvalds 
21741da177e4SLinus Torvalds 	}
21751da177e4SLinus Torvalds 	/* Ensure the unlock addresses we try stay inside the map */
2176467622efSEric W. Biederman 	probe_offset1 = cfi_build_cmd_addr(cfi->addr_unlock1, map, cfi);
2177467622efSEric W. Biederman 	probe_offset2 = cfi_build_cmd_addr(cfi->addr_unlock2, map, cfi);
21781da177e4SLinus Torvalds 	if (	((base + probe_offset1 + map_bankwidth(map)) >= map->size) ||
21791da177e4SLinus Torvalds 		((base + probe_offset2 + map_bankwidth(map)) >= map->size))
21801da177e4SLinus Torvalds 		goto retry;
21811da177e4SLinus Torvalds 
21821da177e4SLinus Torvalds 	/* Reset */
21831da177e4SLinus Torvalds 	jedec_reset(base, map, cfi);
21841da177e4SLinus Torvalds 
21851da177e4SLinus Torvalds 	/* Autoselect Mode */
21861da177e4SLinus Torvalds 	if(cfi->addr_unlock1) {
21871da177e4SLinus Torvalds 		cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21881da177e4SLinus Torvalds 		cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);
21891da177e4SLinus Torvalds 	}
21901da177e4SLinus Torvalds 	cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);
21911da177e4SLinus Torvalds 	/* FIXME - should have a delay before continuing */
21921da177e4SLinus Torvalds 
21931da177e4SLinus Torvalds 	if (!cfi->numchips) {
21941da177e4SLinus Torvalds 		/* This is the first time we're called. Set up the CFI
21951da177e4SLinus Torvalds 		   stuff accordingly and return */
21961da177e4SLinus Torvalds 
21971da177e4SLinus Torvalds 		cfi->mfr = jedec_read_mfr(map, base, cfi);
21981da177e4SLinus Torvalds 		cfi->id = jedec_read_id(map, base, cfi);
2199289c0522SBrian Norris 		pr_debug("Search for id:(%02x %02x) interleave(%d) type(%d)\n",
22001da177e4SLinus Torvalds 			cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type);
220187d10f3cSTobias Klauser 		for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {
22021da177e4SLinus Torvalds 			if ( jedec_match( base, map, cfi, &jedec_table[i] ) ) {
2203289c0522SBrian Norris 				pr_debug("MTD %s(): matched device 0x%x,0x%x unlock_addrs: 0x%.4x 0x%.4x\n",
22041da177e4SLinus Torvalds 				       __func__, cfi->mfr, cfi->id,
22051da177e4SLinus Torvalds 				       cfi->addr_unlock1, cfi->addr_unlock2 );
2206ceabebb2SAntony Pavlov 				if (!cfi_jedec_setup(map, cfi, i))
22071da177e4SLinus Torvalds 					return 0;
22081da177e4SLinus Torvalds 				goto ok_out;
22091da177e4SLinus Torvalds 			}
22101da177e4SLinus Torvalds 		}
22111da177e4SLinus Torvalds 		goto retry;
22121da177e4SLinus Torvalds 	} else {
22135d3cce3bSDavid Woodhouse 		uint16_t mfr;
22145d3cce3bSDavid Woodhouse 		uint16_t id;
22151da177e4SLinus Torvalds 
22161da177e4SLinus Torvalds 		/* Make sure it is a chip of the same manufacturer and id */
22171da177e4SLinus Torvalds 		mfr = jedec_read_mfr(map, base, cfi);
22181da177e4SLinus Torvalds 		id = jedec_read_id(map, base, cfi);
22191da177e4SLinus Torvalds 
22201da177e4SLinus Torvalds 		if ((mfr != cfi->mfr) || (id != cfi->id)) {
22211da177e4SLinus Torvalds 			printk(KERN_DEBUG "%s: Found different chip or no chip at all (mfr 0x%x, id 0x%x) at 0x%x\n",
22221da177e4SLinus Torvalds 			       map->name, mfr, id, base);
22231da177e4SLinus Torvalds 			jedec_reset(base, map, cfi);
22241da177e4SLinus Torvalds 			return 0;
22251da177e4SLinus Torvalds 		}
22261da177e4SLinus Torvalds 	}
22271da177e4SLinus Torvalds 
22281da177e4SLinus Torvalds 	/* Check each previous chip locations to see if it's an alias */
22291da177e4SLinus Torvalds 	for (i=0; i < (base >> cfi->chipshift); i++) {
22301da177e4SLinus Torvalds 		unsigned long start;
22311da177e4SLinus Torvalds 		if(!test_bit(i, chip_map)) {
22321da177e4SLinus Torvalds 			continue; /* Skip location; no valid chip at this address */
22331da177e4SLinus Torvalds 		}
22341da177e4SLinus Torvalds 		start = i << cfi->chipshift;
22351da177e4SLinus Torvalds 		if (jedec_read_mfr(map, start, cfi) == cfi->mfr &&
22361da177e4SLinus Torvalds 		    jedec_read_id(map, start, cfi) == cfi->id) {
22371da177e4SLinus Torvalds 			/* Eep. This chip also looks like it's in autoselect mode.
22381da177e4SLinus Torvalds 			   Is it an alias for the new one? */
22391da177e4SLinus Torvalds 			jedec_reset(start, map, cfi);
22401da177e4SLinus Torvalds 
22411da177e4SLinus Torvalds 			/* If the device IDs go away, it's an alias */
22421da177e4SLinus Torvalds 			if (jedec_read_mfr(map, base, cfi) != cfi->mfr ||
22431da177e4SLinus Torvalds 			    jedec_read_id(map, base, cfi) != cfi->id) {
22441da177e4SLinus Torvalds 				printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
22451da177e4SLinus Torvalds 				       map->name, base, start);
22461da177e4SLinus Torvalds 				return 0;
22471da177e4SLinus Torvalds 			}
22481da177e4SLinus Torvalds 
22491da177e4SLinus Torvalds 			/* Yes, it's actually got the device IDs as data. Most
22501da177e4SLinus Torvalds 			 * unfortunate. Stick the new chip in read mode
22511da177e4SLinus Torvalds 			 * too and if it's the same, assume it's an alias. */
22521da177e4SLinus Torvalds 			/* FIXME: Use other modes to do a proper check */
22531da177e4SLinus Torvalds 			jedec_reset(base, map, cfi);
22541da177e4SLinus Torvalds 			if (jedec_read_mfr(map, base, cfi) == cfi->mfr &&
22551da177e4SLinus Torvalds 			    jedec_read_id(map, base, cfi) == cfi->id) {
22561da177e4SLinus Torvalds 				printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n",
22571da177e4SLinus Torvalds 				       map->name, base, start);
22581da177e4SLinus Torvalds 				return 0;
22591da177e4SLinus Torvalds 			}
22601da177e4SLinus Torvalds 		}
22611da177e4SLinus Torvalds 	}
22621da177e4SLinus Torvalds 
22631da177e4SLinus Torvalds 	/* OK, if we got to here, then none of the previous chips appear to
22641da177e4SLinus Torvalds 	   be aliases for the current one. */
22651da177e4SLinus Torvalds 	set_bit((base >> cfi->chipshift), chip_map); /* Update chip map */
22661da177e4SLinus Torvalds 	cfi->numchips++;
22671da177e4SLinus Torvalds 
22681da177e4SLinus Torvalds ok_out:
22691da177e4SLinus Torvalds 	/* Put it back into Read Mode */
22701da177e4SLinus Torvalds 	jedec_reset(base, map, cfi);
22711da177e4SLinus Torvalds 
22721da177e4SLinus Torvalds 	printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n",
22731da177e4SLinus Torvalds 	       map->name, cfi_interleave(cfi), cfi->device_type*8, base,
22741da177e4SLinus Torvalds 	       map->bankwidth*8);
22751da177e4SLinus Torvalds 
22761da177e4SLinus Torvalds 	return 1;
22771da177e4SLinus Torvalds }
22781da177e4SLinus Torvalds 
22791da177e4SLinus Torvalds static struct chip_probe jedec_chip_probe = {
22801da177e4SLinus Torvalds 	.name = "JEDEC",
22811da177e4SLinus Torvalds 	.probe_chip = jedec_probe_chip
22821da177e4SLinus Torvalds };
22831da177e4SLinus Torvalds 
22841da177e4SLinus Torvalds static struct mtd_info *jedec_probe(struct map_info *map)
22851da177e4SLinus Torvalds {
22861da177e4SLinus Torvalds 	/*
22871da177e4SLinus Torvalds 	 * Just use the generic probe stuff to call our CFI-specific
22881da177e4SLinus Torvalds 	 * chip_probe routine in all the possible permutations, etc.
22891da177e4SLinus Torvalds 	 */
22901da177e4SLinus Torvalds 	return mtd_do_chip_probe(map, &jedec_chip_probe);
22911da177e4SLinus Torvalds }
22921da177e4SLinus Torvalds 
22931da177e4SLinus Torvalds static struct mtd_chip_driver jedec_chipdrv = {
22941da177e4SLinus Torvalds 	.probe	= jedec_probe,
22951da177e4SLinus Torvalds 	.name	= "jedec_probe",
22961da177e4SLinus Torvalds 	.module	= THIS_MODULE
22971da177e4SLinus Torvalds };
22981da177e4SLinus Torvalds 
22991da177e4SLinus Torvalds static int __init jedec_probe_init(void)
23001da177e4SLinus Torvalds {
23011da177e4SLinus Torvalds 	register_mtd_chip_driver(&jedec_chipdrv);
23021da177e4SLinus Torvalds 	return 0;
23031da177e4SLinus Torvalds }
23041da177e4SLinus Torvalds 
23051da177e4SLinus Torvalds static void __exit jedec_probe_exit(void)
23061da177e4SLinus Torvalds {
23071da177e4SLinus Torvalds 	unregister_mtd_chip_driver(&jedec_chipdrv);
23081da177e4SLinus Torvalds }
23091da177e4SLinus Torvalds 
23101da177e4SLinus Torvalds module_init(jedec_probe_init);
23111da177e4SLinus Torvalds module_exit(jedec_probe_exit);
23121da177e4SLinus Torvalds 
23131da177e4SLinus Torvalds MODULE_LICENSE("GPL");
23141da177e4SLinus Torvalds MODULE_AUTHOR("Erwin Authried <eauth@softsys.co.at> et al.");
23151da177e4SLinus Torvalds MODULE_DESCRIPTION("Probe code for JEDEC-compliant flash chips");
2316