18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci Common Flash Interface probe code. 38c2ecf20Sopenharmony_ci (C) 2000 Red Hat. GPL'd. 48c2ecf20Sopenharmony_ci See JEDEC (http://www.jedec.org/) standard JESD21C (section 3.5) 58c2ecf20Sopenharmony_ci for the standard this probe goes back to. 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci Occasionally maintained by Thayne Harbaugh tharbaugh at lnxi dot com 88c2ecf20Sopenharmony_ci*/ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/module.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/types.h> 138c2ecf20Sopenharmony_ci#include <linux/kernel.h> 148c2ecf20Sopenharmony_ci#include <asm/io.h> 158c2ecf20Sopenharmony_ci#include <asm/byteorder.h> 168c2ecf20Sopenharmony_ci#include <linux/errno.h> 178c2ecf20Sopenharmony_ci#include <linux/slab.h> 188c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 218c2ecf20Sopenharmony_ci#include <linux/mtd/map.h> 228c2ecf20Sopenharmony_ci#include <linux/mtd/cfi.h> 238c2ecf20Sopenharmony_ci#include <linux/mtd/gen_probe.h> 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci/* AMD */ 268c2ecf20Sopenharmony_ci#define AM29DL800BB 0x22CB 278c2ecf20Sopenharmony_ci#define AM29DL800BT 0x224A 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define AM29F800BB 0x2258 308c2ecf20Sopenharmony_ci#define AM29F800BT 0x22D6 318c2ecf20Sopenharmony_ci#define AM29LV400BB 0x22BA 328c2ecf20Sopenharmony_ci#define AM29LV400BT 0x22B9 338c2ecf20Sopenharmony_ci#define AM29LV800BB 0x225B 348c2ecf20Sopenharmony_ci#define AM29LV800BT 0x22DA 358c2ecf20Sopenharmony_ci#define AM29LV160DT 0x22C4 368c2ecf20Sopenharmony_ci#define AM29LV160DB 0x2249 378c2ecf20Sopenharmony_ci#define AM29F017D 0x003D 388c2ecf20Sopenharmony_ci#define AM29F016D 0x00AD 398c2ecf20Sopenharmony_ci#define AM29F080 0x00D5 408c2ecf20Sopenharmony_ci#define AM29F040 0x00A4 418c2ecf20Sopenharmony_ci#define AM29LV040B 0x004F 428c2ecf20Sopenharmony_ci#define AM29F032B 0x0041 438c2ecf20Sopenharmony_ci#define AM29F002T 0x00B0 448c2ecf20Sopenharmony_ci#define AM29SL800DB 0x226B 458c2ecf20Sopenharmony_ci#define AM29SL800DT 0x22EA 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* Atmel */ 488c2ecf20Sopenharmony_ci#define AT49BV512 0x0003 498c2ecf20Sopenharmony_ci#define AT29LV512 0x003d 508c2ecf20Sopenharmony_ci#define AT49BV16X 0x00C0 518c2ecf20Sopenharmony_ci#define AT49BV16XT 0x00C2 528c2ecf20Sopenharmony_ci#define AT49BV32X 0x00C8 538c2ecf20Sopenharmony_ci#define AT49BV32XT 0x00C9 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* Eon */ 568c2ecf20Sopenharmony_ci#define EN29LV400AT 0x22B9 578c2ecf20Sopenharmony_ci#define EN29LV400AB 0x22BA 588c2ecf20Sopenharmony_ci#define EN29SL800BB 0x226B 598c2ecf20Sopenharmony_ci#define EN29SL800BT 0x22EA 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* Fujitsu */ 628c2ecf20Sopenharmony_ci#define MBM29F040C 0x00A4 638c2ecf20Sopenharmony_ci#define MBM29F800BA 0x2258 648c2ecf20Sopenharmony_ci#define MBM29LV650UE 0x22D7 658c2ecf20Sopenharmony_ci#define MBM29LV320TE 0x22F6 668c2ecf20Sopenharmony_ci#define MBM29LV320BE 0x22F9 678c2ecf20Sopenharmony_ci#define MBM29LV160TE 0x22C4 688c2ecf20Sopenharmony_ci#define MBM29LV160BE 0x2249 698c2ecf20Sopenharmony_ci#define MBM29LV800BA 0x225B 708c2ecf20Sopenharmony_ci#define MBM29LV800TA 0x22DA 718c2ecf20Sopenharmony_ci#define MBM29LV400TC 0x22B9 728c2ecf20Sopenharmony_ci#define MBM29LV400BC 0x22BA 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* Hyundai */ 758c2ecf20Sopenharmony_ci#define HY29F002T 0x00B0 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci/* Intel */ 788c2ecf20Sopenharmony_ci#define I28F004B3T 0x00d4 798c2ecf20Sopenharmony_ci#define I28F004B3B 0x00d5 808c2ecf20Sopenharmony_ci#define I28F400B3T 0x8894 818c2ecf20Sopenharmony_ci#define I28F400B3B 0x8895 828c2ecf20Sopenharmony_ci#define I28F008S5 0x00a6 838c2ecf20Sopenharmony_ci#define I28F016S5 0x00a0 848c2ecf20Sopenharmony_ci#define I28F008SA 0x00a2 858c2ecf20Sopenharmony_ci#define I28F008B3T 0x00d2 868c2ecf20Sopenharmony_ci#define I28F008B3B 0x00d3 878c2ecf20Sopenharmony_ci#define I28F800B3T 0x8892 888c2ecf20Sopenharmony_ci#define I28F800B3B 0x8893 898c2ecf20Sopenharmony_ci#define I28F016S3 0x00aa 908c2ecf20Sopenharmony_ci#define I28F016B3T 0x00d0 918c2ecf20Sopenharmony_ci#define I28F016B3B 0x00d1 928c2ecf20Sopenharmony_ci#define I28F160B3T 0x8890 938c2ecf20Sopenharmony_ci#define I28F160B3B 0x8891 948c2ecf20Sopenharmony_ci#define I28F320B3T 0x8896 958c2ecf20Sopenharmony_ci#define I28F320B3B 0x8897 968c2ecf20Sopenharmony_ci#define I28F640B3T 0x8898 978c2ecf20Sopenharmony_ci#define I28F640B3B 0x8899 988c2ecf20Sopenharmony_ci#define I28F640C3B 0x88CD 998c2ecf20Sopenharmony_ci#define I28F160F3T 0x88F3 1008c2ecf20Sopenharmony_ci#define I28F160F3B 0x88F4 1018c2ecf20Sopenharmony_ci#define I28F160C3T 0x88C2 1028c2ecf20Sopenharmony_ci#define I28F160C3B 0x88C3 1038c2ecf20Sopenharmony_ci#define I82802AB 0x00ad 1048c2ecf20Sopenharmony_ci#define I82802AC 0x00ac 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci/* Macronix */ 1078c2ecf20Sopenharmony_ci#define MX29LV040C 0x004F 1088c2ecf20Sopenharmony_ci#define MX29LV160T 0x22C4 1098c2ecf20Sopenharmony_ci#define MX29LV160B 0x2249 1108c2ecf20Sopenharmony_ci#define MX29F040 0x00A4 1118c2ecf20Sopenharmony_ci#define MX29F016 0x00AD 1128c2ecf20Sopenharmony_ci#define MX29F002T 0x00B0 1138c2ecf20Sopenharmony_ci#define MX29F004T 0x0045 1148c2ecf20Sopenharmony_ci#define MX29F004B 0x0046 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci/* NEC */ 1178c2ecf20Sopenharmony_ci#define UPD29F064115 0x221C 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci/* PMC */ 1208c2ecf20Sopenharmony_ci#define PM49FL002 0x006D 1218c2ecf20Sopenharmony_ci#define PM49FL004 0x006E 1228c2ecf20Sopenharmony_ci#define PM49FL008 0x006A 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci/* Sharp */ 1258c2ecf20Sopenharmony_ci#define LH28F640BF 0x00B0 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci/* ST - www.st.com */ 1288c2ecf20Sopenharmony_ci#define M29F800AB 0x0058 1298c2ecf20Sopenharmony_ci#define M29W800DT 0x22D7 1308c2ecf20Sopenharmony_ci#define M29W800DB 0x225B 1318c2ecf20Sopenharmony_ci#define M29W400DT 0x00EE 1328c2ecf20Sopenharmony_ci#define M29W400DB 0x00EF 1338c2ecf20Sopenharmony_ci#define M29W160DT 0x22C4 1348c2ecf20Sopenharmony_ci#define M29W160DB 0x2249 1358c2ecf20Sopenharmony_ci#define M29W040B 0x00E3 1368c2ecf20Sopenharmony_ci#define M50FW040 0x002C 1378c2ecf20Sopenharmony_ci#define M50FW080 0x002D 1388c2ecf20Sopenharmony_ci#define M50FW016 0x002E 1398c2ecf20Sopenharmony_ci#define M50LPW080 0x002F 1408c2ecf20Sopenharmony_ci#define M50FLW080A 0x0080 1418c2ecf20Sopenharmony_ci#define M50FLW080B 0x0081 1428c2ecf20Sopenharmony_ci#define PSD4256G6V 0x00e9 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci/* SST */ 1458c2ecf20Sopenharmony_ci#define SST29EE020 0x0010 1468c2ecf20Sopenharmony_ci#define SST29LE020 0x0012 1478c2ecf20Sopenharmony_ci#define SST29EE512 0x005d 1488c2ecf20Sopenharmony_ci#define SST29LE512 0x003d 1498c2ecf20Sopenharmony_ci#define SST39LF800 0x2781 1508c2ecf20Sopenharmony_ci#define SST39LF160 0x2782 1518c2ecf20Sopenharmony_ci#define SST39VF1601 0x234b 1528c2ecf20Sopenharmony_ci#define SST39VF3201 0x235b 1538c2ecf20Sopenharmony_ci#define SST39WF1601 0x274b 1548c2ecf20Sopenharmony_ci#define SST39WF1602 0x274a 1558c2ecf20Sopenharmony_ci#define SST39LF512 0x00D4 1568c2ecf20Sopenharmony_ci#define SST39LF010 0x00D5 1578c2ecf20Sopenharmony_ci#define SST39LF020 0x00D6 1588c2ecf20Sopenharmony_ci#define SST39LF040 0x00D7 1598c2ecf20Sopenharmony_ci#define SST39SF010A 0x00B5 1608c2ecf20Sopenharmony_ci#define SST39SF020A 0x00B6 1618c2ecf20Sopenharmony_ci#define SST39SF040 0x00B7 1628c2ecf20Sopenharmony_ci#define SST49LF004B 0x0060 1638c2ecf20Sopenharmony_ci#define SST49LF040B 0x0050 1648c2ecf20Sopenharmony_ci#define SST49LF008A 0x005a 1658c2ecf20Sopenharmony_ci#define SST49LF030A 0x001C 1668c2ecf20Sopenharmony_ci#define SST49LF040A 0x0051 1678c2ecf20Sopenharmony_ci#define SST49LF080A 0x005B 1688c2ecf20Sopenharmony_ci#define SST36VF3203 0x7354 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci/* Toshiba */ 1718c2ecf20Sopenharmony_ci#define TC58FVT160 0x00C2 1728c2ecf20Sopenharmony_ci#define TC58FVB160 0x0043 1738c2ecf20Sopenharmony_ci#define TC58FVT321 0x009A 1748c2ecf20Sopenharmony_ci#define TC58FVB321 0x009C 1758c2ecf20Sopenharmony_ci#define TC58FVT641 0x0093 1768c2ecf20Sopenharmony_ci#define TC58FVB641 0x0095 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci/* Winbond */ 1798c2ecf20Sopenharmony_ci#define W49V002A 0x00b0 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci/* 1838c2ecf20Sopenharmony_ci * Unlock address sets for AMD command sets. 1848c2ecf20Sopenharmony_ci * Intel command sets use the MTD_UADDR_UNNECESSARY. 1858c2ecf20Sopenharmony_ci * Each identifier, except MTD_UADDR_UNNECESSARY, and 1868c2ecf20Sopenharmony_ci * MTD_UADDR_NO_SUPPORT must be defined below in unlock_addrs[]. 1878c2ecf20Sopenharmony_ci * MTD_UADDR_NOT_SUPPORTED must be 0 so that structure 1888c2ecf20Sopenharmony_ci * initialization need not require initializing all of the 1898c2ecf20Sopenharmony_ci * unlock addresses for all bit widths. 1908c2ecf20Sopenharmony_ci */ 1918c2ecf20Sopenharmony_cienum uaddr { 1928c2ecf20Sopenharmony_ci MTD_UADDR_NOT_SUPPORTED = 0, /* data width not supported */ 1938c2ecf20Sopenharmony_ci MTD_UADDR_0x0555_0x02AA, 1948c2ecf20Sopenharmony_ci MTD_UADDR_0x0555_0x0AAA, 1958c2ecf20Sopenharmony_ci MTD_UADDR_0x5555_0x2AAA, 1968c2ecf20Sopenharmony_ci MTD_UADDR_0x0AAA_0x0554, 1978c2ecf20Sopenharmony_ci MTD_UADDR_0x0AAA_0x0555, 1988c2ecf20Sopenharmony_ci MTD_UADDR_0xAAAA_0x5555, 1998c2ecf20Sopenharmony_ci MTD_UADDR_DONT_CARE, /* Requires an arbitrary address */ 2008c2ecf20Sopenharmony_ci MTD_UADDR_UNNECESSARY, /* Does not require any address */ 2018c2ecf20Sopenharmony_ci}; 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistruct unlock_addr { 2058c2ecf20Sopenharmony_ci uint32_t addr1; 2068c2ecf20Sopenharmony_ci uint32_t addr2; 2078c2ecf20Sopenharmony_ci}; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci/* 2118c2ecf20Sopenharmony_ci * I don't like the fact that the first entry in unlock_addrs[] 2128c2ecf20Sopenharmony_ci * exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore, 2138c2ecf20Sopenharmony_ci * should not be used. The problem is that structures with 2148c2ecf20Sopenharmony_ci * initializers have extra fields initialized to 0. It is _very_ 2158c2ecf20Sopenharmony_ci * desirable to have the unlock address entries for unsupported 2168c2ecf20Sopenharmony_ci * data widths automatically initialized - that means that 2178c2ecf20Sopenharmony_ci * MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here 2188c2ecf20Sopenharmony_ci * must go unused. 2198c2ecf20Sopenharmony_ci */ 2208c2ecf20Sopenharmony_cistatic const struct unlock_addr unlock_addrs[] = { 2218c2ecf20Sopenharmony_ci [MTD_UADDR_NOT_SUPPORTED] = { 2228c2ecf20Sopenharmony_ci .addr1 = 0xffff, 2238c2ecf20Sopenharmony_ci .addr2 = 0xffff 2248c2ecf20Sopenharmony_ci }, 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci [MTD_UADDR_0x0555_0x02AA] = { 2278c2ecf20Sopenharmony_ci .addr1 = 0x0555, 2288c2ecf20Sopenharmony_ci .addr2 = 0x02aa 2298c2ecf20Sopenharmony_ci }, 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci [MTD_UADDR_0x0555_0x0AAA] = { 2328c2ecf20Sopenharmony_ci .addr1 = 0x0555, 2338c2ecf20Sopenharmony_ci .addr2 = 0x0aaa 2348c2ecf20Sopenharmony_ci }, 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci [MTD_UADDR_0x5555_0x2AAA] = { 2378c2ecf20Sopenharmony_ci .addr1 = 0x5555, 2388c2ecf20Sopenharmony_ci .addr2 = 0x2aaa 2398c2ecf20Sopenharmony_ci }, 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci [MTD_UADDR_0x0AAA_0x0554] = { 2428c2ecf20Sopenharmony_ci .addr1 = 0x0AAA, 2438c2ecf20Sopenharmony_ci .addr2 = 0x0554 2448c2ecf20Sopenharmony_ci }, 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci [MTD_UADDR_0x0AAA_0x0555] = { 2478c2ecf20Sopenharmony_ci .addr1 = 0x0AAA, 2488c2ecf20Sopenharmony_ci .addr2 = 0x0555 2498c2ecf20Sopenharmony_ci }, 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci [MTD_UADDR_0xAAAA_0x5555] = { 2528c2ecf20Sopenharmony_ci .addr1 = 0xaaaa, 2538c2ecf20Sopenharmony_ci .addr2 = 0x5555 2548c2ecf20Sopenharmony_ci }, 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci [MTD_UADDR_DONT_CARE] = { 2578c2ecf20Sopenharmony_ci .addr1 = 0x0000, /* Doesn't matter which address */ 2588c2ecf20Sopenharmony_ci .addr2 = 0x0000 /* is used - must be last entry */ 2598c2ecf20Sopenharmony_ci }, 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci [MTD_UADDR_UNNECESSARY] = { 2628c2ecf20Sopenharmony_ci .addr1 = 0x0000, 2638c2ecf20Sopenharmony_ci .addr2 = 0x0000 2648c2ecf20Sopenharmony_ci } 2658c2ecf20Sopenharmony_ci}; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_cistruct amd_flash_info { 2688c2ecf20Sopenharmony_ci const char *name; 2698c2ecf20Sopenharmony_ci const uint16_t mfr_id; 2708c2ecf20Sopenharmony_ci const uint16_t dev_id; 2718c2ecf20Sopenharmony_ci const uint8_t dev_size; 2728c2ecf20Sopenharmony_ci const uint8_t nr_regions; 2738c2ecf20Sopenharmony_ci const uint16_t cmd_set; 2748c2ecf20Sopenharmony_ci const uint32_t regions[6]; 2758c2ecf20Sopenharmony_ci const uint8_t devtypes; /* Bitmask for x8, x16 etc. */ 2768c2ecf20Sopenharmony_ci const uint8_t uaddr; /* unlock addrs for 8, 16, 32, 64 */ 2778c2ecf20Sopenharmony_ci}; 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci#define ERASEINFO(size,blocks) (size<<8)|(blocks-1) 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci#define SIZE_64KiB 16 2828c2ecf20Sopenharmony_ci#define SIZE_128KiB 17 2838c2ecf20Sopenharmony_ci#define SIZE_256KiB 18 2848c2ecf20Sopenharmony_ci#define SIZE_512KiB 19 2858c2ecf20Sopenharmony_ci#define SIZE_1MiB 20 2868c2ecf20Sopenharmony_ci#define SIZE_2MiB 21 2878c2ecf20Sopenharmony_ci#define SIZE_4MiB 22 2888c2ecf20Sopenharmony_ci#define SIZE_8MiB 23 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci/* 2928c2ecf20Sopenharmony_ci * Please keep this list ordered by manufacturer! 2938c2ecf20Sopenharmony_ci * Fortunately, the list isn't searched often and so a 2948c2ecf20Sopenharmony_ci * slow, linear search isn't so bad. 2958c2ecf20Sopenharmony_ci */ 2968c2ecf20Sopenharmony_cistatic const struct amd_flash_info jedec_table[] = { 2978c2ecf20Sopenharmony_ci { 2988c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 2998c2ecf20Sopenharmony_ci .dev_id = AM29F032B, 3008c2ecf20Sopenharmony_ci .name = "AMD AM29F032B", 3018c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 3028c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 3038c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 3048c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3058c2ecf20Sopenharmony_ci .nr_regions = 1, 3068c2ecf20Sopenharmony_ci .regions = { 3078c2ecf20Sopenharmony_ci ERASEINFO(0x10000,64) 3088c2ecf20Sopenharmony_ci } 3098c2ecf20Sopenharmony_ci }, { 3108c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3118c2ecf20Sopenharmony_ci .dev_id = AM29LV160DT, 3128c2ecf20Sopenharmony_ci .name = "AMD AM29LV160DT", 3138c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3148c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3158c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 3168c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3178c2ecf20Sopenharmony_ci .nr_regions = 4, 3188c2ecf20Sopenharmony_ci .regions = { 3198c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 3208c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3218c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 3228c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 3238c2ecf20Sopenharmony_ci } 3248c2ecf20Sopenharmony_ci }, { 3258c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3268c2ecf20Sopenharmony_ci .dev_id = AM29LV160DB, 3278c2ecf20Sopenharmony_ci .name = "AMD AM29LV160DB", 3288c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3298c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3308c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 3318c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3328c2ecf20Sopenharmony_ci .nr_regions = 4, 3338c2ecf20Sopenharmony_ci .regions = { 3348c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 3358c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 3368c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3378c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 3388c2ecf20Sopenharmony_ci } 3398c2ecf20Sopenharmony_ci }, { 3408c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3418c2ecf20Sopenharmony_ci .dev_id = AM29LV400BB, 3428c2ecf20Sopenharmony_ci .name = "AMD AM29LV400BB", 3438c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3448c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3458c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 3468c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3478c2ecf20Sopenharmony_ci .nr_regions = 4, 3488c2ecf20Sopenharmony_ci .regions = { 3498c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 3508c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 3518c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3528c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7) 3538c2ecf20Sopenharmony_ci } 3548c2ecf20Sopenharmony_ci }, { 3558c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3568c2ecf20Sopenharmony_ci .dev_id = AM29LV400BT, 3578c2ecf20Sopenharmony_ci .name = "AMD AM29LV400BT", 3588c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3598c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3608c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 3618c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3628c2ecf20Sopenharmony_ci .nr_regions = 4, 3638c2ecf20Sopenharmony_ci .regions = { 3648c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 3658c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3668c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 3678c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 3688c2ecf20Sopenharmony_ci } 3698c2ecf20Sopenharmony_ci }, { 3708c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3718c2ecf20Sopenharmony_ci .dev_id = AM29LV800BB, 3728c2ecf20Sopenharmony_ci .name = "AMD AM29LV800BB", 3738c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3748c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3758c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 3768c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3778c2ecf20Sopenharmony_ci .nr_regions = 4, 3788c2ecf20Sopenharmony_ci .regions = { 3798c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 3808c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 3818c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3828c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 3838c2ecf20Sopenharmony_ci } 3848c2ecf20Sopenharmony_ci }, { 3858c2ecf20Sopenharmony_ci/* add DL */ 3868c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 3878c2ecf20Sopenharmony_ci .dev_id = AM29DL800BB, 3888c2ecf20Sopenharmony_ci .name = "AMD AM29DL800BB", 3898c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 3908c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 3918c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 3928c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 3938c2ecf20Sopenharmony_ci .nr_regions = 6, 3948c2ecf20Sopenharmony_ci .regions = { 3958c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 3968c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3978c2ecf20Sopenharmony_ci ERASEINFO(0x02000,4), 3988c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 3998c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 4008c2ecf20Sopenharmony_ci ERASEINFO(0x10000,14) 4018c2ecf20Sopenharmony_ci } 4028c2ecf20Sopenharmony_ci }, { 4038c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4048c2ecf20Sopenharmony_ci .dev_id = AM29DL800BT, 4058c2ecf20Sopenharmony_ci .name = "AMD AM29DL800BT", 4068c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 4078c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 4088c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 4098c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4108c2ecf20Sopenharmony_ci .nr_regions = 6, 4118c2ecf20Sopenharmony_ci .regions = { 4128c2ecf20Sopenharmony_ci ERASEINFO(0x10000,14), 4138c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 4148c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 4158c2ecf20Sopenharmony_ci ERASEINFO(0x02000,4), 4168c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 4178c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 4188c2ecf20Sopenharmony_ci } 4198c2ecf20Sopenharmony_ci }, { 4208c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4218c2ecf20Sopenharmony_ci .dev_id = AM29F800BB, 4228c2ecf20Sopenharmony_ci .name = "AMD AM29F800BB", 4238c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 4248c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 4258c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 4268c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4278c2ecf20Sopenharmony_ci .nr_regions = 4, 4288c2ecf20Sopenharmony_ci .regions = { 4298c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 4308c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 4318c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 4328c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 4338c2ecf20Sopenharmony_ci } 4348c2ecf20Sopenharmony_ci }, { 4358c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4368c2ecf20Sopenharmony_ci .dev_id = AM29LV800BT, 4378c2ecf20Sopenharmony_ci .name = "AMD AM29LV800BT", 4388c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 4398c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 4408c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 4418c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4428c2ecf20Sopenharmony_ci .nr_regions = 4, 4438c2ecf20Sopenharmony_ci .regions = { 4448c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 4458c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 4468c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 4478c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 4488c2ecf20Sopenharmony_ci } 4498c2ecf20Sopenharmony_ci }, { 4508c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4518c2ecf20Sopenharmony_ci .dev_id = AM29F800BT, 4528c2ecf20Sopenharmony_ci .name = "AMD AM29F800BT", 4538c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 4548c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 4558c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 4568c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4578c2ecf20Sopenharmony_ci .nr_regions = 4, 4588c2ecf20Sopenharmony_ci .regions = { 4598c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 4608c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 4618c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 4628c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 4638c2ecf20Sopenharmony_ci } 4648c2ecf20Sopenharmony_ci }, { 4658c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4668c2ecf20Sopenharmony_ci .dev_id = AM29F017D, 4678c2ecf20Sopenharmony_ci .name = "AMD AM29F017D", 4688c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 4698c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_DONT_CARE, 4708c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 4718c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4728c2ecf20Sopenharmony_ci .nr_regions = 1, 4738c2ecf20Sopenharmony_ci .regions = { 4748c2ecf20Sopenharmony_ci ERASEINFO(0x10000,32), 4758c2ecf20Sopenharmony_ci } 4768c2ecf20Sopenharmony_ci }, { 4778c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4788c2ecf20Sopenharmony_ci .dev_id = AM29F016D, 4798c2ecf20Sopenharmony_ci .name = "AMD AM29F016D", 4808c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 4818c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 4828c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 4838c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4848c2ecf20Sopenharmony_ci .nr_regions = 1, 4858c2ecf20Sopenharmony_ci .regions = { 4868c2ecf20Sopenharmony_ci ERASEINFO(0x10000,32), 4878c2ecf20Sopenharmony_ci } 4888c2ecf20Sopenharmony_ci }, { 4898c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 4908c2ecf20Sopenharmony_ci .dev_id = AM29F080, 4918c2ecf20Sopenharmony_ci .name = "AMD AM29F080", 4928c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 4938c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 4948c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 4958c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 4968c2ecf20Sopenharmony_ci .nr_regions = 1, 4978c2ecf20Sopenharmony_ci .regions = { 4988c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 4998c2ecf20Sopenharmony_ci } 5008c2ecf20Sopenharmony_ci }, { 5018c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 5028c2ecf20Sopenharmony_ci .dev_id = AM29F040, 5038c2ecf20Sopenharmony_ci .name = "AMD AM29F040", 5048c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 5058c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 5068c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 5078c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5088c2ecf20Sopenharmony_ci .nr_regions = 1, 5098c2ecf20Sopenharmony_ci .regions = { 5108c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 5118c2ecf20Sopenharmony_ci } 5128c2ecf20Sopenharmony_ci }, { 5138c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 5148c2ecf20Sopenharmony_ci .dev_id = AM29LV040B, 5158c2ecf20Sopenharmony_ci .name = "AMD AM29LV040B", 5168c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 5178c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 5188c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 5198c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5208c2ecf20Sopenharmony_ci .nr_regions = 1, 5218c2ecf20Sopenharmony_ci .regions = { 5228c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 5238c2ecf20Sopenharmony_ci } 5248c2ecf20Sopenharmony_ci }, { 5258c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 5268c2ecf20Sopenharmony_ci .dev_id = AM29F002T, 5278c2ecf20Sopenharmony_ci .name = "AMD AM29F002T", 5288c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 5298c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 5308c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 5318c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5328c2ecf20Sopenharmony_ci .nr_regions = 4, 5338c2ecf20Sopenharmony_ci .regions = { 5348c2ecf20Sopenharmony_ci ERASEINFO(0x10000,3), 5358c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 5368c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 5378c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 5388c2ecf20Sopenharmony_ci } 5398c2ecf20Sopenharmony_ci }, { 5408c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 5418c2ecf20Sopenharmony_ci .dev_id = AM29SL800DT, 5428c2ecf20Sopenharmony_ci .name = "AMD AM29SL800DT", 5438c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 5448c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 5458c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 5468c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5478c2ecf20Sopenharmony_ci .nr_regions = 4, 5488c2ecf20Sopenharmony_ci .regions = { 5498c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 5508c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 5518c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 5528c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 5538c2ecf20Sopenharmony_ci } 5548c2ecf20Sopenharmony_ci }, { 5558c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_AMD, 5568c2ecf20Sopenharmony_ci .dev_id = AM29SL800DB, 5578c2ecf20Sopenharmony_ci .name = "AMD AM29SL800DB", 5588c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 5598c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 5608c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 5618c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5628c2ecf20Sopenharmony_ci .nr_regions = 4, 5638c2ecf20Sopenharmony_ci .regions = { 5648c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 5658c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 5668c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 5678c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 5688c2ecf20Sopenharmony_ci } 5698c2ecf20Sopenharmony_ci }, { 5708c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 5718c2ecf20Sopenharmony_ci .dev_id = AT49BV512, 5728c2ecf20Sopenharmony_ci .name = "Atmel AT49BV512", 5738c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 5748c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 5758c2ecf20Sopenharmony_ci .dev_size = SIZE_64KiB, 5768c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5778c2ecf20Sopenharmony_ci .nr_regions = 1, 5788c2ecf20Sopenharmony_ci .regions = { 5798c2ecf20Sopenharmony_ci ERASEINFO(0x10000,1) 5808c2ecf20Sopenharmony_ci } 5818c2ecf20Sopenharmony_ci }, { 5828c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 5838c2ecf20Sopenharmony_ci .dev_id = AT29LV512, 5848c2ecf20Sopenharmony_ci .name = "Atmel AT29LV512", 5858c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 5868c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 5878c2ecf20Sopenharmony_ci .dev_size = SIZE_64KiB, 5888c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 5898c2ecf20Sopenharmony_ci .nr_regions = 1, 5908c2ecf20Sopenharmony_ci .regions = { 5918c2ecf20Sopenharmony_ci ERASEINFO(0x80,256), 5928c2ecf20Sopenharmony_ci ERASEINFO(0x80,256) 5938c2ecf20Sopenharmony_ci } 5948c2ecf20Sopenharmony_ci }, { 5958c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 5968c2ecf20Sopenharmony_ci .dev_id = AT49BV16X, 5978c2ecf20Sopenharmony_ci .name = "Atmel AT49BV16X", 5988c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 5998c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */ 6008c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 6018c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6028c2ecf20Sopenharmony_ci .nr_regions = 2, 6038c2ecf20Sopenharmony_ci .regions = { 6048c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8), 6058c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 6068c2ecf20Sopenharmony_ci } 6078c2ecf20Sopenharmony_ci }, { 6088c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 6098c2ecf20Sopenharmony_ci .dev_id = AT49BV16XT, 6108c2ecf20Sopenharmony_ci .name = "Atmel AT49BV16XT", 6118c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6128c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */ 6138c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 6148c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6158c2ecf20Sopenharmony_ci .nr_regions = 2, 6168c2ecf20Sopenharmony_ci .regions = { 6178c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 6188c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8) 6198c2ecf20Sopenharmony_ci } 6208c2ecf20Sopenharmony_ci }, { 6218c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 6228c2ecf20Sopenharmony_ci .dev_id = AT49BV32X, 6238c2ecf20Sopenharmony_ci .name = "Atmel AT49BV32X", 6248c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6258c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */ 6268c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 6278c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6288c2ecf20Sopenharmony_ci .nr_regions = 2, 6298c2ecf20Sopenharmony_ci .regions = { 6308c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8), 6318c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63) 6328c2ecf20Sopenharmony_ci } 6338c2ecf20Sopenharmony_ci }, { 6348c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ATMEL, 6358c2ecf20Sopenharmony_ci .dev_id = AT49BV32XT, 6368c2ecf20Sopenharmony_ci .name = "Atmel AT49BV32XT", 6378c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6388c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x0AAA, /* ???? */ 6398c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 6408c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6418c2ecf20Sopenharmony_ci .nr_regions = 2, 6428c2ecf20Sopenharmony_ci .regions = { 6438c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63), 6448c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8) 6458c2ecf20Sopenharmony_ci } 6468c2ecf20Sopenharmony_ci }, { 6478c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_EON, 6488c2ecf20Sopenharmony_ci .dev_id = EN29LV400AT, 6498c2ecf20Sopenharmony_ci .name = "Eon EN29LV400AT", 6508c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6518c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 6528c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 6538c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6548c2ecf20Sopenharmony_ci .nr_regions = 4, 6558c2ecf20Sopenharmony_ci .regions = { 6568c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 6578c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 6588c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 6598c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 6608c2ecf20Sopenharmony_ci } 6618c2ecf20Sopenharmony_ci }, { 6628c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_EON, 6638c2ecf20Sopenharmony_ci .dev_id = EN29LV400AB, 6648c2ecf20Sopenharmony_ci .name = "Eon EN29LV400AB", 6658c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6668c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 6678c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 6688c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6698c2ecf20Sopenharmony_ci .nr_regions = 4, 6708c2ecf20Sopenharmony_ci .regions = { 6718c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 6728c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 6738c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 6748c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 6758c2ecf20Sopenharmony_ci } 6768c2ecf20Sopenharmony_ci }, { 6778c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_EON, 6788c2ecf20Sopenharmony_ci .dev_id = EN29SL800BT, 6798c2ecf20Sopenharmony_ci .name = "Eon EN29SL800BT", 6808c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6818c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 6828c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 6838c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6848c2ecf20Sopenharmony_ci .nr_regions = 4, 6858c2ecf20Sopenharmony_ci .regions = { 6868c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 6878c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 6888c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 6898c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 6908c2ecf20Sopenharmony_ci } 6918c2ecf20Sopenharmony_ci }, { 6928c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_EON, 6938c2ecf20Sopenharmony_ci .dev_id = EN29SL800BB, 6948c2ecf20Sopenharmony_ci .name = "Eon EN29SL800BB", 6958c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 6968c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 6978c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 6988c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 6998c2ecf20Sopenharmony_ci .nr_regions = 4, 7008c2ecf20Sopenharmony_ci .regions = { 7018c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 7028c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 7038c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 7048c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 7058c2ecf20Sopenharmony_ci } 7068c2ecf20Sopenharmony_ci }, { 7078c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7088c2ecf20Sopenharmony_ci .dev_id = MBM29F040C, 7098c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29F040C", 7108c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 7118c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7128c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 7138c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7148c2ecf20Sopenharmony_ci .nr_regions = 1, 7158c2ecf20Sopenharmony_ci .regions = { 7168c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8) 7178c2ecf20Sopenharmony_ci } 7188c2ecf20Sopenharmony_ci }, { 7198c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7208c2ecf20Sopenharmony_ci .dev_id = MBM29F800BA, 7218c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29F800BA", 7228c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 7238c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7248c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 7258c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7268c2ecf20Sopenharmony_ci .nr_regions = 4, 7278c2ecf20Sopenharmony_ci .regions = { 7288c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 7298c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 7308c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 7318c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 7328c2ecf20Sopenharmony_ci } 7338c2ecf20Sopenharmony_ci }, { 7348c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7358c2ecf20Sopenharmony_ci .dev_id = MBM29LV650UE, 7368c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV650UE", 7378c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 7388c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_DONT_CARE, 7398c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 7408c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7418c2ecf20Sopenharmony_ci .nr_regions = 1, 7428c2ecf20Sopenharmony_ci .regions = { 7438c2ecf20Sopenharmony_ci ERASEINFO(0x10000,128) 7448c2ecf20Sopenharmony_ci } 7458c2ecf20Sopenharmony_ci }, { 7468c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7478c2ecf20Sopenharmony_ci .dev_id = MBM29LV320TE, 7488c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV320TE", 7498c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 7508c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7518c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 7528c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7538c2ecf20Sopenharmony_ci .nr_regions = 2, 7548c2ecf20Sopenharmony_ci .regions = { 7558c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63), 7568c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8) 7578c2ecf20Sopenharmony_ci } 7588c2ecf20Sopenharmony_ci }, { 7598c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7608c2ecf20Sopenharmony_ci .dev_id = MBM29LV320BE, 7618c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV320BE", 7628c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 7638c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7648c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 7658c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7668c2ecf20Sopenharmony_ci .nr_regions = 2, 7678c2ecf20Sopenharmony_ci .regions = { 7688c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8), 7698c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63) 7708c2ecf20Sopenharmony_ci } 7718c2ecf20Sopenharmony_ci }, { 7728c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7738c2ecf20Sopenharmony_ci .dev_id = MBM29LV160TE, 7748c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV160TE", 7758c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 7768c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7778c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 7788c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7798c2ecf20Sopenharmony_ci .nr_regions = 4, 7808c2ecf20Sopenharmony_ci .regions = { 7818c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 7828c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 7838c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 7848c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 7858c2ecf20Sopenharmony_ci } 7868c2ecf20Sopenharmony_ci }, { 7878c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 7888c2ecf20Sopenharmony_ci .dev_id = MBM29LV160BE, 7898c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV160BE", 7908c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 7918c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 7928c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 7938c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 7948c2ecf20Sopenharmony_ci .nr_regions = 4, 7958c2ecf20Sopenharmony_ci .regions = { 7968c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 7978c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 7988c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 7998c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 8008c2ecf20Sopenharmony_ci } 8018c2ecf20Sopenharmony_ci }, { 8028c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 8038c2ecf20Sopenharmony_ci .dev_id = MBM29LV800BA, 8048c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV800BA", 8058c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 8068c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 8078c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 8088c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 8098c2ecf20Sopenharmony_ci .nr_regions = 4, 8108c2ecf20Sopenharmony_ci .regions = { 8118c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 8128c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 8138c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 8148c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15) 8158c2ecf20Sopenharmony_ci } 8168c2ecf20Sopenharmony_ci }, { 8178c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 8188c2ecf20Sopenharmony_ci .dev_id = MBM29LV800TA, 8198c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV800TA", 8208c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 8218c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 8228c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 8238c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 8248c2ecf20Sopenharmony_ci .nr_regions = 4, 8258c2ecf20Sopenharmony_ci .regions = { 8268c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 8278c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 8288c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 8298c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 8308c2ecf20Sopenharmony_ci } 8318c2ecf20Sopenharmony_ci }, { 8328c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 8338c2ecf20Sopenharmony_ci .dev_id = MBM29LV400BC, 8348c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV400BC", 8358c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 8368c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 8378c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 8388c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 8398c2ecf20Sopenharmony_ci .nr_regions = 4, 8408c2ecf20Sopenharmony_ci .regions = { 8418c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 8428c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 8438c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 8448c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7) 8458c2ecf20Sopenharmony_ci } 8468c2ecf20Sopenharmony_ci }, { 8478c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_FUJITSU, 8488c2ecf20Sopenharmony_ci .dev_id = MBM29LV400TC, 8498c2ecf20Sopenharmony_ci .name = "Fujitsu MBM29LV400TC", 8508c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 8518c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 8528c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 8538c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 8548c2ecf20Sopenharmony_ci .nr_regions = 4, 8558c2ecf20Sopenharmony_ci .regions = { 8568c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 8578c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 8588c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 8598c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 8608c2ecf20Sopenharmony_ci } 8618c2ecf20Sopenharmony_ci }, { 8628c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_HYUNDAI, 8638c2ecf20Sopenharmony_ci .dev_id = HY29F002T, 8648c2ecf20Sopenharmony_ci .name = "Hyundai HY29F002T", 8658c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 8668c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 8678c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 8688c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 8698c2ecf20Sopenharmony_ci .nr_regions = 4, 8708c2ecf20Sopenharmony_ci .regions = { 8718c2ecf20Sopenharmony_ci ERASEINFO(0x10000,3), 8728c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 8738c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 8748c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 8758c2ecf20Sopenharmony_ci } 8768c2ecf20Sopenharmony_ci }, { 8778c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 8788c2ecf20Sopenharmony_ci .dev_id = I28F004B3B, 8798c2ecf20Sopenharmony_ci .name = "Intel 28F004B3B", 8808c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 8818c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 8828c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 8838c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 8848c2ecf20Sopenharmony_ci .nr_regions = 2, 8858c2ecf20Sopenharmony_ci .regions = { 8868c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 8878c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 7), 8888c2ecf20Sopenharmony_ci } 8898c2ecf20Sopenharmony_ci }, { 8908c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 8918c2ecf20Sopenharmony_ci .dev_id = I28F004B3T, 8928c2ecf20Sopenharmony_ci .name = "Intel 28F004B3T", 8938c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 8948c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 8958c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 8968c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 8978c2ecf20Sopenharmony_ci .nr_regions = 2, 8988c2ecf20Sopenharmony_ci .regions = { 8998c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 7), 9008c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 9018c2ecf20Sopenharmony_ci } 9028c2ecf20Sopenharmony_ci }, { 9038c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9048c2ecf20Sopenharmony_ci .dev_id = I28F400B3B, 9058c2ecf20Sopenharmony_ci .name = "Intel 28F400B3B", 9068c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 9078c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9088c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 9098c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9108c2ecf20Sopenharmony_ci .nr_regions = 2, 9118c2ecf20Sopenharmony_ci .regions = { 9128c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 9138c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 7), 9148c2ecf20Sopenharmony_ci } 9158c2ecf20Sopenharmony_ci }, { 9168c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9178c2ecf20Sopenharmony_ci .dev_id = I28F400B3T, 9188c2ecf20Sopenharmony_ci .name = "Intel 28F400B3T", 9198c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 9208c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9218c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 9228c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9238c2ecf20Sopenharmony_ci .nr_regions = 2, 9248c2ecf20Sopenharmony_ci .regions = { 9258c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 7), 9268c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 9278c2ecf20Sopenharmony_ci } 9288c2ecf20Sopenharmony_ci }, { 9298c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9308c2ecf20Sopenharmony_ci .dev_id = I28F008B3B, 9318c2ecf20Sopenharmony_ci .name = "Intel 28F008B3B", 9328c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 9338c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9348c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 9358c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9368c2ecf20Sopenharmony_ci .nr_regions = 2, 9378c2ecf20Sopenharmony_ci .regions = { 9388c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 9398c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 15), 9408c2ecf20Sopenharmony_ci } 9418c2ecf20Sopenharmony_ci }, { 9428c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9438c2ecf20Sopenharmony_ci .dev_id = I28F008B3T, 9448c2ecf20Sopenharmony_ci .name = "Intel 28F008B3T", 9458c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 9468c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9478c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 9488c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9498c2ecf20Sopenharmony_ci .nr_regions = 2, 9508c2ecf20Sopenharmony_ci .regions = { 9518c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 15), 9528c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 9538c2ecf20Sopenharmony_ci } 9548c2ecf20Sopenharmony_ci }, { 9558c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9568c2ecf20Sopenharmony_ci .dev_id = I28F008S5, 9578c2ecf20Sopenharmony_ci .name = "Intel 28F008S5", 9588c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 9598c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9608c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 9618c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 9628c2ecf20Sopenharmony_ci .nr_regions = 1, 9638c2ecf20Sopenharmony_ci .regions = { 9648c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 9658c2ecf20Sopenharmony_ci } 9668c2ecf20Sopenharmony_ci }, { 9678c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9688c2ecf20Sopenharmony_ci .dev_id = I28F016S5, 9698c2ecf20Sopenharmony_ci .name = "Intel 28F016S5", 9708c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 9718c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9728c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 9738c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 9748c2ecf20Sopenharmony_ci .nr_regions = 1, 9758c2ecf20Sopenharmony_ci .regions = { 9768c2ecf20Sopenharmony_ci ERASEINFO(0x10000,32), 9778c2ecf20Sopenharmony_ci } 9788c2ecf20Sopenharmony_ci }, { 9798c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9808c2ecf20Sopenharmony_ci .dev_id = I28F008SA, 9818c2ecf20Sopenharmony_ci .name = "Intel 28F008SA", 9828c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 9838c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9848c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 9858c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9868c2ecf20Sopenharmony_ci .nr_regions = 1, 9878c2ecf20Sopenharmony_ci .regions = { 9888c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 16), 9898c2ecf20Sopenharmony_ci } 9908c2ecf20Sopenharmony_ci }, { 9918c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 9928c2ecf20Sopenharmony_ci .dev_id = I28F800B3B, 9938c2ecf20Sopenharmony_ci .name = "Intel 28F800B3B", 9948c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 9958c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 9968c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 9978c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 9988c2ecf20Sopenharmony_ci .nr_regions = 2, 9998c2ecf20Sopenharmony_ci .regions = { 10008c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10018c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 15), 10028c2ecf20Sopenharmony_ci } 10038c2ecf20Sopenharmony_ci }, { 10048c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10058c2ecf20Sopenharmony_ci .dev_id = I28F800B3T, 10068c2ecf20Sopenharmony_ci .name = "Intel 28F800B3T", 10078c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 10088c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10098c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 10108c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10118c2ecf20Sopenharmony_ci .nr_regions = 2, 10128c2ecf20Sopenharmony_ci .regions = { 10138c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 15), 10148c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10158c2ecf20Sopenharmony_ci } 10168c2ecf20Sopenharmony_ci }, { 10178c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10188c2ecf20Sopenharmony_ci .dev_id = I28F016B3B, 10198c2ecf20Sopenharmony_ci .name = "Intel 28F016B3B", 10208c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 10218c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10228c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 10238c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10248c2ecf20Sopenharmony_ci .nr_regions = 2, 10258c2ecf20Sopenharmony_ci .regions = { 10268c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10278c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 31), 10288c2ecf20Sopenharmony_ci } 10298c2ecf20Sopenharmony_ci }, { 10308c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10318c2ecf20Sopenharmony_ci .dev_id = I28F016S3, 10328c2ecf20Sopenharmony_ci .name = "Intel I28F016S3", 10338c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 10348c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10358c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 10368c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10378c2ecf20Sopenharmony_ci .nr_regions = 1, 10388c2ecf20Sopenharmony_ci .regions = { 10398c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 32), 10408c2ecf20Sopenharmony_ci } 10418c2ecf20Sopenharmony_ci }, { 10428c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10438c2ecf20Sopenharmony_ci .dev_id = I28F016B3T, 10448c2ecf20Sopenharmony_ci .name = "Intel 28F016B3T", 10458c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 10468c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10478c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 10488c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10498c2ecf20Sopenharmony_ci .nr_regions = 2, 10508c2ecf20Sopenharmony_ci .regions = { 10518c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 31), 10528c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10538c2ecf20Sopenharmony_ci } 10548c2ecf20Sopenharmony_ci }, { 10558c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10568c2ecf20Sopenharmony_ci .dev_id = I28F160B3B, 10578c2ecf20Sopenharmony_ci .name = "Intel 28F160B3B", 10588c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 10598c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10608c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 10618c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10628c2ecf20Sopenharmony_ci .nr_regions = 2, 10638c2ecf20Sopenharmony_ci .regions = { 10648c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10658c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 31), 10668c2ecf20Sopenharmony_ci } 10678c2ecf20Sopenharmony_ci }, { 10688c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10698c2ecf20Sopenharmony_ci .dev_id = I28F160B3T, 10708c2ecf20Sopenharmony_ci .name = "Intel 28F160B3T", 10718c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 10728c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10738c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 10748c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10758c2ecf20Sopenharmony_ci .nr_regions = 2, 10768c2ecf20Sopenharmony_ci .regions = { 10778c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 31), 10788c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10798c2ecf20Sopenharmony_ci } 10808c2ecf20Sopenharmony_ci }, { 10818c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10828c2ecf20Sopenharmony_ci .dev_id = I28F320B3B, 10838c2ecf20Sopenharmony_ci .name = "Intel 28F320B3B", 10848c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 10858c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10868c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 10878c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 10888c2ecf20Sopenharmony_ci .nr_regions = 2, 10898c2ecf20Sopenharmony_ci .regions = { 10908c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 10918c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 63), 10928c2ecf20Sopenharmony_ci } 10938c2ecf20Sopenharmony_ci }, { 10948c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 10958c2ecf20Sopenharmony_ci .dev_id = I28F320B3T, 10968c2ecf20Sopenharmony_ci .name = "Intel 28F320B3T", 10978c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 10988c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 10998c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 11008c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 11018c2ecf20Sopenharmony_ci .nr_regions = 2, 11028c2ecf20Sopenharmony_ci .regions = { 11038c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 63), 11048c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 11058c2ecf20Sopenharmony_ci } 11068c2ecf20Sopenharmony_ci }, { 11078c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 11088c2ecf20Sopenharmony_ci .dev_id = I28F640B3B, 11098c2ecf20Sopenharmony_ci .name = "Intel 28F640B3B", 11108c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 11118c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 11128c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 11138c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 11148c2ecf20Sopenharmony_ci .nr_regions = 2, 11158c2ecf20Sopenharmony_ci .regions = { 11168c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 11178c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 127), 11188c2ecf20Sopenharmony_ci } 11198c2ecf20Sopenharmony_ci }, { 11208c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 11218c2ecf20Sopenharmony_ci .dev_id = I28F640B3T, 11228c2ecf20Sopenharmony_ci .name = "Intel 28F640B3T", 11238c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 11248c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 11258c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 11268c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 11278c2ecf20Sopenharmony_ci .nr_regions = 2, 11288c2ecf20Sopenharmony_ci .regions = { 11298c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 127), 11308c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 11318c2ecf20Sopenharmony_ci } 11328c2ecf20Sopenharmony_ci }, { 11338c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 11348c2ecf20Sopenharmony_ci .dev_id = I28F640C3B, 11358c2ecf20Sopenharmony_ci .name = "Intel 28F640C3B", 11368c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 11378c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 11388c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 11398c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_STD, 11408c2ecf20Sopenharmony_ci .nr_regions = 2, 11418c2ecf20Sopenharmony_ci .regions = { 11428c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 11438c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 127), 11448c2ecf20Sopenharmony_ci } 11458c2ecf20Sopenharmony_ci }, { 11468c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 11478c2ecf20Sopenharmony_ci .dev_id = I82802AB, 11488c2ecf20Sopenharmony_ci .name = "Intel 82802AB", 11498c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 11508c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 11518c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 11528c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 11538c2ecf20Sopenharmony_ci .nr_regions = 1, 11548c2ecf20Sopenharmony_ci .regions = { 11558c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 11568c2ecf20Sopenharmony_ci } 11578c2ecf20Sopenharmony_ci }, { 11588c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_INTEL, 11598c2ecf20Sopenharmony_ci .dev_id = I82802AC, 11608c2ecf20Sopenharmony_ci .name = "Intel 82802AC", 11618c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 11628c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 11638c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 11648c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 11658c2ecf20Sopenharmony_ci .nr_regions = 1, 11668c2ecf20Sopenharmony_ci .regions = { 11678c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 11688c2ecf20Sopenharmony_ci } 11698c2ecf20Sopenharmony_ci }, { 11708c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 11718c2ecf20Sopenharmony_ci .dev_id = MX29LV040C, 11728c2ecf20Sopenharmony_ci .name = "Macronix MX29LV040C", 11738c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 11748c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 11758c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 11768c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 11778c2ecf20Sopenharmony_ci .nr_regions = 1, 11788c2ecf20Sopenharmony_ci .regions = { 11798c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 11808c2ecf20Sopenharmony_ci } 11818c2ecf20Sopenharmony_ci }, { 11828c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 11838c2ecf20Sopenharmony_ci .dev_id = MX29LV160T, 11848c2ecf20Sopenharmony_ci .name = "MXIC MX29LV160T", 11858c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 11868c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 11878c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 11888c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 11898c2ecf20Sopenharmony_ci .nr_regions = 4, 11908c2ecf20Sopenharmony_ci .regions = { 11918c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 11928c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 11938c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 11948c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 11958c2ecf20Sopenharmony_ci } 11968c2ecf20Sopenharmony_ci }, { 11978c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_NEC, 11988c2ecf20Sopenharmony_ci .dev_id = UPD29F064115, 11998c2ecf20Sopenharmony_ci .name = "NEC uPD29F064115", 12008c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 12018c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 12028c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 12038c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12048c2ecf20Sopenharmony_ci .nr_regions = 3, 12058c2ecf20Sopenharmony_ci .regions = { 12068c2ecf20Sopenharmony_ci ERASEINFO(0x2000,8), 12078c2ecf20Sopenharmony_ci ERASEINFO(0x10000,126), 12088c2ecf20Sopenharmony_ci ERASEINFO(0x2000,8), 12098c2ecf20Sopenharmony_ci } 12108c2ecf20Sopenharmony_ci }, { 12118c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12128c2ecf20Sopenharmony_ci .dev_id = MX29LV160B, 12138c2ecf20Sopenharmony_ci .name = "MXIC MX29LV160B", 12148c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 12158c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 12168c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 12178c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12188c2ecf20Sopenharmony_ci .nr_regions = 4, 12198c2ecf20Sopenharmony_ci .regions = { 12208c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 12218c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 12228c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 12238c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 12248c2ecf20Sopenharmony_ci } 12258c2ecf20Sopenharmony_ci }, { 12268c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12278c2ecf20Sopenharmony_ci .dev_id = MX29F040, 12288c2ecf20Sopenharmony_ci .name = "Macronix MX29F040", 12298c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12308c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 12318c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 12328c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12338c2ecf20Sopenharmony_ci .nr_regions = 1, 12348c2ecf20Sopenharmony_ci .regions = { 12358c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 12368c2ecf20Sopenharmony_ci } 12378c2ecf20Sopenharmony_ci }, { 12388c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12398c2ecf20Sopenharmony_ci .dev_id = MX29F016, 12408c2ecf20Sopenharmony_ci .name = "Macronix MX29F016", 12418c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12428c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 12438c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 12448c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12458c2ecf20Sopenharmony_ci .nr_regions = 1, 12468c2ecf20Sopenharmony_ci .regions = { 12478c2ecf20Sopenharmony_ci ERASEINFO(0x10000,32), 12488c2ecf20Sopenharmony_ci } 12498c2ecf20Sopenharmony_ci }, { 12508c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12518c2ecf20Sopenharmony_ci .dev_id = MX29F004T, 12528c2ecf20Sopenharmony_ci .name = "Macronix MX29F004T", 12538c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12548c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 12558c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 12568c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12578c2ecf20Sopenharmony_ci .nr_regions = 4, 12588c2ecf20Sopenharmony_ci .regions = { 12598c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 12608c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 12618c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 12628c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 12638c2ecf20Sopenharmony_ci } 12648c2ecf20Sopenharmony_ci }, { 12658c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12668c2ecf20Sopenharmony_ci .dev_id = MX29F004B, 12678c2ecf20Sopenharmony_ci .name = "Macronix MX29F004B", 12688c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12698c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 12708c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 12718c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12728c2ecf20Sopenharmony_ci .nr_regions = 4, 12738c2ecf20Sopenharmony_ci .regions = { 12748c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 12758c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 12768c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 12778c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7), 12788c2ecf20Sopenharmony_ci } 12798c2ecf20Sopenharmony_ci }, { 12808c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_MACRONIX, 12818c2ecf20Sopenharmony_ci .dev_id = MX29F002T, 12828c2ecf20Sopenharmony_ci .name = "Macronix MX29F002T", 12838c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12848c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 12858c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 12868c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 12878c2ecf20Sopenharmony_ci .nr_regions = 4, 12888c2ecf20Sopenharmony_ci .regions = { 12898c2ecf20Sopenharmony_ci ERASEINFO(0x10000,3), 12908c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 12918c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 12928c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 12938c2ecf20Sopenharmony_ci } 12948c2ecf20Sopenharmony_ci }, { 12958c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_PMC, 12968c2ecf20Sopenharmony_ci .dev_id = PM49FL002, 12978c2ecf20Sopenharmony_ci .name = "PMC Pm49FL002", 12988c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 12998c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13008c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 13018c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13028c2ecf20Sopenharmony_ci .nr_regions = 1, 13038c2ecf20Sopenharmony_ci .regions = { 13048c2ecf20Sopenharmony_ci ERASEINFO( 0x01000, 64 ) 13058c2ecf20Sopenharmony_ci } 13068c2ecf20Sopenharmony_ci }, { 13078c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_PMC, 13088c2ecf20Sopenharmony_ci .dev_id = PM49FL004, 13098c2ecf20Sopenharmony_ci .name = "PMC Pm49FL004", 13108c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13118c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13128c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 13138c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13148c2ecf20Sopenharmony_ci .nr_regions = 1, 13158c2ecf20Sopenharmony_ci .regions = { 13168c2ecf20Sopenharmony_ci ERASEINFO( 0x01000, 128 ) 13178c2ecf20Sopenharmony_ci } 13188c2ecf20Sopenharmony_ci }, { 13198c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_PMC, 13208c2ecf20Sopenharmony_ci .dev_id = PM49FL008, 13218c2ecf20Sopenharmony_ci .name = "PMC Pm49FL008", 13228c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13238c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13248c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 13258c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13268c2ecf20Sopenharmony_ci .nr_regions = 1, 13278c2ecf20Sopenharmony_ci .regions = { 13288c2ecf20Sopenharmony_ci ERASEINFO( 0x01000, 256 ) 13298c2ecf20Sopenharmony_ci } 13308c2ecf20Sopenharmony_ci }, { 13318c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SHARP, 13328c2ecf20Sopenharmony_ci .dev_id = LH28F640BF, 13338c2ecf20Sopenharmony_ci .name = "LH28F640BF", 13348c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 13358c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 13368c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 13378c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 13388c2ecf20Sopenharmony_ci .nr_regions = 2, 13398c2ecf20Sopenharmony_ci .regions = { 13408c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 127), 13418c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 8), 13428c2ecf20Sopenharmony_ci } 13438c2ecf20Sopenharmony_ci }, { 13448c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 13458c2ecf20Sopenharmony_ci .dev_id = SST39LF512, 13468c2ecf20Sopenharmony_ci .name = "SST 39LF512", 13478c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13488c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13498c2ecf20Sopenharmony_ci .dev_size = SIZE_64KiB, 13508c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13518c2ecf20Sopenharmony_ci .nr_regions = 1, 13528c2ecf20Sopenharmony_ci .regions = { 13538c2ecf20Sopenharmony_ci ERASEINFO(0x01000,16), 13548c2ecf20Sopenharmony_ci } 13558c2ecf20Sopenharmony_ci }, { 13568c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 13578c2ecf20Sopenharmony_ci .dev_id = SST39LF010, 13588c2ecf20Sopenharmony_ci .name = "SST 39LF010", 13598c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13608c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13618c2ecf20Sopenharmony_ci .dev_size = SIZE_128KiB, 13628c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13638c2ecf20Sopenharmony_ci .nr_regions = 1, 13648c2ecf20Sopenharmony_ci .regions = { 13658c2ecf20Sopenharmony_ci ERASEINFO(0x01000,32), 13668c2ecf20Sopenharmony_ci } 13678c2ecf20Sopenharmony_ci }, { 13688c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 13698c2ecf20Sopenharmony_ci .dev_id = SST29EE020, 13708c2ecf20Sopenharmony_ci .name = "SST 29EE020", 13718c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13728c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13738c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 13748c2ecf20Sopenharmony_ci .cmd_set = P_ID_SST_PAGE, 13758c2ecf20Sopenharmony_ci .nr_regions = 1, 13768c2ecf20Sopenharmony_ci .regions = {ERASEINFO(0x01000,64), 13778c2ecf20Sopenharmony_ci } 13788c2ecf20Sopenharmony_ci }, { 13798c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 13808c2ecf20Sopenharmony_ci .dev_id = SST29LE020, 13818c2ecf20Sopenharmony_ci .name = "SST 29LE020", 13828c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13838c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13848c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 13858c2ecf20Sopenharmony_ci .cmd_set = P_ID_SST_PAGE, 13868c2ecf20Sopenharmony_ci .nr_regions = 1, 13878c2ecf20Sopenharmony_ci .regions = {ERASEINFO(0x01000,64), 13888c2ecf20Sopenharmony_ci } 13898c2ecf20Sopenharmony_ci }, { 13908c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 13918c2ecf20Sopenharmony_ci .dev_id = SST39LF020, 13928c2ecf20Sopenharmony_ci .name = "SST 39LF020", 13938c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 13948c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 13958c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 13968c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 13978c2ecf20Sopenharmony_ci .nr_regions = 1, 13988c2ecf20Sopenharmony_ci .regions = { 13998c2ecf20Sopenharmony_ci ERASEINFO(0x01000,64), 14008c2ecf20Sopenharmony_ci } 14018c2ecf20Sopenharmony_ci }, { 14028c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14038c2ecf20Sopenharmony_ci .dev_id = SST39LF040, 14048c2ecf20Sopenharmony_ci .name = "SST 39LF040", 14058c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14068c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14078c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 14088c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14098c2ecf20Sopenharmony_ci .nr_regions = 1, 14108c2ecf20Sopenharmony_ci .regions = { 14118c2ecf20Sopenharmony_ci ERASEINFO(0x01000,128), 14128c2ecf20Sopenharmony_ci } 14138c2ecf20Sopenharmony_ci }, { 14148c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14158c2ecf20Sopenharmony_ci .dev_id = SST39SF010A, 14168c2ecf20Sopenharmony_ci .name = "SST 39SF010A", 14178c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14188c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14198c2ecf20Sopenharmony_ci .dev_size = SIZE_128KiB, 14208c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14218c2ecf20Sopenharmony_ci .nr_regions = 1, 14228c2ecf20Sopenharmony_ci .regions = { 14238c2ecf20Sopenharmony_ci ERASEINFO(0x01000,32), 14248c2ecf20Sopenharmony_ci } 14258c2ecf20Sopenharmony_ci }, { 14268c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14278c2ecf20Sopenharmony_ci .dev_id = SST39SF020A, 14288c2ecf20Sopenharmony_ci .name = "SST 39SF020A", 14298c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14308c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14318c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 14328c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14338c2ecf20Sopenharmony_ci .nr_regions = 1, 14348c2ecf20Sopenharmony_ci .regions = { 14358c2ecf20Sopenharmony_ci ERASEINFO(0x01000,64), 14368c2ecf20Sopenharmony_ci } 14378c2ecf20Sopenharmony_ci }, { 14388c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14398c2ecf20Sopenharmony_ci .dev_id = SST39SF040, 14408c2ecf20Sopenharmony_ci .name = "SST 39SF040", 14418c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14428c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14438c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 14448c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14458c2ecf20Sopenharmony_ci .nr_regions = 1, 14468c2ecf20Sopenharmony_ci .regions = { 14478c2ecf20Sopenharmony_ci ERASEINFO(0x01000,128), 14488c2ecf20Sopenharmony_ci } 14498c2ecf20Sopenharmony_ci }, { 14508c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14518c2ecf20Sopenharmony_ci .dev_id = SST49LF040B, 14528c2ecf20Sopenharmony_ci .name = "SST 49LF040B", 14538c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14548c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14558c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 14568c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14578c2ecf20Sopenharmony_ci .nr_regions = 1, 14588c2ecf20Sopenharmony_ci .regions = { 14598c2ecf20Sopenharmony_ci ERASEINFO(0x01000,128), 14608c2ecf20Sopenharmony_ci } 14618c2ecf20Sopenharmony_ci }, { 14628c2ecf20Sopenharmony_ci 14638c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14648c2ecf20Sopenharmony_ci .dev_id = SST49LF004B, 14658c2ecf20Sopenharmony_ci .name = "SST 49LF004B", 14668c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14678c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14688c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 14698c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14708c2ecf20Sopenharmony_ci .nr_regions = 1, 14718c2ecf20Sopenharmony_ci .regions = { 14728c2ecf20Sopenharmony_ci ERASEINFO(0x01000,128), 14738c2ecf20Sopenharmony_ci } 14748c2ecf20Sopenharmony_ci }, { 14758c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14768c2ecf20Sopenharmony_ci .dev_id = SST49LF008A, 14778c2ecf20Sopenharmony_ci .name = "SST 49LF008A", 14788c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14798c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14808c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 14818c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14828c2ecf20Sopenharmony_ci .nr_regions = 1, 14838c2ecf20Sopenharmony_ci .regions = { 14848c2ecf20Sopenharmony_ci ERASEINFO(0x01000,256), 14858c2ecf20Sopenharmony_ci } 14868c2ecf20Sopenharmony_ci }, { 14878c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 14888c2ecf20Sopenharmony_ci .dev_id = SST49LF030A, 14898c2ecf20Sopenharmony_ci .name = "SST 49LF030A", 14908c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 14918c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 14928c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 14938c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 14948c2ecf20Sopenharmony_ci .nr_regions = 1, 14958c2ecf20Sopenharmony_ci .regions = { 14968c2ecf20Sopenharmony_ci ERASEINFO(0x01000,96), 14978c2ecf20Sopenharmony_ci } 14988c2ecf20Sopenharmony_ci }, { 14998c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 15008c2ecf20Sopenharmony_ci .dev_id = SST49LF040A, 15018c2ecf20Sopenharmony_ci .name = "SST 49LF040A", 15028c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 15038c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 15048c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 15058c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15068c2ecf20Sopenharmony_ci .nr_regions = 1, 15078c2ecf20Sopenharmony_ci .regions = { 15088c2ecf20Sopenharmony_ci ERASEINFO(0x01000,128), 15098c2ecf20Sopenharmony_ci } 15108c2ecf20Sopenharmony_ci }, { 15118c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 15128c2ecf20Sopenharmony_ci .dev_id = SST49LF080A, 15138c2ecf20Sopenharmony_ci .name = "SST 49LF080A", 15148c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 15158c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 15168c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 15178c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15188c2ecf20Sopenharmony_ci .nr_regions = 1, 15198c2ecf20Sopenharmony_ci .regions = { 15208c2ecf20Sopenharmony_ci ERASEINFO(0x01000,256), 15218c2ecf20Sopenharmony_ci } 15228c2ecf20Sopenharmony_ci }, { 15238c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, /* should be CFI */ 15248c2ecf20Sopenharmony_ci .dev_id = SST39LF160, 15258c2ecf20Sopenharmony_ci .name = "SST 39LF160", 15268c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 15278c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 15288c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 15298c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15308c2ecf20Sopenharmony_ci .nr_regions = 2, 15318c2ecf20Sopenharmony_ci .regions = { 15328c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15338c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256) 15348c2ecf20Sopenharmony_ci } 15358c2ecf20Sopenharmony_ci }, { 15368c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, /* should be CFI */ 15378c2ecf20Sopenharmony_ci .dev_id = SST39VF1601, 15388c2ecf20Sopenharmony_ci .name = "SST 39VF1601", 15398c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 15408c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 15418c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 15428c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15438c2ecf20Sopenharmony_ci .nr_regions = 2, 15448c2ecf20Sopenharmony_ci .regions = { 15458c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15468c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256) 15478c2ecf20Sopenharmony_ci } 15488c2ecf20Sopenharmony_ci }, { 15498c2ecf20Sopenharmony_ci /* CFI is broken: reports AMD_STD, but needs custom uaddr */ 15508c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 15518c2ecf20Sopenharmony_ci .dev_id = SST39WF1601, 15528c2ecf20Sopenharmony_ci .name = "SST 39WF1601", 15538c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 15548c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 15558c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 15568c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15578c2ecf20Sopenharmony_ci .nr_regions = 2, 15588c2ecf20Sopenharmony_ci .regions = { 15598c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15608c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256) 15618c2ecf20Sopenharmony_ci } 15628c2ecf20Sopenharmony_ci }, { 15638c2ecf20Sopenharmony_ci /* CFI is broken: reports AMD_STD, but needs custom uaddr */ 15648c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 15658c2ecf20Sopenharmony_ci .dev_id = SST39WF1602, 15668c2ecf20Sopenharmony_ci .name = "SST 39WF1602", 15678c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 15688c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 15698c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 15708c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15718c2ecf20Sopenharmony_ci .nr_regions = 2, 15728c2ecf20Sopenharmony_ci .regions = { 15738c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15748c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256) 15758c2ecf20Sopenharmony_ci } 15768c2ecf20Sopenharmony_ci }, { 15778c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, /* should be CFI */ 15788c2ecf20Sopenharmony_ci .dev_id = SST39VF3201, 15798c2ecf20Sopenharmony_ci .name = "SST 39VF3201", 15808c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 15818c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0xAAAA_0x5555, 15828c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 15838c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15848c2ecf20Sopenharmony_ci .nr_regions = 4, 15858c2ecf20Sopenharmony_ci .regions = { 15868c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15878c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15888c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256), 15898c2ecf20Sopenharmony_ci ERASEINFO(0x1000,256) 15908c2ecf20Sopenharmony_ci } 15918c2ecf20Sopenharmony_ci }, { 15928c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_SST, 15938c2ecf20Sopenharmony_ci .dev_id = SST36VF3203, 15948c2ecf20Sopenharmony_ci .name = "SST 36VF3203", 15958c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 15968c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 15978c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 15988c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 15998c2ecf20Sopenharmony_ci .nr_regions = 1, 16008c2ecf20Sopenharmony_ci .regions = { 16018c2ecf20Sopenharmony_ci ERASEINFO(0x10000,64), 16028c2ecf20Sopenharmony_ci } 16038c2ecf20Sopenharmony_ci }, { 16048c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 16058c2ecf20Sopenharmony_ci .dev_id = M29F800AB, 16068c2ecf20Sopenharmony_ci .name = "ST M29F800AB", 16078c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16088c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 16098c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 16108c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16118c2ecf20Sopenharmony_ci .nr_regions = 4, 16128c2ecf20Sopenharmony_ci .regions = { 16138c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 16148c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 16158c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 16168c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 16178c2ecf20Sopenharmony_ci } 16188c2ecf20Sopenharmony_ci }, { 16198c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */ 16208c2ecf20Sopenharmony_ci .dev_id = M29W800DT, 16218c2ecf20Sopenharmony_ci .name = "ST M29W800DT", 16228c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16238c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 16248c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 16258c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16268c2ecf20Sopenharmony_ci .nr_regions = 4, 16278c2ecf20Sopenharmony_ci .regions = { 16288c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15), 16298c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 16308c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 16318c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 16328c2ecf20Sopenharmony_ci } 16338c2ecf20Sopenharmony_ci }, { 16348c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */ 16358c2ecf20Sopenharmony_ci .dev_id = M29W800DB, 16368c2ecf20Sopenharmony_ci .name = "ST M29W800DB", 16378c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16388c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 16398c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 16408c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16418c2ecf20Sopenharmony_ci .nr_regions = 4, 16428c2ecf20Sopenharmony_ci .regions = { 16438c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 16448c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 16458c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 16468c2ecf20Sopenharmony_ci ERASEINFO(0x10000,15) 16478c2ecf20Sopenharmony_ci } 16488c2ecf20Sopenharmony_ci }, { 16498c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 16508c2ecf20Sopenharmony_ci .dev_id = M29W400DT, 16518c2ecf20Sopenharmony_ci .name = "ST M29W400DT", 16528c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16538c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 16548c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 16558c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16568c2ecf20Sopenharmony_ci .nr_regions = 4, 16578c2ecf20Sopenharmony_ci .regions = { 16588c2ecf20Sopenharmony_ci ERASEINFO(0x04000,7), 16598c2ecf20Sopenharmony_ci ERASEINFO(0x02000,1), 16608c2ecf20Sopenharmony_ci ERASEINFO(0x08000,2), 16618c2ecf20Sopenharmony_ci ERASEINFO(0x10000,1) 16628c2ecf20Sopenharmony_ci } 16638c2ecf20Sopenharmony_ci }, { 16648c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 16658c2ecf20Sopenharmony_ci .dev_id = M29W400DB, 16668c2ecf20Sopenharmony_ci .name = "ST M29W400DB", 16678c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16688c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 16698c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 16708c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16718c2ecf20Sopenharmony_ci .nr_regions = 4, 16728c2ecf20Sopenharmony_ci .regions = { 16738c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 16748c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 16758c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 16768c2ecf20Sopenharmony_ci ERASEINFO(0x10000,7) 16778c2ecf20Sopenharmony_ci } 16788c2ecf20Sopenharmony_ci }, { 16798c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */ 16808c2ecf20Sopenharmony_ci .dev_id = M29W160DT, 16818c2ecf20Sopenharmony_ci .name = "ST M29W160DT", 16828c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16838c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, /* ???? */ 16848c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 16858c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 16868c2ecf20Sopenharmony_ci .nr_regions = 4, 16878c2ecf20Sopenharmony_ci .regions = { 16888c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 16898c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 16908c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 16918c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 16928c2ecf20Sopenharmony_ci } 16938c2ecf20Sopenharmony_ci }, { 16948c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, /* FIXME - CFI device? */ 16958c2ecf20Sopenharmony_ci .dev_id = M29W160DB, 16968c2ecf20Sopenharmony_ci .name = "ST M29W160DB", 16978c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 16988c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, /* ???? */ 16998c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 17008c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 17018c2ecf20Sopenharmony_ci .nr_regions = 4, 17028c2ecf20Sopenharmony_ci .regions = { 17038c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 17048c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 17058c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 17068c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 17078c2ecf20Sopenharmony_ci } 17088c2ecf20Sopenharmony_ci }, { 17098c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17108c2ecf20Sopenharmony_ci .dev_id = M29W040B, 17118c2ecf20Sopenharmony_ci .name = "ST M29W040B", 17128c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17138c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0555_0x02AA, 17148c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 17158c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 17168c2ecf20Sopenharmony_ci .nr_regions = 1, 17178c2ecf20Sopenharmony_ci .regions = { 17188c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 17198c2ecf20Sopenharmony_ci } 17208c2ecf20Sopenharmony_ci }, { 17218c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17228c2ecf20Sopenharmony_ci .dev_id = M50FW040, 17238c2ecf20Sopenharmony_ci .name = "ST M50FW040", 17248c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17258c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17268c2ecf20Sopenharmony_ci .dev_size = SIZE_512KiB, 17278c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17288c2ecf20Sopenharmony_ci .nr_regions = 1, 17298c2ecf20Sopenharmony_ci .regions = { 17308c2ecf20Sopenharmony_ci ERASEINFO(0x10000,8), 17318c2ecf20Sopenharmony_ci } 17328c2ecf20Sopenharmony_ci }, { 17338c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17348c2ecf20Sopenharmony_ci .dev_id = M50FW080, 17358c2ecf20Sopenharmony_ci .name = "ST M50FW080", 17368c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17378c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17388c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 17398c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17408c2ecf20Sopenharmony_ci .nr_regions = 1, 17418c2ecf20Sopenharmony_ci .regions = { 17428c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 17438c2ecf20Sopenharmony_ci } 17448c2ecf20Sopenharmony_ci }, { 17458c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17468c2ecf20Sopenharmony_ci .dev_id = M50FW016, 17478c2ecf20Sopenharmony_ci .name = "ST M50FW016", 17488c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17498c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17508c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 17518c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17528c2ecf20Sopenharmony_ci .nr_regions = 1, 17538c2ecf20Sopenharmony_ci .regions = { 17548c2ecf20Sopenharmony_ci ERASEINFO(0x10000,32), 17558c2ecf20Sopenharmony_ci } 17568c2ecf20Sopenharmony_ci }, { 17578c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17588c2ecf20Sopenharmony_ci .dev_id = M50LPW080, 17598c2ecf20Sopenharmony_ci .name = "ST M50LPW080", 17608c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17618c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17628c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 17638c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17648c2ecf20Sopenharmony_ci .nr_regions = 1, 17658c2ecf20Sopenharmony_ci .regions = { 17668c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 17678c2ecf20Sopenharmony_ci }, 17688c2ecf20Sopenharmony_ci }, { 17698c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17708c2ecf20Sopenharmony_ci .dev_id = M50FLW080A, 17718c2ecf20Sopenharmony_ci .name = "ST M50FLW080A", 17728c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17738c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17748c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 17758c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17768c2ecf20Sopenharmony_ci .nr_regions = 4, 17778c2ecf20Sopenharmony_ci .regions = { 17788c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17798c2ecf20Sopenharmony_ci ERASEINFO(0x10000,13), 17808c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17818c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17828c2ecf20Sopenharmony_ci } 17838c2ecf20Sopenharmony_ci }, { 17848c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_ST, 17858c2ecf20Sopenharmony_ci .dev_id = M50FLW080B, 17868c2ecf20Sopenharmony_ci .name = "ST M50FLW080B", 17878c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 17888c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_UNNECESSARY, 17898c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 17908c2ecf20Sopenharmony_ci .cmd_set = P_ID_INTEL_EXT, 17918c2ecf20Sopenharmony_ci .nr_regions = 4, 17928c2ecf20Sopenharmony_ci .regions = { 17938c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17948c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17958c2ecf20Sopenharmony_ci ERASEINFO(0x10000,13), 17968c2ecf20Sopenharmony_ci ERASEINFO(0x1000,16), 17978c2ecf20Sopenharmony_ci } 17988c2ecf20Sopenharmony_ci }, { 17998c2ecf20Sopenharmony_ci .mfr_id = 0xff00 | CFI_MFR_ST, 18008c2ecf20Sopenharmony_ci .dev_id = 0xff00 | PSD4256G6V, 18018c2ecf20Sopenharmony_ci .name = "ST PSD4256G6V", 18028c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16, 18038c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0554, 18048c2ecf20Sopenharmony_ci .dev_size = SIZE_1MiB, 18058c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18068c2ecf20Sopenharmony_ci .nr_regions = 1, 18078c2ecf20Sopenharmony_ci .regions = { 18088c2ecf20Sopenharmony_ci ERASEINFO(0x10000,16), 18098c2ecf20Sopenharmony_ci } 18108c2ecf20Sopenharmony_ci }, { 18118c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18128c2ecf20Sopenharmony_ci .dev_id = TC58FVT160, 18138c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVT160", 18148c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18158c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18168c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 18178c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18188c2ecf20Sopenharmony_ci .nr_regions = 4, 18198c2ecf20Sopenharmony_ci .regions = { 18208c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31), 18218c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 18228c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 18238c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1) 18248c2ecf20Sopenharmony_ci } 18258c2ecf20Sopenharmony_ci }, { 18268c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18278c2ecf20Sopenharmony_ci .dev_id = TC58FVB160, 18288c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVB160", 18298c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18308c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18318c2ecf20Sopenharmony_ci .dev_size = SIZE_2MiB, 18328c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18338c2ecf20Sopenharmony_ci .nr_regions = 4, 18348c2ecf20Sopenharmony_ci .regions = { 18358c2ecf20Sopenharmony_ci ERASEINFO(0x04000,1), 18368c2ecf20Sopenharmony_ci ERASEINFO(0x02000,2), 18378c2ecf20Sopenharmony_ci ERASEINFO(0x08000,1), 18388c2ecf20Sopenharmony_ci ERASEINFO(0x10000,31) 18398c2ecf20Sopenharmony_ci } 18408c2ecf20Sopenharmony_ci }, { 18418c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18428c2ecf20Sopenharmony_ci .dev_id = TC58FVB321, 18438c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVB321", 18448c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18458c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18468c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 18478c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18488c2ecf20Sopenharmony_ci .nr_regions = 2, 18498c2ecf20Sopenharmony_ci .regions = { 18508c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8), 18518c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63) 18528c2ecf20Sopenharmony_ci } 18538c2ecf20Sopenharmony_ci }, { 18548c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18558c2ecf20Sopenharmony_ci .dev_id = TC58FVT321, 18568c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVT321", 18578c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18588c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18598c2ecf20Sopenharmony_ci .dev_size = SIZE_4MiB, 18608c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18618c2ecf20Sopenharmony_ci .nr_regions = 2, 18628c2ecf20Sopenharmony_ci .regions = { 18638c2ecf20Sopenharmony_ci ERASEINFO(0x10000,63), 18648c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8) 18658c2ecf20Sopenharmony_ci } 18668c2ecf20Sopenharmony_ci }, { 18678c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18688c2ecf20Sopenharmony_ci .dev_id = TC58FVB641, 18698c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVB641", 18708c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18718c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18728c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 18738c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18748c2ecf20Sopenharmony_ci .nr_regions = 2, 18758c2ecf20Sopenharmony_ci .regions = { 18768c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8), 18778c2ecf20Sopenharmony_ci ERASEINFO(0x10000,127) 18788c2ecf20Sopenharmony_ci } 18798c2ecf20Sopenharmony_ci }, { 18808c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_TOSHIBA, 18818c2ecf20Sopenharmony_ci .dev_id = TC58FVT641, 18828c2ecf20Sopenharmony_ci .name = "Toshiba TC58FVT641", 18838c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X16|CFI_DEVICETYPE_X8, 18848c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x0AAA_0x0555, 18858c2ecf20Sopenharmony_ci .dev_size = SIZE_8MiB, 18868c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 18878c2ecf20Sopenharmony_ci .nr_regions = 2, 18888c2ecf20Sopenharmony_ci .regions = { 18898c2ecf20Sopenharmony_ci ERASEINFO(0x10000,127), 18908c2ecf20Sopenharmony_ci ERASEINFO(0x02000,8) 18918c2ecf20Sopenharmony_ci } 18928c2ecf20Sopenharmony_ci }, { 18938c2ecf20Sopenharmony_ci .mfr_id = CFI_MFR_WINBOND, 18948c2ecf20Sopenharmony_ci .dev_id = W49V002A, 18958c2ecf20Sopenharmony_ci .name = "Winbond W49V002A", 18968c2ecf20Sopenharmony_ci .devtypes = CFI_DEVICETYPE_X8, 18978c2ecf20Sopenharmony_ci .uaddr = MTD_UADDR_0x5555_0x2AAA, 18988c2ecf20Sopenharmony_ci .dev_size = SIZE_256KiB, 18998c2ecf20Sopenharmony_ci .cmd_set = P_ID_AMD_STD, 19008c2ecf20Sopenharmony_ci .nr_regions = 4, 19018c2ecf20Sopenharmony_ci .regions = { 19028c2ecf20Sopenharmony_ci ERASEINFO(0x10000, 3), 19038c2ecf20Sopenharmony_ci ERASEINFO(0x08000, 1), 19048c2ecf20Sopenharmony_ci ERASEINFO(0x02000, 2), 19058c2ecf20Sopenharmony_ci ERASEINFO(0x04000, 1), 19068c2ecf20Sopenharmony_ci } 19078c2ecf20Sopenharmony_ci } 19088c2ecf20Sopenharmony_ci}; 19098c2ecf20Sopenharmony_ci 19108c2ecf20Sopenharmony_cistatic inline u32 jedec_read_mfr(struct map_info *map, uint32_t base, 19118c2ecf20Sopenharmony_ci struct cfi_private *cfi) 19128c2ecf20Sopenharmony_ci{ 19138c2ecf20Sopenharmony_ci map_word result; 19148c2ecf20Sopenharmony_ci unsigned long mask; 19158c2ecf20Sopenharmony_ci int bank = 0; 19168c2ecf20Sopenharmony_ci 19178c2ecf20Sopenharmony_ci /* According to JEDEC "Standard Manufacturer's Identification Code" 19188c2ecf20Sopenharmony_ci * (http://www.jedec.org/download/search/jep106W.pdf) 19198c2ecf20Sopenharmony_ci * several first banks can contain 0x7f instead of actual ID 19208c2ecf20Sopenharmony_ci */ 19218c2ecf20Sopenharmony_ci do { 19228c2ecf20Sopenharmony_ci uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi); 19238c2ecf20Sopenharmony_ci mask = (1 << (cfi->device_type * 8)) - 1; 19248c2ecf20Sopenharmony_ci if (ofs >= map->size) 19258c2ecf20Sopenharmony_ci return 0; 19268c2ecf20Sopenharmony_ci result = map_read(map, base + ofs); 19278c2ecf20Sopenharmony_ci bank++; 19288c2ecf20Sopenharmony_ci } while ((result.x[0] & mask) == CFI_MFR_CONTINUATION); 19298c2ecf20Sopenharmony_ci 19308c2ecf20Sopenharmony_ci return result.x[0] & mask; 19318c2ecf20Sopenharmony_ci} 19328c2ecf20Sopenharmony_ci 19338c2ecf20Sopenharmony_cistatic inline u32 jedec_read_id(struct map_info *map, uint32_t base, 19348c2ecf20Sopenharmony_ci struct cfi_private *cfi) 19358c2ecf20Sopenharmony_ci{ 19368c2ecf20Sopenharmony_ci map_word result; 19378c2ecf20Sopenharmony_ci unsigned long mask; 19388c2ecf20Sopenharmony_ci u32 ofs = cfi_build_cmd_addr(1, map, cfi); 19398c2ecf20Sopenharmony_ci mask = (1 << (cfi->device_type * 8)) -1; 19408c2ecf20Sopenharmony_ci result = map_read(map, base + ofs); 19418c2ecf20Sopenharmony_ci return result.x[0] & mask; 19428c2ecf20Sopenharmony_ci} 19438c2ecf20Sopenharmony_ci 19448c2ecf20Sopenharmony_cistatic void jedec_reset(u32 base, struct map_info *map, struct cfi_private *cfi) 19458c2ecf20Sopenharmony_ci{ 19468c2ecf20Sopenharmony_ci /* Reset */ 19478c2ecf20Sopenharmony_ci 19488c2ecf20Sopenharmony_ci /* after checking the datasheets for SST, MACRONIX and ATMEL 19498c2ecf20Sopenharmony_ci * (oh and incidentaly the jedec spec - 3.5.3.3) the reset 19508c2ecf20Sopenharmony_ci * sequence is *supposed* to be 0xaa at 0x5555, 0x55 at 19518c2ecf20Sopenharmony_ci * 0x2aaa, 0xF0 at 0x5555 this will not affect the AMD chips 19528c2ecf20Sopenharmony_ci * as they will ignore the writes and don't care what address 19538c2ecf20Sopenharmony_ci * the F0 is written to */ 19548c2ecf20Sopenharmony_ci if (cfi->addr_unlock1) { 19558c2ecf20Sopenharmony_ci pr_debug( "reset unlock called %x %x \n", 19568c2ecf20Sopenharmony_ci cfi->addr_unlock1,cfi->addr_unlock2); 19578c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 19588c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL); 19598c2ecf20Sopenharmony_ci } 19608c2ecf20Sopenharmony_ci 19618c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 19628c2ecf20Sopenharmony_ci /* Some misdesigned Intel chips do not respond for 0xF0 for a reset, 19638c2ecf20Sopenharmony_ci * so ensure we're in read mode. Send both the Intel and the AMD command 19648c2ecf20Sopenharmony_ci * for this. Intel uses 0xff for this, AMD uses 0xff for NOP, so 19658c2ecf20Sopenharmony_ci * this should be safe. 19668c2ecf20Sopenharmony_ci */ 19678c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0xFF, 0, base, map, cfi, cfi->device_type, NULL); 19688c2ecf20Sopenharmony_ci /* FIXME - should have reset delay before continuing */ 19698c2ecf20Sopenharmony_ci} 19708c2ecf20Sopenharmony_ci 19718c2ecf20Sopenharmony_ci 19728c2ecf20Sopenharmony_cistatic int cfi_jedec_setup(struct map_info *map, struct cfi_private *cfi, int index) 19738c2ecf20Sopenharmony_ci{ 19748c2ecf20Sopenharmony_ci int i,num_erase_regions; 19758c2ecf20Sopenharmony_ci uint8_t uaddr; 19768c2ecf20Sopenharmony_ci 19778c2ecf20Sopenharmony_ci if (!(jedec_table[index].devtypes & cfi->device_type)) { 19788c2ecf20Sopenharmony_ci pr_debug("Rejecting potential %s with incompatible %d-bit device type\n", 19798c2ecf20Sopenharmony_ci jedec_table[index].name, 4 * (1<<cfi->device_type)); 19808c2ecf20Sopenharmony_ci return 0; 19818c2ecf20Sopenharmony_ci } 19828c2ecf20Sopenharmony_ci 19838c2ecf20Sopenharmony_ci printk(KERN_INFO "Found: %s\n",jedec_table[index].name); 19848c2ecf20Sopenharmony_ci 19858c2ecf20Sopenharmony_ci num_erase_regions = jedec_table[index].nr_regions; 19868c2ecf20Sopenharmony_ci 19878c2ecf20Sopenharmony_ci cfi->cfiq = kmalloc(sizeof(struct cfi_ident) + num_erase_regions * 4, GFP_KERNEL); 19888c2ecf20Sopenharmony_ci if (!cfi->cfiq) { 19898c2ecf20Sopenharmony_ci //xx printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure\n", map->name); 19908c2ecf20Sopenharmony_ci return 0; 19918c2ecf20Sopenharmony_ci } 19928c2ecf20Sopenharmony_ci 19938c2ecf20Sopenharmony_ci memset(cfi->cfiq, 0, sizeof(struct cfi_ident)); 19948c2ecf20Sopenharmony_ci 19958c2ecf20Sopenharmony_ci cfi->cfiq->P_ID = jedec_table[index].cmd_set; 19968c2ecf20Sopenharmony_ci cfi->cfiq->NumEraseRegions = jedec_table[index].nr_regions; 19978c2ecf20Sopenharmony_ci cfi->cfiq->DevSize = jedec_table[index].dev_size; 19988c2ecf20Sopenharmony_ci cfi->cfi_mode = CFI_MODE_JEDEC; 19998c2ecf20Sopenharmony_ci cfi->sector_erase_cmd = CMD(0x30); 20008c2ecf20Sopenharmony_ci 20018c2ecf20Sopenharmony_ci for (i=0; i<num_erase_regions; i++){ 20028c2ecf20Sopenharmony_ci cfi->cfiq->EraseRegionInfo[i] = jedec_table[index].regions[i]; 20038c2ecf20Sopenharmony_ci } 20048c2ecf20Sopenharmony_ci cfi->cmdset_priv = NULL; 20058c2ecf20Sopenharmony_ci 20068c2ecf20Sopenharmony_ci /* This may be redundant for some cases, but it doesn't hurt */ 20078c2ecf20Sopenharmony_ci cfi->mfr = jedec_table[index].mfr_id; 20088c2ecf20Sopenharmony_ci cfi->id = jedec_table[index].dev_id; 20098c2ecf20Sopenharmony_ci 20108c2ecf20Sopenharmony_ci uaddr = jedec_table[index].uaddr; 20118c2ecf20Sopenharmony_ci 20128c2ecf20Sopenharmony_ci /* The table has unlock addresses in _bytes_, and we try not to let 20138c2ecf20Sopenharmony_ci our brains explode when we see the datasheets talking about address 20148c2ecf20Sopenharmony_ci lines numbered from A-1 to A18. The CFI table has unlock addresses 20158c2ecf20Sopenharmony_ci in device-words according to the mode the device is connected in */ 20168c2ecf20Sopenharmony_ci cfi->addr_unlock1 = unlock_addrs[uaddr].addr1 / cfi->device_type; 20178c2ecf20Sopenharmony_ci cfi->addr_unlock2 = unlock_addrs[uaddr].addr2 / cfi->device_type; 20188c2ecf20Sopenharmony_ci 20198c2ecf20Sopenharmony_ci return 1; /* ok */ 20208c2ecf20Sopenharmony_ci} 20218c2ecf20Sopenharmony_ci 20228c2ecf20Sopenharmony_ci 20238c2ecf20Sopenharmony_ci/* 20248c2ecf20Sopenharmony_ci * There is a BIG problem properly ID'ing the JEDEC device and guaranteeing 20258c2ecf20Sopenharmony_ci * the mapped address, unlock addresses, and proper chip ID. This function 20268c2ecf20Sopenharmony_ci * attempts to minimize errors. It is doubtfull that this probe will ever 20278c2ecf20Sopenharmony_ci * be perfect - consequently there should be some module parameters that 20288c2ecf20Sopenharmony_ci * could be manually specified to force the chip info. 20298c2ecf20Sopenharmony_ci */ 20308c2ecf20Sopenharmony_cistatic inline int jedec_match( uint32_t base, 20318c2ecf20Sopenharmony_ci struct map_info *map, 20328c2ecf20Sopenharmony_ci struct cfi_private *cfi, 20338c2ecf20Sopenharmony_ci const struct amd_flash_info *finfo ) 20348c2ecf20Sopenharmony_ci{ 20358c2ecf20Sopenharmony_ci int rc = 0; /* failure until all tests pass */ 20368c2ecf20Sopenharmony_ci u32 mfr, id; 20378c2ecf20Sopenharmony_ci uint8_t uaddr; 20388c2ecf20Sopenharmony_ci 20398c2ecf20Sopenharmony_ci /* 20408c2ecf20Sopenharmony_ci * The IDs must match. For X16 and X32 devices operating in 20418c2ecf20Sopenharmony_ci * a lower width ( X8 or X16 ), the device ID's are usually just 20428c2ecf20Sopenharmony_ci * the lower byte(s) of the larger device ID for wider mode. If 20438c2ecf20Sopenharmony_ci * a part is found that doesn't fit this assumption (device id for 20448c2ecf20Sopenharmony_ci * smaller width mode is completely unrealated to full-width mode) 20458c2ecf20Sopenharmony_ci * then the jedec_table[] will have to be augmented with the IDs 20468c2ecf20Sopenharmony_ci * for different widths. 20478c2ecf20Sopenharmony_ci */ 20488c2ecf20Sopenharmony_ci switch (cfi->device_type) { 20498c2ecf20Sopenharmony_ci case CFI_DEVICETYPE_X8: 20508c2ecf20Sopenharmony_ci mfr = (uint8_t)finfo->mfr_id; 20518c2ecf20Sopenharmony_ci id = (uint8_t)finfo->dev_id; 20528c2ecf20Sopenharmony_ci 20538c2ecf20Sopenharmony_ci /* bjd: it seems that if we do this, we can end up 20548c2ecf20Sopenharmony_ci * detecting 16bit flashes as an 8bit device, even though 20558c2ecf20Sopenharmony_ci * there aren't. 20568c2ecf20Sopenharmony_ci */ 20578c2ecf20Sopenharmony_ci if (finfo->dev_id > 0xff) { 20588c2ecf20Sopenharmony_ci pr_debug("%s(): ID is not 8bit\n", 20598c2ecf20Sopenharmony_ci __func__); 20608c2ecf20Sopenharmony_ci goto match_done; 20618c2ecf20Sopenharmony_ci } 20628c2ecf20Sopenharmony_ci break; 20638c2ecf20Sopenharmony_ci case CFI_DEVICETYPE_X16: 20648c2ecf20Sopenharmony_ci mfr = (uint16_t)finfo->mfr_id; 20658c2ecf20Sopenharmony_ci id = (uint16_t)finfo->dev_id; 20668c2ecf20Sopenharmony_ci break; 20678c2ecf20Sopenharmony_ci case CFI_DEVICETYPE_X32: 20688c2ecf20Sopenharmony_ci mfr = (uint16_t)finfo->mfr_id; 20698c2ecf20Sopenharmony_ci id = (uint32_t)finfo->dev_id; 20708c2ecf20Sopenharmony_ci break; 20718c2ecf20Sopenharmony_ci default: 20728c2ecf20Sopenharmony_ci printk(KERN_WARNING 20738c2ecf20Sopenharmony_ci "MTD %s(): Unsupported device type %d\n", 20748c2ecf20Sopenharmony_ci __func__, cfi->device_type); 20758c2ecf20Sopenharmony_ci goto match_done; 20768c2ecf20Sopenharmony_ci } 20778c2ecf20Sopenharmony_ci if ( cfi->mfr != mfr || cfi->id != id ) { 20788c2ecf20Sopenharmony_ci goto match_done; 20798c2ecf20Sopenharmony_ci } 20808c2ecf20Sopenharmony_ci 20818c2ecf20Sopenharmony_ci /* the part size must fit in the memory window */ 20828c2ecf20Sopenharmony_ci pr_debug("MTD %s(): Check fit 0x%.8x + 0x%.8x = 0x%.8x\n", 20838c2ecf20Sopenharmony_ci __func__, base, 1 << finfo->dev_size, base + (1 << finfo->dev_size) ); 20848c2ecf20Sopenharmony_ci if ( base + cfi_interleave(cfi) * ( 1 << finfo->dev_size ) > map->size ) { 20858c2ecf20Sopenharmony_ci pr_debug("MTD %s(): 0x%.4x 0x%.4x %dKiB doesn't fit\n", 20868c2ecf20Sopenharmony_ci __func__, finfo->mfr_id, finfo->dev_id, 20878c2ecf20Sopenharmony_ci 1 << finfo->dev_size ); 20888c2ecf20Sopenharmony_ci goto match_done; 20898c2ecf20Sopenharmony_ci } 20908c2ecf20Sopenharmony_ci 20918c2ecf20Sopenharmony_ci if (! (finfo->devtypes & cfi->device_type)) 20928c2ecf20Sopenharmony_ci goto match_done; 20938c2ecf20Sopenharmony_ci 20948c2ecf20Sopenharmony_ci uaddr = finfo->uaddr; 20958c2ecf20Sopenharmony_ci 20968c2ecf20Sopenharmony_ci pr_debug("MTD %s(): check unlock addrs 0x%.4x 0x%.4x\n", 20978c2ecf20Sopenharmony_ci __func__, cfi->addr_unlock1, cfi->addr_unlock2 ); 20988c2ecf20Sopenharmony_ci if ( MTD_UADDR_UNNECESSARY != uaddr && MTD_UADDR_DONT_CARE != uaddr 20998c2ecf20Sopenharmony_ci && ( unlock_addrs[uaddr].addr1 / cfi->device_type != cfi->addr_unlock1 || 21008c2ecf20Sopenharmony_ci unlock_addrs[uaddr].addr2 / cfi->device_type != cfi->addr_unlock2 ) ) { 21018c2ecf20Sopenharmony_ci pr_debug("MTD %s(): 0x%.4x 0x%.4x did not match\n", 21028c2ecf20Sopenharmony_ci __func__, 21038c2ecf20Sopenharmony_ci unlock_addrs[uaddr].addr1, 21048c2ecf20Sopenharmony_ci unlock_addrs[uaddr].addr2); 21058c2ecf20Sopenharmony_ci goto match_done; 21068c2ecf20Sopenharmony_ci } 21078c2ecf20Sopenharmony_ci 21088c2ecf20Sopenharmony_ci /* 21098c2ecf20Sopenharmony_ci * Make sure the ID's disappear when the device is taken out of 21108c2ecf20Sopenharmony_ci * ID mode. The only time this should fail when it should succeed 21118c2ecf20Sopenharmony_ci * is when the ID's are written as data to the same 21128c2ecf20Sopenharmony_ci * addresses. For this rare and unfortunate case the chip 21138c2ecf20Sopenharmony_ci * cannot be probed correctly. 21148c2ecf20Sopenharmony_ci * FIXME - write a driver that takes all of the chip info as 21158c2ecf20Sopenharmony_ci * module parameters, doesn't probe but forces a load. 21168c2ecf20Sopenharmony_ci */ 21178c2ecf20Sopenharmony_ci pr_debug("MTD %s(): check ID's disappear when not in ID mode\n", 21188c2ecf20Sopenharmony_ci __func__ ); 21198c2ecf20Sopenharmony_ci jedec_reset( base, map, cfi ); 21208c2ecf20Sopenharmony_ci mfr = jedec_read_mfr( map, base, cfi ); 21218c2ecf20Sopenharmony_ci id = jedec_read_id( map, base, cfi ); 21228c2ecf20Sopenharmony_ci if ( mfr == cfi->mfr && id == cfi->id ) { 21238c2ecf20Sopenharmony_ci pr_debug("MTD %s(): ID 0x%.2x:0x%.2x did not change after reset:\n" 21248c2ecf20Sopenharmony_ci "You might need to manually specify JEDEC parameters.\n", 21258c2ecf20Sopenharmony_ci __func__, cfi->mfr, cfi->id ); 21268c2ecf20Sopenharmony_ci goto match_done; 21278c2ecf20Sopenharmony_ci } 21288c2ecf20Sopenharmony_ci 21298c2ecf20Sopenharmony_ci /* all tests passed - mark as success */ 21308c2ecf20Sopenharmony_ci rc = 1; 21318c2ecf20Sopenharmony_ci 21328c2ecf20Sopenharmony_ci /* 21338c2ecf20Sopenharmony_ci * Put the device back in ID mode - only need to do this if we 21348c2ecf20Sopenharmony_ci * were truly frobbing a real device. 21358c2ecf20Sopenharmony_ci */ 21368c2ecf20Sopenharmony_ci pr_debug("MTD %s(): return to ID mode\n", __func__ ); 21378c2ecf20Sopenharmony_ci if (cfi->addr_unlock1) { 21388c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 21398c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL); 21408c2ecf20Sopenharmony_ci } 21418c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 21428c2ecf20Sopenharmony_ci /* FIXME - should have a delay before continuing */ 21438c2ecf20Sopenharmony_ci 21448c2ecf20Sopenharmony_ci match_done: 21458c2ecf20Sopenharmony_ci return rc; 21468c2ecf20Sopenharmony_ci} 21478c2ecf20Sopenharmony_ci 21488c2ecf20Sopenharmony_ci 21498c2ecf20Sopenharmony_cistatic int jedec_probe_chip(struct map_info *map, __u32 base, 21508c2ecf20Sopenharmony_ci unsigned long *chip_map, struct cfi_private *cfi) 21518c2ecf20Sopenharmony_ci{ 21528c2ecf20Sopenharmony_ci int i; 21538c2ecf20Sopenharmony_ci enum uaddr uaddr_idx = MTD_UADDR_NOT_SUPPORTED; 21548c2ecf20Sopenharmony_ci u32 probe_offset1, probe_offset2; 21558c2ecf20Sopenharmony_ci 21568c2ecf20Sopenharmony_ci retry: 21578c2ecf20Sopenharmony_ci if (!cfi->numchips) { 21588c2ecf20Sopenharmony_ci uaddr_idx++; 21598c2ecf20Sopenharmony_ci 21608c2ecf20Sopenharmony_ci if (MTD_UADDR_UNNECESSARY == uaddr_idx) 21618c2ecf20Sopenharmony_ci return 0; 21628c2ecf20Sopenharmony_ci 21638c2ecf20Sopenharmony_ci cfi->addr_unlock1 = unlock_addrs[uaddr_idx].addr1 / cfi->device_type; 21648c2ecf20Sopenharmony_ci cfi->addr_unlock2 = unlock_addrs[uaddr_idx].addr2 / cfi->device_type; 21658c2ecf20Sopenharmony_ci } 21668c2ecf20Sopenharmony_ci 21678c2ecf20Sopenharmony_ci /* Make certain we aren't probing past the end of map */ 21688c2ecf20Sopenharmony_ci if (base >= map->size) { 21698c2ecf20Sopenharmony_ci printk(KERN_NOTICE 21708c2ecf20Sopenharmony_ci "Probe at base(0x%08x) past the end of the map(0x%08lx)\n", 21718c2ecf20Sopenharmony_ci base, map->size -1); 21728c2ecf20Sopenharmony_ci return 0; 21738c2ecf20Sopenharmony_ci 21748c2ecf20Sopenharmony_ci } 21758c2ecf20Sopenharmony_ci /* Ensure the unlock addresses we try stay inside the map */ 21768c2ecf20Sopenharmony_ci probe_offset1 = cfi_build_cmd_addr(cfi->addr_unlock1, map, cfi); 21778c2ecf20Sopenharmony_ci probe_offset2 = cfi_build_cmd_addr(cfi->addr_unlock2, map, cfi); 21788c2ecf20Sopenharmony_ci if ( ((base + probe_offset1 + map_bankwidth(map)) >= map->size) || 21798c2ecf20Sopenharmony_ci ((base + probe_offset2 + map_bankwidth(map)) >= map->size)) 21808c2ecf20Sopenharmony_ci goto retry; 21818c2ecf20Sopenharmony_ci 21828c2ecf20Sopenharmony_ci /* Reset */ 21838c2ecf20Sopenharmony_ci jedec_reset(base, map, cfi); 21848c2ecf20Sopenharmony_ci 21858c2ecf20Sopenharmony_ci /* Autoselect Mode */ 21868c2ecf20Sopenharmony_ci if(cfi->addr_unlock1) { 21878c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 21888c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL); 21898c2ecf20Sopenharmony_ci } 21908c2ecf20Sopenharmony_ci cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL); 21918c2ecf20Sopenharmony_ci /* FIXME - should have a delay before continuing */ 21928c2ecf20Sopenharmony_ci 21938c2ecf20Sopenharmony_ci if (!cfi->numchips) { 21948c2ecf20Sopenharmony_ci /* This is the first time we're called. Set up the CFI 21958c2ecf20Sopenharmony_ci stuff accordingly and return */ 21968c2ecf20Sopenharmony_ci 21978c2ecf20Sopenharmony_ci cfi->mfr = jedec_read_mfr(map, base, cfi); 21988c2ecf20Sopenharmony_ci cfi->id = jedec_read_id(map, base, cfi); 21998c2ecf20Sopenharmony_ci pr_debug("Search for id:(%02x %02x) interleave(%d) type(%d)\n", 22008c2ecf20Sopenharmony_ci cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type); 22018c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(jedec_table); i++) { 22028c2ecf20Sopenharmony_ci if ( jedec_match( base, map, cfi, &jedec_table[i] ) ) { 22038c2ecf20Sopenharmony_ci pr_debug("MTD %s(): matched device 0x%x,0x%x unlock_addrs: 0x%.4x 0x%.4x\n", 22048c2ecf20Sopenharmony_ci __func__, cfi->mfr, cfi->id, 22058c2ecf20Sopenharmony_ci cfi->addr_unlock1, cfi->addr_unlock2 ); 22068c2ecf20Sopenharmony_ci if (!cfi_jedec_setup(map, cfi, i)) 22078c2ecf20Sopenharmony_ci return 0; 22088c2ecf20Sopenharmony_ci goto ok_out; 22098c2ecf20Sopenharmony_ci } 22108c2ecf20Sopenharmony_ci } 22118c2ecf20Sopenharmony_ci goto retry; 22128c2ecf20Sopenharmony_ci } else { 22138c2ecf20Sopenharmony_ci uint16_t mfr; 22148c2ecf20Sopenharmony_ci uint16_t id; 22158c2ecf20Sopenharmony_ci 22168c2ecf20Sopenharmony_ci /* Make sure it is a chip of the same manufacturer and id */ 22178c2ecf20Sopenharmony_ci mfr = jedec_read_mfr(map, base, cfi); 22188c2ecf20Sopenharmony_ci id = jedec_read_id(map, base, cfi); 22198c2ecf20Sopenharmony_ci 22208c2ecf20Sopenharmony_ci if ((mfr != cfi->mfr) || (id != cfi->id)) { 22218c2ecf20Sopenharmony_ci printk(KERN_DEBUG "%s: Found different chip or no chip at all (mfr 0x%x, id 0x%x) at 0x%x\n", 22228c2ecf20Sopenharmony_ci map->name, mfr, id, base); 22238c2ecf20Sopenharmony_ci jedec_reset(base, map, cfi); 22248c2ecf20Sopenharmony_ci return 0; 22258c2ecf20Sopenharmony_ci } 22268c2ecf20Sopenharmony_ci } 22278c2ecf20Sopenharmony_ci 22288c2ecf20Sopenharmony_ci /* Check each previous chip locations to see if it's an alias */ 22298c2ecf20Sopenharmony_ci for (i=0; i < (base >> cfi->chipshift); i++) { 22308c2ecf20Sopenharmony_ci unsigned long start; 22318c2ecf20Sopenharmony_ci if(!test_bit(i, chip_map)) { 22328c2ecf20Sopenharmony_ci continue; /* Skip location; no valid chip at this address */ 22338c2ecf20Sopenharmony_ci } 22348c2ecf20Sopenharmony_ci start = i << cfi->chipshift; 22358c2ecf20Sopenharmony_ci if (jedec_read_mfr(map, start, cfi) == cfi->mfr && 22368c2ecf20Sopenharmony_ci jedec_read_id(map, start, cfi) == cfi->id) { 22378c2ecf20Sopenharmony_ci /* Eep. This chip also looks like it's in autoselect mode. 22388c2ecf20Sopenharmony_ci Is it an alias for the new one? */ 22398c2ecf20Sopenharmony_ci jedec_reset(start, map, cfi); 22408c2ecf20Sopenharmony_ci 22418c2ecf20Sopenharmony_ci /* If the device IDs go away, it's an alias */ 22428c2ecf20Sopenharmony_ci if (jedec_read_mfr(map, base, cfi) != cfi->mfr || 22438c2ecf20Sopenharmony_ci jedec_read_id(map, base, cfi) != cfi->id) { 22448c2ecf20Sopenharmony_ci printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n", 22458c2ecf20Sopenharmony_ci map->name, base, start); 22468c2ecf20Sopenharmony_ci return 0; 22478c2ecf20Sopenharmony_ci } 22488c2ecf20Sopenharmony_ci 22498c2ecf20Sopenharmony_ci /* Yes, it's actually got the device IDs as data. Most 22508c2ecf20Sopenharmony_ci * unfortunate. Stick the new chip in read mode 22518c2ecf20Sopenharmony_ci * too and if it's the same, assume it's an alias. */ 22528c2ecf20Sopenharmony_ci /* FIXME: Use other modes to do a proper check */ 22538c2ecf20Sopenharmony_ci jedec_reset(base, map, cfi); 22548c2ecf20Sopenharmony_ci if (jedec_read_mfr(map, base, cfi) == cfi->mfr && 22558c2ecf20Sopenharmony_ci jedec_read_id(map, base, cfi) == cfi->id) { 22568c2ecf20Sopenharmony_ci printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx\n", 22578c2ecf20Sopenharmony_ci map->name, base, start); 22588c2ecf20Sopenharmony_ci return 0; 22598c2ecf20Sopenharmony_ci } 22608c2ecf20Sopenharmony_ci } 22618c2ecf20Sopenharmony_ci } 22628c2ecf20Sopenharmony_ci 22638c2ecf20Sopenharmony_ci /* OK, if we got to here, then none of the previous chips appear to 22648c2ecf20Sopenharmony_ci be aliases for the current one. */ 22658c2ecf20Sopenharmony_ci set_bit((base >> cfi->chipshift), chip_map); /* Update chip map */ 22668c2ecf20Sopenharmony_ci cfi->numchips++; 22678c2ecf20Sopenharmony_ci 22688c2ecf20Sopenharmony_ciok_out: 22698c2ecf20Sopenharmony_ci /* Put it back into Read Mode */ 22708c2ecf20Sopenharmony_ci jedec_reset(base, map, cfi); 22718c2ecf20Sopenharmony_ci 22728c2ecf20Sopenharmony_ci printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n", 22738c2ecf20Sopenharmony_ci map->name, cfi_interleave(cfi), cfi->device_type*8, base, 22748c2ecf20Sopenharmony_ci map->bankwidth*8); 22758c2ecf20Sopenharmony_ci 22768c2ecf20Sopenharmony_ci return 1; 22778c2ecf20Sopenharmony_ci} 22788c2ecf20Sopenharmony_ci 22798c2ecf20Sopenharmony_cistatic struct chip_probe jedec_chip_probe = { 22808c2ecf20Sopenharmony_ci .name = "JEDEC", 22818c2ecf20Sopenharmony_ci .probe_chip = jedec_probe_chip 22828c2ecf20Sopenharmony_ci}; 22838c2ecf20Sopenharmony_ci 22848c2ecf20Sopenharmony_cistatic struct mtd_info *jedec_probe(struct map_info *map) 22858c2ecf20Sopenharmony_ci{ 22868c2ecf20Sopenharmony_ci /* 22878c2ecf20Sopenharmony_ci * Just use the generic probe stuff to call our CFI-specific 22888c2ecf20Sopenharmony_ci * chip_probe routine in all the possible permutations, etc. 22898c2ecf20Sopenharmony_ci */ 22908c2ecf20Sopenharmony_ci return mtd_do_chip_probe(map, &jedec_chip_probe); 22918c2ecf20Sopenharmony_ci} 22928c2ecf20Sopenharmony_ci 22938c2ecf20Sopenharmony_cistatic struct mtd_chip_driver jedec_chipdrv = { 22948c2ecf20Sopenharmony_ci .probe = jedec_probe, 22958c2ecf20Sopenharmony_ci .name = "jedec_probe", 22968c2ecf20Sopenharmony_ci .module = THIS_MODULE 22978c2ecf20Sopenharmony_ci}; 22988c2ecf20Sopenharmony_ci 22998c2ecf20Sopenharmony_cistatic int __init jedec_probe_init(void) 23008c2ecf20Sopenharmony_ci{ 23018c2ecf20Sopenharmony_ci register_mtd_chip_driver(&jedec_chipdrv); 23028c2ecf20Sopenharmony_ci return 0; 23038c2ecf20Sopenharmony_ci} 23048c2ecf20Sopenharmony_ci 23058c2ecf20Sopenharmony_cistatic void __exit jedec_probe_exit(void) 23068c2ecf20Sopenharmony_ci{ 23078c2ecf20Sopenharmony_ci unregister_mtd_chip_driver(&jedec_chipdrv); 23088c2ecf20Sopenharmony_ci} 23098c2ecf20Sopenharmony_ci 23108c2ecf20Sopenharmony_cimodule_init(jedec_probe_init); 23118c2ecf20Sopenharmony_cimodule_exit(jedec_probe_exit); 23128c2ecf20Sopenharmony_ci 23138c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 23148c2ecf20Sopenharmony_ciMODULE_AUTHOR("Erwin Authried <eauth@softsys.co.at> et al."); 23158c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Probe code for JEDEC-compliant flash chips"); 2316