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