1 /*
2  * This file is part of the flashrom project.
3  *
4  * Copyright (C) 2000 Silicon Integrated System Corporation
5  * Copyright (C) 2004 Tyan Corp
6  * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
7  * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
8  * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  */
20 
21 #include "flash.h"
22 #include "flashchips.h"
23 #include "chipdrivers.h"
24 
25 /**
26  * List of supported flash chips.
27  *
28  * Temporarily, this file is sorted alphabetically by vendor and name to
29  * assist with merging the Chromium fork of flashrom.
30  *
31  * The usual intention is that that this list is sorted by vendor, then chip
32  * family and chip density, which is useful for the output of 'flashrom -L'.
33  */
34 const struct flashchip flashchips[] = {
35 
36 	/*
BlockSampler_Init(BlockSampler bs,BlockNumber nblocks,int samplesize,long randseed)37 	 * .vendor		= Vendor name
38 	 * .name		= Chip name
39 	 * .bustype		= Supported flash bus types (Parallel, LPC...)
40 	 * .manufacture_id	= Manufacturer chip ID
41 	 * .model_id		= Model chip ID
42 	 * .total_size		= Total size in (binary) kbytes
43 	 * .page_size		= Page or eraseblock(?) size in bytes
44 	 * .tested		= Test status
45 	 * .probe		= Probe function
46 	 * .probe_timing	= Probe function delay
47 	 * .block_erasers[]	= Array of erase layouts and erase functions
48 	 * {
49 	 *	.eraseblocks[]	= Array of { blocksize, blockcount }
50 	 *	.block_erase	= Block erase function
51 	 * }
52 	 * .printlock		= Chip lock status function
53 	 * .unlock		= Chip unlock function
54 	 * .write		= Chip write function
55 	 * .read		= Chip read function
56 	 * .voltage		= Voltage range in millivolt
57 	 */
58 
59 	{
60 		.vendor		= "AMD",
61 		.name		= "Am29F002(N)BB",
62 		.bustype	= BUS_PARALLEL,
63 		.manufacture_id	= AMD_ID,
64 		.model_id	= AMD_AM29F002BB,
65 		.total_size	= 256,
66 		.page_size	= 256,
67 		.feature_bits	= FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
68 		.tested		= TEST_UNTESTED,
69 		.probe		= probe_jedec,
70 		.probe_timing	= TIMING_ZERO,
71 		.block_erasers	=
72 		{
73 			{
74 				.eraseblocks = {
75 					{16 * 1024, 1},
76 					{8 * 1024, 2},
77 					{32 * 1024, 1},
78 					{64 * 1024, 3},
79 				},
80 				.block_erase = erase_sector_jedec,
81 			}, {
82 				.eraseblocks = { {256 * 1024, 1} },
83 				.block_erase = erase_chip_block_jedec,
84 			},
85 		},
86 		.write		= write_jedec_1,
87 		.read		= read_memmapped,
88 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
89 	},
90 
91 	{
92 		.vendor		= "AMD",
93 		.name		= "Am29F002(N)BT",
94 		.bustype	= BUS_PARALLEL,
95 		.manufacture_id	= AMD_ID,
96 		.model_id	= AMD_AM29F002BT,
97 		.total_size	= 256,
98 		.page_size	= 256,
99 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
100 		.tested		= TEST_UNTESTED,
101 		.probe		= probe_jedec,
102 		.probe_timing	= TIMING_ZERO,
103 		.block_erasers	=
104 		{
105 			{
106 				.eraseblocks = {
107 					{64 * 1024, 3},
108 					{32 * 1024, 1},
109 					{8 * 1024, 2},
110 					{16 * 1024, 1},
111 				},
112 				.block_erase = erase_sector_jedec,
113 			}, {
114 				.eraseblocks = { {256 * 1024, 1} },
115 				.block_erase = erase_chip_block_jedec,
116 			},
117 		},
118 		.write		= write_jedec_1,
119 		.read		= read_memmapped,
120 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
121 	},
122 
123 	{
124 		.vendor		= "AMD",
125 		.name		= "Am29F010",
126 		.bustype	= BUS_PARALLEL,
127 		.manufacture_id	= AMD_ID,
128 		.model_id	= AMD_AM29F010,
reservoir_init_selection_state(ReservoirState rs,int n)129 		.total_size	= 128,
130 		.page_size	= 16 * 1024,
131 		.feature_bits	= FEATURE_SHORT_RESET,
132 		.tested		= TEST_UNTESTED,
133 		.probe		= probe_jedec,
134 		.probe_timing	= TIMING_ZERO,
135 		.block_erasers	=
136 		{
137 			{
138 				.eraseblocks = { {16 * 1024, 8} },
139 				.block_erase = erase_sector_jedec,
140 			}, {
141 				.eraseblocks = { {128 * 1024, 1} },
142 				.block_erase = erase_chip_block_jedec,
143 			},
144 		},
145 		.write		= write_jedec_1,
146 		.read		= read_memmapped,
147 		.voltage	= {4500, 5500},
148 	},
149 
150 	{
151 		.vendor		= "AMD",
152 		.name		= "Am29F010A/B",
153 		.bustype	= BUS_PARALLEL,
154 		.manufacture_id	= AMD_ID,
155 		.model_id	= AMD_AM29F010,
156 		.total_size	= 128,
157 		.page_size	= 16 * 1024,
158 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
159 		.tested		= TEST_OK_PRE,
160 		.probe		= probe_jedec,
161 		.probe_timing	= TIMING_ZERO,
162 		.block_erasers	=
163 		{
164 			{
165 				.eraseblocks = { {16 * 1024, 8} },
166 				.block_erase = erase_sector_jedec,
167 			}, {
168 				.eraseblocks = { {128 * 1024, 1} },
169 				.block_erase = erase_chip_block_jedec,
170 			},
171 		},
172 		.write		= write_jedec_1,
173 		.read		= read_memmapped,
174 		.voltage	= {4500, 5500},
175 	},
176 
177 	{
178 		.vendor		= "AMD",
179 		.name		= "Am29F016D",
180 		.bustype	= BUS_PARALLEL,
181 		.manufacture_id	= AMD_ID,
182 		.model_id	= AMD_AM29F016D,
183 		.total_size	= 2 * 1024,
184 		.page_size	= 64 * 1024,
185 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
186 		.tested		= TEST_UNTESTED,
187 		.probe		= probe_jedec,
188 		.probe_timing	= TIMING_ZERO,
189 		.block_erasers	=
190 		{
191 			{
192 				.eraseblocks = { {64 * 1024, 32} },
193 				.block_erase = erase_sector_jedec,
194 			}, {
195 				.eraseblocks = { {2048 * 1024, 1} },
196 				.block_erase = erase_chip_block_jedec,
197 			},
198 		},
199 		.write		= write_jedec_1,
200 		.read		= read_memmapped,
201 		.voltage	= {4500, 5500},
202 	},
203 
204 	{
205 		.vendor		= "AMD",
206 		.name		= "Am29F040",
207 		.bustype	= BUS_PARALLEL,
208 		.manufacture_id	= AMD_ID,
209 		.model_id	= AMD_AM29F040,
210 		.total_size	= 512,
211 		.page_size	= 64 * 1024,
212 		.feature_bits	= FEATURE_EITHER_RESET,
213 		.tested		= TEST_UNTESTED,
214 		.probe		= probe_jedec,
215 		.probe_timing	= TIMING_ZERO,
216 		.block_erasers	=
217 		{
218 			{
219 				.eraseblocks = { {64 * 1024, 8} },
220 				.block_erase = erase_sector_jedec,
221 			}, {
222 				.eraseblocks = { {512 * 1024, 1} },
223 				.block_erase = erase_chip_block_jedec,
224 			},
225 		},
226 		.write		= write_jedec_1,
227 		.read		= read_memmapped,
228 		.voltage	= {4500, 5500},
sampler_random_init_state(long seed,SamplerRandomState randstate)229 	},
230 
231 	{
232 		.vendor		= "AMD",
233 		.name		= "Am29F040B",
234 		.bustype	= BUS_PARALLEL,
235 		.manufacture_id	= AMD_ID,
236 		.model_id	= AMD_AM29F040,
237 		.total_size	= 512,
238 		.page_size	= 64 * 1024,
239 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
240 		.tested		= TEST_UNTESTED,
241 		.probe		= probe_jedec,
242 		.probe_timing	= TIMING_ZERO,
243 		.block_erasers	=
244 		{
245 			{
246 				.eraseblocks = { {64 * 1024, 8} },
247 				.block_erase = erase_sector_jedec,
248 			}, {
249 				.eraseblocks = { {512 * 1024, 1} },
250 				.block_erase = erase_chip_block_jedec,
251 			},
252 		},
253 		.write		= write_jedec_1,
254 		.read		= read_memmapped,
255 		.voltage	= {4500, 5500},
256 	},
257 
258 	{
259 		.vendor		= "AMD",
260 		.name		= "Am29F080",
261 		.bustype	= BUS_PARALLEL,
anl_random_fract(void)262 		.manufacture_id	= AMD_ID,
263 		.model_id	= AMD_AM29F080,
264 		.total_size	= 1024,
265 		.page_size	= 64 * 1024,
266 		.feature_bits	= FEATURE_EITHER_RESET,
267 		.tested		= TEST_UNTESTED,
268 		.probe		= probe_jedec,
269 		.probe_timing	= TIMING_ZERO,
270 		.block_erasers	=
271 		{
272 			{
273 				.eraseblocks = { {64 * 1024, 16} },
274 				.block_erase = erase_sector_jedec,
275 			}, {
276 				.eraseblocks = { {1024 * 1024, 1} },
277 				.block_erase = erase_chip_block_jedec,
278 			},
279 		},
280 		.write		= write_jedec_1,
281 		.read		= read_memmapped,
282 		.voltage	= {4500, 5500},
283 	},
anl_get_next_S(double t,int n,double * stateptr)284 
285 	{
286 		.vendor		= "AMD",
287 		.name		= "Am29F080B",
288 		.bustype	= BUS_PARALLEL,
289 		.manufacture_id	= AMD_ID,
290 		.model_id	= AMD_AM29F080,
291 		.total_size	= 1024,
292 		.page_size	= 64 * 1024,
293 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
294 		.tested		= TEST_UNTESTED,
295 		.probe		= probe_jedec,
296 		.probe_timing	= TIMING_ZERO,
297 		.block_erasers	=
298 		{
299 			{
300 				.eraseblocks = { {64 * 1024, 16} },
301 				.block_erase = erase_sector_jedec,
302 			}, {
303 				.eraseblocks = { {1024 * 1024, 1} },
304 				.block_erase = erase_chip_block_jedec,
305 			},
306 		},
307 		.write		= write_jedec_1,
308 		.read		= read_memmapped,
309 		.voltage	= {4500, 5500},
310 	},
311 
312 	{
313 		.vendor		= "AMD",
314 		.name		= "Am29LV001BB",
315 		.bustype	= BUS_PARALLEL,
316 		.manufacture_id	= AMD_ID,
317 		.model_id	= AMD_AM29LV001BB,
318 		.total_size	= 128,
319 		.page_size	= 64 * 1024, /* unused */
320 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
321 		.tested		= TEST_OK_PREW,
322 		.probe		= probe_jedec,
323 		.probe_timing	= TIMING_ZERO,
324 		.block_erasers	=
325 		{
326 			{
327 				.eraseblocks = {
328 					{8 * 1024, 1},
329 					{4 * 1024, 2},
330 					{16 * 1024, 7},
331 				},
332 				.block_erase = erase_sector_jedec,
333 			}, {
334 				.eraseblocks = { {128 * 1024, 1} },
335 				.block_erase = erase_chip_block_jedec,
336 			},
337 		},
338 		.write		= write_jedec_1,
339 		.read		= read_memmapped,
340 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
341 	},
342 
343 	{
344 		.vendor		= "AMD",
345 		.name		= "Am29LV001BT",
346 		.bustype	= BUS_PARALLEL,
347 		.manufacture_id	= AMD_ID,
348 		.model_id	= AMD_AM29LV001BT,
349 		.total_size	= 128,
350 		.page_size	= 64 * 1024, /* unused */
351 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
352 		.tested		= TEST_UNTESTED,
353 		.probe		= probe_jedec,
354 		.probe_timing	= TIMING_ZERO,
355 		.block_erasers	=
356 		{
357 			{
358 				.eraseblocks = {
359 					{16 * 1024, 7},
360 					{4 * 1024, 2},
361 					{8 * 1024, 1},
362 				},
363 				.block_erase = erase_sector_jedec,
364 			}, {
365 				.eraseblocks = { {128 * 1024, 1} },
366 				.block_erase = erase_chip_block_jedec,
367 			},
368 		},
369 		.write		= write_jedec_1,
370 		.read		= read_memmapped,
371 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
372 	},
373 
374 	{
375 		.vendor		= "AMD",
376 		.name		= "Am29LV002BB",
377 		.bustype	= BUS_PARALLEL,
378 		.manufacture_id	= AMD_ID,
379 		.model_id	= AMD_AM29LV002BB,
380 		.total_size	= 256,
381 		.page_size	= 64 * 1024, /* unused */
382 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
383 		.tested		= TEST_UNTESTED,
384 		.probe		= probe_jedec,
385 		.probe_timing	= TIMING_ZERO,
386 		.block_erasers	=
387 		{
388 			{
389 				.eraseblocks = {
390 					{16 * 1024, 1},
391 					{8 * 1024, 2},
392 					{32 * 1024, 1},
393 					{64 * 1024, 3},
394 				},
395 				.block_erase = erase_sector_jedec,
396 			}, {
397 				.eraseblocks = { {256 * 1024, 1} },
398 				.block_erase = erase_chip_block_jedec,
399 			},
400 		},
401 		.write		= write_jedec_1,
402 		.read		= read_memmapped,
403 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
404 	},
405 
406 	{
407 		.vendor		= "AMD",
408 		.name		= "Am29LV002BT",
409 		.bustype	= BUS_PARALLEL,
410 		.manufacture_id	= AMD_ID,
411 		.model_id	= AMD_AM29LV002BT,
412 		.total_size	= 256,
413 		.page_size	= 64 * 1024, /* unused */
414 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
415 		.tested		= TEST_UNTESTED,
416 		.probe		= probe_jedec,
417 		.probe_timing	= TIMING_ZERO,
418 		.block_erasers	=
419 		{
420 			{
421 				.eraseblocks = {
422 					{64 * 1024, 3},
423 					{32 * 1024, 1},
424 					{8 * 1024, 2},
425 					{16 * 1024, 1},
426 				},
427 				.block_erase = erase_sector_jedec,
428 			}, {
429 				.eraseblocks = { {256 * 1024, 1} },
430 				.block_erase = erase_chip_block_jedec,
431 			},
432 		},
433 		.write		= write_jedec_1,
434 		.read		= read_memmapped,
435 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
436 	},
437 
438 	{
439 		.vendor		= "AMD",
440 		.name		= "Am29LV004BB",
441 		.bustype	= BUS_PARALLEL,
442 		.manufacture_id	= AMD_ID,
443 		.model_id	= AMD_AM29LV004BB,
444 		.total_size	= 512,
445 		.page_size	= 64 * 1024, /* unused */
446 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
447 		.tested		= TEST_UNTESTED,
448 		.probe		= probe_jedec,
449 		.probe_timing	= TIMING_ZERO,
450 		.block_erasers	=
451 		{
452 			{
453 				.eraseblocks = {
454 					{16 * 1024, 1},
455 					{8 * 1024, 2},
456 					{32 * 1024, 1},
457 					{64 * 1024, 7},
458 				},
459 				.block_erase = erase_sector_jedec,
460 			}, {
461 				.eraseblocks = { {512 * 1024, 1} },
462 				.block_erase = erase_chip_block_jedec,
463 			},
464 		},
465 		.write		= write_jedec_1,
466 		.read		= read_memmapped,
467 		.voltage	= {2700, 3600},
468 	},
469 
470 	{
471 		.vendor		= "AMD",
472 		.name		= "Am29LV004BT",
473 		.bustype	= BUS_PARALLEL,
474 		.manufacture_id	= AMD_ID,
475 		.model_id	= AMD_AM29LV004BT,
476 		.total_size	= 512,
477 		.page_size	= 64 * 1024, /* unused */
478 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
479 		.tested		= TEST_UNTESTED,
480 		.probe		= probe_jedec,
481 		.probe_timing	= TIMING_ZERO,
482 		.block_erasers	=
483 		{
484 			{
485 				.eraseblocks = {
486 					{64 * 1024, 7},
487 					{32 * 1024, 1},
488 					{8 * 1024, 2},
489 					{16 * 1024, 1},
490 				},
491 				.block_erase = erase_sector_jedec,
492 			}, {
493 				.eraseblocks = { {512 * 1024, 1} },
494 				.block_erase = erase_chip_block_jedec,
495 			},
496 		},
497 		.write		= write_jedec_1,
498 		.read		= read_memmapped,
499 		.voltage	= {2700, 3600},
500 	},
501 
502 	{
503 		.vendor		= "AMD",
504 		.name		= "Am29LV008BB",
505 		.bustype	= BUS_PARALLEL,
506 		.manufacture_id	= AMD_ID,
507 		.model_id	= AMD_AM29LV008BB,
508 		.total_size	= 1024,
509 		.page_size	= 64 * 1024, /* unused */
510 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
511 		.tested		= TEST_OK_PREW,
512 		.probe		= probe_jedec,
513 		.probe_timing	= TIMING_ZERO,
514 		.block_erasers	=
515 		{
516 			{
517 				.eraseblocks = {
518 					{16 * 1024, 1},
519 					{8 * 1024, 2},
520 					{32 * 1024, 1},
521 					{64 * 1024, 15},
522 				},
523 				.block_erase = erase_sector_jedec,
524 			}, {
525 				.eraseblocks = { {1024 * 1024, 1} },
526 				.block_erase = erase_chip_block_jedec,
527 			},
528 		},
529 		.write		= write_jedec_1,
530 		.read		= read_memmapped,
531 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
532 	},
533 
534 	{
535 		.vendor		= "AMD",
536 		.name		= "Am29LV008BT",
537 		.bustype	= BUS_PARALLEL,
538 		.manufacture_id	= AMD_ID,
539 		.model_id	= AMD_AM29LV008BT,
540 		.total_size	= 1024,
541 		.page_size	= 64 * 1024, /* unused */
542 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
543 		.tested		= TEST_UNTESTED,
544 		.probe		= probe_jedec,
545 		.probe_timing	= TIMING_ZERO,
546 		.block_erasers	=
547 		{
548 			{
549 				.eraseblocks = {
550 					{64 * 1024, 15},
551 					{32 * 1024, 1},
552 					{8 * 1024, 2},
553 					{16 * 1024, 1},
554 				},
555 				.block_erase = erase_sector_jedec,
556 			}, {
557 				.eraseblocks = { {1024 * 1024, 1} },
558 				.block_erase = erase_chip_block_jedec,
559 			},
560 		},
561 		.write		= write_jedec_1,
562 		.read		= read_memmapped,
563 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
564 	},
565 
566 	{
567 		.vendor		= "AMD",
568 		.name		= "Am29LV040B",
569 		.bustype	= BUS_PARALLEL,
570 		.manufacture_id	= AMD_ID,
571 		.model_id	= AMD_AM29LV040B,
572 		.total_size	= 512,
573 		.page_size	= 64 * 1024,
574 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
575 		.tested		= TEST_OK_PRE,
576 		.probe		= probe_jedec,
577 		.probe_timing	= TIMING_ZERO,
578 		.block_erasers	=
579 		{
580 			{
581 				.eraseblocks = { {64 * 1024, 8} },
582 				.block_erase = erase_sector_jedec,
583 			}, {
584 				.eraseblocks = { {512 * 1024, 1} },
585 				.block_erase = erase_chip_block_jedec,
586 			},
587 		},
588 		.write		= write_jedec_1,
589 		.read		= read_memmapped,
590 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
591 	},
592 
593 	{
594 		.vendor		= "AMD",
595 		.name		= "Am29LV081B",
596 		.bustype	= BUS_PARALLEL,
597 		.manufacture_id	= AMD_ID,
598 		.model_id	= AMD_AM29LV080B,
599 		.total_size	= 1024,
600 		.page_size	= 64 * 1024,
601 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
602 		.tested		= TEST_UNTESTED,
603 		.probe		= probe_jedec,
604 		.probe_timing	= TIMING_ZERO,
605 		.block_erasers	=
606 		{
607 			{
608 				.eraseblocks = { {64 * 1024, 16} },
609 				.block_erase = erase_sector_jedec,
610 			}, {
611 				.eraseblocks = { {1024 * 1024, 1} },
612 				.block_erase = erase_chip_block_jedec,
613 			},
614 		},
615 		.write		= write_jedec_1,
616 		.read		= read_memmapped,
617 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
618 	},
619 
620 	{
621 		.vendor		= "AMIC",
622 		.name		= "A25L010",
623 		.bustype	= BUS_SPI,
624 		.manufacture_id	= AMIC_ID_NOPREFIX,
625 		.model_id	= AMIC_A25L010,
626 		.total_size	= 128,
627 		.page_size	= 256,
628 		.feature_bits	= FEATURE_WRSR_WREN,
629 		.tested		= TEST_UNTESTED,
630 		.probe		= probe_spi_rdid,
631 		.probe_timing	= TIMING_ZERO,
632 		.block_erasers	=
633 		{
634 			{
635 				.eraseblocks = { { 4 * 1024, 32 } },
636 				.block_erase = spi_block_erase_20,
637 			}, {
638 				.eraseblocks = { { 64 * 1024, 2 } },
639 				.block_erase = spi_block_erase_d8,
640 			}, {
641 				.eraseblocks = { { 128 * 1024, 1 } },
642 				.block_erase = spi_block_erase_c7,
643 			}
644 		},
645 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
646 		.unlock		= spi_disable_blockprotect,
647 		.write		= spi_chip_write_256,
648 		.read		= spi_chip_read,
649 		.voltage	= {2700, 3600},
650 	},
651 
652 	{
653 		.vendor		= "AMIC",
654 		.name		= "A25L016",
655 		.bustype	= BUS_SPI,
656 		.manufacture_id	= AMIC_ID_NOPREFIX,
657 		.model_id	= AMIC_A25L016,
658 		.total_size	= 2048,
659 		.page_size	= 256,
660 		.feature_bits	= FEATURE_WRSR_WREN,
661 		.tested		= TEST_UNTESTED,
662 		.probe		= probe_spi_rdid,
663 		.probe_timing	= TIMING_ZERO,
664 		.block_erasers	=
665 		{
666 			{
667 				.eraseblocks = { { 4 * 1024, 512 } },
668 				.block_erase = spi_block_erase_20,
669 			}, {
670 				.eraseblocks = { { 64 * 1024, 32 } },
671 				.block_erase = spi_block_erase_d8,
672 			}, {
673 				.eraseblocks = { { 2048 * 1024, 1 } },
674 				.block_erase = spi_block_erase_c7,
675 			}
676 		},
677 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
678 		.unlock		= spi_disable_blockprotect,
679 		.write		= spi_chip_write_256,
680 		.read		= spi_chip_read,
681 		.voltage	= {2700, 3600},
682 	},
683 
684 	{
685 		.vendor		= "AMIC",
686 		.name		= "A25L020",
687 		.bustype	= BUS_SPI,
688 		.manufacture_id	= AMIC_ID_NOPREFIX,
689 		.model_id	= AMIC_A25L020,
690 		.total_size	= 256,
691 		.page_size	= 256,
692 		.feature_bits	= FEATURE_WRSR_WREN,
693 		.tested		= TEST_UNTESTED,
694 		.probe		= probe_spi_rdid,
695 		.probe_timing	= TIMING_ZERO,
696 		.block_erasers	=
697 		{
698 			{
699 				.eraseblocks = { { 4 * 1024, 64 } },
700 				.block_erase = spi_block_erase_20,
701 			}, {
702 				.eraseblocks = { { 64 * 1024, 4 } },
703 				.block_erase = spi_block_erase_d8,
704 			}, {
705 				.eraseblocks = { { 256 * 1024, 1 } },
706 				.block_erase = spi_block_erase_c7,
707 			}
708 		},
709 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
710 		.unlock		= spi_disable_blockprotect,
711 		.write		= spi_chip_write_256,
712 		.read		= spi_chip_read,
713 		.voltage	= {2700, 3600},
714 	},
715 
716 	{
717 		.vendor		= "AMIC",
718 		.name		= "A25L032",
719 		.bustype	= BUS_SPI,
720 		.manufacture_id	= AMIC_ID_NOPREFIX,
721 		.model_id	= AMIC_A25L032,
722 		.total_size	= 4096,
723 		.page_size	= 256,
724 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
725 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
726 		.tested		= TEST_OK_PREW,
727 		.probe		= probe_spi_rdid,
728 		.probe_timing	= TIMING_ZERO,
729 		.block_erasers	=
730 		{
731 			{
732 				.eraseblocks = { { 4 * 1024, 1024 } },
733 				.block_erase = spi_block_erase_20,
734 			}, {
735 				.eraseblocks = { { 64 * 1024, 64 } },
736 				.block_erase = spi_block_erase_52,
737 			}, {
738 				.eraseblocks = { { 64 * 1024, 64 } },
739 				.block_erase = spi_block_erase_d8,
740 			}, {
741 				.eraseblocks = { { 4096 * 1024, 1 } },
742 				.block_erase = spi_block_erase_60,
743 			}, {
744 				.eraseblocks = { { 4096 * 1024, 1 } },
745 				.block_erase = spi_block_erase_c7,
746 			}
747 		},
748 		.printlock	= spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
749 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
750 		.write		= spi_chip_write_256,
751 		.read		= spi_chip_read,
752 		.voltage	= {2700, 3600},
753 	},
754 
755 	{
756 		.vendor		= "AMIC",
757 		.name		= "A25L040",
758 		.bustype	= BUS_SPI,
759 		.manufacture_id	= AMIC_ID_NOPREFIX,
760 		.model_id	= AMIC_A25L040,
761 		.total_size	= 512,
762 		.page_size	= 256,
763 		.feature_bits	= FEATURE_WRSR_WREN,
764 		.tested		= TEST_UNTESTED,
765 		.probe		= probe_spi_rdid,
766 		.probe_timing	= TIMING_ZERO,
767 		.block_erasers	=
768 		{
769 			{
770 				.eraseblocks = { { 4 * 1024, 128 } },
771 				.block_erase = spi_block_erase_20,
772 			}, {
773 				.eraseblocks = { { 64 * 1024, 8 } },
774 				.block_erase = spi_block_erase_d8,
775 			}, {
776 				.eraseblocks = { { 512 * 1024, 1 } },
777 				.block_erase = spi_block_erase_c7,
778 			}
779 		},
780 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
781 		.unlock		= spi_disable_blockprotect,
782 		.write		= spi_chip_write_256,
783 		.read		= spi_chip_read,
784 		.voltage	= {2700, 3600},
785 	},
786 
787 	{
788 		.vendor		= "AMIC",
789 		.name		= "A25L05PT",
790 		.bustype	= BUS_SPI,
791 		.manufacture_id	= AMIC_ID,
792 		.model_id	= AMIC_A25L05PT,
793 		.total_size	= 64,
794 		.page_size	= 256,
795 		.feature_bits	= FEATURE_WRSR_WREN,
796 		.tested		= TEST_UNTESTED,
797 		.probe		= probe_spi_rdid4,
798 		.probe_timing	= TIMING_ZERO,
799 		.block_erasers	=
800 		{
801 			{
802 				.eraseblocks = {
803 					{32 * 1024, 1},
804 					{16 * 1024, 1},
805 					{8 * 1024, 1},
806 					{4 * 1024, 2},
807 				},
808 				.block_erase = spi_block_erase_d8,
809 			}, {
810 				.eraseblocks = { {64 * 1024, 1} },
811 				.block_erase = spi_block_erase_c7,
812 			}
813 		},
814 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
815 		.unlock		= spi_disable_blockprotect,
816 		.write		= spi_chip_write_256,
817 		.read		= spi_chip_read,
818 		.voltage	= {2700, 3600},
819 	},
820 
821 	{
822 		.vendor		= "AMIC",
823 		.name		= "A25L05PU",
824 		.bustype	= BUS_SPI,
825 		.manufacture_id	= AMIC_ID,
826 		.model_id	= AMIC_A25L05PU,
827 		.total_size	= 64,
828 		.page_size	= 256,
829 		.feature_bits	= FEATURE_WRSR_WREN,
830 		.tested		= TEST_UNTESTED,
831 		.probe		= probe_spi_rdid4,
832 		.probe_timing	= TIMING_ZERO,
833 		.block_erasers	=
834 		{
835 			{
836 				.eraseblocks = {
837 					{4 * 1024, 2},
838 					{8 * 1024, 1},
839 					{16 * 1024, 1},
840 					{32 * 1024, 1},
841 				},
842 				.block_erase = spi_block_erase_d8,
843 			}, {
844 				.eraseblocks = { {64 * 1024, 1} },
845 				.block_erase = spi_block_erase_c7,
846 			}
847 		},
848 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
849 		.unlock		= spi_disable_blockprotect,
850 		.write		= spi_chip_write_256,
851 		.read		= spi_chip_read,
852 		.voltage	= {2700, 3600},
853 	},
854 
855 	{
856 		.vendor		= "AMIC",
857 		.name		= "A25L080",
858 		.bustype	= BUS_SPI,
859 		.manufacture_id	= AMIC_ID_NOPREFIX,
860 		.model_id	= AMIC_A25L080,
861 		.total_size	= 1024,
862 		.page_size	= 256,
863 		.feature_bits	= FEATURE_WRSR_WREN,
864 		.tested		= TEST_UNTESTED,
865 		.probe		= probe_spi_rdid,
866 		.probe_timing	= TIMING_ZERO,
867 		.block_erasers	=
868 		{
869 			{
870 				.eraseblocks = { { 4 * 1024, 256 } },
871 				.block_erase = spi_block_erase_20,
872 			}, {
873 				.eraseblocks = { { 64 * 1024, 16 } },
874 				.block_erase = spi_block_erase_d8,
875 			}, {
876 				.eraseblocks = { { 1024 * 1024, 1 } },
877 				.block_erase = spi_block_erase_c7,
878 			}
879 		},
880 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
881 		.unlock		= spi_disable_blockprotect,
882 		.write		= spi_chip_write_256,
883 		.read		= spi_chip_read,
884 		.voltage	= {2700, 3600},
885 	},
886 
887 	{
888 		.vendor		= "AMIC",
889 		.name		= "A25L10PT",
890 		.bustype	= BUS_SPI,
891 		.manufacture_id	= AMIC_ID,
892 		.model_id	= AMIC_A25L10PT,
893 		.total_size	= 128,
894 		.page_size	= 256,
895 		.feature_bits	= FEATURE_WRSR_WREN,
896 		.tested		= TEST_UNTESTED,
897 		.probe		= probe_spi_rdid4,
898 		.probe_timing	= TIMING_ZERO,
899 		.block_erasers	=
900 		{
901 			{
902 				.eraseblocks = {
903 					{64 * 1024, 1},
904 					{32 * 1024, 1},
905 					{16 * 1024, 1},
906 					{8 * 1024, 1},
907 					{4 * 1024, 2},
908 				},
909 				.block_erase = spi_block_erase_d8,
910 			}, {
911 				.eraseblocks = { {128 * 1024, 1} },
912 				.block_erase = spi_block_erase_c7,
913 			}
914 		},
915 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
916 		.unlock		= spi_disable_blockprotect,
917 		.write		= spi_chip_write_256,
918 		.read		= spi_chip_read,
919 		.voltage	= {2700, 3600},
920 	},
921 
922 	{
923 		.vendor		= "AMIC",
924 		.name		= "A25L10PU",
925 		.bustype	= BUS_SPI,
926 		.manufacture_id	= AMIC_ID,
927 		.model_id	= AMIC_A25L10PU,
928 		.total_size	= 128,
929 		.page_size	= 256,
930 		.feature_bits	= FEATURE_WRSR_WREN,
931 		.tested		= TEST_UNTESTED,
932 		.probe		= probe_spi_rdid4,
933 		.probe_timing	= TIMING_ZERO,
934 		.block_erasers	=
935 		{
936 			{
937 				.eraseblocks = {
938 					{4 * 1024, 2},
939 					{8 * 1024, 1},
940 					{16 * 1024, 1},
941 					{32 * 1024, 1},
942 					{64 * 1024, 1},
943 				},
944 				.block_erase = spi_block_erase_d8,
945 			}, {
946 				.eraseblocks = { {128 * 1024, 1} },
947 				.block_erase = spi_block_erase_c7,
948 			}
949 		},
950 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
951 		.unlock		= spi_disable_blockprotect,
952 		.write		= spi_chip_write_256,
953 		.read		= spi_chip_read,
954 		.voltage	= {2700, 3600},
955 	},
956 
957 	{
958 		.vendor		= "AMIC",
959 		.name		= "A25L16PT",
960 		.bustype	= BUS_SPI,
961 		.manufacture_id	= AMIC_ID,
962 		.model_id	= AMIC_A25L16PT,
963 		.total_size	= 2048,
964 		.page_size	= 256,
965 		.feature_bits	= FEATURE_WRSR_WREN,
966 		.tested		= TEST_UNTESTED,
967 		.probe		= probe_spi_rdid4,
968 		.probe_timing	= TIMING_ZERO,
969 		.block_erasers	=
970 		{
971 			{
972 				.eraseblocks = {
973 					{64 * 1024, 31},
974 					{32 * 1024, 1},
975 					{16 * 1024, 1},
976 					{8 * 1024, 1},
977 					{4 * 1024, 2},
978 				},
979 				.block_erase = spi_block_erase_d8,
980 			}, {
981 				.eraseblocks = { {2048 * 1024, 1} },
982 				.block_erase = spi_block_erase_60,
983 			}, {
984 				.eraseblocks = { {2048 * 1024, 1} },
985 				.block_erase = spi_block_erase_c7,
986 			}
987 		},
988 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
989 		.unlock		= spi_disable_blockprotect,
990 		.write		= spi_chip_write_256,
991 		.read		= spi_chip_read,
992 		.voltage	= {2700, 3600},
993 	},
994 
995 	{
996 		.vendor		= "AMIC",
997 		.name		= "A25L16PU",
998 		.bustype	= BUS_SPI,
999 		.manufacture_id	= AMIC_ID,
1000 		.model_id	= AMIC_A25L16PU,
1001 		.total_size	= 2048,
1002 		.page_size	= 256,
1003 		.feature_bits	= FEATURE_WRSR_WREN,
1004 		.tested		= TEST_OK_PR,
1005 		.probe		= probe_spi_rdid4,
1006 		.probe_timing	= TIMING_ZERO,
1007 		.block_erasers	=
1008 		{
1009 			{
1010 				.eraseblocks = {
1011 					{4 * 1024, 2},
1012 					{8 * 1024, 1},
1013 					{16 * 1024, 1},
1014 					{32 * 1024, 1},
1015 					{64 * 1024, 31},
1016 				},
1017 				.block_erase = spi_block_erase_d8,
1018 			}, {
1019 				.eraseblocks = { {2048 * 1024, 1} },
1020 				.block_erase = spi_block_erase_60,
1021 			}, {
1022 				.eraseblocks = { {2048 * 1024, 1} },
1023 				.block_erase = spi_block_erase_c7,
1024 			}
1025 		},
1026 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
1027 		.unlock		= spi_disable_blockprotect,
1028 		.write		= spi_chip_write_256,
1029 		.read		= spi_chip_read,
1030 		.voltage	= {2700, 3600},
1031 	},
1032 
1033 	{
1034 		.vendor		= "AMIC",
1035 		.name		= "A25L20PT",
1036 		.bustype	= BUS_SPI,
1037 		.manufacture_id	= AMIC_ID,
1038 		.model_id	= AMIC_A25L20PT,
1039 		.total_size	= 256,
1040 		.page_size	= 256,
1041 		.feature_bits	= FEATURE_WRSR_WREN,
1042 		.tested		= TEST_UNTESTED,
1043 		.probe		= probe_spi_rdid4,
1044 		.probe_timing	= TIMING_ZERO,
1045 		.block_erasers	=
1046 		{
1047 			{
1048 				.eraseblocks = {
1049 					{64 * 1024, 3},
1050 					{32 * 1024, 1},
1051 					{16 * 1024, 1},
1052 					{8 * 1024, 1},
1053 					{4 * 1024, 2},
1054 				},
1055 				.block_erase = spi_block_erase_d8,
1056 			}, {
1057 				.eraseblocks = { {256 * 1024, 1} },
1058 				.block_erase = spi_block_erase_c7,
1059 			}
1060 		},
1061 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
1062 		.unlock		= spi_disable_blockprotect,
1063 		.write		= spi_chip_write_256,
1064 		.read		= spi_chip_read,
1065 		.voltage	= {2700, 3600},
1066 	},
1067 
1068 	{
1069 		.vendor		= "AMIC",
1070 		.name		= "A25L20PU",
1071 		.bustype	= BUS_SPI,
1072 		.manufacture_id	= AMIC_ID,
1073 		.model_id	= AMIC_A25L20PU,
1074 		.total_size	= 256,
1075 		.page_size	= 256,
1076 		.feature_bits	= FEATURE_WRSR_WREN,
1077 		.tested		= TEST_UNTESTED,
1078 		.probe		= probe_spi_rdid4,
1079 		.probe_timing	= TIMING_ZERO,
1080 		.block_erasers	=
1081 		{
1082 			{
1083 				.eraseblocks = {
1084 					{4 * 1024, 2},
1085 					{8 * 1024, 1},
1086 					{16 * 1024, 1},
1087 					{32 * 1024, 1},
1088 					{64 * 1024, 3},
1089 				},
1090 				.block_erase = spi_block_erase_d8,
1091 			}, {
1092 				.eraseblocks = { {256 * 1024, 1} },
1093 				.block_erase = spi_block_erase_c7,
1094 			}
1095 		},
1096 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
1097 		.unlock		= spi_disable_blockprotect,
1098 		.write		= spi_chip_write_256,
1099 		.read		= spi_chip_read,
1100 		.voltage	= {2700, 3600},
1101 	},
1102 
1103 	/* The A25L40P{T,U} chips are distinguished by their
1104 	 * erase block layouts, but without any distinction in RDID.
1105 	 * This inexplicable quirk was verified by Rudolf Marek
1106 	 * and discussed on the flashrom mailing list on 2010-07-12.
1107 	 */
1108 	{
1109 		.vendor		= "AMIC",
1110 		.name		= "A25L40PT",
1111 		.bustype	= BUS_SPI,
1112 		.manufacture_id	= AMIC_ID,
1113 		.model_id	= AMIC_A25L40PT,
1114 		.total_size	= 512,
1115 		.page_size	= 256,
1116 		.feature_bits	= FEATURE_WRSR_WREN,
1117 		.tested		= TEST_OK_PR,
1118 		.probe		= probe_spi_rdid4,
1119 		.probe_timing	= TIMING_ZERO,
1120 		.block_erasers	=
1121 		{
1122 			{
1123 				.eraseblocks = {
1124 					{64 * 1024, 7},
1125 					{32 * 1024, 1},
1126 					{16 * 1024, 1},
1127 					{8 * 1024, 1},
1128 					{4 * 1024, 2},
1129 				},
1130 				.block_erase = spi_block_erase_d8,
1131 			}, {
1132 				.eraseblocks = { {512 * 1024, 1} },
1133 				.block_erase = spi_block_erase_c7,
1134 			}
1135 		},
1136 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
1137 		.unlock		= spi_disable_blockprotect,
1138 		.write		= spi_chip_write_256,
1139 		.read		= spi_chip_read,
1140 		.voltage	= {2700, 3600},
1141 	},
1142 
1143 	{
1144 		.vendor		= "AMIC",
1145 		.name		= "A25L40PU",
1146 		.bustype	= BUS_SPI,
1147 		.manufacture_id	= AMIC_ID,
1148 		.model_id	= AMIC_A25L40PU,
1149 		.total_size	= 512,
1150 		.page_size	= 256,
1151 		.feature_bits	= FEATURE_WRSR_WREN,
1152 		.tested		= TEST_OK_PREW,
1153 		.probe		= probe_spi_rdid4,
1154 		.probe_timing	= TIMING_ZERO,
1155 		.block_erasers	=
1156 		{
1157 			{
1158 				.eraseblocks = {
1159 					{4 * 1024, 2},
1160 					{8 * 1024, 1},
1161 					{16 * 1024, 1},
1162 					{32 * 1024, 1},
1163 					{64 * 1024, 7},
1164 				},
1165 				.block_erase = spi_block_erase_d8,
1166 			}, {
1167 				.eraseblocks = { {512 * 1024, 1} },
1168 				.block_erase = spi_block_erase_c7,
1169 			}
1170 		},
1171 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
1172 		.unlock		= spi_disable_blockprotect,
1173 		.write		= spi_chip_write_256,
1174 		.read		= spi_chip_read,
1175 		.voltage	= {2700, 3600},
1176 	},
1177 
1178 	{
1179 		.vendor		= "AMIC",
1180 		.name		= "A25L512",
1181 		.bustype	= BUS_SPI,
1182 		.manufacture_id	= AMIC_ID_NOPREFIX,
1183 		.model_id	= AMIC_A25L512,
1184 		.total_size	= 64,
1185 		.page_size	= 256,
1186 		.feature_bits	= FEATURE_WRSR_WREN,
1187 		.tested		= TEST_UNTESTED,
1188 		.probe		= probe_spi_rdid,
1189 		.probe_timing	= TIMING_ZERO,
1190 		.block_erasers	=
1191 		{
1192 			{
1193 				.eraseblocks = { { 4 * 1024, 16 } },
1194 				.block_erase = spi_block_erase_20,
1195 			}, {
1196 				.eraseblocks = { { 64 * 1024, 1 } },
1197 				.block_erase = spi_block_erase_d8,
1198 			}, {
1199 				.eraseblocks = { { 64 * 1024, 1 } },
1200 				.block_erase = spi_block_erase_c7,
1201 			}
1202 		},
1203 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
1204 		.unlock		= spi_disable_blockprotect,
1205 		.write		= spi_chip_write_256,
1206 		.read		= spi_chip_read,
1207 		.voltage	= {2700, 3600},
1208 	},
1209 
1210 	{
1211 		.vendor		= "AMIC",
1212 		.name		= "A25L80P",
1213 		.bustype	= BUS_SPI,
1214 		.manufacture_id	= AMIC_ID,
1215 		.model_id	= AMIC_A25L80P,
1216 		.total_size	= 1024,
1217 		.page_size	= 256,
1218 		.feature_bits	= FEATURE_WRSR_WREN,
1219 		.tested		= TEST_OK_PRE,
1220 		.probe		= probe_spi_rdid4,
1221 		.probe_timing	= TIMING_ZERO,
1222 		.block_erasers	=
1223 		{
1224 			{
1225 				.eraseblocks = {
1226 					{4 * 1024, 2},
1227 					{8 * 1024, 1},
1228 					{16 * 1024, 1},
1229 					{32 * 1024, 1},
1230 					{64 * 1024, 15},
1231 				},
1232 				.block_erase = spi_block_erase_d8,
1233 			}, {
1234 				.eraseblocks = { {1024 * 1024, 1} },
1235 				.block_erase = spi_block_erase_c7,
1236 			}
1237 		},
1238 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
1239 		.unlock		= spi_disable_blockprotect,
1240 		.write		= spi_chip_write_256,
1241 		.read		= spi_chip_read,
1242 		.voltage	= {2700, 3600},
1243 	},
1244 
1245 	{
1246 		.vendor		= "AMIC",
1247 		.name		= "A25LQ032/A25LQ32A",
1248 		.bustype	= BUS_SPI,
1249 		.manufacture_id	= AMIC_ID_NOPREFIX,
1250 		.model_id	= AMIC_A25LQ032,
1251 		.total_size	= 4096,
1252 		.page_size	= 256,
1253 		/* A25LQ32A supports SFDP */
1254 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1255 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1256 		.tested		= TEST_UNTESTED,
1257 		.probe		= probe_spi_rdid,
1258 		.probe_timing	= TIMING_ZERO,
1259 		.block_erasers	=
1260 		{
1261 			{
1262 				.eraseblocks = { { 4 * 1024, 1024 } },
1263 				.block_erase = spi_block_erase_20,
1264 			}, {
1265 				.eraseblocks = { { 64 * 1024, 64 } },
1266 				.block_erase = spi_block_erase_52,
1267 			}, {
1268 				.eraseblocks = { { 64 * 1024, 64 } },
1269 				.block_erase = spi_block_erase_d8,
1270 			}, {
1271 				.eraseblocks = { { 4096 * 1024, 1 } },
1272 				.block_erase = spi_block_erase_60,
1273 			}, {
1274 				.eraseblocks = { { 4096 * 1024, 1 } },
1275 				.block_erase = spi_block_erase_c7,
1276 			}
1277 		},
1278 		.printlock	= spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1279 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1280 		.write		= spi_chip_write_256,
1281 		.read		= spi_chip_read,
1282 		.voltage	= {2700, 3600},
1283 	},
1284 
1285 	{
1286 		.vendor		= "AMIC",
1287 		.name		= "A25LQ16",
1288 		.bustype	= BUS_SPI,
1289 		.manufacture_id	= AMIC_ID_NOPREFIX,
1290 		.model_id	= AMIC_A25LQ16,
1291 		.total_size	= 2048,
1292 		.page_size	= 256,
1293 		/* supports SFDP */
1294 		/* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1295 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1296 		.tested		= TEST_UNTESTED,
1297 		.probe		= probe_spi_rdid,
1298 		.probe_timing	= TIMING_ZERO,
1299 		.block_erasers	=
1300 		{
1301 			{
1302 				.eraseblocks = { { 4 * 1024, 512 } },
1303 				.block_erase = spi_block_erase_20,
1304 			}, {
1305 				.eraseblocks = { { 64 * 1024, 32 } },
1306 				.block_erase = spi_block_erase_52,
1307 			}, {
1308 				.eraseblocks = { { 64 * 1024, 32 } },
1309 				.block_erase = spi_block_erase_d8,
1310 			}, {
1311 				.eraseblocks = { { 2048 * 1024, 1 } },
1312 				.block_erase = spi_block_erase_60,
1313 			}, {
1314 				.eraseblocks = { { 2048 * 1024, 1 } },
1315 				.block_erase = spi_block_erase_c7,
1316 			}
1317 		},
1318 		.printlock	= spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1319 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1320 		.write		= spi_chip_write_256,
1321 		.read		= spi_chip_read,
1322 		.voltage	= {2700, 3600},
1323 	},
1324 
1325 	{
1326 		.vendor		= "AMIC",
1327 		.name		= "A25LQ64",
1328 		.bustype	= BUS_SPI,
1329 		.manufacture_id	= AMIC_ID_NOPREFIX,
1330 		.model_id	= AMIC_A25LQ64,
1331 		.total_size	= 8192,
1332 		.page_size	= 256,
1333 		/* supports SFDP */
1334 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
1335 		/* QPI enable 0x35, disable 0xF5 */
1336 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1337 		.tested		= TEST_UNTESTED,
1338 		.probe		= probe_spi_rdid,
1339 		.probe_timing	= TIMING_ZERO,
1340 		.block_erasers	=
1341 		{
1342 			{
1343 				.eraseblocks = { { 4 * 1024, 2048 } },
1344 				.block_erase = spi_block_erase_20,
1345 			}, {
1346 				.eraseblocks = { { 32 * 1024, 256 } },
1347 				.block_erase = spi_block_erase_52,
1348 			}, {
1349 				.eraseblocks = { { 64 * 1024, 128 } },
1350 				.block_erase = spi_block_erase_d8,
1351 			}, {
1352 				.eraseblocks = { { 8192 * 1024, 1 } },
1353 				.block_erase = spi_block_erase_60,
1354 			}, {
1355 				.eraseblocks = { { 8192 * 1024, 1 } },
1356 				.block_erase = spi_block_erase_c7,
1357 			}
1358 		},
1359 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
1360 		.unlock		= spi_disable_blockprotect_bp3_srwd,
1361 		.write		= spi_chip_write_256,
1362 		.read		= spi_chip_read,
1363 		.voltage	= {2700, 3600},
1364 	},
1365 
1366 	{
1367 		.vendor		= "AMIC",
1368 		.name		= "A29002B",
1369 		.bustype	= BUS_PARALLEL,
1370 		.manufacture_id	= AMIC_ID_NOPREFIX,
1371 		.model_id	= AMIC_A29002B,
1372 		.total_size	= 256,
1373 		.page_size	= 64 * 1024,
1374 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1375 		.tested		= TEST_UNTESTED,
1376 		.probe		= probe_jedec,
1377 		.probe_timing	= TIMING_ZERO,
1378 		.block_erasers	=
1379 		{
1380 			{
1381 				.eraseblocks = {
1382 					{16 * 1024, 1},
1383 					{8 * 1024, 2},
1384 					{32 * 1024, 1},
1385 					{64 * 1024, 3},
1386 				},
1387 				.block_erase = erase_sector_jedec,
1388 			}, {
1389 				.eraseblocks = { {256 * 1024, 1} },
1390 				.block_erase = erase_chip_block_jedec,
1391 			},
1392 		},
1393 		.write		= write_jedec_1,
1394 		.read		= read_memmapped,
1395 		.voltage	= {4500, 5500},
1396 	},
1397 
1398 	{
1399 		.vendor		= "AMIC",
1400 		.name		= "A29002T",
1401 		.bustype	= BUS_PARALLEL,
1402 		.manufacture_id	= AMIC_ID_NOPREFIX,
1403 		.model_id	= AMIC_A29002T,
1404 		.total_size	= 256,
1405 		.page_size	= 64 * 1024,
1406 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1407 		.tested		= TEST_OK_PREW,
1408 		.probe		= probe_jedec,
1409 		.probe_timing	= TIMING_ZERO,
1410 		.block_erasers	=
1411 		{
1412 			{
1413 				.eraseblocks = {
1414 					{64 * 1024, 3},
1415 					{32 * 1024, 1},
1416 					{8 * 1024, 2},
1417 					{16 * 1024, 1},
1418 				},
1419 				.block_erase = erase_sector_jedec,
1420 			}, {
1421 				.eraseblocks = { {256 * 1024, 1} },
1422 				.block_erase = erase_chip_block_jedec,
1423 			},
1424 		},
1425 		.write		= write_jedec_1,
1426 		.read		= read_memmapped,
1427 		.voltage	= {4500, 5500},
1428 	},
1429 
1430 	{
1431 		.vendor		= "AMIC",
1432 		.name		= "A29040B",
1433 		.bustype	= BUS_PARALLEL,
1434 		.manufacture_id	= AMIC_ID_NOPREFIX,
1435 		.model_id	= AMIC_A29040B,
1436 		.total_size	= 512,
1437 		.page_size	= 64 * 1024,
1438 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1439 		.tested		= TEST_OK_PREW,
1440 		.probe		= probe_jedec,
1441 		.probe_timing	= TIMING_ZERO,
1442 		.block_erasers	=
1443 		{
1444 			{
1445 				.eraseblocks = { {64 * 1024, 8} },
1446 				.block_erase = erase_sector_jedec,
1447 			}, {
1448 				.eraseblocks = { {512 * 1024, 1} },
1449 				.block_erase = erase_chip_block_jedec,
1450 			},
1451 		},
1452 		.write		= write_jedec_1,
1453 		.read		= read_memmapped,
1454 		.voltage	= {4500, 5500},
1455 	},
1456 
1457 	{
1458 		.vendor		= "AMIC",
1459 		.name		= "A49LF040A",
1460 		.bustype	= BUS_LPC,
1461 		.manufacture_id	= AMIC_ID_NOPREFIX,
1462 		.model_id	= AMIC_A49LF040A,
1463 		.total_size	= 512,
1464 		.page_size	= 64 * 1024,
1465 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
1466 		.tested		= TEST_OK_PR,
1467 		.probe		= probe_jedec,
1468 		.probe_timing	= TIMING_ZERO,	/* routine is wrapper to probe_jedec (pm49fl00x.c) */
1469 		.block_erasers	=
1470 		{
1471 			{
1472 				.eraseblocks = { {64 * 1024, 8} },
1473 				.block_erase = erase_block_jedec,
1474 			}, {
1475 				.eraseblocks = { {512 * 1024, 1} },
1476 				.block_erase = erase_chip_block_jedec,
1477 			}
1478 		},
1479 		.unlock		= unlock_regspace2_uniform_64k,
1480 		.write		= write_jedec_1,
1481 		.read		= read_memmapped,
1482 		.voltage	= {3000, 3600},
1483 	},
1484 
1485 	{
1486 		.vendor		= "Atmel",
1487 		.name		= "AT25DF021",
1488 		.bustype	= BUS_SPI,
1489 		.manufacture_id	= ATMEL_ID,
1490 		.model_id	= ATMEL_AT25DF021,
1491 		.total_size	= 256,
1492 		.page_size	= 256,
1493 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1494 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1495 		.tested		= TEST_UNTESTED,
1496 		.probe		= probe_spi_rdid,
1497 		.probe_timing	= TIMING_ZERO,
1498 		.block_erasers	=
1499 		{
1500 			{
1501 				.eraseblocks = { {4 * 1024, 64} },
1502 				.block_erase = spi_block_erase_20,
1503 			}, {
1504 				.eraseblocks = { {32 * 1024, 8} },
1505 				.block_erase = spi_block_erase_52,
1506 			}, {
1507 				.eraseblocks = { {64 * 1024, 4} },
1508 				.block_erase = spi_block_erase_d8,
1509 			}, {
1510 				.eraseblocks = { {256 * 1024, 1} },
1511 				.block_erase = spi_block_erase_60,
1512 			}, {
1513 				.eraseblocks = { {256 * 1024, 1} },
1514 				.block_erase = spi_block_erase_c7,
1515 			}
1516 		},
1517 		.printlock	= spi_prettyprint_status_register_at25df,
1518 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
1519 		.write		= spi_chip_write_256,
1520 		.read		= spi_chip_read,
1521 		.voltage	= {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1522 	},
1523 
1524 	{
1525 		.vendor		= "Atmel",
1526 		.name		= "AT25DF021A",
1527 		.bustype	= BUS_SPI,
1528 		.manufacture_id	= ATMEL_ID,
1529 		.model_id	= ATMEL_AT25DF021A,
1530 		.total_size	= 256,
1531 		.page_size	= 256,
1532 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1533 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1534 		.tested		= TEST_OK_PREW,
1535 		.probe		= probe_spi_rdid,
1536 		.probe_timing	= TIMING_ZERO,
1537 		.block_erasers	=
1538 		{
1539 			{
1540 				.eraseblocks = { {4 * 1024, 64} },
1541 				.block_erase = spi_block_erase_20,
1542 			}, {
1543 				.eraseblocks = { {32 * 1024, 8} },
1544 				.block_erase = spi_block_erase_52,
1545 			}, {
1546 				.eraseblocks = { {64 * 1024, 4} },
1547 				.block_erase = spi_block_erase_d8,
1548 			}, {
1549 				.eraseblocks = { {256 * 1024, 1} },
1550 				.block_erase = spi_block_erase_60,
1551 			}, {
1552 				.eraseblocks = { {256 * 1024, 1} },
1553 				.block_erase = spi_block_erase_c7,
1554 			}
1555 		},
1556 		.printlock	= spi_prettyprint_status_register_at25df,
1557 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
1558 		.write		= spi_chip_write_256,
1559 		.read		= spi_chip_read,
1560 		.voltage	= {1650, 3600},
1561 	},
1562 
1563 	{
1564 		.vendor		= "Atmel",
1565 		.name		= "AT25DF041A",
1566 		.bustype	= BUS_SPI,
1567 		.manufacture_id	= ATMEL_ID,
1568 		.model_id	= ATMEL_AT25DF041A,
1569 		.total_size	= 512,
1570 		.page_size	= 256,
1571 		.feature_bits	= FEATURE_WRSR_WREN,
1572 		.tested		= TEST_OK_PREW,
1573 		.probe		= probe_spi_rdid,
1574 		.probe_timing	= TIMING_ZERO,
1575 		.block_erasers	=
1576 		{
1577 			{
1578 				.eraseblocks = { {4 * 1024, 128} },
1579 				.block_erase = spi_block_erase_20,
1580 			}, {
1581 				.eraseblocks = { {32 * 1024, 16} },
1582 				.block_erase = spi_block_erase_52,
1583 			}, {
1584 				.eraseblocks = { {64 * 1024, 8} },
1585 				.block_erase = spi_block_erase_d8,
1586 			}, {
1587 				.eraseblocks = { {512 * 1024, 1} },
1588 				.block_erase = spi_block_erase_60,
1589 			}, {
1590 				.eraseblocks = { {512 * 1024, 1} },
1591 				.block_erase = spi_block_erase_c7,
1592 			}
1593 		},
1594 		.printlock	= spi_prettyprint_status_register_at25df,
1595 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
1596 		.write		= spi_chip_write_256,
1597 		.read		= spi_chip_read,
1598 		.voltage	= {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1599 	},
1600 
1601 	{
1602 		.vendor		= "Atmel",
1603 		.name		= "AT25DF081",
1604 		.bustype	= BUS_SPI,
1605 		.manufacture_id	= ATMEL_ID,
1606 		.model_id	= ATMEL_AT25DF081,
1607 		.total_size	= 1024,
1608 		.page_size	= 256,
1609 		.feature_bits	= FEATURE_WRSR_WREN,
1610 		.tested		= TEST_UNTESTED,
1611 		.probe		= probe_spi_rdid,
1612 		.probe_timing	= TIMING_ZERO,
1613 		.block_erasers	=
1614 		{
1615 			{
1616 				.eraseblocks = { {4 * 1024, 256} },
1617 				.block_erase = spi_block_erase_20,
1618 			}, {
1619 				.eraseblocks = { {32 * 1024, 32} },
1620 				.block_erase = spi_block_erase_52,
1621 			}, {
1622 				.eraseblocks = { {64 * 1024, 16} },
1623 				.block_erase = spi_block_erase_d8,
1624 			}, {
1625 				.eraseblocks = { {1024 * 1024, 1} },
1626 				.block_erase = spi_block_erase_60,
1627 			}, {
1628 				.eraseblocks = { {1024 * 1024, 1} },
1629 				.block_erase = spi_block_erase_c7,
1630 			}
1631 		},
1632 		.printlock	= spi_prettyprint_status_register_at25df,
1633 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
1634 		.write		= spi_chip_write_256,
1635 		.read		= spi_chip_read,
1636 		.voltage	= {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
1637 	},
1638 
1639 	{
1640 		.vendor		= "Atmel",
1641 		.name		= "AT25DF081A",
1642 		.bustype	= BUS_SPI,
1643 		.manufacture_id	= ATMEL_ID,
1644 		.model_id	= ATMEL_AT25DF081A,
1645 		.total_size	= 1024,
1646 		.page_size	= 256,
1647 		.feature_bits	= FEATURE_WRSR_WREN,
1648 		.tested		= TEST_UNTESTED,
1649 		.probe		= probe_spi_rdid,
1650 		.probe_timing	= TIMING_ZERO,
1651 		.block_erasers	=
1652 		{
1653 			{
1654 				.eraseblocks = { {4 * 1024, 256} },
1655 				.block_erase = spi_block_erase_20,
1656 			}, {
1657 				.eraseblocks = { {32 * 1024, 32} },
1658 				.block_erase = spi_block_erase_52,
1659 			}, {
1660 				.eraseblocks = { {64 * 1024, 16} },
1661 				.block_erase = spi_block_erase_d8,
1662 			}, {
1663 				.eraseblocks = { {1024 * 1024, 1} },
1664 				.block_erase = spi_block_erase_60,
1665 			}, {
1666 				.eraseblocks = { {1024 * 1024, 1} },
1667 				.block_erase = spi_block_erase_c7,
1668 			}
1669 		},
1670 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1671 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1672 		.write		= spi_chip_write_256,
1673 		.read		= spi_chip_read,
1674 		.voltage	= {2700, 3600},
1675 	},
1676 
1677 	{
1678 		.vendor		= "Atmel",
1679 		.name		= "AT25DF161",
1680 		.bustype	= BUS_SPI,
1681 		.manufacture_id	= ATMEL_ID,
1682 		.model_id	= ATMEL_AT25DF161,
1683 		.total_size	= 2048,
1684 		.page_size	= 256,
1685 		.feature_bits	= FEATURE_WRSR_WREN,
1686 		.tested		= TEST_OK_PREW,
1687 		.probe		= probe_spi_rdid,
1688 		.probe_timing	= TIMING_ZERO,
1689 		.block_erasers	=
1690 		{
1691 			{
1692 				.eraseblocks = { {4 * 1024, 512} },
1693 				.block_erase = spi_block_erase_20,
1694 			}, {
1695 				.eraseblocks = { {32 * 1024, 64} },
1696 				.block_erase = spi_block_erase_52,
1697 			}, {
1698 				.eraseblocks = { {64 * 1024, 32} },
1699 				.block_erase = spi_block_erase_d8,
1700 			}, {
1701 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1702 				.block_erase = spi_block_erase_60,
1703 			}, {
1704 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1705 				.block_erase = spi_block_erase_c7,
1706 			}
1707 		},
1708 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1709 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1710 		.write		= spi_chip_write_256,
1711 		.read		= spi_chip_read,
1712 		.voltage	= {2700, 3600},
1713 	},
1714 
1715 	/*The AT26DF321 has the same ID as the AT25DF321. */
1716 	{
1717 		.vendor		= "Atmel",
1718 		.name		= "AT25DF321",
1719 		.bustype	= BUS_SPI,
1720 		.manufacture_id	= ATMEL_ID,
1721 		.model_id	= ATMEL_AT25DF321,
1722 		.total_size	= 4096,
1723 		.page_size	= 256,
1724 		.feature_bits	= FEATURE_WRSR_WREN,
1725 		.tested		= TEST_OK_PREW,
1726 		.probe		= probe_spi_rdid,
1727 		.probe_timing	= TIMING_ZERO,
1728 		.block_erasers	=
1729 		{
1730 			{
1731 				.eraseblocks = { {4 * 1024, 1024} },
1732 				.block_erase = spi_block_erase_20,
1733 			}, {
1734 				.eraseblocks = { {32 * 1024, 128} },
1735 				.block_erase = spi_block_erase_52,
1736 			}, {
1737 				.eraseblocks = { {64 * 1024, 64} },
1738 				.block_erase = spi_block_erase_d8,
1739 			}, {
1740 				.eraseblocks = { {4 * 1024 * 1024, 1} },
1741 				.block_erase = spi_block_erase_60,
1742 			}, {
1743 				.eraseblocks = { {4 * 1024 * 1024, 1} },
1744 				.block_erase = spi_block_erase_c7,
1745 			}
1746 		},
1747 		.printlock	= spi_prettyprint_status_register_at25df,
1748 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
1749 		.write		= spi_chip_write_256,
1750 		.read		= spi_chip_read,
1751 		.voltage	= {2700, 3600},
1752 	},
1753 
1754 	{
1755 		.vendor		= "Atmel",
1756 		.name		= "AT25DF321A",
1757 		.bustype	= BUS_SPI,
1758 		.manufacture_id	= ATMEL_ID,
1759 		.model_id	= ATMEL_AT25DF321A,
1760 		.total_size	= 4096,
1761 		.page_size	= 256,
1762 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1763 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1764 		.tested		= TEST_OK_PREW,
1765 		.probe		= probe_spi_rdid,
1766 		.probe_timing	= TIMING_ZERO,
1767 		.block_erasers	=
1768 		{
1769 			{
1770 				.eraseblocks = { {4 * 1024, 1024} },
1771 				.block_erase = spi_block_erase_20,
1772 			}, {
1773 				.eraseblocks = { {32 * 1024, 128} },
1774 				.block_erase = spi_block_erase_52,
1775 			}, {
1776 				.eraseblocks = { {64 * 1024, 64} },
1777 				.block_erase = spi_block_erase_d8,
1778 			}, {
1779 				.eraseblocks = { {4 * 1024 * 1024, 1} },
1780 				.block_erase = spi_block_erase_60,
1781 			}, {
1782 				.eraseblocks = { {4 * 1024 * 1024, 1} },
1783 				.block_erase = spi_block_erase_c7,
1784 			}
1785 		},
1786 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1787 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1788 		.write		= spi_chip_write_256,
1789 		.read		= spi_chip_read,
1790 		.voltage	= {2700, 3600},
1791 	},
1792 
1793 	{
1794 		.vendor		= "Atmel",
1795 		.name		= "AT25DF641(A)",
1796 		.bustype	= BUS_SPI,
1797 		.manufacture_id	= ATMEL_ID,
1798 		.model_id	= ATMEL_AT25DF641,
1799 		.total_size	= 8192,
1800 		.page_size	= 256,
1801 		.feature_bits	= FEATURE_WRSR_WREN,
1802 		.tested		= TEST_OK_PREW,
1803 		.probe		= probe_spi_rdid,
1804 		.probe_timing	= TIMING_ZERO,
1805 		.block_erasers	=
1806 		{
1807 			{
1808 				.eraseblocks = { {4 * 1024, 2048} },
1809 				.block_erase = spi_block_erase_20,
1810 			}, {
1811 				.eraseblocks = { {32 * 1024, 256} },
1812 				.block_erase = spi_block_erase_52,
1813 			}, {
1814 				.eraseblocks = { {64 * 1024, 128} },
1815 				.block_erase = spi_block_erase_d8,
1816 			}, {
1817 				.eraseblocks = { {8 * 1024 * 1024, 1} },
1818 				.block_erase = spi_block_erase_60,
1819 			}, {
1820 				.eraseblocks = { {8 * 1024 * 1024, 1} },
1821 				.block_erase = spi_block_erase_c7,
1822 			}
1823 		},
1824 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1825 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1826 		.write		= spi_chip_write_256,
1827 		.read		= spi_chip_read,
1828 		.voltage	= {2700, 3600},
1829 	},
1830 
1831 	{
1832 		.vendor		= "Atmel",
1833 		.name		= "AT25DL081",
1834 		.bustype	= BUS_SPI,
1835 		.manufacture_id	= ATMEL_ID,
1836 		.model_id	= ATMEL_AT25DF081,
1837 		.total_size	= 1024,
1838 		.page_size	= 256,
1839 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1840 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1841 		.tested		= TEST_UNTESTED,
1842 		.probe		= probe_spi_rdid,
1843 		.probe_timing	= TIMING_ZERO,
1844 		.block_erasers	=
1845 		{
1846 			{
1847 				.eraseblocks = { {4 * 1024, 256} },
1848 				.block_erase = spi_block_erase_20,
1849 			}, {
1850 				.eraseblocks = { {32 * 1024, 32} },
1851 				.block_erase = spi_block_erase_52,
1852 			}, {
1853 				.eraseblocks = { {64 * 1024, 16} },
1854 				.block_erase = spi_block_erase_d8,
1855 			}, {
1856 				.eraseblocks = { {1 * 1024 * 1024, 1} },
1857 				.block_erase = spi_block_erase_60,
1858 			}, {
1859 				.eraseblocks = { {1 * 1024 * 1024, 1} },
1860 				.block_erase = spi_block_erase_c7,
1861 			}
1862 		},
1863 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1864 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1865 		.write		= spi_chip_write_256, /* Dual I/O  (0xA2) supported */
1866 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O  (0x3B) supported */
1867 		.voltage	= {1650, 1950},
1868 	},
1869 
1870 	{
1871 		.vendor		= "Atmel",
1872 		.name		= "AT25DL161",
1873 		.bustype	= BUS_SPI,
1874 		.manufacture_id	= ATMEL_ID,
1875 		.model_id	= ATMEL_AT25DL161,
1876 		.total_size	= 2048,
1877 		.page_size	= 256,
1878 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1879 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1880 		.tested		= TEST_UNTESTED,
1881 		.probe		= probe_spi_rdid,
1882 		.probe_timing	= TIMING_ZERO,
1883 		.block_erasers	=
1884 		{
1885 			{
1886 				.eraseblocks = { {4 * 1024, 512} },
1887 				.block_erase = spi_block_erase_20,
1888 			}, {
1889 				.eraseblocks = { {32 * 1024, 64} },
1890 				.block_erase = spi_block_erase_52,
1891 			}, {
1892 				.eraseblocks = { {64 * 1024, 32} },
1893 				.block_erase = spi_block_erase_d8,
1894 			}, {
1895 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1896 				.block_erase = spi_block_erase_60,
1897 			}, {
1898 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1899 				.block_erase = spi_block_erase_c7,
1900 			}
1901 		},
1902 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1903 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1904 		.write		= spi_chip_write_256, /* Dual I/O  (0xA2) supported */
1905 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O  (0x3B) supported */
1906 		.voltage	= {1650, 1950},
1907 	},
1908 
1909 	{
1910 		.vendor		= "Atmel",
1911 		.name		= "AT25DQ161",
1912 		.bustype	= BUS_SPI,
1913 		.manufacture_id	= ATMEL_ID,
1914 		.model_id	= ATMEL_AT25DQ161,
1915 		.total_size	= 2048,
1916 		.page_size	= 256,
1917 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1918 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
1919 		.tested		= TEST_UNTESTED,
1920 		.probe		= probe_spi_rdid,
1921 		.probe_timing	= TIMING_ZERO,
1922 		.block_erasers	=
1923 		{
1924 			{
1925 				.eraseblocks = { {4 * 1024, 512} },
1926 				.block_erase = spi_block_erase_20,
1927 			}, {
1928 				.eraseblocks = { {32 * 1024, 64} },
1929 				.block_erase = spi_block_erase_52,
1930 			}, {
1931 				.eraseblocks = { {64 * 1024, 32} },
1932 				.block_erase = spi_block_erase_d8,
1933 			}, {
1934 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1935 				.block_erase = spi_block_erase_60,
1936 			}, {
1937 				.eraseblocks = { {2 * 1024 * 1024, 1} },
1938 				.block_erase = spi_block_erase_c7,
1939 			}
1940 		},
1941 		.printlock	= spi_prettyprint_status_register_at25df_sec,
1942 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect_sec,
1943 		.write		= spi_chip_write_256,
1944 		.read		= spi_chip_read,
1945 		.voltage	= {2700, 3600},
1946 	},
1947 
1948 	{
1949 		.vendor		= "Atmel",
1950 		/* The A suffix indicates 33MHz instead of 20MHz clock rate.
1951 		 * All other properties seem to be the same.*/
1952 		.name		= "AT25F1024(A)",
1953 		.bustype	= BUS_SPI,
1954 		.manufacture_id	= ATMEL_ID,
1955 		.model_id	= ATMEL_AT25F1024,
1956 		.total_size	= 128,
1957 		.page_size	= 256,
1958 		.feature_bits	= FEATURE_WRSR_WREN,
1959 		.tested		= TEST_OK_PREW,
1960 		.probe		= probe_spi_at25f,
1961 		.probe_timing	= TIMING_ZERO,
1962 		.block_erasers	=
1963 		{
1964 			{
1965 				.eraseblocks = { {32 * 1024, 4} },
1966 				.block_erase = spi_block_erase_52,
1967 			}, {
1968 				.eraseblocks = { {128 * 1024, 1} },
1969 				.block_erase = spi_block_erase_62,
1970 			}
1971 		},
1972 		.printlock	= spi_prettyprint_status_register_at25f,
1973 		.unlock		= spi_disable_blockprotect_at25f,
1974 		.write		= spi_chip_write_256,
1975 		.read		= spi_chip_read,
1976 		.voltage	= {2700, 3600},
1977 	},
1978 
1979 	{
1980 		.vendor		= "Atmel",
1981 		.name		= "AT25F2048",
1982 		.bustype	= BUS_SPI,
1983 		.manufacture_id	= ATMEL_ID,
1984 		.model_id	= ATMEL_AT25F2048,
1985 		.total_size	= 256,
1986 		.page_size	= 256,
1987 		.feature_bits	= FEATURE_WRSR_WREN,
1988 		.tested		= TEST_UNTESTED,
1989 		.probe		= probe_spi_at25f,
1990 		.probe_timing	= TIMING_ZERO,
1991 		.block_erasers	=
1992 		{
1993 			{
1994 				.eraseblocks = { {64 * 1024, 4} },
1995 				.block_erase = spi_block_erase_52,
1996 			}, {
1997 				.eraseblocks = { {256 * 1024, 1} },
1998 				.block_erase = spi_block_erase_62,
1999 			}
2000 		},
2001 		.printlock	= spi_prettyprint_status_register_at25f,
2002 		.unlock		= spi_disable_blockprotect_at25f,
2003 		.write		= spi_chip_write_256,
2004 		.read		= spi_chip_read,
2005 		.voltage	= {2700, 3600},
2006 	},
2007 
2008 	{
2009 		.vendor		= "Atmel",
2010 		.name		= "AT25F4096",
2011 		.bustype	= BUS_SPI,
2012 		.manufacture_id	= ATMEL_ID,
2013 		.model_id	= ATMEL_AT25F4096,
2014 		.total_size	= 512,
2015 		.page_size	= 256,
2016 		.feature_bits	= FEATURE_WRSR_WREN,
2017 		.tested		= TEST_OK_PREW,
2018 		.probe		= probe_spi_at25f,
2019 		.probe_timing	= TIMING_ZERO,
2020 		.block_erasers	=
2021 		{
2022 			{
2023 				.eraseblocks = { {64 * 1024, 8} },
2024 				.block_erase = spi_block_erase_52,
2025 			}, {
2026 				.eraseblocks = { {512 * 1024, 1} },
2027 				.block_erase = spi_block_erase_62,
2028 			}
2029 		},
2030 		.printlock	= spi_prettyprint_status_register_at25f4096,
2031 		/* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2032 		.unlock		= spi_disable_blockprotect_bp2_srwd,
2033 		.write		= spi_chip_write_256,
2034 		.read		= spi_chip_read,
2035 		.voltage	= {2700, 3600},
2036 	},
2037 
2038 	{
2039 		.vendor		= "Atmel",
2040 		.name		= "AT25F512",
2041 		.bustype	= BUS_SPI,
2042 		.manufacture_id	= ATMEL_ID,
2043 		.model_id	= ATMEL_AT25F512,
2044 		.total_size	= 64,
2045 		.page_size	= 256,
2046 		.feature_bits	= FEATURE_WRSR_WREN,
2047 		.tested		= TEST_OK_PREW,
2048 		.probe		= probe_spi_at25f,
2049 		.probe_timing	= TIMING_ZERO,
2050 		.block_erasers	=
2051 		{
2052 			{
2053 				.eraseblocks = { {32 * 1024, 2} },
2054 				.block_erase = spi_block_erase_52,
2055 			}, {
2056 				.eraseblocks = { {64 * 1024, 1} },
2057 				.block_erase = spi_block_erase_62,
2058 			}
2059 		},
2060 		.printlock	= spi_prettyprint_status_register_at25f,
2061 		.unlock		= spi_disable_blockprotect_at25f,
2062 		.write		= spi_chip_write_256,
2063 		.read		= spi_chip_read,
2064 		.voltage	= {2700, 3600},
2065 	},
2066 
2067 	{
2068 		.vendor		= "Atmel",
2069 		.name		= "AT25F512A",
2070 		.bustype	= BUS_SPI,
2071 		.manufacture_id	= ATMEL_ID,
2072 		.model_id	= ATMEL_AT25F512A,
2073 		.total_size	= 64,
2074 		.page_size	= 128,
2075 		.feature_bits	= FEATURE_WRSR_WREN,
2076 		.tested		= TEST_OK_PREW,
2077 		.probe		= probe_spi_at25f,
2078 		.probe_timing	= TIMING_ZERO,
2079 		.block_erasers	=
2080 		{
2081 			{
2082 				.eraseblocks = { {32 * 1024, 2} },
2083 				.block_erase = spi_block_erase_52,
2084 			}, {
2085 				.eraseblocks = { {64 * 1024, 1} },
2086 				.block_erase = spi_block_erase_62,
2087 			}
2088 		},
2089 		.printlock	= spi_prettyprint_status_register_at25f512a,
2090 		/* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2091 		.unlock		= spi_disable_blockprotect_at25f512a,
2092 		.write		= spi_chip_write_256,
2093 		.read		= spi_chip_read,
2094 		.voltage	= {2700, 3600},
2095 	},
2096 
2097 	{
2098 		.vendor		= "Atmel",
2099 		.name		= "AT25F512B",
2100 		.bustype	= BUS_SPI,
2101 		.manufacture_id	= ATMEL_ID,
2102 		.model_id	= ATMEL_AT25F512B,
2103 		.total_size	= 64,
2104 		.page_size	= 256,
2105 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2106 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
2107 		.tested		= TEST_UNTESTED,
2108 		.probe		= probe_spi_rdid,
2109 		.probe_timing	= TIMING_ZERO,
2110 		.block_erasers	=
2111 		{
2112 			{
2113 				.eraseblocks = { {4 * 1024, 16} },
2114 				.block_erase = spi_block_erase_20,
2115 			}, {
2116 				.eraseblocks = { {32 * 1024, 2} },
2117 				.block_erase = spi_block_erase_52,
2118 			}, {
2119 				.eraseblocks = { {32 * 1024, 2} },
2120 				.block_erase = spi_block_erase_d8,
2121 			}, {
2122 				.eraseblocks = { {64 * 1024, 1} },
2123 				.block_erase = spi_block_erase_60,
2124 			}, {
2125 				.eraseblocks = { {64 * 1024, 1} },
2126 				.block_erase = spi_block_erase_c7,
2127 			}, {
2128 				.eraseblocks = { {64 * 1024, 1} },
2129 				.block_erase = spi_block_erase_62,
2130 			}
2131 		},
2132 		.printlock	= spi_prettyprint_status_register_at25f512b,
2133 		.unlock		= spi_disable_blockprotect_at25f512b,
2134 		.write		= spi_chip_write_256,
2135 		.read		= spi_chip_read,
2136 		.voltage	= {2700, 3600},
2137 	},
2138 
2139 	{
2140 		.vendor		= "Atmel",
2141 		.name		= "AT25FS010",
2142 		.bustype	= BUS_SPI,
2143 		.manufacture_id	= ATMEL_ID,
2144 		.model_id	= ATMEL_AT25FS010,
2145 		.total_size	= 128,
2146 		.page_size	= 256,
2147 		.feature_bits	= FEATURE_WRSR_WREN,
2148 		.tested		= TEST_OK_PREW,
2149 		.probe		= probe_spi_rdid,
2150 		.probe_timing	= TIMING_ZERO,
2151 		.block_erasers	=
2152 		{
2153 			{
2154 				.eraseblocks = { {4 * 1024, 32} },
2155 				.block_erase = spi_block_erase_20,
2156 			}, {
2157 				.eraseblocks = { {4 * 1024, 32} },
2158 				.block_erase = spi_block_erase_d7,
2159 			}, {
2160 				.eraseblocks = { {32 * 1024, 4} },
2161 				.block_erase = spi_block_erase_52,
2162 			}, {
2163 				.eraseblocks = { {32 * 1024, 4} },
2164 				.block_erase = spi_block_erase_d8,
2165 			}, {
2166 				.eraseblocks = { {128 * 1024, 1} },
2167 				.block_erase = spi_block_erase_60,
2168 			}, {
2169 				.eraseblocks = { {128 * 1024, 1} },
2170 				.block_erase = spi_block_erase_c7,
2171 			}
2172 		},
2173 		.printlock	= spi_prettyprint_status_register_at25fs010,
2174 		.unlock		= spi_disable_blockprotect_at25fs010,
2175 		.write		= spi_chip_write_256,
2176 		.read		= spi_chip_read,
2177 		.voltage	= {2700, 3600},
2178 	},
2179 
2180 	{
2181 		.vendor		= "Atmel",
2182 		.name		= "AT25FS040",
2183 		.bustype	= BUS_SPI,
2184 		.manufacture_id	= ATMEL_ID,
2185 		.model_id	= ATMEL_AT25FS040,
2186 		.total_size	= 512,
2187 		.page_size	= 256,
2188 		.feature_bits	= FEATURE_WRSR_WREN,
2189 		.tested		= TEST_UNTESTED,
2190 		.probe		= probe_spi_rdid,
2191 		.probe_timing	= TIMING_ZERO,
2192 		.block_erasers	=
2193 		{
2194 			{
2195 				.eraseblocks = { {4 * 1024, 128} },
2196 				.block_erase = spi_block_erase_20,
2197 			}, {
2198 				.eraseblocks = { {64 * 1024, 8} },
2199 				.block_erase = spi_block_erase_52,
2200 			}, {
2201 				.eraseblocks = { {64 * 1024, 8} },
2202 				.block_erase = spi_block_erase_d8,
2203 			}, {
2204 				.eraseblocks = { {512 * 1024, 1} },
2205 				.block_erase = spi_block_erase_60,
2206 			}, {
2207 				.eraseblocks = { {512 * 1024, 1} },
2208 				.block_erase = spi_block_erase_c7,
2209 			}
2210 		},
2211 		.printlock	= spi_prettyprint_status_register_at25fs040,
2212 		.unlock		= spi_disable_blockprotect_at25fs040,
2213 		.write		= spi_chip_write_256,
2214 		.read		= spi_chip_read,
2215 		.voltage	= {2700, 3600},
2216 	},
2217 
2218 	{
2219 		.vendor		= "Atmel",
2220 		.name		= "AT25SF041",
2221 		.bustype	= BUS_SPI,
2222 		.manufacture_id	= ATMEL_ID,
2223 		.model_id	= ATMEL_AT25SF041,
2224 		.total_size	= 512,
2225 		.page_size	= 256,
2226 		.feature_bits	= FEATURE_WRSR_WREN,
2227 		.tested		= TEST_OK_PREW,
2228 		.probe		= probe_spi_rdid,
2229 		.probe_timing	= TIMING_ZERO,
2230 		.block_erasers	=
2231 		{
2232 			{
2233 				.eraseblocks = { {4 * 1024, 128} },
2234 				.block_erase = spi_block_erase_20,
2235 			}, {
2236 				.eraseblocks = { {32 * 1024, 16} },
2237 				.block_erase = spi_block_erase_52,
2238 			}, {
2239 				.eraseblocks = { {64 * 1024, 8} },
2240 				.block_erase = spi_block_erase_d8,
2241 			}, {
2242 				.eraseblocks = { {512 * 1024, 1} },
2243 				.block_erase = spi_block_erase_60,
2244 			}, {
2245 				.eraseblocks = { {512 * 1024, 1} },
2246 				.block_erase = spi_block_erase_c7,
2247 			}
2248 		},
2249 		.printlock	= spi_prettyprint_status_register_plain,
2250 		.unlock		= spi_disable_blockprotect,
2251 		.write		= spi_chip_write_256,
2252 		.read		= spi_chip_read,
2253 		.voltage	= {2500, 3600},
2254 	},
2255 
2256 	{
2257 		.vendor		= "Atmel",
2258 		.name		= "AT25SF081",
2259 		.bustype	= BUS_SPI,
2260 		.manufacture_id	= ATMEL_ID,
2261 		.model_id	= ATMEL_AT25SF081,
2262 		.total_size	= 1024,
2263 		.page_size	= 256,
2264 		.feature_bits	= FEATURE_WRSR_WREN,
2265 		.tested		= TEST_OK_PREW,
2266 		.probe		= probe_spi_rdid,
2267 		.probe_timing	= TIMING_ZERO,
2268 		.block_erasers	=
2269 		{
2270 			{
2271 				.eraseblocks = { {4 * 1024, 256} },
2272 				.block_erase = spi_block_erase_20,
2273 			}, {
2274 				.eraseblocks = { {32 * 1024, 32} },
2275 				.block_erase = spi_block_erase_52,
2276 			}, {
2277 				.eraseblocks = { {64 * 1024, 16} },
2278 				.block_erase = spi_block_erase_d8,
2279 			}, {
2280 				.eraseblocks = { {1024 * 1024, 1} },
2281 				.block_erase = spi_block_erase_60,
2282 			}, {
2283 				.eraseblocks = { {1024 * 1024, 1} },
2284 				.block_erase = spi_block_erase_c7,
2285 			}
2286 		},
2287 		.printlock	= spi_prettyprint_status_register_plain,
2288 		.unlock		= spi_disable_blockprotect,
2289 		.write		= spi_chip_write_256,
2290 		.read		= spi_chip_read,
2291 		.voltage	= {2300, 3600},
2292 	},
2293 
2294 	{
2295 		.vendor		= "Atmel",
2296 		.name		= "AT25SF161",
2297 		.bustype	= BUS_SPI,
2298 		.manufacture_id	= ATMEL_ID,
2299 		.model_id	= ATMEL_AT25SF161,
2300 		.total_size	= 2048,
2301 		.page_size	= 256,
2302 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
2303 		.tested		= TEST_OK_PREW,
2304 		.probe		= probe_spi_rdid,
2305 		.probe_timing	= TIMING_ZERO,
2306 		.block_erasers	=
2307 		{
2308 			{
2309 				.eraseblocks = { {4 * 1024, 512} },
2310 				.block_erase = spi_block_erase_20,
2311 			}, {
2312 				.eraseblocks = { {32 * 1024, 64} },
2313 				.block_erase = spi_block_erase_52,
2314 			}, {
2315 				.eraseblocks = { {64 * 1024, 32} },
2316 				.block_erase = spi_block_erase_d8,
2317 			}, {
2318 				.eraseblocks = { {2048 * 1024, 1} },
2319 				.block_erase = spi_block_erase_60,
2320 			}, {
2321 				.eraseblocks = { {2048 * 1024, 1} },
2322 				.block_erase = spi_block_erase_c7,
2323 			}
2324 		},
2325 		.printlock	= spi_prettyprint_status_register_plain,
2326 		.unlock		= spi_disable_blockprotect,
2327 		.write		= spi_chip_write_256,
2328 		.read		= spi_chip_read,
2329 		.voltage	= {2500, 3600},
2330 	},
2331 
2332 	{
2333 		.vendor		= "Atmel",
2334 		.name		= "AT25SF321",
2335 		.bustype	= BUS_SPI,
2336 		.manufacture_id	= ATMEL_ID,
2337 		.model_id	= ATMEL_AT25SF321,
2338 		.total_size	= 4096,
2339 		.page_size	= 256,
2340 		.feature_bits	= FEATURE_WRSR_WREN,
2341 		.tested		= TEST_OK_PR,
2342 		.probe		= probe_spi_rdid,
2343 		.probe_timing	= TIMING_ZERO,
2344 		.block_erasers	=
2345 		{
2346 			{
2347 				.eraseblocks = { {4 * 1024, 1024} },
2348 				.block_erase = spi_block_erase_20,
2349 			}, {
2350 				.eraseblocks = { {32 * 1024, 128} },
2351 				.block_erase = spi_block_erase_52,
2352 			}, {
2353 				.eraseblocks = { {64 * 1024, 64} },
2354 				.block_erase = spi_block_erase_d8,
2355 			}, {
2356 				.eraseblocks = { {4096 * 1024, 1} },
2357 				.block_erase = spi_block_erase_60,
2358 			}, {
2359 				.eraseblocks = { {4096 * 1024, 1} },
2360 				.block_erase = spi_block_erase_c7,
2361 			}
2362 		},
2363 		.printlock	= spi_prettyprint_status_register_plain,
2364 		.unlock		= spi_disable_blockprotect,
2365 		.write		= spi_chip_write_256,
2366 		.read		= spi_chip_read,
2367 		.voltage	= {2500, 3600},
2368 	},
2369 
2370 	{
2371 		.vendor		= "Atmel",
2372 		.name		= "AT25SL128A",
2373 		.bustype	= BUS_SPI,
2374 		.manufacture_id	= ATMEL_ID,
2375 		.model_id	= ATMEL_AT25SL128A,
2376 		.total_size	= 16384,
2377 		.page_size	= 256,
2378 		/* supports SFDP */
2379 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
2380 		.tested		= TEST_OK_PREW,
2381 		.probe		= probe_spi_rdid,
2382 		.probe_timing	= TIMING_ZERO,
2383 		.block_erasers	=
2384 		{
2385 			{
2386 				.eraseblocks = { {4 * 1024, 4096} },
2387 				.block_erase = spi_block_erase_20,
2388 			}, {
2389 				.eraseblocks = { {32 * 1024, 512} },
2390 				.block_erase = spi_block_erase_52,
2391 			}, {
2392 				.eraseblocks = { {64 * 1024, 256} },
2393 				.block_erase = spi_block_erase_d8,
2394 			}, {
2395 				.eraseblocks = { {16 * 1024 * 1024, 1} },
2396 				.block_erase = spi_block_erase_60,
2397 			}, {
2398 				.eraseblocks = { {16 * 1024 * 1024, 1} },
2399 				.block_erase = spi_block_erase_c7,
2400 			}
2401 		},
2402 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
2403 		.unlock		= spi_disable_blockprotect,
2404 		.write		= spi_chip_write_256,
2405 		.read		= spi_chip_read,
2406 		.voltage	= {1700, 2000},
2407 	},
2408 
2409 	{
2410 		.vendor		= "Atmel",
2411 		.name		= "AT26DF041",
2412 		.bustype	= BUS_SPI,
2413 		.manufacture_id	= ATMEL_ID,
2414 		.model_id	= ATMEL_AT26DF041,
2415 		.total_size	= 512,
2416 		.page_size	= 256,
2417 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2418 		.tested		= TEST_OK_PREW,
2419 		.probe		= probe_spi_rdid,
2420 		.probe_timing	= TIMING_ZERO,
2421 		.block_erasers	=
2422 		{
2423 			{
2424 				.eraseblocks = { {256, 2048} },
2425 				.block_erase = spi_block_erase_81,
2426 			}, {
2427 				.eraseblocks = { {2 * 1024, 256} },
2428 				.block_erase = spi_block_erase_50,
2429 			}, {
2430 				.eraseblocks = { {4 * 1024, 128} },
2431 				.block_erase = spi_block_erase_20,
2432 			}
2433 		},
2434 		.printlock	= spi_prettyprint_status_register_plain,
2435 		/* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
2436 		.write		= spi_chip_write_1,
2437 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
2438 		.voltage	= {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
2439 	},
2440 
2441 	{
2442 		.vendor		= "Atmel",
2443 		.name		= "AT26DF081A",
2444 		.bustype	= BUS_SPI,
2445 		.manufacture_id	= ATMEL_ID,
2446 		.model_id	= ATMEL_AT26DF081A,
2447 		.total_size	= 1024,
2448 		.page_size	= 256,
2449 		.feature_bits	= FEATURE_WRSR_WREN,
2450 		.tested		= TEST_OK_PREW,
2451 		.probe		= probe_spi_rdid,
2452 		.probe_timing	= TIMING_ZERO,
2453 		.block_erasers	=
2454 		{
2455 			{
2456 				.eraseblocks = { {4 * 1024, 256} },
2457 				.block_erase = spi_block_erase_20,
2458 			}, {
2459 				.eraseblocks = { {32 * 1024, 32} },
2460 				.block_erase = spi_block_erase_52,
2461 			}, {
2462 				.eraseblocks = { {64 * 1024, 16} },
2463 				.block_erase = spi_block_erase_d8,
2464 			}, {
2465 				.eraseblocks = { {1024 * 1024, 1} },
2466 				.block_erase = spi_block_erase_60,
2467 			}, {
2468 				.eraseblocks = { {1024 * 1024, 1} },
2469 				.block_erase = spi_block_erase_c7,
2470 			}
2471 		},
2472 		.printlock	= spi_prettyprint_status_register_at26df081a,
2473 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
2474 		.write		= spi_chip_write_256,
2475 		.read		= spi_chip_read,
2476 		.voltage	= {2700, 3600},
2477 	},
2478 
2479 	{
2480 		.vendor		= "Atmel",
2481 		.name		= "AT26DF161",
2482 		.bustype	= BUS_SPI,
2483 		.manufacture_id	= ATMEL_ID,
2484 		.model_id	= ATMEL_AT26DF161,
2485 		.total_size	= 2048,
2486 		.page_size	= 256,
2487 		.feature_bits	= FEATURE_WRSR_WREN,
2488 		.tested		= TEST_OK_PREW,
2489 		.probe		= probe_spi_rdid,
2490 		.probe_timing	= TIMING_ZERO,
2491 		.block_erasers	=
2492 		{
2493 			{
2494 				.eraseblocks = { {4 * 1024, 512} },
2495 				.block_erase = spi_block_erase_20,
2496 			}, {
2497 				.eraseblocks = { {32 * 1024, 64} },
2498 				.block_erase = spi_block_erase_52,
2499 			}, {
2500 				.eraseblocks = { {64 * 1024, 32} },
2501 				.block_erase = spi_block_erase_d8,
2502 			}, {
2503 				.eraseblocks = { {2 * 1024 * 1024, 1} },
2504 				.block_erase = spi_block_erase_60,
2505 			}, {
2506 				.eraseblocks = { {2 * 1024 * 1024, 1} },
2507 				.block_erase = spi_block_erase_c7,
2508 			}
2509 		},
2510 		.printlock	= spi_prettyprint_status_register_at25df,
2511 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
2512 		.write		= spi_chip_write_256,
2513 		.read		= spi_chip_read,
2514 		.voltage	= {2700, 3600},
2515 	},
2516 
2517 	{
2518 		.vendor		= "Atmel",
2519 		.name		= "AT26DF161A",
2520 		.bustype	= BUS_SPI,
2521 		.manufacture_id	= ATMEL_ID,
2522 		.model_id	= ATMEL_AT26DF161A,
2523 		.total_size	= 2048,
2524 		.page_size	= 256,
2525 		.feature_bits	= FEATURE_WRSR_WREN,
2526 		.tested		= TEST_OK_PREW,
2527 		.probe		= probe_spi_rdid,
2528 		.probe_timing	= TIMING_ZERO,
2529 		.block_erasers	=
2530 		{
2531 			{
2532 				.eraseblocks = { {4 * 1024, 512} },
2533 				.block_erase = spi_block_erase_20,
2534 			}, {
2535 				.eraseblocks = { {32 * 1024, 64} },
2536 				.block_erase = spi_block_erase_52,
2537 			}, {
2538 				.eraseblocks = { {64 * 1024, 32} },
2539 				.block_erase = spi_block_erase_d8,
2540 			}, {
2541 				.eraseblocks = { {2 * 1024 * 1024, 1} },
2542 				.block_erase = spi_block_erase_60,
2543 			}, {
2544 				.eraseblocks = { {2 * 1024 * 1024, 1} },
2545 				.block_erase = spi_block_erase_c7,
2546 			}
2547 		},
2548 		.printlock	= spi_prettyprint_status_register_at26df081a,
2549 		.unlock		= spi_disable_blockprotect_at2x_global_unprotect,
2550 		.write		= spi_chip_write_256,
2551 		.read		= spi_chip_read,
2552 		.voltage	= {2700, 3600},
2553 	},
2554 
2555 	{
2556 		.vendor		= "Atmel",
2557 		.name		= "AT26F004",
2558 		.bustype	= BUS_SPI,
2559 		.manufacture_id	= ATMEL_ID,
2560 		.model_id	= ATMEL_AT26F004,
2561 		.total_size	= 512,
2562 		.page_size	= 256,
2563 		.feature_bits	= FEATURE_WRSR_WREN,
2564 		.tested		= {.probe = NT, .read = NT, .erase = NT, .write = BAD},
2565 		.probe		= probe_spi_rdid,
2566 		.probe_timing	= TIMING_ZERO,
2567 		.block_erasers	=
2568 		{
2569 			{
2570 				.eraseblocks = { {4 * 1024, 128} },
2571 				.block_erase = spi_block_erase_20,
2572 			}, {
2573 				.eraseblocks = { {32 * 1024, 16} },
2574 				.block_erase = spi_block_erase_52,
2575 			}, {
2576 				.eraseblocks = { {64 * 1024, 8} },
2577 				.block_erase = spi_block_erase_d8,
2578 			}, {
2579 				.eraseblocks = { {512 * 1024, 1} },
2580 				.block_erase = spi_block_erase_60,
2581 			}, {
2582 				.eraseblocks = { {512 * 1024, 1} },
2583 				.block_erase = spi_block_erase_c7,
2584 			}
2585 		},
2586 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
2587 		.write		= NULL, /* Incompatible Page write */
2588 		.read		= spi_chip_read,
2589 		.voltage	= {2700, 3600},
2590 	},
2591 
2592 	{
2593 		.vendor		= "Atmel",
2594 		.name		= "AT29C010A",
2595 		.bustype	= BUS_PARALLEL,
2596 		.manufacture_id	= ATMEL_ID,
2597 		.model_id	= ATMEL_AT29C010A,
2598 		.total_size	= 128,
2599 		.page_size	= 128,
2600 		.feature_bits	= FEATURE_LONG_RESET,
2601 		.tested		= TEST_OK_PRE,
2602 		.probe		= probe_jedec,
2603 		.probe_timing	= 10000, /* 10mS, Enter=Exec */
2604 		.block_erasers	=
2605 		{
2606 			{
2607 				.eraseblocks = { {128 * 1024, 1} },
2608 				.block_erase = erase_chip_block_jedec,
2609 			}
2610 		},
2611 		.write		= write_jedec,	/* FIXME */
2612 		.read		= read_memmapped,
2613 		.voltage	= {4500, 5500},
2614 	},
2615 
2616 	{
2617 		.vendor		= "Atmel",
2618 		.name		= "AT29C020",
2619 		.bustype	= BUS_PARALLEL,
2620 		.manufacture_id	= ATMEL_ID,
2621 		.model_id	= ATMEL_AT29C020,
2622 		.total_size	= 256,
2623 		.page_size	= 256,
2624 		.feature_bits	= FEATURE_LONG_RESET,
2625 		.tested		= TEST_OK_PREW,
2626 		.probe		= probe_jedec,
2627 		.probe_timing	= 10000,			/* 10ms */
2628 		.block_erasers	=
2629 		{
2630 			{
2631 				.eraseblocks = { {256 * 1024, 1} },
2632 				.block_erase = erase_chip_block_jedec,
2633 			}
2634 		},
2635 		.write		= write_jedec,
2636 		.read		= read_memmapped,
2637 		.voltage	= {4500, 5500},
2638 	},
2639 
2640 	{
2641 		.vendor		= "Atmel",
2642 		.name		= "AT29C040A",
2643 		.bustype	= BUS_PARALLEL,
2644 		.manufacture_id	= ATMEL_ID,
2645 		.model_id	= ATMEL_AT29C040A,
2646 		.total_size	= 512,
2647 		.page_size	= 256,
2648 		.feature_bits	= FEATURE_LONG_RESET,
2649 		.tested		= TEST_UNTESTED,
2650 		.probe		= probe_jedec,
2651 		.probe_timing	= 10000,			/* 10 ms */
2652 		.block_erasers	=
2653 		{
2654 			{
2655 				.eraseblocks = { {512 * 1024, 1} },
2656 				.block_erase = erase_chip_block_jedec,
2657 			}
2658 		},
2659 		.write		= write_jedec,
2660 		.read		= read_memmapped,
2661 		.voltage	= {4500, 5500},
2662 	},
2663 
2664 	{
2665 		.vendor		= "Atmel",
2666 		.name		= "AT29C512",
2667 		.bustype	= BUS_PARALLEL,
2668 		.manufacture_id	= ATMEL_ID,
2669 		.model_id	= ATMEL_AT29C512,
2670 		.total_size	= 64,
2671 		.page_size	= 128,
2672 		.feature_bits	= FEATURE_LONG_RESET,
2673 		.tested		= TEST_OK_PREW,
2674 		.probe		= probe_jedec,
2675 		.probe_timing	= 10000, /* 10mS, Enter=Exec */
2676 		.block_erasers	=
2677 		{
2678 			{
2679 				.eraseblocks = { {64 * 1024, 1} },
2680 				.block_erase = erase_chip_block_jedec,
2681 			}
2682 		},
2683 		.write		= write_jedec,
2684 		.read		= read_memmapped,
2685 		.voltage	= {4500, 5500},
2686 	},
2687 
2688 	{
2689 		.vendor		= "Atmel",
2690 		.name		= "AT45CS1282",
2691 		.bustype	= BUS_SPI,
2692 		.manufacture_id	= ATMEL_ID,
2693 		.model_id	= ATMEL_AT45CS1282,
2694 		.total_size	= 16896, /* No power of two sizes */
2695 		.page_size	= 1056, /* No power of two sizes */
2696 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2697 		/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2698 		.feature_bits	= FEATURE_OTP,
2699 		.tested		= TEST_UNTESTED,
2700 		.probe		= probe_spi_rdid,
2701 		.probe_timing	= TIMING_ZERO,
2702 		.block_erasers	=
2703 		{
2704 			{
2705 				.eraseblocks = {
2706 					{8 * 1056, 1},    /* sector 0a:      opcode 50h */
2707 					{248 * 1056, 1},  /* sector 0b:      opcode 7Ch */
2708 					{256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2709 				},
2710 				.block_erase = spi_erase_at45cs_sector,
2711 			}
2712 		},
2713 		.printlock	= spi_prettyprint_status_register_plain,
2714 		.write		= spi_write_at45db,
2715 		.read		= spi_read_at45db,
2716 		.voltage	= {2700, 3600},
2717 		.gran		= write_gran_1056bytes,
2718 	},
2719 
2720 	{
2721 		.vendor		= "Atmel",
2722 		.name		= "AT45DB011D",
2723 		.bustype	= BUS_SPI,
2724 		.manufacture_id	= ATMEL_ID,
2725 		.model_id	= ATMEL_AT45DB011D,
2726 		.total_size	= 128, /* or 132, determined from status register */
2727 		.page_size	= 256, /* or 264, determined from status register */
2728 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2729 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2730 		.feature_bits	= FEATURE_OTP,
2731 		.tested		= TEST_OK_PREW,
2732 		.probe		= probe_spi_at45db,
2733 		.probe_timing	= TIMING_ZERO,
2734 		.block_erasers	=
2735 		{
2736 			{
2737 				.eraseblocks = { {256, 512} },
2738 				.block_erase = spi_erase_at45db_page,
2739 			}, {
2740 				.eraseblocks = { {8 * 256, 512/8} },
2741 				.block_erase = spi_erase_at45db_block,
2742 			}, {
2743 				.eraseblocks = {
2744 					{8 * 256, 1},
2745 					{120 * 256, 1},
2746 					{128 * 256, 3},
2747 				},
2748 				.block_erase = spi_erase_at45db_sector
2749 			}, {
2750 				.eraseblocks = { {128 * 1024, 1} },
2751 				.block_erase = spi_erase_at45db_chip,
2752 			}
2753 		},
2754 		.printlock	= spi_prettyprint_status_register_at45db,
2755 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2756 		/* granularity will be set by the probing function. */
2757 		.write		= spi_write_at45db,
2758 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
2759 		.voltage	= {2700, 3600},
2760 	},
2761 
2762 	{
2763 		.vendor		= "Atmel",
2764 		.name		= "AT45DB021D",
2765 		.bustype	= BUS_SPI,
2766 		.manufacture_id	= ATMEL_ID,
2767 		.model_id	= ATMEL_AT45DB021D,
2768 		.total_size	= 256, /* or 264, determined from status register */
2769 		.page_size	= 256, /* or 264, determined from status register */
2770 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2771 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2772 		.feature_bits	= FEATURE_OTP,
2773 		.tested		= TEST_OK_PREW,
2774 		.probe		= probe_spi_at45db,
2775 		.probe_timing	= TIMING_ZERO,
2776 		.block_erasers	=
2777 		{
2778 			{
2779 				.eraseblocks = { {256, 1024} },
2780 				.block_erase = spi_erase_at45db_page,
2781 			}, {
2782 				.eraseblocks = { {8 * 256, 1024/8} },
2783 				.block_erase = spi_erase_at45db_block,
2784 			}, {
2785 				.eraseblocks = {
2786 					{8 * 256, 1},
2787 					{120 * 256, 1},
2788 					{128 * 256, 7},
2789 				},
2790 				.block_erase = spi_erase_at45db_sector
2791 			}, {
2792 				.eraseblocks = { {256 * 1024, 1} },
2793 				.block_erase = spi_erase_at45db_chip,
2794 			}
2795 		},
2796 		.printlock	= spi_prettyprint_status_register_at45db,
2797 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2798 		/* granularity will be set by the probing function. */
2799 		.write		= spi_write_at45db,
2800 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
2801 		.voltage	= {2700, 3600},
2802 	},
2803 
2804 	{
2805 		.vendor		= "Atmel",
2806 		.name		= "AT45DB041D",
2807 		.bustype	= BUS_SPI,
2808 		.manufacture_id	= ATMEL_ID,
2809 		.model_id	= ATMEL_AT45DB041D,
2810 		.total_size	= 512, /* or 528, determined from status register */
2811 		.page_size	= 256, /* or 264, determined from status register */
2812 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2813 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2814 		.feature_bits	= FEATURE_OTP,
2815 		.tested		= TEST_OK_PREW,
2816 		.probe		= probe_spi_at45db,
2817 		.probe_timing	= TIMING_ZERO,
2818 		.block_erasers	=
2819 		{
2820 			{
2821 				.eraseblocks = { {256, 2048} },
2822 				.block_erase = spi_erase_at45db_page,
2823 			}, {
2824 				.eraseblocks = { {8 * 256, 2048/8} },
2825 				.block_erase = spi_erase_at45db_block,
2826 			}, {
2827 				.eraseblocks = {
2828 					{8 * 256, 1},
2829 					{248 * 256, 1},
2830 					{256 * 256, 7},
2831 				},
2832 				.block_erase = spi_erase_at45db_sector
2833 			}, {
2834 				.eraseblocks = { {512 * 1024, 1} },
2835 				.block_erase = spi_erase_at45db_chip,
2836 			}
2837 		},
2838 		.printlock	= spi_prettyprint_status_register_at45db,
2839 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2840 		/* granularity will be set by the probing function. */
2841 		.write		= spi_write_at45db,
2842 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
2843 		.voltage	= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2844 	},
2845 
2846 	{
2847 		.vendor		= "Atmel",
2848 		.name		= "AT45DB081D",
2849 		.bustype	= BUS_SPI,
2850 		.manufacture_id	= ATMEL_ID,
2851 		.model_id	= ATMEL_AT45DB081D,
2852 		.total_size	= 1024, /* or 1056, determined from status register */
2853 		.page_size	= 256, /* or 264, determined from status register */
2854 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2855 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2856 		.feature_bits	= FEATURE_OTP,
2857 		.tested		= TEST_OK_PREW,
2858 		.probe		= probe_spi_at45db,
2859 		.probe_timing	= TIMING_ZERO,
2860 		.block_erasers	=
2861 		{
2862 			{
2863 				.eraseblocks = { {256, 4096} },
2864 				.block_erase = spi_erase_at45db_page,
2865 			}, {
2866 				.eraseblocks = { {8 * 256, 4096/8} },
2867 				.block_erase = spi_erase_at45db_block,
2868 			}, {
2869 				.eraseblocks = {
2870 					{8 * 256, 1},
2871 					{248 * 256, 1},
2872 					{256 * 256, 15},
2873 				},
2874 				.block_erase = spi_erase_at45db_sector
2875 			}, {
2876 				.eraseblocks = { {1024 * 1024, 1} },
2877 				.block_erase = spi_erase_at45db_chip,
2878 			}
2879 		},
2880 		.printlock	= spi_prettyprint_status_register_at45db,
2881 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2882 		/* granularity will be set by the probing function. */
2883 		.write		= spi_write_at45db,
2884 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
2885 		.voltage	= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2886 	},
2887 
2888 	{
2889 		.vendor		= "Atmel",
2890 		.name		= "AT45DB161D",
2891 		.bustype	= BUS_SPI,
2892 		.manufacture_id	= ATMEL_ID,
2893 		.model_id	= ATMEL_AT45DB161D,
2894 		.total_size	= 2048, /* or 2112, determined from status register */
2895 		.page_size	= 512, /* or 528, determined from status register */
2896 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2897 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2898 		.feature_bits	= FEATURE_OTP,
2899 		.tested		= TEST_OK_PREW,
2900 		.probe		= probe_spi_at45db,
2901 		.probe_timing	= TIMING_ZERO,
2902 		.block_erasers	=
2903 		{
2904 			{
2905 				.eraseblocks = { {512, 4096} },
2906 				.block_erase = spi_erase_at45db_page,
2907 			}, {
2908 				.eraseblocks = { {8 * 512, 4096/8} },
2909 				.block_erase = spi_erase_at45db_block,
2910 			}, {
2911 				.eraseblocks = {
2912 					{8 * 512, 1},
2913 					{248 * 512, 1},
2914 					{256 * 512, 15},
2915 				},
2916 				.block_erase = spi_erase_at45db_sector
2917 			}, {
2918 				.eraseblocks = { {2048 * 1024, 1} },
2919 				.block_erase = spi_erase_at45db_chip,
2920 			}
2921 		},
2922 		.printlock	= spi_prettyprint_status_register_at45db,
2923 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2924 		/* granularity will be set by the probing function. */
2925 		.write		= spi_write_at45db,
2926 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
2927 		.voltage	= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2928 	},
2929 
2930 	{
2931 		.vendor		= "Atmel",
2932 		.name		= "AT45DB321C",
2933 		.bustype	= BUS_SPI,
2934 		.manufacture_id	= ATMEL_ID,
2935 		.model_id	= ATMEL_AT45DB321C,
2936 		.total_size	= 4224, /* No power of two sizes */
2937 		.page_size	= 528, /* No power of two sizes */
2938 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2939 		/* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2940 		.feature_bits	= FEATURE_OTP,
2941 		.tested		= TEST_UNTESTED,
2942 		.probe		= probe_spi_rdid,
2943 		.probe_timing	= TIMING_ZERO,
2944 		.block_erasers	=
2945 		{
2946 			{
2947 				.eraseblocks = { {528, 8192} },
2948 				.block_erase = spi_erase_at45db_page,
2949 			}, {
2950 				.eraseblocks = { {8 * 528, 8192/8} },
2951 				.block_erase = spi_erase_at45db_block,
2952 			}, /* Although the datasheets describes sectors (which can be write protected)
2953 			    * there seems to be no erase functions for them.
2954 			{
2955 				.eraseblocks = {
2956 					{8 * 528, 1},
2957 					{120 * 528, 1},
2958 					{128 * 528, 63},
2959 				},
2960 				.block_erase = spi_erase_at45db_sector
2961 			}, */ {
2962 				.eraseblocks = { {4224 * 1024, 1} },
2963 				.block_erase = spi_erase_at45db_chip,
2964 			}
2965 		},
2966 		.printlock	= spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2967 		.write		= spi_write_at45db,
2968 		.read		= spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
2969 		.voltage	= {2700, 3600},
2970 		.gran		= write_gran_528bytes,
2971 	},
2972 
2973 	{
2974 		.vendor		= "Atmel",
2975 		.name		= "AT45DB321D",
2976 		.bustype	= BUS_SPI,
2977 		.manufacture_id	= ATMEL_ID,
2978 		.model_id	= ATMEL_AT45DB321D,
2979 		.total_size	= 4096, /* or 4224, determined from status register */
2980 		.page_size	= 512, /* or 528, determined from status register */
2981 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2982 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2983 		.feature_bits	= FEATURE_OTP,
2984 		.tested		= TEST_OK_PREW,
2985 		.probe		= probe_spi_at45db,
2986 		.probe_timing	= TIMING_ZERO,
2987 		.block_erasers	=
2988 		{
2989 			{
2990 				.eraseblocks = { {512, 8192} },
2991 				.block_erase = spi_erase_at45db_page,
2992 			}, {
2993 				.eraseblocks = { {8 * 512, 8192/8} },
2994 				.block_erase = spi_erase_at45db_block,
2995 			}, {
2996 				.eraseblocks = {
2997 					{8 * 512, 1},
2998 					{120 * 512, 1},
2999 					{128 * 512, 63},
3000 				},
3001 				.block_erase = spi_erase_at45db_sector
3002 			}, {
3003 				.eraseblocks = { {4096 * 1024, 1} },
3004 				.block_erase = spi_erase_at45db_chip,
3005 			}
3006 		},
3007 		.printlock	= spi_prettyprint_status_register_at45db,
3008 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3009 		/* granularity will be set by the probing function. */
3010 		.write		= spi_write_at45db,
3011 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
3012 		.voltage	= {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
3013 	},
3014 
3015 	{
3016 		.vendor		= "Atmel",
3017 		.name		= "AT45DB321E",
3018 		.bustype	= BUS_SPI,
3019 		.manufacture_id	= ATMEL_ID,
3020 		.model_id	= ATMEL_AT45DB321C,
3021 		.total_size	= 4096, /* or 4224, determined from status register */
3022 		.page_size	= 512, /* or 528, determined from status register */
3023 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3024 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3025 		.feature_bits	= FEATURE_OTP,
3026 		.tested		= TEST_UNTESTED,
3027 		.probe		= probe_spi_at45db,
3028 		.probe_timing	= TIMING_ZERO,
3029 		.block_erasers	=
3030 		{
3031 			{
3032 				.eraseblocks = { {512, 8192} },
3033 				.block_erase = spi_erase_at45db_page,
3034 			}, {
3035 				.eraseblocks = { {8 * 512, 8192/8} },
3036 				.block_erase = spi_erase_at45db_block,
3037 			}, {
3038 				.eraseblocks = {
3039 					{8 * 512, 1},
3040 					{120 * 512, 1},
3041 					{128 * 512, 63},
3042 				},
3043 				.block_erase = spi_erase_at45db_sector
3044 			}, {
3045 				.eraseblocks = { {4096 * 1024, 1} },
3046 				.block_erase = spi_erase_at45db_chip,
3047 			}
3048 		},
3049 		.printlock	= spi_prettyprint_status_register_at45db, /* has a 2nd status register */
3050 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3051 		/* granularity will be set by the probing function. */
3052 		.write		= spi_write_at45db,
3053 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
3054 		.voltage	= {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
3055 	},
3056 
3057 	{
3058 		.vendor		= "Atmel",
3059 		.name		= "AT45DB642D",
3060 		.bustype	= BUS_SPI,
3061 		.manufacture_id	= ATMEL_ID,
3062 		.model_id	= ATMEL_AT45DB642D,
3063 		.total_size	= 8192, /* or 8448, determined from status register */
3064 		.page_size	= 1024, /* or 1056, determined from status register */
3065 		/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3066 		/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3067 		.feature_bits	= FEATURE_OTP,
3068 		.tested		= TEST_OK_PREW,
3069 		.probe		= probe_spi_at45db,
3070 		.probe_timing	= TIMING_ZERO,
3071 		.block_erasers	=
3072 		{
3073 			{
3074 				.eraseblocks = { {1024, 8192} },
3075 				.block_erase = spi_erase_at45db_page,
3076 			}, {
3077 				.eraseblocks = { {8 * 1024, 8192/8} },
3078 				.block_erase = spi_erase_at45db_block,
3079 			}, {
3080 				.eraseblocks = {
3081 					{8 * 1024, 1},
3082 					{248 * 1024, 1},
3083 					{256 * 1024, 31},
3084 				},
3085 				.block_erase = spi_erase_at45db_sector
3086 			}, {
3087 				.eraseblocks = { {8192 * 1024, 1} },
3088 				.block_erase = spi_erase_at45db_chip,
3089 			}
3090 		},
3091 		.printlock	= spi_prettyprint_status_register_at45db,
3092 		.unlock		= spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3093 		/* granularity will be set by the probing function. */
3094 		.write		= spi_write_at45db,
3095 		.read		= spi_read_at45db, /* Fast read (0x0B) supported */
3096 		.voltage	= {2700, 3600},
3097 	},
3098 
3099 	{
3100 		.vendor		= "Atmel",
3101 		.name		= "AT49(H)F010",
3102 		.bustype	= BUS_PARALLEL,
3103 		.manufacture_id	= ATMEL_ID,
3104 		.model_id	= ATMEL_AT49F010,
3105 		.total_size	= 128,
3106 		.page_size	= 0, /* unused */
3107 		.feature_bits	= FEATURE_EITHER_RESET,
3108 		.tested		= TEST_OK_PREW,
3109 		.probe		= probe_jedec,
3110 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3111 		.block_erasers	=
3112 		{
3113 			{
3114 				.eraseblocks = { {128 * 1024, 1} },
3115 				.block_erase = erase_chip_block_jedec,
3116 			}
3117 		},
3118 		.printlock	= printlock_at49f,
3119 		.write		= write_jedec_1,
3120 		.read		= read_memmapped,
3121 		.voltage	= {4500, 5500},
3122 	},
3123 
3124 	{
3125 		.vendor		= "Atmel",
3126 		.name		= "AT49BV512",
3127 		.bustype	= BUS_PARALLEL,
3128 		.manufacture_id	= ATMEL_ID,
3129 		.model_id	= ATMEL_AT49BV512,
3130 		.total_size	= 64,
3131 		.page_size	= 64,
3132 		.feature_bits	= FEATURE_EITHER_RESET,
3133 		.tested		= TEST_OK_PREW,
3134 		.probe		= probe_jedec,
3135 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3136 		.block_erasers	=
3137 		{
3138 			{
3139 				.eraseblocks = { {64 * 1024, 1} },
3140 				.block_erase = erase_chip_block_jedec,
3141 			}
3142 		},
3143 		.write		= write_jedec_1,
3144 		.read		= read_memmapped,
3145 		.voltage	= {2700, 3600},
3146 	},
3147 
3148 	{
3149 		.vendor		= "Atmel",
3150 		.name		= "AT49F002(N)",
3151 		.bustype	= BUS_PARALLEL,
3152 		.manufacture_id	= ATMEL_ID,
3153 		.model_id	= ATMEL_AT49F002N,
3154 		.total_size	= 256,
3155 		.page_size	= 256,
3156 		.feature_bits	= FEATURE_EITHER_RESET,
3157 		.tested		= TEST_UNTESTED,
3158 		.probe		= probe_jedec,
3159 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3160 		.block_erasers	=
3161 		{
3162 			{
3163 				.eraseblocks = {
3164 					{16 * 1024, 1},
3165 					{8 * 1024, 2},
3166 					{96 * 1024, 1},
3167 					{128 * 1024, 1},
3168 				},
3169 				.block_erase = erase_sector_jedec,
3170 			}, {
3171 				.eraseblocks = { {256 * 1024, 1} },
3172 				.block_erase = erase_chip_block_jedec,
3173 			}
3174 		},
3175 		.write		= write_jedec_1,
3176 		.read		= read_memmapped,
3177 		.voltage	= {4500, 5500},
3178 	},
3179 
3180 	{
3181 		.vendor		= "Atmel",
3182 		.name		= "AT49F002(N)T",
3183 		.bustype	= BUS_PARALLEL,
3184 		.manufacture_id	= ATMEL_ID,
3185 		.model_id	= ATMEL_AT49F002NT,
3186 		.total_size	= 256,
3187 		.page_size	= 256,
3188 		.feature_bits	= FEATURE_EITHER_RESET,
3189 		.tested		= TEST_OK_PR,
3190 		.probe		= probe_jedec,
3191 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3192 		.block_erasers	=
3193 		{
3194 			{
3195 				.eraseblocks = {
3196 					{128 * 1024, 1},
3197 					{96 * 1024, 1},
3198 					{8 * 1024, 2},
3199 					{16 * 1024, 1},
3200 				},
3201 				.block_erase = erase_sector_jedec,
3202 			}, {
3203 				.eraseblocks = { {256 * 1024, 1} },
3204 				.block_erase = erase_chip_block_jedec,
3205 			}
3206 		},
3207 		.write		= write_jedec_1,
3208 		.read		= read_memmapped,
3209 		.voltage	= {4500, 5500},
3210 	},
3211 
3212 	{
3213 		.vendor		= "Atmel",
3214 		.name		= "AT49F020",
3215 		.bustype	= BUS_PARALLEL,
3216 		.manufacture_id	= ATMEL_ID,
3217 		.model_id	= ATMEL_AT49F020,
3218 		.total_size	= 256,
3219 		.page_size	= 0, /* unused */
3220 		.feature_bits	= FEATURE_EITHER_RESET,
3221 		.tested		= TEST_OK_PRE,
3222 		.probe		= probe_jedec,
3223 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3224 		.block_erasers	=
3225 		{
3226 			{
3227 				.eraseblocks = { {256 * 1024, 1} },
3228 				.block_erase = erase_chip_block_jedec,
3229 			}
3230 			/* Chip features an optional permanent write protection
3231 			 * of the first 8 kB. The erase function is the same as
3232 			 * above, but 00000H to 01FFFH will not be erased.
3233 			 * FIXME: add another eraser when partial erasers are
3234 			 * supported.
3235 			 */
3236 		},
3237 		.printlock	= printlock_at49f,
3238 		.write		= write_jedec_1,
3239 		.read		= read_memmapped,
3240 		.voltage	= {4500, 5500},
3241 	},
3242 
3243 	{
3244 		.vendor		= "Atmel",
3245 		.name		= "AT49F040",
3246 		.bustype	= BUS_PARALLEL,
3247 		.manufacture_id	= ATMEL_ID,
3248 		.model_id	= ATMEL_AT49F040,
3249 		.total_size	= 512,
3250 		.page_size	= 0, /* unused */
3251 		.feature_bits	= FEATURE_EITHER_RESET,
3252 		.tested		= TEST_UNTESTED,
3253 		.probe		= probe_jedec,
3254 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
3255 		.block_erasers	=
3256 		{
3257 			{
3258 				.eraseblocks = { {512 * 1024, 1} },
3259 				.block_erase = erase_chip_block_jedec,
3260 			}
3261 			/* Chip features an optional permanent write protection
3262 			 * of the first 16 kB. The erase function is the same as
3263 			 * above, but 00000H to 03FFFH will not be erased.
3264 			 * FIXME: add another eraser when partial erasers are
3265 			 * supported.
3266 			 */
3267 		},
3268 		.printlock	= printlock_at49f,
3269 		.write		= write_jedec_1,
3270 		.read		= read_memmapped,
3271 		.voltage	= {4500, 5500},
3272 	},
3273 
3274 	{
3275 		.vendor		= "Atmel",
3276 		.name		= "AT49F080",
3277 		.bustype	= BUS_PARALLEL,
3278 		.manufacture_id	= ATMEL_ID,
3279 		.model_id	= ATMEL_AT49F080,
3280 		.total_size	= 1024,
3281 		.page_size	= 0, /* unused */
3282 		.feature_bits	= FEATURE_EITHER_RESET,
3283 		.tested		= TEST_UNTESTED,
3284 		.probe		= probe_jedec,
3285 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
3286 		.block_erasers	=
3287 		{
3288 			{
3289 				.eraseblocks = { {1024 * 1024, 1} },
3290 				.block_erase = erase_chip_block_jedec,
3291 			}
3292 			/* Chip features an optional permanent write protection
3293 			 * of the first 16 kB. The erase function is the same as
3294 			 * above, but 00000H to 03FFFH will not be erased.
3295 			 * FIXME: add another eraser when partial erasers are
3296 			 * supported.
3297 			 */
3298 		},
3299 		.printlock	= printlock_at49f,
3300 		.write		= write_jedec_1,
3301 		.read		= read_memmapped,
3302 		.voltage	= {4500, 5500},
3303 	},
3304 
3305 	{
3306 		/* 'top' version of AT49F080. equal in all aspects but the boot block address */
3307 		.vendor		= "Atmel",
3308 		.name		= "AT49F080T",
3309 		.bustype	= BUS_PARALLEL,
3310 		.manufacture_id	= ATMEL_ID,
3311 		.model_id	= ATMEL_AT49F080T,
3312 		.total_size	= 1024,
3313 		.page_size	= 0, /* unused */
3314 		.feature_bits	= FEATURE_EITHER_RESET,
3315 		.tested		= TEST_UNTESTED,
3316 		.probe		= probe_jedec,
3317 		.probe_timing	= TIMING_ZERO,  /* Datasheet has no timing info specified */
3318 		.block_erasers	=
3319 		{
3320 			{
3321 				.eraseblocks = { {1024 * 1024, 1} },
3322 				.block_erase = erase_chip_block_jedec,
3323 			}
3324 			/* Chip features an optional permanent write protection
3325 			 * of the first 16 kB. The erase function is the same as
3326 			 * above, but FC000H to FFFFFH will not be erased.
3327 			 * FIXME: add another eraser when partial erasers are
3328 			 * supported.
3329 			 */
3330 		},
3331 		.printlock	= printlock_at49f,
3332 		.write		= write_jedec_1,
3333 		.read		= read_memmapped,
3334 		.voltage	= {4500, 5500},
3335 	},
3336 
3337 	{
3338 		.vendor		= "Atmel",
3339 		.name		= "AT49LH002",
3340 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
3341 		.manufacture_id	= ATMEL_ID,
3342 		.model_id	= ATMEL_AT49LH002,
3343 		.total_size	= 256,
3344 		.page_size	= 0, /* unused */
3345 		.feature_bits	= FEATURE_REGISTERMAP,
3346 		.tested		= TEST_UNTESTED,
3347 		.probe		= probe_82802ab,
3348 		.probe_timing	= TIMING_ZERO,
3349 		.block_erasers	=
3350 		{
3351 			{
3352 				.eraseblocks = {
3353 					{64 * 1024, 3},
3354 					{32 * 1024, 1},
3355 					{8 * 1024, 2},
3356 					{16 * 1024, 1},
3357 				},
3358 				.block_erase = NULL, /* TODO: Implement. */
3359 			}, {
3360 				.eraseblocks = {
3361 					{64 * 1024, 4},
3362 				},
3363 				.block_erase = erase_block_82802ab,
3364 			},
3365 		},
3366 		.printlock	= printlock_regspace2_block_eraser_0,
3367 		.unlock		= unlock_regspace2_block_eraser_0,
3368 		.write		= write_82802ab,
3369 		.read		= read_memmapped,
3370 		.voltage	= {3000, 3600},
3371 	},
3372 
3373 	{
3374 		.vendor		= "Atmel",
3375 		.name		= "AT49LH004",
3376 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
3377 		.manufacture_id	= ATMEL_ID,
3378 		.model_id	= ATMEL_AT49LH004,
3379 		.total_size	= 512,
3380 		.page_size	= 0, /* unused */
3381 		.feature_bits	= FEATURE_REGISTERMAP,
3382 		.tested		= TEST_UNTESTED,
3383 		.probe		= probe_82802ab,
3384 		.probe_timing	= TIMING_ZERO,
3385 		.block_erasers	=
3386 		{
3387 			{
3388 				.eraseblocks = {
3389 					{64 * 1024, 7},
3390 					{32 * 1024, 1},
3391 					{8 * 1024, 2},
3392 					{16 * 1024, 1},
3393 				},
3394 				.block_erase = erase_block_82802ab,
3395 			}, {
3396 				.eraseblocks = {
3397 					{64 * 1024, 8},
3398 				},
3399 				.block_erase = NULL, /* TODO: Implement. */
3400 			},
3401 		},
3402 		.printlock	= printlock_regspace2_block_eraser_0,
3403 		.unlock		= unlock_regspace2_block_eraser_0,
3404 		.write		= write_82802ab,
3405 		.read		= read_memmapped,
3406 		.voltage	= {3000, 3600},
3407 	},
3408 
3409 	{
3410 		.vendor		= "Atmel",
3411 		.name		= "AT49LH00B4",
3412 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
3413 		.manufacture_id	= ATMEL_ID,
3414 		.model_id	= ATMEL_AT49LH00B4,
3415 		.total_size	= 512,
3416 		.page_size	= 0, /* unused */
3417 		.feature_bits	= FEATURE_REGISTERMAP,
3418 		.tested		= TEST_UNTESTED,
3419 		.probe		= probe_82802ab,
3420 		.probe_timing	= TIMING_ZERO,
3421 		.block_erasers	=
3422 		{
3423 			{
3424 				.eraseblocks = {
3425 					{8 * 1024, 2},
3426 					{16 * 1024, 1},
3427 					{32 * 1024, 1},
3428 					{64 * 1024, 7},
3429 				},
3430 				.block_erase = NULL, /* TODO: Implement. */
3431 			}, {
3432 				.eraseblocks = {
3433 					{64 * 1024, 8},
3434 				},
3435 				.block_erase = erase_block_82802ab,
3436 			},
3437 		},
3438 		.printlock	= printlock_regspace2_block_eraser_0,
3439 		.unlock		= unlock_regspace2_block_eraser_0,
3440 		.write		= write_82802ab,
3441 		.read		= read_memmapped,
3442 		.voltage	= {3000, 3600},
3443 	},
3444 
3445 	{
3446 		.vendor		= "Bright",
3447 		.name		= "BM29F040",
3448 		.bustype	= BUS_PARALLEL,
3449 		.manufacture_id	= BRIGHT_ID,
3450 		.model_id	= BRIGHT_BM29F040,
3451 		.total_size	= 512,
3452 		.page_size	= 64 * 1024,
3453 		.feature_bits	= FEATURE_EITHER_RESET,
3454 		.tested		= TEST_OK_PR,
3455 		.probe		= probe_jedec,
3456 		.probe_timing	= TIMING_ZERO,
3457 		.block_erasers	=
3458 		{
3459 			{
3460 				.eraseblocks = { {64 * 1024, 8} },
3461 				.block_erase = erase_sector_jedec,
3462 			}, {
3463 				.eraseblocks = { {512 * 1024, 1} },
3464 				.block_erase = erase_chip_block_jedec,
3465 			},
3466 		},
3467 		.write		= write_jedec_1,
3468 		.read		= read_memmapped,
3469 		.voltage	= {4500, 5500},
3470 	},
3471 
3472 	{
3473 		.vendor		= "Catalyst",
3474 		.name		= "CAT28F512",
3475 		.bustype	= BUS_PARALLEL,
3476 		.manufacture_id	= CATALYST_ID,
3477 		.model_id	= CATALYST_CAT28F512,
3478 		.total_size	= 64,
3479 		.page_size	= 0, /* unused */
3480 		.feature_bits	= 0,
3481 		.tested		= {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
3482 		.probe		= probe_jedec, /* FIXME! */
3483 		.probe_timing	= TIMING_ZERO,
3484 		.block_erasers	=
3485 		{
3486 			{
3487 				.eraseblocks = { {64 * 1024, 1} },
3488 				.block_erase = NULL, /* TODO */
3489 			},
3490 		},
3491 		.write		= NULL, /* TODO */
3492 		.read		= read_memmapped,
3493 		.voltage	= {4500, 5500},
3494 	},
3495 
3496 	{
3497 		.vendor		= "ENE",
3498 		.name		= "KB9012 (EDI)",
3499 		.bustype	= BUS_SPI,
3500 		.total_size	= 128,
3501 		.page_size	= 128,
3502 		.feature_bits	= FEATURE_ERASED_ZERO,
3503 		.tested		= TEST_OK_PREW,
3504 		.spi_cmd_set	= SPI_EDI,
3505 		.probe		= edi_probe_kb9012,
3506 		.probe_timing	= TIMING_ZERO,
3507 		.block_erasers	=
3508 		{
3509 			{
3510 				.eraseblocks = { {128, 1024} },
3511 				.block_erase = edi_chip_block_erase,
3512 			},
3513 		},
3514 		.write		= edi_chip_write,
3515 		.read		= edi_chip_read,
3516 		.voltage	= {2700, 3600},
3517 		.gran		= write_gran_128bytes,
3518 	},
3519 
3520 	{
3521 		.vendor		= "ESI",
3522 		.name		= "ES25P16",
3523 		.bustype	= BUS_SPI,
3524 		.manufacture_id	= EXCEL_ID_NOPREFIX,
3525 		.model_id	= EXCEL_ES25P16,
3526 		.total_size	= 2 * 1024,
3527 		.page_size	= 256,
3528 		/* 256-byte parameter page separate from memory array:
3529 		 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3530 		.feature_bits	= FEATURE_WRSR_WREN,
3531 		.tested		= TEST_UNTESTED,
3532 		.probe		= probe_spi_rdid,
3533 		.probe_timing	= TIMING_ZERO,
3534 		.block_erasers	=
3535 		{
3536 			{
3537 				.eraseblocks = { {64 * 1024, 32} },
3538 				.block_erase = spi_block_erase_d8,
3539 			}, {
3540 				.eraseblocks = { {2 * 1024 * 1024, 1} },
3541 				.block_erase = spi_block_erase_c7,
3542 			}
3543 		},
3544 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
3545 		.unlock		= spi_disable_blockprotect_bp2_srwd,
3546 		.write		= spi_chip_write_256,
3547 		.read		= spi_chip_read, /* Fast Read (0x0B) supported */
3548 		.voltage	= {2700, 3600},
3549 	},
3550 
3551 	{
3552 		.vendor		= "ESI",
3553 		.name		= "ES25P40",
3554 		.bustype	= BUS_SPI,
3555 		.manufacture_id	= EXCEL_ID_NOPREFIX,
3556 		.model_id	= EXCEL_ES25P40,
3557 		.total_size	= 512,
3558 		.page_size	= 256,
3559 		/* 256-byte parameter page separate from memory array:
3560 		 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3561 		.feature_bits	= FEATURE_WRSR_WREN,
3562 		.tested		= TEST_UNTESTED,
3563 		.probe		= probe_spi_rdid,
3564 		.probe_timing	= TIMING_ZERO,
3565 		.block_erasers	=
3566 		{
3567 			{
3568 				.eraseblocks = { {64 * 1024, 8} },
3569 				.block_erase = spi_block_erase_d8,
3570 			}, {
3571 				.eraseblocks = { {512 * 1024, 1} },
3572 				.block_erase = spi_block_erase_c7,
3573 			}
3574 		},
3575 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
3576 		.unlock		= spi_disable_blockprotect_bp2_srwd,
3577 		.write		= spi_chip_write_256,
3578 		.read		= spi_chip_read, /* Fast Read (0x0B) supported */
3579 		.voltage	= {2700, 3600},
3580 	},
3581 
3582 	{
3583 		.vendor		= "ESI",
3584 		.name		= "ES25P80",
3585 		.bustype	= BUS_SPI,
3586 		.manufacture_id	= EXCEL_ID_NOPREFIX,
3587 		.model_id	= EXCEL_ES25P80,
3588 		.total_size	= 1024,
3589 		.page_size	= 256,
3590 		/* 256-byte parameter page separate from memory array:
3591 		 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3592 		.feature_bits	= FEATURE_WRSR_WREN,
3593 		.tested		= TEST_UNTESTED,
3594 		.probe		= probe_spi_rdid,
3595 		.probe_timing	= TIMING_ZERO,
3596 		.block_erasers	=
3597 		{
3598 			{
3599 				.eraseblocks = { {64 * 1024, 16} },
3600 				.block_erase = spi_block_erase_d8,
3601 			}, {
3602 				.eraseblocks = { {1024 * 1024, 1} },
3603 				.block_erase = spi_block_erase_c7,
3604 			}
3605 		},
3606 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
3607 		.unlock		= spi_disable_blockprotect_bp2_srwd,
3608 		.write		= spi_chip_write_256,
3609 		.read		= spi_chip_read, /* Fast Read (0x0B) supported */
3610 		.voltage	= {2700, 3600},
3611 	},
3612 
3613 	{
3614 		.vendor		= "ESMT",
3615 		.name		= "F25L008A",
3616 		.bustype	= BUS_SPI,
3617 		.manufacture_id	= ESMT_ID,
3618 		.model_id	= ESMT_F25L008A,
3619 		.total_size	= 1024,
3620 		.page_size	= 256,
3621 		.feature_bits	= FEATURE_WRSR_EITHER,
3622 		.tested		= TEST_OK_PREW,
3623 		.probe		= probe_spi_rdid,
3624 		.probe_timing	= TIMING_ZERO,
3625 		.block_erasers	=
3626 		{
3627 			{
3628 				.eraseblocks = { {4 * 1024, 256} },
3629 				.block_erase = spi_block_erase_20,
3630 			}, {
3631 				.eraseblocks = { {64 * 1024, 16} },
3632 				.block_erase = spi_block_erase_d8,
3633 			}, {
3634 				.eraseblocks = { {1024 * 1024, 1} },
3635 				.block_erase = spi_block_erase_60,
3636 			}, {
3637 				.eraseblocks = { {1024 * 1024, 1} },
3638 				.block_erase = spi_block_erase_c7,
3639 			}
3640 		},
3641 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3642 		.unlock		= spi_disable_blockprotect,
3643 		.write		= spi_chip_write_1,
3644 		.read		= spi_chip_read,
3645 		.voltage	= {2700, 3600},
3646 	},
3647 
3648 	{
3649 		.vendor		= "ESMT",
3650 		.name		= "F25L32PA",
3651 		.bustype	= BUS_SPI,
3652 		.manufacture_id	= ESMT_ID,
3653 		.model_id	= ESMT_F25L32PA,
3654 		.total_size	= 4096,
3655 		.page_size	= 256,
3656 		.feature_bits	= FEATURE_WRSR_EITHER | FEATURE_OTP,
3657 		.tested		= TEST_UNTESTED,
3658 		.probe		= probe_spi_rdid,
3659 		.probe_timing	= TIMING_ZERO,
3660 		.block_erasers	=
3661 		{
3662 			{
3663 				.eraseblocks = { {4 * 1024, 1024} },
3664 				.block_erase = spi_block_erase_20,
3665 			}, {
3666 				.eraseblocks = { {64 * 1024, 64} },
3667 				.block_erase = spi_block_erase_d8,
3668 			}, {
3669 				.eraseblocks = { {4 * 1024 * 1024, 1} },
3670 				.block_erase = spi_block_erase_60,
3671 			}, {
3672 				.eraseblocks = { {4 * 1024 * 1024, 1} },
3673 				.block_erase = spi_block_erase_c7,
3674 			}
3675 		},
3676 		.printlock	= spi_prettyprint_status_register_bp2_bpl,
3677 		.unlock		= spi_disable_blockprotect,
3678 		.write		= spi_chip_write_256,
3679 		.read		= spi_chip_read,
3680 		.voltage	= {2700, 3600},
3681 	},
3682 
3683 	{
3684 		.vendor		= "ESMT",
3685 		.name		= "F49B002UA",
3686 		.bustype	= BUS_PARALLEL,
3687 		.manufacture_id	= ESMT_ID,
3688 		.model_id	= ESMT_F49B002UA,
3689 		.total_size	= 256,
3690 		.page_size	= 4096,
3691 		.feature_bits	= FEATURE_EITHER_RESET,
3692 		.tested		= TEST_UNTESTED,
3693 		.probe		= probe_jedec,
3694 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
3695 		.block_erasers	=
3696 		{
3697 			{
3698 				.eraseblocks = {
3699 					{128 * 1024, 1},
3700 					{96 * 1024, 1},
3701 					{8 * 1024, 2},
3702 					{16 * 1024, 1},
3703 				},
3704 				.block_erase = erase_sector_jedec,
3705 			}, {
3706 				.eraseblocks = { {256 * 1024, 1} },
3707 				.block_erase = erase_chip_block_jedec,
3708 			}
3709 		},
3710 		.write		= write_jedec_1,
3711 		.read		= read_memmapped,
3712 		.voltage	= {4500, 5500},
3713 	},
3714 
3715 	{
3716 		.vendor		= "Eon",
3717 		.name		= "EN25B05",
3718 		.bustype	= BUS_SPI,
3719 		.manufacture_id	= EON_ID_NOPREFIX,
3720 		.model_id	= EON_EN25B05,
3721 		.total_size	= 64,
3722 		.page_size	= 256,
3723 		.feature_bits	= FEATURE_WRSR_WREN,
3724 		.tested		= TEST_UNTESTED,
3725 		.probe		= probe_spi_rdid,
3726 		.probe_timing	= TIMING_ZERO,
3727 		.block_erasers	=
3728 		{
3729 			{
3730 				.eraseblocks = {
3731 					{4 * 1024, 2},
3732 					{8 * 1024, 1},
3733 					{16 * 1024, 1},
3734 					{32 * 1024, 1},
3735 				},
3736 				.block_erase = spi_block_erase_d8,
3737 			}, {
3738 				.eraseblocks = { {64 * 1024, 1} },
3739 				.block_erase = spi_block_erase_c7,
3740 			}
3741 		},
3742 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3743 		.unlock		= spi_disable_blockprotect,
3744 		.write		= spi_chip_write_256,
3745 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3746 		.voltage	= {2700, 3600},
3747 	},
3748 
3749 	{
3750 		.vendor		= "Eon",
3751 		.name		= "EN25B05T",
3752 		.bustype	= BUS_SPI,
3753 		.manufacture_id	= EON_ID_NOPREFIX,
3754 		.model_id	= EON_EN25B05,
3755 		.total_size	= 64,
3756 		.page_size	= 256,
3757 		.feature_bits	= FEATURE_WRSR_WREN,
3758 		.tested		= TEST_UNTESTED,
3759 		.probe		= probe_spi_rdid,
3760 		.probe_timing	= TIMING_ZERO,
3761 		.block_erasers	=
3762 		{
3763 			{
3764 				.eraseblocks = {
3765 					{32 * 1024, 1},
3766 					{16 * 1024, 1},
3767 					{8 * 1024, 1},
3768 					{4 * 1024, 2},
3769 				},
3770 				.block_erase = spi_block_erase_d8,
3771 			}, {
3772 				.eraseblocks = { {64 * 1024, 1} },
3773 				.block_erase = spi_block_erase_c7,
3774 			}
3775 		},
3776 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3777 		.unlock		= spi_disable_blockprotect,
3778 		.write		= spi_chip_write_256,
3779 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3780 		.voltage	= {2700, 3600},
3781 	},
3782 
3783 	{
3784 		.vendor		= "Eon",
3785 		.name		= "EN25B10",
3786 		.bustype	= BUS_SPI,
3787 		.manufacture_id	= EON_ID_NOPREFIX,
3788 		.model_id	= EON_EN25B10,
3789 		.total_size	= 128,
3790 		.page_size	= 256,
3791 		.feature_bits	= FEATURE_WRSR_WREN,
3792 		.tested		= TEST_UNTESTED,
3793 		.probe		= probe_spi_rdid,
3794 		.probe_timing	= TIMING_ZERO,
3795 		.block_erasers	=
3796 		{
3797 			{
3798 				.eraseblocks = {
3799 					{4 * 1024, 2},
3800 					{8 * 1024, 1},
3801 					{16 * 1024, 1},
3802 					{32 * 1024, 3},
3803 				},
3804 				.block_erase = spi_block_erase_d8,
3805 			}, {
3806 				.eraseblocks = { {128 * 1024, 1} },
3807 				.block_erase = spi_block_erase_c7,
3808 			}
3809 		},
3810 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3811 		.unlock		= spi_disable_blockprotect,
3812 		.write		= spi_chip_write_256,
3813 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3814 		.voltage	= {2700, 3600},
3815 	},
3816 
3817 	{
3818 		.vendor		= "Eon",
3819 		.name		= "EN25B10T",
3820 		.bustype	= BUS_SPI,
3821 		.manufacture_id	= EON_ID_NOPREFIX,
3822 		.model_id	= EON_EN25B10,
3823 		.total_size	= 128,
3824 		.page_size	= 256,
3825 		.feature_bits	= FEATURE_WRSR_WREN,
3826 		.tested		= TEST_OK_PREW,
3827 		.probe		= probe_spi_rdid,
3828 		.probe_timing	= TIMING_ZERO,
3829 		.block_erasers	=
3830 		{
3831 			{
3832 				.eraseblocks = {
3833 					{32 * 1024, 3},
3834 					{16 * 1024, 1},
3835 					{8 * 1024, 1},
3836 					{4 * 1024, 2},
3837 				},
3838 				.block_erase = spi_block_erase_d8,
3839 			}, {
3840 				.eraseblocks = { {128 * 1024, 1} },
3841 				.block_erase = spi_block_erase_c7,
3842 			}
3843 		},
3844 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3845 		.unlock		= spi_disable_blockprotect,
3846 		.write		= spi_chip_write_256,
3847 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3848 		.voltage	= {2700, 3600},
3849 	},
3850 
3851 	{
3852 		.vendor		= "Eon",
3853 		.name		= "EN25B16",
3854 		.bustype	= BUS_SPI,
3855 		.manufacture_id	= EON_ID_NOPREFIX,
3856 		.model_id	= EON_EN25B16,
3857 		.total_size	= 2048,
3858 		.page_size	= 256,
3859 		.feature_bits	= FEATURE_WRSR_WREN,
3860 		.tested		= TEST_UNTESTED,
3861 		.probe		= probe_spi_rdid,
3862 		.probe_timing	= TIMING_ZERO,
3863 		.block_erasers	=
3864 		{
3865 			{
3866 				.eraseblocks = {
3867 					{4 * 1024, 2},
3868 					{8 * 1024, 1},
3869 					{16 * 1024, 1},
3870 					{32 * 1024, 1},
3871 					{64 * 1024, 31},
3872 				},
3873 				.block_erase = spi_block_erase_d8,
3874 			}, {
3875 				.eraseblocks = { {2 * 1024 * 1024, 1} },
3876 				.block_erase = spi_block_erase_c7,
3877 			}
3878 		},
3879 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3880 		.unlock		= spi_disable_blockprotect,
3881 		.write		= spi_chip_write_256,
3882 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3883 		.voltage	= {2700, 3600},
3884 	},
3885 
3886 	{
3887 		.vendor		= "Eon",
3888 		.name		= "EN25B16T",
3889 		.bustype	= BUS_SPI,
3890 		.manufacture_id	= EON_ID_NOPREFIX,
3891 		.model_id	= EON_EN25B16,
3892 		.total_size	= 2048,
3893 		.page_size	= 256,
3894 		.feature_bits	= FEATURE_WRSR_WREN,
3895 		.tested		= TEST_UNTESTED,
3896 		.probe		= probe_spi_rdid,
3897 		.probe_timing	= TIMING_ZERO,
3898 		.block_erasers	=
3899 		{
3900 			{
3901 				.eraseblocks = {
3902 					{64 * 1024, 31},
3903 					{32 * 1024, 1},
3904 					{16 * 1024, 1},
3905 					{8 * 1024, 1},
3906 					{4 * 1024, 2},
3907 				},
3908 				.block_erase = spi_block_erase_d8,
3909 			}, {
3910 				.eraseblocks = { {2 * 1024 * 1024, 1} },
3911 				.block_erase = spi_block_erase_c7,
3912 			}
3913 		},
3914 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3915 		.unlock		= spi_disable_blockprotect,
3916 		.write		= spi_chip_write_256,
3917 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3918 		.voltage	= {2700, 3600},
3919 	},
3920 
3921 	{
3922 		.vendor		= "Eon",
3923 		.name		= "EN25B20",
3924 		.bustype	= BUS_SPI,
3925 		.manufacture_id	= EON_ID_NOPREFIX,
3926 		.model_id	= EON_EN25B20,
3927 		.total_size	= 256,
3928 		.page_size	= 256,
3929 		.feature_bits	= FEATURE_WRSR_WREN,
3930 		.tested		= TEST_UNTESTED,
3931 		.probe		= probe_spi_rdid,
3932 		.probe_timing	= TIMING_ZERO,
3933 		.block_erasers	=
3934 		{
3935 			{
3936 				.eraseblocks = {
3937 					{4 * 1024, 2},
3938 					{8 * 1024, 1},
3939 					{16 * 1024, 1},
3940 					{32 * 1024, 1},
3941 					{64 * 1024, 3}
3942 				},
3943 				.block_erase = spi_block_erase_d8,
3944 			}, {
3945 				.eraseblocks = { {256 * 1024, 1} },
3946 				.block_erase = spi_block_erase_c7,
3947 			}
3948 		},
3949 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3950 		.unlock		= spi_disable_blockprotect,
3951 		.write		= spi_chip_write_256,
3952 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3953 		.voltage	= {2700, 3600},
3954 	},
3955 
3956 	{
3957 		.vendor		= "Eon",
3958 		.name		= "EN25B20T",
3959 		.bustype	= BUS_SPI,
3960 		.manufacture_id	= EON_ID_NOPREFIX,
3961 		.model_id	= EON_EN25B20,
3962 		.total_size	= 256,
3963 		.page_size	= 256,
3964 		.feature_bits	= FEATURE_WRSR_WREN,
3965 		.tested		= TEST_UNTESTED,
3966 		.probe		= probe_spi_rdid,
3967 		.probe_timing	= TIMING_ZERO,
3968 		.block_erasers	=
3969 		{
3970 			{
3971 				.eraseblocks = {
3972 					{64 * 1024, 3},
3973 					{32 * 1024, 1},
3974 					{16 * 1024, 1},
3975 					{8 * 1024, 1},
3976 					{4 * 1024, 2},
3977 				},
3978 				.block_erase = spi_block_erase_d8,
3979 			}, {
3980 				.eraseblocks = { {256 * 1024, 1} },
3981 				.block_erase = spi_block_erase_c7,
3982 			}
3983 		},
3984 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
3985 		.unlock		= spi_disable_blockprotect,
3986 		.write		= spi_chip_write_256,
3987 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
3988 		.voltage	= {2700, 3600},
3989 	},
3990 
3991 	{
3992 		.vendor		= "Eon",
3993 		.name		= "EN25B32",
3994 		.bustype	= BUS_SPI,
3995 		.manufacture_id	= EON_ID_NOPREFIX,
3996 		.model_id	= EON_EN25B32,
3997 		.total_size	= 4096,
3998 		.page_size	= 256,
3999 		/* OTP: 512B total; enter 0x3A */
4000 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4001 		.tested		= TEST_UNTESTED,
4002 		.probe		= probe_spi_rdid,
4003 		.probe_timing	= TIMING_ZERO,
4004 		.block_erasers	=
4005 		{
4006 			{
4007 				.eraseblocks = {
4008 					{4 * 1024, 2},
4009 					{8 * 1024, 1},
4010 					{16 * 1024, 1},
4011 					{32 * 1024, 1},
4012 					{64 * 1024, 63},
4013 				},
4014 				.block_erase = spi_block_erase_d8,
4015 			}, {
4016 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4017 				.block_erase = spi_block_erase_c7,
4018 			}
4019 		},
4020 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4021 		.unlock		= spi_disable_blockprotect,
4022 		.write		= spi_chip_write_256,
4023 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4024 		.voltage	= {2700, 3600},
4025 	},
4026 
4027 	{
4028 		.vendor		= "Eon",
4029 		.name		= "EN25B32T",
4030 		.bustype	= BUS_SPI,
4031 		.manufacture_id	= EON_ID_NOPREFIX,
4032 		.model_id	= EON_EN25B32,
4033 		.total_size	= 4096,
4034 		.page_size	= 256,
4035 		/* OTP: 512B total; enter 0x3A */
4036 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4037 		.tested		= TEST_UNTESTED,
4038 		.probe		= probe_spi_rdid,
4039 		.probe_timing	= TIMING_ZERO,
4040 		.block_erasers	=
4041 		{
4042 			{
4043 				.eraseblocks = {
4044 					{64 * 1024, 63},
4045 					{32 * 1024, 1},
4046 					{16 * 1024, 1},
4047 					{8 * 1024, 1},
4048 					{4 * 1024, 2},
4049 				},
4050 				.block_erase = spi_block_erase_d8,
4051 			}, {
4052 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4053 				.block_erase = spi_block_erase_c7,
4054 			}
4055 		},
4056 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4057 		.unlock		= spi_disable_blockprotect,
4058 		.write		= spi_chip_write_256,
4059 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4060 		.voltage	= {2700, 3600},
4061 	},
4062 
4063 	{
4064 		.vendor		= "Eon",
4065 		.name		= "EN25B40",
4066 		.bustype	= BUS_SPI,
4067 		.manufacture_id	= EON_ID_NOPREFIX,
4068 		.model_id	= EON_EN25B40,
4069 		.total_size	= 512,
4070 		.page_size	= 256,
4071 		.feature_bits	= FEATURE_WRSR_WREN,
4072 		.tested		= TEST_UNTESTED,
4073 		.probe		= probe_spi_rdid,
4074 		.probe_timing	= TIMING_ZERO,
4075 		.block_erasers	=
4076 		{
4077 			{
4078 				.eraseblocks = {
4079 					{4 * 1024, 2},
4080 					{8 * 1024, 1},
4081 					{16 * 1024, 1},
4082 					{32 * 1024, 1},
4083 					{64 * 1024, 7}
4084 				},
4085 				.block_erase = spi_block_erase_d8,
4086 			}, {
4087 				.eraseblocks = { {512 * 1024, 1} },
4088 				.block_erase = spi_block_erase_c7,
4089 			}
4090 		},
4091 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4092 		.unlock		= spi_disable_blockprotect,
4093 		.write		= spi_chip_write_256,
4094 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4095 		.voltage	= {2700, 3600},
4096 	},
4097 
4098 	{
4099 		.vendor		= "Eon",
4100 		.name		= "EN25B40T",
4101 		.bustype	= BUS_SPI,
4102 		.manufacture_id	= EON_ID_NOPREFIX,
4103 		.model_id	= EON_EN25B40,
4104 		.total_size	= 512,
4105 		.page_size	= 256,
4106 		.feature_bits	= FEATURE_WRSR_WREN,
4107 		.tested		= TEST_UNTESTED,
4108 		.probe		= probe_spi_rdid,
4109 		.probe_timing	= TIMING_ZERO,
4110 		.block_erasers	=
4111 		{
4112 			{
4113 				.eraseblocks = {
4114 					{64 * 1024, 7},
4115 					{32 * 1024, 1},
4116 					{16 * 1024, 1},
4117 					{8 * 1024, 1},
4118 					{4 * 1024, 2},
4119 				},
4120 				.block_erase = spi_block_erase_d8,
4121 			}, {
4122 				.eraseblocks = { {512 * 1024, 1} },
4123 				.block_erase = spi_block_erase_c7,
4124 			}
4125 		},
4126 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4127 		.unlock		= spi_disable_blockprotect,
4128 		.write		= spi_chip_write_256,
4129 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4130 		.voltage	= {2700, 3600},
4131 	},
4132 
4133 	{
4134 		.vendor		= "Eon",
4135 		.name		= "EN25B64",
4136 		.bustype	= BUS_SPI,
4137 		.manufacture_id	= EON_ID_NOPREFIX,
4138 		.model_id	= EON_EN25B64,
4139 		.total_size	= 8192,
4140 		.page_size	= 256,
4141 		/* OTP: 512B total; enter 0x3A */
4142 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4143 		.tested		= TEST_UNTESTED,
4144 		.probe		= probe_spi_rdid,
4145 		.probe_timing	= TIMING_ZERO,
4146 		.block_erasers	=
4147 		{
4148 			{
4149 				.eraseblocks = {
4150 					{4 * 1024, 2},
4151 					{8 * 1024, 1},
4152 					{16 * 1024, 1},
4153 					{32 * 1024, 1},
4154 					{64 * 1024, 127},
4155 				},
4156 				.block_erase = spi_block_erase_d8,
4157 			}, {
4158 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4159 				.block_erase = spi_block_erase_c7,
4160 			}
4161 		},
4162 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4163 		.unlock		= spi_disable_blockprotect,
4164 		.write		= spi_chip_write_256,
4165 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4166 		.voltage	= {2700, 3600},
4167 	},
4168 
4169 	{
4170 		.vendor		= "Eon",
4171 		.name		= "EN25B64T",
4172 		.bustype	= BUS_SPI,
4173 		.manufacture_id	= EON_ID_NOPREFIX,
4174 		.model_id	= EON_EN25B64,
4175 		.total_size	= 8192,
4176 		.page_size	= 256,
4177 		/* OTP: 512B total; enter 0x3A */
4178 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4179 		.tested		= TEST_UNTESTED,
4180 		.probe		= probe_spi_rdid,
4181 		.probe_timing	= TIMING_ZERO,
4182 		.block_erasers	=
4183 		{
4184 			{
4185 				.eraseblocks = {
4186 					{64 * 1024, 127},
4187 					{32 * 1024, 1},
4188 					{16 * 1024, 1},
4189 					{8 * 1024, 1},
4190 					{4 * 1024, 2},
4191 				},
4192 				.block_erase = spi_block_erase_d8,
4193 			}, {
4194 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4195 				.block_erase = spi_block_erase_c7,
4196 			}
4197 		},
4198 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4199 		.unlock		= spi_disable_blockprotect,
4200 		.write		= spi_chip_write_256,
4201 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4202 		.voltage	= {2700, 3600},
4203 	},
4204 
4205 	{
4206 		.vendor		= "Eon",
4207 		.name		= "EN25B80",
4208 		.bustype	= BUS_SPI,
4209 		.manufacture_id	= EON_ID_NOPREFIX,
4210 		.model_id	= EON_EN25B80,
4211 		.total_size	= 1024,
4212 		.page_size	= 256,
4213 		.feature_bits	= FEATURE_WRSR_WREN,
4214 		.tested		= TEST_UNTESTED,
4215 		.probe		= probe_spi_rdid,
4216 		.probe_timing	= TIMING_ZERO,
4217 		.block_erasers	=
4218 		{
4219 			{
4220 				.eraseblocks = {
4221 					{4 * 1024, 2},
4222 					{8 * 1024, 1},
4223 					{16 * 1024, 1},
4224 					{32 * 1024, 1},
4225 					{64 * 1024, 15}
4226 				},
4227 				.block_erase = spi_block_erase_d8,
4228 			}, {
4229 				.eraseblocks = { {1024 * 1024, 1} },
4230 				.block_erase = spi_block_erase_c7,
4231 			}
4232 		},
4233 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4234 		.unlock		= spi_disable_blockprotect,
4235 		.write		= spi_chip_write_256,
4236 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4237 		.voltage	= {2700, 3600},
4238 	},
4239 
4240 	{
4241 		.vendor		= "Eon",
4242 		.name		= "EN25B80T",
4243 		.bustype	= BUS_SPI,
4244 		.manufacture_id	= EON_ID_NOPREFIX,
4245 		.model_id	= EON_EN25B80,
4246 		.total_size	= 1024,
4247 		.page_size	= 256,
4248 		.feature_bits	= FEATURE_WRSR_WREN,
4249 		.tested		= TEST_UNTESTED,
4250 		.probe		= probe_spi_rdid,
4251 		.probe_timing	= TIMING_ZERO,
4252 		.block_erasers	=
4253 		{
4254 			{
4255 				.eraseblocks = {
4256 					{64 * 1024, 15},
4257 					{32 * 1024, 1},
4258 					{16 * 1024, 1},
4259 					{8 * 1024, 1},
4260 					{4 * 1024, 2},
4261 				},
4262 				.block_erase = spi_block_erase_d8,
4263 			}, {
4264 				.eraseblocks = { {1024 * 1024, 1} },
4265 				.block_erase = spi_block_erase_c7,
4266 			}
4267 		},
4268 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4269 		.unlock		= spi_disable_blockprotect,
4270 		.write		= spi_chip_write_256,
4271 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4272 		.voltage	= {2700, 3600},
4273 	},
4274 
4275 	{
4276 		.vendor		= "Eon",
4277 		.name		= "EN25F05",
4278 		.bustype	= BUS_SPI,
4279 		.manufacture_id	= EON_ID_NOPREFIX,
4280 		.model_id	= EON_EN25F05,
4281 		.total_size	= 64,
4282 		.page_size	= 256,
4283 		.feature_bits	= FEATURE_WRSR_WREN,
4284 		.tested		= TEST_OK_PREW,
4285 		.probe		= probe_spi_rdid,
4286 		.probe_timing	= TIMING_ZERO,
4287 		.block_erasers	=
4288 		{
4289 			{
4290 				.eraseblocks = { {4 * 1024, 16} },
4291 				.block_erase = spi_block_erase_20,
4292 			}, {
4293 				.eraseblocks = { {32 * 1024, 2} },
4294 				.block_erase = spi_block_erase_d8,
4295 			}, {
4296 				.eraseblocks = { {32 * 1024, 2} },
4297 				.block_erase = spi_block_erase_52,
4298 			}, {
4299 				.eraseblocks = { {64 * 1024, 1} },
4300 				.block_erase = spi_block_erase_60,
4301 			}, {
4302 				.eraseblocks = { {64 * 1024, 1} },
4303 				.block_erase = spi_block_erase_c7,
4304 			}
4305 		},
4306 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4307 		.unlock		= spi_disable_blockprotect,
4308 		.write		= spi_chip_write_256,
4309 		.read		= spi_chip_read,
4310 		.voltage	= {2700, 3600},
4311 	},
4312 
4313 	{
4314 		.vendor		= "Eon",
4315 		.name		= "EN25F10",
4316 		.bustype	= BUS_SPI,
4317 		.manufacture_id	= EON_ID_NOPREFIX,
4318 		.model_id	= EON_EN25F10,
4319 		.total_size	= 128,
4320 		.page_size	= 256,
4321 		.feature_bits	= FEATURE_WRSR_WREN,
4322 		.tested		= TEST_UNTESTED,
4323 		.probe		= probe_spi_rdid,
4324 		.probe_timing	= TIMING_ZERO,
4325 		.block_erasers	=
4326 		{
4327 			{
4328 				.eraseblocks = { {4 * 1024, 32} },
4329 				.block_erase = spi_block_erase_20,
4330 			}, {
4331 				.eraseblocks = { {32 * 1024, 4} },
4332 				.block_erase = spi_block_erase_d8,
4333 			}, {
4334 				.eraseblocks = { {32 * 1024, 4} },
4335 				.block_erase = spi_block_erase_52,
4336 			}, {
4337 				.eraseblocks = { {128 * 1024, 1} },
4338 				.block_erase = spi_block_erase_60,
4339 			}, {
4340 				.eraseblocks = { {128 * 1024, 1} },
4341 				.block_erase = spi_block_erase_c7,
4342 			}
4343 		},
4344 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4345 		.unlock		= spi_disable_blockprotect,
4346 		.write		= spi_chip_write_256,
4347 		.read		= spi_chip_read,
4348 		.voltage	= {2700, 3600},
4349 	},
4350 
4351 	{
4352 		.vendor		= "Eon",
4353 		.name		= "EN25F16",
4354 		.bustype	= BUS_SPI,
4355 		.manufacture_id	= EON_ID_NOPREFIX,
4356 		.model_id	= EON_EN25F16,
4357 		.total_size	= 2048,
4358 		.page_size	= 256,
4359 		.feature_bits	= FEATURE_WRSR_WREN,
4360 		.tested		= TEST_OK_PREW,
4361 		.probe		= probe_spi_rdid,
4362 		.probe_timing	= TIMING_ZERO,
4363 		.block_erasers	=
4364 		{
4365 			{
4366 				.eraseblocks = { {4 * 1024, 512} },
4367 				.block_erase = spi_block_erase_20,
4368 			}, {
4369 				.eraseblocks = { {64 * 1024, 32} },
4370 				.block_erase = spi_block_erase_d8,
4371 			}, {
4372 				.eraseblocks = { {2 * 1024 * 1024, 1} },
4373 				.block_erase = spi_block_erase_60,
4374 			}, {
4375 				.eraseblocks = { {2 * 1024 * 1024, 1} },
4376 				.block_erase = spi_block_erase_c7,
4377 			}
4378 		},
4379 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4380 		.unlock		= spi_disable_blockprotect,
4381 		.write		= spi_chip_write_256,
4382 		.read		= spi_chip_read,
4383 		.voltage	= {2700, 3600},
4384 	},
4385 
4386 	{
4387 		.vendor		= "Eon",
4388 		.name		= "EN25F20",
4389 		.bustype	= BUS_SPI,
4390 		.manufacture_id	= EON_ID_NOPREFIX,
4391 		.model_id	= EON_EN25F20,
4392 		.total_size	= 256,
4393 		.page_size	= 256,
4394 		.feature_bits	= FEATURE_WRSR_WREN,
4395 		.tested		= TEST_UNTESTED,
4396 		.probe		= probe_spi_rdid,
4397 		.probe_timing	= TIMING_ZERO,
4398 		.block_erasers	=
4399 		{
4400 			{
4401 				.eraseblocks = { {4 * 1024, 64} },
4402 				.block_erase = spi_block_erase_20,
4403 			}, {
4404 				.eraseblocks = { {64 * 1024, 4} },
4405 				.block_erase = spi_block_erase_d8,
4406 			}, {
4407 				.eraseblocks = { {64 * 1024, 4} },
4408 				.block_erase = spi_block_erase_52,
4409 			}, {
4410 				.eraseblocks = { {256 * 1024, 1} },
4411 				.block_erase = spi_block_erase_60,
4412 			}, {
4413 				.eraseblocks = { {256 * 1024, 1} },
4414 				.block_erase = spi_block_erase_c7,
4415 			}
4416 		},
4417 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4418 		.unlock		= spi_disable_blockprotect,
4419 		.write		= spi_chip_write_256,
4420 		.read		= spi_chip_read,
4421 		.voltage	= {2700, 3600},
4422 	},
4423 
4424 	{
4425 		.vendor		= "Eon",
4426 		.name		= "EN25F32",
4427 		.bustype	= BUS_SPI,
4428 		.manufacture_id	= EON_ID_NOPREFIX,
4429 		.model_id	= EON_EN25F32,
4430 		.total_size	= 4096,
4431 		.page_size	= 256,
4432 		.feature_bits	= FEATURE_WRSR_WREN,
4433 		.tested		= TEST_OK_PREW,
4434 		.probe		= probe_spi_rdid,
4435 		.probe_timing	= TIMING_ZERO,
4436 		.block_erasers	=
4437 		{
4438 			{
4439 				.eraseblocks = { {4 * 1024, 1024} },
4440 				.block_erase = spi_block_erase_20,
4441 			}, {
4442 				.eraseblocks = { {64 * 1024, 64} },
4443 				.block_erase = spi_block_erase_d8,
4444 			}, {
4445 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4446 				.block_erase = spi_block_erase_60,
4447 			}, {
4448 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4449 				.block_erase = spi_block_erase_c7,
4450 			}
4451 		},
4452 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4453 		.unlock		= spi_disable_blockprotect,
4454 		.write		= spi_chip_write_256,
4455 		.read		= spi_chip_read,
4456 		.voltage	= {2700, 3600},
4457 	},
4458 
4459 	{
4460 		.vendor		= "Eon",
4461 		.name		= "EN25F40",
4462 		.bustype	= BUS_SPI,
4463 		.manufacture_id	= EON_ID_NOPREFIX,
4464 		.model_id	= EON_EN25F40,
4465 		.total_size	= 512,
4466 		.page_size	= 256,
4467 		.feature_bits	= FEATURE_WRSR_WREN,
4468 		.tested		= TEST_OK_PREW,
4469 		.probe		= probe_spi_rdid,
4470 		.probe_timing	= TIMING_ZERO,
4471 		.block_erasers	=
4472 		{
4473 			{
4474 				.eraseblocks = { {4 * 1024, 128} },
4475 				.block_erase = spi_block_erase_20,
4476 			}, {
4477 				.eraseblocks = { {64 * 1024, 8} },
4478 				.block_erase = spi_block_erase_d8,
4479 			}, {
4480 				.eraseblocks = { {512 * 1024, 1} },
4481 				.block_erase = spi_block_erase_60,
4482 			}, {
4483 				.eraseblocks = { {512 * 1024, 1} },
4484 				.block_erase = spi_block_erase_c7,
4485 			},
4486 		},
4487 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4488 		.unlock		= spi_disable_blockprotect,
4489 		.write		= spi_chip_write_256,
4490 		.read		= spi_chip_read,
4491 		.voltage	= {2700, 3600},
4492 	},
4493 
4494 	{
4495 		.vendor		= "Eon",
4496 		.name		= "EN25F64",
4497 		.bustype	= BUS_SPI,
4498 		.manufacture_id	= EON_ID_NOPREFIX,
4499 		.model_id	= EON_EN25F64,
4500 		.total_size	= 8192,
4501 		.page_size	= 256,
4502 		.feature_bits	= FEATURE_WRSR_WREN,
4503 		.tested		= TEST_OK_PREW,
4504 		.probe		= probe_spi_rdid,
4505 		.probe_timing	= TIMING_ZERO,
4506 		.block_erasers	=
4507 		{
4508 			{
4509 				.eraseblocks = { {4 * 1024, 2048} },
4510 				.block_erase = spi_block_erase_20,
4511 			}, {
4512 				.eraseblocks = { {64 * 1024, 128} },
4513 				.block_erase = spi_block_erase_d8,
4514 			}, {
4515 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4516 				.block_erase = spi_block_erase_60,
4517 			}, {
4518 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4519 				.block_erase = spi_block_erase_c7,
4520 			}
4521 		},
4522 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4523 		.unlock		= spi_disable_blockprotect,
4524 		.write		= spi_chip_write_256,
4525 		.read		= spi_chip_read,
4526 		.voltage	= {2700, 3600},
4527 	},
4528 
4529 	{
4530 		.vendor		= "Eon",
4531 		.name		= "EN25F80",
4532 		.bustype	= BUS_SPI,
4533 		.manufacture_id	= EON_ID_NOPREFIX,
4534 		.model_id	= EON_EN25F80,
4535 		.total_size	= 1024,
4536 		.page_size	= 256,
4537 		.feature_bits	= FEATURE_WRSR_WREN,
4538 		.tested		= TEST_OK_PREW,
4539 		.probe		= probe_spi_rdid,
4540 		.probe_timing	= TIMING_ZERO,
4541 		.block_erasers	=
4542 		{
4543 			{
4544 				.eraseblocks = { {4 * 1024, 256} },
4545 				.block_erase = spi_block_erase_20,
4546 			}, {
4547 				.eraseblocks = { {64 * 1024, 16} },
4548 				.block_erase = spi_block_erase_d8,
4549 			}, {
4550 				.eraseblocks = { {1024 * 1024, 1} },
4551 				.block_erase = spi_block_erase_60,
4552 			}, {
4553 				.eraseblocks = { {1024 * 1024, 1} },
4554 				.block_erase = spi_block_erase_c7,
4555 			}
4556 		},
4557 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4558 		.unlock		= spi_disable_blockprotect,
4559 		.write		= spi_chip_write_256,
4560 		.read		= spi_chip_read,
4561 		.voltage	= {2700, 3600},
4562 	},
4563 
4564 	{
4565 		.vendor		= "Eon",
4566 		.name		= "EN25P05",
4567 		.bustype	= BUS_SPI,
4568 		.manufacture_id	= EON_ID_NOPREFIX,
4569 		.model_id	= EON_EN25B05,
4570 		.total_size	= 64,
4571 		.page_size	= 256,
4572 		.feature_bits	= FEATURE_WRSR_WREN,
4573 		.tested		= TEST_UNTESTED,
4574 		.probe		= probe_spi_rdid,
4575 		.probe_timing	= TIMING_ZERO,
4576 		.block_erasers	=
4577 		{
4578 			{
4579 				.eraseblocks = {
4580 					{32 * 1024, 2} },
4581 				.block_erase = spi_block_erase_d8,
4582 			}, {
4583 				.eraseblocks = { {64 * 1024, 1} },
4584 				.block_erase = spi_block_erase_c7,
4585 			}
4586 		},
4587 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4588 		.unlock		= spi_disable_blockprotect,
4589 		.write		= spi_chip_write_256,
4590 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4591 		.voltage	= {2700, 3600},
4592 	},
4593 
4594 	{
4595 		.vendor		= "Eon",
4596 		.name		= "EN25P10",
4597 		.bustype	= BUS_SPI,
4598 		.manufacture_id	= EON_ID_NOPREFIX,
4599 		.model_id	= EON_EN25B10,
4600 		.total_size	= 128,
4601 		.page_size	= 256,
4602 		.feature_bits	= FEATURE_WRSR_WREN,
4603 		.tested		= TEST_UNTESTED,
4604 		.probe		= probe_spi_rdid,
4605 		.probe_timing	= TIMING_ZERO,
4606 		.block_erasers	=
4607 		{
4608 			{
4609 				.eraseblocks = { {32 * 1024, 4} },
4610 				.block_erase = spi_block_erase_d8,
4611 			}, {
4612 				.eraseblocks = { {128 * 1024, 1} },
4613 				.block_erase = spi_block_erase_c7,
4614 			}
4615 		},
4616 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4617 		.unlock		= spi_disable_blockprotect,
4618 		.write		= spi_chip_write_256,
4619 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4620 		.voltage	= {2700, 3600},
4621 	},
4622 
4623 	{
4624 		.vendor		= "Eon",
4625 		.name		= "EN25P16",
4626 		.bustype	= BUS_SPI,
4627 		.manufacture_id	= EON_ID_NOPREFIX,
4628 		.model_id	= EON_EN25B16,
4629 		.total_size	= 2048,
4630 		.page_size	= 256,
4631 		.feature_bits	= FEATURE_WRSR_WREN,
4632 		.tested		= TEST_UNTESTED,
4633 		.probe		= probe_spi_rdid,
4634 		.probe_timing	= TIMING_ZERO,
4635 		.block_erasers	=
4636 		{
4637 			{
4638 				.eraseblocks = { {64 * 1024, 32} },
4639 				.block_erase = spi_block_erase_d8,
4640 			}, {
4641 				.eraseblocks = { {2 * 1024 * 1024, 1} },
4642 				.block_erase = spi_block_erase_c7,
4643 			}
4644 		},
4645 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4646 		.unlock		= spi_disable_blockprotect,
4647 		.write		= spi_chip_write_256,
4648 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4649 		.voltage	= {2700, 3600},
4650 	},
4651 
4652 	{
4653 		.vendor		= "Eon",
4654 		.name		= "EN25P20",
4655 		.bustype	= BUS_SPI,
4656 		.manufacture_id	= EON_ID_NOPREFIX,
4657 		.model_id	= EON_EN25B20,
4658 		.total_size	= 256,
4659 		.page_size	= 256,
4660 		.feature_bits	= FEATURE_WRSR_WREN,
4661 		.tested		= TEST_UNTESTED,
4662 		.probe		= probe_spi_rdid,
4663 		.probe_timing	= TIMING_ZERO,
4664 		.block_erasers	=
4665 		{
4666 			{
4667 				.eraseblocks = { {64 * 1024, 4} },
4668 				.block_erase = spi_block_erase_d8,
4669 			}, {
4670 				.eraseblocks = { {256 * 1024, 1} },
4671 				.block_erase = spi_block_erase_c7,
4672 			}
4673 		},
4674 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4675 		.unlock		= spi_disable_blockprotect,
4676 		.write		= spi_chip_write_256,
4677 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4678 		.voltage	= {2700, 3600},
4679 	},
4680 
4681 	{
4682 		.vendor		= "Eon",
4683 		.name		= "EN25P32", /* Uniform version of EN25B32 */
4684 		.bustype	= BUS_SPI,
4685 		.manufacture_id	= EON_ID_NOPREFIX,
4686 		.model_id	= EON_EN25B32,
4687 		.total_size	= 4096,
4688 		.page_size	= 256,
4689 		/* OTP: 512B total; enter 0x3A */
4690 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4691 		.tested		= TEST_UNTESTED,
4692 		.probe		= probe_spi_rdid,
4693 		.probe_timing	= TIMING_ZERO,
4694 		.block_erasers	=
4695 		{
4696 			{
4697 				.eraseblocks = { {64 * 1024, 64} },
4698 				.block_erase = spi_block_erase_d8,
4699 			}, {
4700 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4701 				.block_erase = spi_block_erase_c7,
4702 			}
4703 		},
4704 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4705 		.unlock		= spi_disable_blockprotect,
4706 		.write		= spi_chip_write_256,
4707 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4708 		.voltage	= {2700, 3600},
4709 	},
4710 
4711 	{
4712 		.vendor		= "Eon",
4713 		.name		= "EN25P40",
4714 		.bustype	= BUS_SPI,
4715 		.manufacture_id	= EON_ID_NOPREFIX,
4716 		.model_id	= EON_EN25B40,
4717 		.total_size	= 512,
4718 		.page_size	= 256,
4719 		.feature_bits	= FEATURE_WRSR_WREN,
4720 		.tested		= TEST_UNTESTED,
4721 		.probe		= probe_spi_rdid,
4722 		.probe_timing	= TIMING_ZERO,
4723 		.block_erasers	=
4724 		{
4725 			{
4726 				.eraseblocks = { {64 * 1024, 8} },
4727 				.block_erase = spi_block_erase_d8,
4728 			}, {
4729 				.eraseblocks = { {512 * 1024, 1} },
4730 				.block_erase = spi_block_erase_c7,
4731 			}
4732 		},
4733 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4734 		.unlock		= spi_disable_blockprotect,
4735 		.write		= spi_chip_write_256,
4736 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4737 		.voltage	= {2700, 3600},
4738 	},
4739 
4740 	{
4741 		.vendor		= "Eon",
4742 		.name		= "EN25P64",
4743 		.bustype	= BUS_SPI,
4744 		.manufacture_id	= EON_ID_NOPREFIX,
4745 		.model_id	= EON_EN25B64,
4746 		.total_size	= 8192,
4747 		.page_size	= 256,
4748 		/* OTP: 512B total; enter 0x3A */
4749 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4750 		.tested		= TEST_UNTESTED,
4751 		.probe		= probe_spi_rdid,
4752 		.probe_timing	= TIMING_ZERO,
4753 		.block_erasers	=
4754 		{
4755 			{
4756 				.eraseblocks = { {64 * 1024, 128} },
4757 				.block_erase = spi_block_erase_d8,
4758 			}, {
4759 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4760 				.block_erase = spi_block_erase_c7,
4761 			}
4762 		},
4763 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4764 		.unlock		= spi_disable_blockprotect,
4765 		.write		= spi_chip_write_256,
4766 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4767 		.voltage	= {2700, 3600},
4768 	},
4769 
4770 	{
4771 		.vendor		= "Eon",
4772 		.name		= "EN25P80",
4773 		.bustype	= BUS_SPI,
4774 		.manufacture_id	= EON_ID_NOPREFIX,
4775 		.model_id	= EON_EN25B80,
4776 		.total_size	= 1024,
4777 		.page_size	= 256,
4778 		.feature_bits	= FEATURE_WRSR_WREN,
4779 		.tested		= TEST_UNTESTED,
4780 		.probe		= probe_spi_rdid,
4781 		.probe_timing	= TIMING_ZERO,
4782 		.block_erasers	=
4783 		{
4784 			{
4785 				.eraseblocks = { {64 * 1024, 16} },
4786 				.block_erase = spi_block_erase_d8,
4787 			}, {
4788 				.eraseblocks = { {1024 * 1024, 1} },
4789 				.block_erase = spi_block_erase_c7,
4790 			}
4791 		},
4792 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4793 		.unlock		= spi_disable_blockprotect,
4794 		.write		= spi_chip_write_256,
4795 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
4796 		.voltage	= {2700, 3600},
4797 	},
4798 
4799 	{
4800 		.vendor		= "Eon",
4801 		.name		= "EN25Q128",
4802 		.bustype	= BUS_SPI,
4803 		.manufacture_id	= EON_ID_NOPREFIX,
4804 		.model_id	= EON_EN25Q128,
4805 		.total_size	= 16384,
4806 		.page_size	= 256,
4807 		/* OTP: 512B total; enter 0x3A */
4808 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4809 		.tested		= TEST_OK_PREW,
4810 		.probe		= probe_spi_rdid,
4811 		.probe_timing	= TIMING_ZERO,
4812 		.block_erasers	=
4813 		{
4814 			{
4815 				.eraseblocks = { {4 * 1024, 4096} },
4816 				.block_erase = spi_block_erase_20,
4817 			}, {
4818 				.eraseblocks = { {64 * 1024, 256} },
4819 				.block_erase = spi_block_erase_d8,
4820 			}, {
4821 				.eraseblocks = { {16 * 1024 * 1024, 1} },
4822 				.block_erase = spi_block_erase_60,
4823 			}, {
4824 				.eraseblocks = { {16 * 1024 * 1024, 1} },
4825 				.block_erase = spi_block_erase_c7,
4826 			}
4827 		},
4828 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4829 		.unlock		= spi_disable_blockprotect,
4830 		.write		= spi_chip_write_256,
4831 		.read		= spi_chip_read,
4832 	},
4833 
4834 	{
4835 		/* Note: EN25D16 is an evil twin which shares the model ID
4836 		   but has different write protection capabilities */
4837 		.vendor		= "Eon",
4838 		.name		= "EN25Q16",
4839 		.bustype	= BUS_SPI,
4840 		.manufacture_id	= EON_ID_NOPREFIX,
4841 		.model_id	= EON_EN25Q16,
4842 		.total_size	= 2048,
4843 		.page_size	= 256,
4844 		/* OTP: D16 512B/Q16 128B total; enter 0x3A */
4845 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4846 		.tested		= TEST_UNTESTED,
4847 		.probe		= probe_spi_rdid,
4848 		.probe_timing	= TIMING_ZERO,
4849 		.block_erasers	=
4850 		{
4851 			{
4852 				.eraseblocks = { {4 * 1024, 512} },
4853 				.block_erase = spi_block_erase_20,
4854 			}, {
4855 				.eraseblocks = { {64 * 1024, 32} },
4856 				.block_erase = spi_block_erase_d8,
4857 			}, {
4858 				/* not supported by Q16 version */
4859 				.eraseblocks = { {64 * 1024, 32} },
4860 				.block_erase = spi_block_erase_52,
4861 			}, {
4862 				.eraseblocks = { {2 * 1024 * 1024, 1} },
4863 				.block_erase = spi_block_erase_60,
4864 			}, {
4865 				.eraseblocks = { {2 * 1024 * 1024, 1} },
4866 				.block_erase = spi_block_erase_c7,
4867 			}
4868 		},
4869 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4870 		.unlock		= spi_disable_blockprotect,
4871 		.write		= spi_chip_write_256,
4872 		.read		= spi_chip_read,
4873 		.voltage	= {2700, 3600},
4874 	},
4875 
4876 	{
4877 		.vendor		= "Eon",
4878 		.name		= "EN25Q32(A/B)",
4879 		.bustype	= BUS_SPI,
4880 		.manufacture_id	= EON_ID_NOPREFIX,
4881 		.model_id	= EON_EN25Q32,
4882 		.total_size	= 4096,
4883 		.page_size	= 256,
4884 		/* OTP: 512B total; enter 0x3A */
4885 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4886 		.tested		= TEST_OK_PREW,
4887 		.probe		= probe_spi_rdid,
4888 		.probe_timing	= TIMING_ZERO,
4889 		.block_erasers	=
4890 		{
4891 			{
4892 				.eraseblocks = { {4 * 1024, 1024} },
4893 				.block_erase = spi_block_erase_20,
4894 			}, {
4895 				.eraseblocks = { {64 * 1024, 64} },
4896 				.block_erase = spi_block_erase_d8,
4897 			}, {
4898 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4899 				.block_erase = spi_block_erase_60,
4900 			}, {
4901 				.eraseblocks = { {4 * 1024 * 1024, 1} },
4902 				.block_erase = spi_block_erase_c7,
4903 			}
4904 		},
4905 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4906 		.unlock		= spi_disable_blockprotect,
4907 		.write		= spi_chip_write_256,
4908 		.read		= spi_chip_read,
4909 		.voltage	= {2700, 3600},
4910 	},
4911 
4912 	{
4913 		.vendor		= "Eon",
4914 		.name		= "EN25Q40",
4915 		.bustype	= BUS_SPI,
4916 		.manufacture_id	= EON_ID_NOPREFIX,
4917 		.model_id	= EON_EN25Q40,
4918 		.total_size	= 512,
4919 		.page_size	= 256,
4920 		/* OTP: 256B total; enter 0x3A */
4921 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4922 		.tested		= TEST_UNTESTED,
4923 		.probe		= probe_spi_rdid,
4924 		.probe_timing	= TIMING_ZERO,
4925 		.block_erasers	=
4926 		{
4927 			{
4928 				.eraseblocks = { {4 * 1024, 128} },
4929 				.block_erase = spi_block_erase_20,
4930 			}, {
4931 				.eraseblocks = { {64 * 1024, 8} },
4932 				.block_erase = spi_block_erase_d8,
4933 			}, {
4934 				.eraseblocks = { {512 * 1024, 1} },
4935 				.block_erase = spi_block_erase_60,
4936 			}, {
4937 				.eraseblocks = { {512 * 1024, 1} },
4938 				.block_erase = spi_block_erase_c7,
4939 			}
4940 		},
4941 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4942 		.unlock		= spi_disable_blockprotect,
4943 		.write		= spi_chip_write_256,
4944 		.read		= spi_chip_read,
4945 		.voltage	= {2700, 3600},
4946 	},
4947 
4948 	{
4949 		.vendor		= "Eon",
4950 		.name		= "EN25Q64",
4951 		.bustype	= BUS_SPI,
4952 		.manufacture_id	= EON_ID_NOPREFIX,
4953 		.model_id	= EON_EN25Q64,
4954 		.total_size	= 8192,
4955 		.page_size	= 256,
4956 		/* OTP: 512B total; enter 0x3A */
4957 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4958 		.tested		= TEST_OK_PREW,
4959 		.probe		= probe_spi_rdid,
4960 		.probe_timing	= TIMING_ZERO,
4961 		.block_erasers	=
4962 		{
4963 			{
4964 				.eraseblocks = { {4 * 1024, 2048} },
4965 				.block_erase = spi_block_erase_20,
4966 			}, {
4967 				.eraseblocks = { {64 * 1024, 128} },
4968 				.block_erase = spi_block_erase_d8,
4969 			}, {
4970 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4971 				.block_erase = spi_block_erase_60,
4972 			}, {
4973 				.eraseblocks = { {8 * 1024 * 1024, 1} },
4974 				.block_erase = spi_block_erase_c7,
4975 			}
4976 		},
4977 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
4978 		.unlock		= spi_disable_blockprotect,
4979 		.write		= spi_chip_write_256,
4980 		.read		= spi_chip_read,
4981 		.voltage	= {2700, 3600},
4982 	},
4983 
4984 	{
4985 		.vendor		= "Eon",
4986 		.name		= "EN25Q80(A)",
4987 		.bustype	= BUS_SPI,
4988 		.manufacture_id	= EON_ID_NOPREFIX,
4989 		.model_id	= EON_EN25Q80,
4990 		.total_size	= 1024,
4991 		.page_size	= 256,
4992 		/* OTP: 256B total; enter 0x3A */
4993 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
4994 		.tested		= TEST_UNTESTED,
4995 		.probe		= probe_spi_rdid,
4996 		.probe_timing	= TIMING_ZERO,
4997 		.block_erasers	=
4998 		{
4999 			{
5000 				.eraseblocks = { {4 * 1024, 256} },
5001 				.block_erase = spi_block_erase_20,
5002 			}, {
5003 				.eraseblocks = { {64 * 1024, 16} },
5004 				.block_erase = spi_block_erase_d8,
5005 			}, {
5006 				.eraseblocks = { {1024 * 1024, 1} },
5007 				.block_erase = spi_block_erase_60,
5008 			}, {
5009 				.eraseblocks = { {1024 * 1024, 1} },
5010 				.block_erase = spi_block_erase_c7,
5011 			}
5012 		},
5013 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
5014 		.unlock		= spi_disable_blockprotect,
5015 		.write		= spi_chip_write_256,
5016 		.read		= spi_chip_read,
5017 		.voltage	= {2700, 3600},
5018 	},
5019 
5020 	{
5021 		.vendor		= "Eon",
5022 		.name		= "EN25QH128",
5023 		.bustype	= BUS_SPI,
5024 		.manufacture_id	= EON_ID_NOPREFIX,
5025 		.model_id	= EON_EN25QH128,
5026 		.total_size	= 16384,
5027 		.page_size	= 256,
5028 		/* supports SFDP */
5029 		/* OTP: 512B total; enter 0x3A */
5030 		/* QPI enable 0x38, disable 0xFF */
5031 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5032 		.tested		= TEST_UNTESTED,
5033 		.probe		= probe_spi_rdid,
5034 		.probe_timing	= TIMING_ZERO,
5035 		.block_erasers	=
5036 		{
5037 			{
5038 				.eraseblocks = { {4 * 1024, 4096} },
5039 				.block_erase = spi_block_erase_20,
5040 			}, {
5041 				.eraseblocks = { {64 * 1024, 256} },
5042 				.block_erase = spi_block_erase_d8,
5043 			}, {
5044 				.eraseblocks = { { 16384 * 1024, 1} },
5045 				.block_erase = spi_block_erase_60,
5046 			}, {
5047 				.eraseblocks = { { 16384 * 1024, 1} },
5048 				.block_erase = spi_block_erase_c7,
5049 			}
5050 		},
5051 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5052 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5053 		.write		= spi_chip_write_256,
5054 		.read		= spi_chip_read,
5055 		.voltage	= {2700, 3600},
5056 	},
5057 
5058 	{
5059 		.vendor		= "Eon",
5060 		.name		= "EN25QH16",
5061 		.bustype	= BUS_SPI,
5062 		.manufacture_id	= EON_ID_NOPREFIX,
5063 		.model_id	= EON_EN25QH16,
5064 		.total_size	= 2048,
5065 		.page_size	= 256,
5066 		/* supports SFDP */
5067 		/* OTP: 512B total; enter 0x3A */
5068 		/* QPI enable 0x38, disable 0xFF */
5069 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5070 		.tested		= TEST_OK_PREW,
5071 		.probe		= probe_spi_rdid,
5072 		.probe_timing	= TIMING_ZERO,
5073 		.block_erasers	=
5074 		{
5075 			{
5076 				.eraseblocks = { {4 * 1024, 512} },
5077 				.block_erase = spi_block_erase_20,
5078 			}, {
5079 				.eraseblocks = { {64 * 1024, 32} },
5080 				.block_erase = spi_block_erase_d8,
5081 			}, {
5082 				.eraseblocks = { {1024 * 2048, 1} },
5083 				.block_erase = spi_block_erase_60,
5084 			}, {
5085 				.eraseblocks = { {1024 * 2048, 1} },
5086 				.block_erase = spi_block_erase_c7,
5087 			}
5088 		},
5089 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5090 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5091 		.write		= spi_chip_write_256,
5092 		.read		= spi_chip_read,
5093 		.voltage	= {2700, 3600},
5094 	},
5095 
5096 	{
5097 		.vendor		= "Eon",
5098 		.name		= "EN25QH32",
5099 		.bustype	= BUS_SPI,
5100 		.manufacture_id	= EON_ID_NOPREFIX,
5101 		.model_id	= EON_EN25QH32,
5102 		.total_size	= 4096,
5103 		.page_size	= 256,
5104 		/* supports SFDP */
5105 		/* OTP: 512B total; enter 0x3A */
5106 		/* QPI enable 0x38, disable 0xFF */
5107 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5108 		.tested		= TEST_OK_PREW,
5109 		.probe		= probe_spi_rdid,
5110 		.probe_timing	= TIMING_ZERO,
5111 		.block_erasers	=
5112 		{
5113 			{
5114 				.eraseblocks = { {4 * 1024, 1024} },
5115 				.block_erase = spi_block_erase_20,
5116 			}, {
5117 				.eraseblocks = { {64 * 1024, 64} },
5118 				.block_erase = spi_block_erase_d8,
5119 			}, {
5120 				.eraseblocks = { {1024 * 4096, 1} },
5121 				.block_erase = spi_block_erase_60,
5122 			}, {
5123 				.eraseblocks = { {1024 * 4096, 1} },
5124 				.block_erase = spi_block_erase_c7,
5125 			}
5126 		},
5127 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5128 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5129 		.write		= spi_chip_write_256,
5130 		.read		= spi_chip_read,
5131 		.voltage	= {2700, 3600},
5132 	},
5133 
5134 	{
5135 		.vendor		= "Eon",
5136 		.name		= "EN25QH64",
5137 		.bustype	= BUS_SPI,
5138 		.manufacture_id	= EON_ID_NOPREFIX,
5139 		.model_id	= EON_EN25QH64,
5140 		.total_size	= 8192,
5141 		.page_size	= 256,
5142 		/* supports SFDP */
5143 		/* OTP: 512B total; enter 0x3A */
5144 		/* QPI enable 0x38, disable 0xFF */
5145 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5146 		.tested		= TEST_OK_PREW,
5147 		.probe		= probe_spi_rdid,
5148 		.probe_timing	= TIMING_ZERO,
5149 		.block_erasers	=
5150 		{
5151 			{
5152 				.eraseblocks = { {4 * 1024, 2048} },
5153 				.block_erase = spi_block_erase_20,
5154 			}, {
5155 				.eraseblocks = { {64 * 1024, 128} },
5156 				.block_erase = spi_block_erase_d8,
5157 			}, {
5158 				.eraseblocks = { { 8192 * 1024, 1} },
5159 				.block_erase = spi_block_erase_60,
5160 			}, {
5161 				.eraseblocks = { { 8192 * 1024, 1} },
5162 				.block_erase = spi_block_erase_c7,
5163 			}
5164 		},
5165 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5166 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5167 		.write		= spi_chip_write_256,
5168 		.read		= spi_chip_read,
5169 		.voltage	= {2700, 3600},
5170 	},
5171 
5172 	{
5173 		.vendor		= "Eon",
5174 		.name		= "EN25S10",
5175 		.bustype	= BUS_SPI,
5176 		.manufacture_id	= EON_ID_NOPREFIX,
5177 		.model_id	= EON_EN25S10,
5178 		.total_size	= 128,
5179 		.page_size	= 256,
5180 		/* OTP: 256B total; enter 0x3A */
5181 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5182 		.tested		= TEST_UNTESTED,
5183 		.probe		= probe_spi_rdid,
5184 		.probe_timing	= TIMING_ZERO,
5185 		.block_erasers	=
5186 		{
5187 			{
5188 				.eraseblocks = { {4 * 1024, 32} },
5189 				.block_erase = spi_block_erase_20,
5190 			},  {
5191 				.eraseblocks = { {32 * 1024, 4} },
5192 				.block_erase = spi_block_erase_52,
5193 			}, {
5194 				.eraseblocks = { {128 * 1024, 1} },
5195 				.block_erase = spi_block_erase_60,
5196 			}, {
5197 				.eraseblocks = { {128 * 1024, 1} },
5198 				.block_erase = spi_block_erase_c7,
5199 			}
5200 		},
5201 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
5202 		.unlock		= spi_disable_blockprotect,
5203 		.write		= spi_chip_write_256,
5204 		.read		= spi_chip_read,
5205 		.voltage	= {1650, 1950},
5206 	},
5207 
5208 	{
5209 		.vendor		= "Eon",
5210 		.name		= "EN25S16",
5211 		.bustype	= BUS_SPI,
5212 		.manufacture_id	= EON_ID_NOPREFIX,
5213 		.model_id	= EON_EN25S16,
5214 		.total_size	= 2048,
5215 		.page_size	= 256,
5216 		/* OTP: 512B total; enter 0x3A */
5217 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5218 		.tested		= TEST_UNTESTED,
5219 		.probe		= probe_spi_rdid,
5220 		.probe_timing	= TIMING_ZERO,
5221 		.block_erasers	=
5222 		{
5223 			{
5224 				.eraseblocks = { {4 * 1024, 512} },
5225 				.block_erase = spi_block_erase_20,
5226 			}, {
5227 				.eraseblocks = { {64 * 1024, 32} },
5228 				.block_erase = spi_block_erase_52,
5229 			}, {
5230 				.eraseblocks = { {32 * 1024, 64} },
5231 				.block_erase = spi_block_erase_d8,
5232 			}, {
5233 				.eraseblocks = { {2048 * 1024, 1} },
5234 				.block_erase = spi_block_erase_60,
5235 			}, {
5236 				.eraseblocks = { {2048 * 1024, 1} },
5237 				.block_erase = spi_block_erase_c7,
5238 			}
5239 		},
5240 		.printlock	= spi_prettyprint_status_register_en25s_wp,
5241 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5242 		.write		= spi_chip_write_256,
5243 		.read		= spi_chip_read,
5244 		.voltage	= {1650, 1950},
5245 	},
5246 
5247 	{
5248 		.vendor		= "Eon",
5249 		.name		= "EN25S20",
5250 		.bustype	= BUS_SPI,
5251 		.manufacture_id	= EON_ID_NOPREFIX,
5252 		.model_id	= EON_EN25S20,
5253 		.total_size	= 256,
5254 		.page_size	= 256,
5255 		/* OTP: 256B total; enter 0x3A */
5256 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5257 		.tested		= TEST_UNTESTED,
5258 		.probe		= probe_spi_rdid,
5259 		.probe_timing	= TIMING_ZERO,
5260 		.block_erasers	=
5261 		{
5262 			{
5263 				.eraseblocks = { {4 * 1024, 64} },
5264 				.block_erase = spi_block_erase_20,
5265 			}, {
5266 				.eraseblocks = { {64 * 1024, 4} },
5267 				.block_erase = spi_block_erase_d8,
5268 			}, {
5269 				.eraseblocks = { {256 * 1024, 1} },
5270 				.block_erase = spi_block_erase_60,
5271 			}, {
5272 				.eraseblocks = { {256 * 1024, 1} },
5273 				.block_erase = spi_block_erase_c7,
5274 			}
5275 		},
5276 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
5277 		.unlock		= spi_disable_blockprotect,
5278 		.write		= spi_chip_write_256,
5279 		.read		= spi_chip_read,
5280 		.voltage	= {1650, 1950},
5281 	},
5282 
5283 	{
5284 		.vendor		= "Eon",
5285 		.name		= "EN25S32",
5286 		.bustype	= BUS_SPI,
5287 		.manufacture_id	= EON_ID_NOPREFIX,
5288 		.model_id	= EON_EN25S32,
5289 		.total_size	= 4096,
5290 		.page_size	= 256,
5291 		/* OTP: 512B total; enter 0x3A */
5292 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5293 		.tested		= TEST_UNTESTED,
5294 		.probe		= probe_spi_rdid,
5295 		.probe_timing	= TIMING_ZERO,
5296 		.block_erasers	=
5297 		{
5298 			{
5299 				.eraseblocks = { {4 * 1024, 1024} },
5300 				.block_erase = spi_block_erase_20,
5301 			}, {
5302 				.eraseblocks = { {32 * 1024, 128} },
5303 				.block_erase = spi_block_erase_52,
5304 			}, {
5305 				.eraseblocks = { {64 * 1024, 64} },
5306 				.block_erase = spi_block_erase_d8,
5307 			}, {
5308 				.eraseblocks = { {4096 * 1024, 1} },
5309 				.block_erase = spi_block_erase_60,
5310 			}, {
5311 				.eraseblocks = { {4096 * 1024, 1} },
5312 				.block_erase = spi_block_erase_c7,
5313 			}
5314 		},
5315 		.printlock	= spi_prettyprint_status_register_en25s_wp,
5316 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5317 		.write		= spi_chip_write_256,
5318 		.read		= spi_chip_read,
5319 		.voltage	= {1650, 1950},
5320 	},
5321 
5322 	{
5323 		.vendor		= "Eon",
5324 		.name		= "EN25S40",
5325 		.bustype	= BUS_SPI,
5326 		.manufacture_id	= EON_ID_NOPREFIX,
5327 		.model_id	= EON_EN25S40,
5328 		.total_size	= 512,
5329 		.page_size	= 256,
5330 		/* OTP: 256B total; enter 0x3A */
5331 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5332 		.tested		= TEST_OK_PREW,
5333 		.probe		= probe_spi_rdid,
5334 		.probe_timing	= TIMING_ZERO,
5335 		.block_erasers	=
5336 		{
5337 			{
5338 				.eraseblocks = { {4 * 1024, 128} },
5339 				.block_erase = spi_block_erase_20,
5340 			}, {
5341 				.eraseblocks = { {64 * 1024, 8} },
5342 				.block_erase = spi_block_erase_d8,
5343 			}, {
5344 				.eraseblocks = { {512 * 1024, 1} },
5345 				.block_erase = spi_block_erase_60,
5346 			}, {
5347 				.eraseblocks = { {512 * 1024, 1} },
5348 				.block_erase = spi_block_erase_c7,
5349 			}
5350 		},
5351 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
5352 		.unlock		= spi_disable_blockprotect,
5353 		.write		= spi_chip_write_256,
5354 		.read		= spi_chip_read,
5355 		.voltage	= {1650, 1950},
5356 	},
5357 
5358 	{
5359 		.vendor		= "Eon",
5360 		.name		= "EN25S64",
5361 		.bustype	= BUS_SPI,
5362 		.manufacture_id	= EON_ID_NOPREFIX,
5363 		.model_id	= EON_EN25S64,
5364 		.total_size	= 8192,
5365 		.page_size	= 256,
5366 		/* OTP: 512B total; enter 0x3A */
5367 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5368 		.tested		= TEST_UNTESTED,
5369 		.probe		= probe_spi_rdid,
5370 		.probe_timing	= TIMING_ZERO,
5371 		.block_erasers	=
5372 		{
5373 			{
5374 				.eraseblocks = { {4 * 1024, 2048} },
5375 				.block_erase = spi_block_erase_20,
5376 			}, {
5377 				.eraseblocks = { {64 * 1024, 128} },
5378 				.block_erase = spi_block_erase_d8,
5379 			}, {
5380 				.eraseblocks = { {8192 * 1024, 1} },
5381 				.block_erase = spi_block_erase_60,
5382 			}, {
5383 				.eraseblocks = { {8192 * 1024, 1} },
5384 				.block_erase = spi_block_erase_c7,
5385 			}
5386 		},
5387 		.printlock	= spi_prettyprint_status_register_en25s_wp,
5388 		.unlock		= spi_disable_blockprotect_bp3_srwd,
5389 		.write		= spi_chip_write_256,
5390 		.read		= spi_chip_read,
5391 		.voltage	= {1650, 1950},
5392 	},
5393 
5394 	{
5395 		.vendor		= "Eon",
5396 		.name		= "EN25S80",
5397 		.bustype	= BUS_SPI,
5398 		.manufacture_id	= EON_ID_NOPREFIX,
5399 		.model_id	= EON_EN25S80,
5400 		.total_size	= 1024,
5401 		.page_size	= 256,
5402 		/* OTP: 256B total; enter 0x3A */
5403 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5404 		.tested		= TEST_UNTESTED,
5405 		.probe		= probe_spi_rdid,
5406 		.probe_timing	= TIMING_ZERO,
5407 		.block_erasers	=
5408 		{
5409 			{
5410 				.eraseblocks = { {4 * 1024, 256} },
5411 				.block_erase = spi_block_erase_20,
5412 			}, {
5413 				.eraseblocks = { {64 * 1024, 16} },
5414 				.block_erase = spi_block_erase_d8,
5415 			}, {
5416 				.eraseblocks = { {1024 * 1024, 1} },
5417 				.block_erase = spi_block_erase_60,
5418 			}, {
5419 				.eraseblocks = { {1024 * 1024, 1} },
5420 				.block_erase = spi_block_erase_c7,
5421 			}
5422 		},
5423 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
5424 		.unlock		= spi_disable_blockprotect,
5425 		.write		= spi_chip_write_256,
5426 		.read		= spi_chip_read,
5427 		.voltage	= {1650, 1950},
5428 	},
5429 
5430 	{
5431 		.vendor		= "Eon",
5432 		.name		= "EN29F002(A)(N)B",
5433 		.bustype	= BUS_PARALLEL,
5434 		.manufacture_id	= EON_ID,
5435 		.model_id	= EON_EN29F002B,
5436 		.total_size	= 256,
5437 		.page_size	= 256,
5438 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
5439 		.tested		= TEST_OK_PREW,
5440 		.probe		= probe_jedec,
5441 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5442 		.block_erasers	=
5443 		{
5444 			{
5445 				.eraseblocks = {
5446 					{16 * 1024, 1},
5447 					{8 * 1024, 2},
5448 					{32 * 1024, 1},
5449 					{64 * 1024, 3},
5450 				},
5451 				.block_erase = erase_sector_jedec,
5452 			}, {
5453 				.eraseblocks = { {256 * 1024, 1} },
5454 				.block_erase = erase_chip_block_jedec,
5455 			},
5456 		},
5457 		.write		= write_jedec_1,
5458 		.read		= read_memmapped,
5459 		.voltage	= {4500, 5500},
5460 	},
5461 
5462 	{
5463 		.vendor		= "Eon",
5464 		.name		= "EN29F002(A)(N)T",
5465 		.bustype	= BUS_PARALLEL,
5466 		.manufacture_id	= EON_ID,
5467 		.model_id	= EON_EN29F002T,
5468 		.total_size	= 256,
5469 		.page_size	= 256,
5470 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
5471 		.tested		= TEST_OK_PREW,
5472 		.probe		= probe_jedec,
5473 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5474 		.block_erasers	=
5475 		{
5476 			{
5477 				.eraseblocks = {
5478 					{64 * 1024, 3},
5479 					{32 * 1024, 1},
5480 					{8 * 1024, 2},
5481 					{16 * 1024, 1},
5482 				},
5483 				.block_erase = erase_sector_jedec,
5484 			}, {
5485 				.eraseblocks = { {256 * 1024, 1} },
5486 				.block_erase = erase_chip_block_jedec,
5487 			},
5488 		},
5489 		.write		= write_jedec_1,
5490 		.read		= read_memmapped,
5491 		.voltage	= {4500, 5500},
5492 	},
5493 
5494 	{
5495 		.vendor		= "Eon",
5496 		.name		= "EN29F010",
5497 		.bustype	= BUS_PARALLEL,
5498 		.manufacture_id	= EON_ID,
5499 		.model_id	= EON_EN29F010,
5500 		.total_size	= 128,
5501 		.page_size	= 128,
5502 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5503 		.tested		= TEST_OK_PRE,
5504 		.probe		= probe_jedec,
5505 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5506 		.block_erasers	=
5507 		{
5508 			{
5509 				.eraseblocks = { {16 * 1024, 8} },
5510 				.block_erase = erase_sector_jedec,
5511 			},
5512 			{
5513 				.eraseblocks = { {128 * 1024, 1} },
5514 				.block_erase = erase_chip_block_jedec,
5515 			},
5516 		},
5517 		.write		= write_jedec_1,
5518 		.read		= read_memmapped,
5519 		.voltage	= {4500, 5500},
5520 	},
5521 
5522 	{
5523 		.vendor		= "Eon",
5524 		.name		= "EN29GL064(A)B",
5525 		.bustype	= BUS_PARALLEL,
5526 		.manufacture_id	= EON_ID,
5527 		.model_id	= EON_EN29GL064B,
5528 		.total_size	= 8192,
5529 		.page_size	= 128 * 1024, /* actual page size is 16 */
5530 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5531 		.tested		= TEST_UNTESTED,
5532 		.probe		= probe_jedec_29gl,
5533 		.probe_timing	= TIMING_ZERO,
5534 		.block_erasers	=
5535 		{
5536 			{
5537 				.eraseblocks = {
5538 					{8 * 1024, 8},
5539 					{64 * 1024, 127},
5540 				},
5541 				.block_erase = erase_sector_jedec,
5542 			}, {
5543 				.eraseblocks = { {8 * 1024 * 1024, 1} },
5544 				.block_erase = erase_chip_block_jedec,
5545 			},
5546 		},
5547 		.write		= write_jedec_1,
5548 		.read		= read_memmapped,
5549 		.voltage	= {2700, 3600},
5550 	},
5551 
5552 	{
5553 		.vendor		= "Eon",
5554 		.name		= "EN29GL064(A)T",
5555 		.bustype	= BUS_PARALLEL,
5556 		.manufacture_id	= EON_ID,
5557 		.model_id	= EON_EN29GL064T,
5558 		.total_size	= 8192,
5559 		.page_size	= 128 * 1024, /* actual page size is 16 */
5560 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5561 		.tested		= TEST_UNTESTED,
5562 		.probe		= probe_jedec_29gl,
5563 		.probe_timing	= TIMING_ZERO,
5564 		.block_erasers	=
5565 		{
5566 			{
5567 				.eraseblocks = {
5568 					{64 * 1024, 127},
5569 					{8 * 1024, 8},
5570 				},
5571 				.block_erase = erase_sector_jedec,
5572 			}, {
5573 				.eraseblocks = { {8 * 1024 * 1024, 1} },
5574 				.block_erase = erase_chip_block_jedec,
5575 			},
5576 		},
5577 		.write		= write_jedec_1,
5578 		.read		= read_memmapped,
5579 		.voltage	= {2700, 3600},
5580 	},
5581 
5582 	{
5583 		.vendor		= "Eon",
5584 		.name		= "EN29GL064H/L",
5585 		.bustype	= BUS_PARALLEL,
5586 		.manufacture_id	= EON_ID,
5587 		.model_id	= EON_EN29GL064HL,
5588 		.total_size	= 8192,
5589 		.page_size	= 128 * 1024, /* actual page size is 16 */
5590 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5591 		.tested		= TEST_UNTESTED,
5592 		.probe		= probe_jedec_29gl,
5593 		.probe_timing	= TIMING_ZERO,
5594 		.block_erasers	=
5595 		{
5596 			{
5597 				.eraseblocks = { {64 * 1024, 128} },
5598 				.block_erase = erase_sector_jedec,
5599 			}, {
5600 				.eraseblocks = { {8 * 1024 * 1024, 1} },
5601 				.block_erase = erase_chip_block_jedec,
5602 			},
5603 		},
5604 		.write		= write_jedec_1,
5605 		.read		= read_memmapped,
5606 		.voltage	= {2700, 3600},
5607 	},
5608 
5609 	{
5610 		.vendor		= "Eon",
5611 		.name		= "EN29GL128",
5612 		.bustype	= BUS_PARALLEL,
5613 		.manufacture_id	= EON_ID,
5614 		.model_id	= EON_EN29GL128HL,
5615 		.total_size	= 16384,
5616 		.page_size	= 128 * 1024, /* actual page size is 16 */
5617 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5618 		.tested		= TEST_UNTESTED,
5619 		.probe		= probe_jedec_29gl,
5620 		.probe_timing	= TIMING_ZERO,
5621 		.block_erasers	=
5622 		{
5623 			{
5624 				.eraseblocks = { {128 * 1024, 128} },
5625 				.block_erase = erase_sector_jedec,
5626 			}, {
5627 				.eraseblocks = { {16 * 1024 * 1024, 1} },
5628 				.block_erase = erase_chip_block_jedec,
5629 			},
5630 		},
5631 		.write		= write_jedec_1,
5632 		.read		= read_memmapped,
5633 		.voltage	= {2700, 3600},
5634 	},
5635 
5636 	{
5637 		.vendor		= "Eon",
5638 		.name		= "EN29LV040(A)",
5639 		.bustype	= BUS_PARALLEL,
5640 		.manufacture_id	= EON_ID,
5641 		.model_id	= EON_EN29LV040,
5642 		.total_size	= 512,
5643 		.page_size	= 4 * 1024,
5644 		.tested		= TEST_OK_PREW,
5645 		.probe		= probe_jedec,
5646 		.probe_timing	= TIMING_ZERO,
5647 		.block_erasers	=
5648 		{
5649 			{
5650 				.eraseblocks = { {64 * 1024, 8} },
5651 				.block_erase = erase_sector_jedec,
5652 			},
5653 			{
5654 				.eraseblocks = { {512 * 1024, 1} },
5655 				.block_erase = erase_chip_block_jedec,
5656 			},
5657 		},
5658 		.write		= write_jedec_1,
5659 		.read		= read_memmapped,
5660 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5661 	},
5662 
5663 	{
5664 		.vendor		= "Eon",
5665 		.name		= "EN29LV640B",
5666 		.bustype	= BUS_PARALLEL,
5667 		.manufacture_id	= EON_ID,
5668 		.model_id	= EON_EN29LV640B,
5669 		.total_size	= 8192,
5670 		.page_size	= 8192,
5671 		.feature_bits	= FEATURE_ADDR_SHIFTED,
5672 		.tested		= TEST_OK_PREW,
5673 		.probe		= probe_en29lv640b,
5674 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5675 		.block_erasers	=
5676 		{
5677 			{
5678 				.eraseblocks = {
5679 					{8 * 1024, 8},
5680 					{64 * 1024, 127},
5681 				},
5682 				.block_erase = erase_block_jedec,
5683 			}, {
5684 				.eraseblocks = { {8 * 1024 * 1024, 1} },
5685 				.block_erase = erase_chip_block_jedec,
5686 			},
5687 		},
5688 		.write		= write_en29lv640b,
5689 		.read		= read_memmapped,
5690 		.voltage	= {2700, 3600},
5691 	},
5692 
5693 	{
5694 		.vendor		= "Fujitsu",
5695 		.name		= "MBM29F004BC",
5696 		.bustype	= BUS_PARALLEL,
5697 		.manufacture_id	= FUJITSU_ID,
5698 		.model_id	= FUJITSU_MBM29F004BC,
5699 		.total_size	= 512,
5700 		.page_size	= 64 * 1024,
5701 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5702 		.tested		= TEST_UNTESTED,
5703 		.probe		= probe_jedec,
5704 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5705 		.block_erasers	=
5706 		{
5707 			{
5708 				.eraseblocks = {
5709 					{16 * 1024, 1},
5710 					{8 * 1024, 2},
5711 					{32 * 1024, 1},
5712 					{64 * 1024, 7},
5713 				},
5714 				.block_erase = erase_sector_jedec,
5715 			}, {
5716 				.eraseblocks = { {512 * 1024, 1} },
5717 				.block_erase = erase_chip_block_jedec,
5718 			},
5719 		},
5720 		.write		= NULL,
5721 		.read		= read_memmapped,
5722 		.voltage	= {4500, 5500},
5723 	},
5724 
5725 	{
5726 		.vendor		= "Fujitsu",
5727 		.name		= "MBM29F004TC",
5728 		.bustype	= BUS_PARALLEL,
5729 		.manufacture_id	= FUJITSU_ID,
5730 		.model_id	= FUJITSU_MBM29F004TC,
5731 		.total_size	= 512,
5732 		.page_size	= 64 * 1024,
5733 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5734 		.tested		= TEST_UNTESTED,
5735 		.probe		= probe_jedec,
5736 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
5737 		.block_erasers	=
5738 		{
5739 			{
5740 				.eraseblocks = {
5741 					{64 * 1024, 7},
5742 					{32 * 1024, 1},
5743 					{8 * 1024, 2},
5744 					{16 * 1024, 1},
5745 				},
5746 				.block_erase = erase_sector_jedec,
5747 			}, {
5748 				.eraseblocks = { {512 * 1024, 1} },
5749 				.block_erase = erase_chip_block_jedec,
5750 			},
5751 		},
5752 		.write		= NULL,
5753 		.read		= read_memmapped,
5754 		.voltage	= {4500, 5500},
5755 	},
5756 
5757 	{
5758 		/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
5759 		.vendor		= "Fujitsu",
5760 		.name		= "MBM29F400BC",
5761 		.bustype	= BUS_PARALLEL,
5762 		.manufacture_id	= FUJITSU_ID,
5763 		.model_id	= FUJITSU_MBM29F400BC,
5764 		.total_size	= 512,
5765 		.page_size	= 64 * 1024,
5766 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5767 		.tested		= TEST_UNTESTED,
5768 		.probe		= probe_jedec,
5769 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5770 		.block_erasers	=
5771 		{
5772 			{
5773 				.eraseblocks = {
5774 					{16 * 1024, 1},
5775 					{8 * 1024, 2},
5776 					{32 * 1024, 1},
5777 					{64 * 1024, 7},
5778 				},
5779 				.block_erase = erase_sector_jedec,
5780 			}, {
5781 				.eraseblocks = { {512 * 1024, 1} },
5782 				.block_erase = erase_chip_block_jedec,
5783 			},
5784 		},
5785 		.write		= write_jedec_1,
5786 		.read		= read_memmapped,
5787 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
5788 	},
5789 
5790 	{
5791 		.vendor		= "Fujitsu",
5792 		.name		= "MBM29F400TC",
5793 		.bustype	= BUS_PARALLEL,
5794 		.manufacture_id	= FUJITSU_ID,
5795 		.model_id	= FUJITSU_MBM29F400TC,
5796 		.total_size	= 512,
5797 		.page_size	= 64 * 1024,
5798 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
5799 		.tested		= TEST_UNTESTED,
5800 		.probe		= probe_jedec,
5801 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5802 		.block_erasers	=
5803 		{
5804 			{
5805 				.eraseblocks = {
5806 					{64 * 1024, 7},
5807 					{32 * 1024, 1},
5808 					{8 * 1024, 2},
5809 					{16 * 1024, 1},
5810 				},
5811 				.block_erase = erase_sector_jedec,
5812 			}, {
5813 				.eraseblocks = { {512 * 1024, 1} },
5814 				.block_erase = erase_chip_block_jedec,
5815 			},
5816 		},
5817 		.write		= write_jedec_1,
5818 		.read		= read_memmapped,
5819 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
5820 	},
5821 
5822 	{
5823 		.vendor		= "Fujitsu",
5824 		.name		= "MBM29LV160BE",
5825 		.bustype	= BUS_PARALLEL,
5826 		.manufacture_id	= FUJITSU_ID,
5827 		.model_id	= FUJITSU_MBM29LV160BE,
5828 		.total_size	= 2 * 1024,
5829 		.page_size	= 0,
5830 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5831 		.tested		= TEST_UNTESTED,
5832 		.probe		= probe_jedec,
5833 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5834 		.block_erasers	=
5835 		{
5836 			{
5837 				.eraseblocks = {
5838 					{16 * 1024, 1},
5839 					{8 * 1024, 2},
5840 					{32 * 1024, 1},
5841 					{64 * 1024, 31},
5842 				},
5843 				.block_erase = erase_block_jedec,
5844 			}, {
5845 				.eraseblocks = { {2048 * 1024, 1} },
5846 				.block_erase = erase_chip_block_jedec,
5847 			},
5848 		},
5849 		.write		= write_jedec_1, /* Supports a fast mode too */
5850 		.read		= read_memmapped,
5851 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5852 	},
5853 
5854 	{
5855 		.vendor		= "Fujitsu",
5856 		.name		= "MBM29LV160TE",
5857 		.bustype	= BUS_PARALLEL,
5858 		.manufacture_id	= FUJITSU_ID,
5859 		.model_id	= FUJITSU_MBM29LV160TE,
5860 		.total_size	= 2 * 1024,
5861 		.page_size	= 0,
5862 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5863 		.tested		= TEST_UNTESTED,
5864 		.probe		= probe_jedec,
5865 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5866 		.block_erasers	=
5867 		{
5868 			{
5869 				.eraseblocks = {
5870 					{64 * 1024, 31},
5871 					{32 * 1024, 1},
5872 					{8 * 1024, 2},
5873 					{16 * 1024, 1},
5874 				},
5875 				.block_erase = erase_block_jedec,
5876 			}, {
5877 				.eraseblocks = { {2048 * 1024, 1} },
5878 				.block_erase = erase_chip_block_jedec,
5879 			},
5880 		},
5881 		.write		= write_jedec_1, /* Supports a fast mode too */
5882 		.read		= read_memmapped,
5883 		.voltage	= {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5884 	},
5885 
5886 	{
5887 		.vendor		= "GigaDevice",
5888 		.name		= "GD25B128B/GD25Q128B",
5889 		.bustype	= BUS_SPI,
5890 		.manufacture_id	= GIGADEVICE_ID,
5891 		.model_id	= GIGADEVICE_GD25Q128,
5892 		.total_size	= 16384,
5893 		.page_size	= 256,
5894 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5895 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5896 		.tested		= TEST_OK_PREW,
5897 		.probe		= probe_spi_rdid,
5898 		.probe_timing	= TIMING_ZERO,
5899 		.block_erasers	=
5900 		{
5901 			{
5902 				.eraseblocks = { {4 * 1024, 4096} },
5903 				.block_erase = spi_block_erase_20,
5904 			}, {
5905 				.eraseblocks = { {32 * 1024, 512} },
5906 				.block_erase = spi_block_erase_52,
5907 			}, {
5908 				.eraseblocks = { {64 * 1024, 256} },
5909 				.block_erase = spi_block_erase_d8,
5910 			}, {
5911 				.eraseblocks = { {16 * 1024 * 1024, 1} },
5912 				.block_erase = spi_block_erase_60,
5913 			}, {
5914 				.eraseblocks = { {16 * 1024 * 1024, 1} },
5915 				.block_erase = spi_block_erase_c7,
5916 			}
5917 		},
5918 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
5919 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5920 		.write		= spi_chip_write_256,
5921 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5922 		.voltage	= {2700, 3600},
5923 	},
5924 
5925 	{
5926 		.vendor		= "GigaDevice",
5927 		.name		= "GD25LQ128C/GD25LQ128D",
5928 		.bustype	= BUS_SPI,
5929 		.manufacture_id	= GIGADEVICE_ID,
5930 		.model_id	= GIGADEVICE_GD25LQ128CD,
5931 		.total_size	= 16384,
5932 		.page_size	= 256,
5933 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5934 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5935 		.tested		= TEST_UNTESTED,
5936 		.probe		= probe_spi_rdid,
5937 		.probe_timing	= TIMING_ZERO,
5938 		.block_erasers	=
5939 		{
5940 			{
5941 				.eraseblocks = { {4 * 1024, 4096} },
5942 				.block_erase = spi_block_erase_20,
5943 			}, {
5944 				.eraseblocks = { {32 * 1024, 512} },
5945 				.block_erase = spi_block_erase_52,
5946 			}, {
5947 				.eraseblocks = { {64 * 1024, 256} },
5948 				.block_erase = spi_block_erase_d8,
5949 			}, {
5950 				.eraseblocks = { {16 * 1024 * 1024, 1} },
5951 				.block_erase = spi_block_erase_60,
5952 			}, {
5953 				.eraseblocks = { {16 * 1024 * 1024, 1} },
5954 				.block_erase = spi_block_erase_c7,
5955 			}
5956 		},
5957 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
5958 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5959 		.write		= spi_chip_write_256,
5960 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5961 		.voltage	= {1695, 1950},
5962 	},
5963 
5964 	{
5965 		.vendor		= "GigaDevice",
5966 		.name		= "GD25LQ16",
5967 		.bustype	= BUS_SPI,
5968 		.manufacture_id	= GIGADEVICE_ID,
5969 		.model_id	= GIGADEVICE_GD25LQ16,
5970 		.total_size	= 2048,
5971 		.page_size	= 256,
5972 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5973 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
5974 		.tested		= TEST_UNTESTED,
5975 		.probe		= probe_spi_rdid,
5976 		.probe_timing	= TIMING_ZERO,
5977 		.block_erasers	=
5978 		{
5979 			{
5980 				.eraseblocks = { {4 * 1024, 512} },
5981 				.block_erase = spi_block_erase_20,
5982 			}, {
5983 				.eraseblocks = { {32 * 1024, 64} },
5984 				.block_erase = spi_block_erase_52,
5985 			}, {
5986 				.eraseblocks = { {64 * 1024, 32} },
5987 				.block_erase = spi_block_erase_d8,
5988 			}, {
5989 				.eraseblocks = { {2 * 1024 * 1024, 1} },
5990 				.block_erase = spi_block_erase_60,
5991 			}, {
5992 				.eraseblocks = { {2 * 1024 * 1024, 1} },
5993 				.block_erase = spi_block_erase_c7,
5994 			}
5995 		},
5996 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
5997 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
5998 		.write		= spi_chip_write_256,
5999 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6000 		.voltage	= {1695, 1950},
6001 	},
6002 
6003 	{
6004 		.vendor		= "GigaDevice",
6005 		.name		= "GD25LQ32",
6006 		.bustype	= BUS_SPI,
6007 		.manufacture_id	= GIGADEVICE_ID,
6008 		.model_id	= GIGADEVICE_GD25LQ32,
6009 		.total_size	= 4096,
6010 		.page_size	= 256,
6011 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6012 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6013 		.tested		= TEST_OK_PREW,
6014 		.probe		= probe_spi_rdid,
6015 		.probe_timing	= TIMING_ZERO,
6016 		.block_erasers	=
6017 		{
6018 			{
6019 				.eraseblocks = { {4 * 1024, 1024} },
6020 				.block_erase = spi_block_erase_20,
6021 			}, {
6022 				.eraseblocks = { {32 * 1024, 128} },
6023 				.block_erase = spi_block_erase_52,
6024 			}, {
6025 				.eraseblocks = { {64 * 1024, 64} },
6026 				.block_erase = spi_block_erase_d8,
6027 			}, {
6028 				.eraseblocks = { {4 * 1024 * 1024, 1} },
6029 				.block_erase = spi_block_erase_60,
6030 			}, {
6031 				.eraseblocks = { {4 * 1024 * 1024, 1} },
6032 				.block_erase = spi_block_erase_c7,
6033 			}
6034 		},
6035 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6036 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6037 		.write		= spi_chip_write_256,
6038 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6039 		.voltage	= {1695, 1950},
6040 	},
6041 
6042 	{
6043 		.vendor		= "GigaDevice",
6044 		.name		= "GD25LQ40",
6045 		.bustype	= BUS_SPI,
6046 		.manufacture_id	= GIGADEVICE_ID,
6047 		.model_id	= GIGADEVICE_GD25LQ40,
6048 		.total_size	= 512,
6049 		.page_size	= 256,
6050 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6051 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6052 		.tested		= TEST_UNTESTED,
6053 		.probe		= probe_spi_rdid,
6054 		.probe_timing	= TIMING_ZERO,
6055 		.block_erasers	=
6056 		{
6057 			{
6058 				.eraseblocks = { {4 * 1024, 128} },
6059 				.block_erase = spi_block_erase_20,
6060 			}, {
6061 				.eraseblocks = { {32 * 1024, 16} },
6062 				.block_erase = spi_block_erase_52,
6063 			}, {
6064 				.eraseblocks = { {64 * 1024, 8} },
6065 				.block_erase = spi_block_erase_d8,
6066 			}, {
6067 				.eraseblocks = { {512 * 1024, 1} },
6068 				.block_erase = spi_block_erase_60,
6069 			}, {
6070 				.eraseblocks = { {512 * 1024, 1} },
6071 				.block_erase = spi_block_erase_c7,
6072 			}
6073 		},
6074 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6075 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6076 		.write		= spi_chip_write_256,
6077 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6078 		.voltage	= {1695, 1950},
6079 	},
6080 
6081 	{
6082 		.vendor		= "GigaDevice",
6083 		.name		= "GD25LQ64(B)",
6084 		.bustype	= BUS_SPI,
6085 		.manufacture_id	= GIGADEVICE_ID,
6086 		.model_id	= GIGADEVICE_GD25LQ64,
6087 		.total_size	= 8192,
6088 		.page_size	= 256,
6089 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6090 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6091 		.tested		= TEST_OK_PREW,
6092 		.probe		= probe_spi_rdid,
6093 		.probe_timing	= TIMING_ZERO,
6094 		.block_erasers	=
6095 		{
6096 			{
6097 				.eraseblocks = { {4 * 1024, 2048} },
6098 				.block_erase = spi_block_erase_20,
6099 			}, {
6100 				.eraseblocks = { {32 * 1024, 256} },
6101 				.block_erase = spi_block_erase_52,
6102 			}, {
6103 				.eraseblocks = { {64 * 1024, 128} },
6104 				.block_erase = spi_block_erase_d8,
6105 			}, {
6106 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6107 				.block_erase = spi_block_erase_60,
6108 			}, {
6109 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6110 				.block_erase = spi_block_erase_c7,
6111 			}
6112 		},
6113 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6114 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6115 		.write		= spi_chip_write_256,
6116 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6117 		.voltage	= {1695, 1950},
6118 	},
6119 
6120 	{
6121 		.vendor		= "GigaDevice",
6122 		.name		= "GD25LQ80",
6123 		.bustype	= BUS_SPI,
6124 		.manufacture_id	= GIGADEVICE_ID,
6125 		.model_id	= GIGADEVICE_GD25LQ80,
6126 		.total_size	= 1024,
6127 		.page_size	= 256,
6128 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6129 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6130 		.tested		= TEST_UNTESTED,
6131 		.probe		= probe_spi_rdid,
6132 		.probe_timing	= TIMING_ZERO,
6133 		.block_erasers	=
6134 		{
6135 			{
6136 				.eraseblocks = { {4 * 1024, 256} },
6137 				.block_erase = spi_block_erase_20,
6138 			}, {
6139 				.eraseblocks = { {32 * 1024, 32} },
6140 				.block_erase = spi_block_erase_52,
6141 			}, {
6142 				.eraseblocks = { {64 * 1024, 16} },
6143 				.block_erase = spi_block_erase_d8,
6144 			}, {
6145 				.eraseblocks = { {1 * 1024 * 1024, 1} },
6146 				.block_erase = spi_block_erase_60,
6147 			}, {
6148 				.eraseblocks = { {1 * 1024 * 1024, 1} },
6149 				.block_erase = spi_block_erase_c7,
6150 			}
6151 		},
6152 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6153 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6154 		.write		= spi_chip_write_256,
6155 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6156 		.voltage	= {1695, 1950},
6157 	},
6158 
6159 	{
6160 		.vendor		= "GigaDevice",
6161 		.name		= "GD25Q10",
6162 		.bustype	= BUS_SPI,
6163 		.manufacture_id	= GIGADEVICE_ID,
6164 		.model_id	= GIGADEVICE_GD25Q10,
6165 		.total_size	= 128,
6166 		.page_size	= 256,
6167 		.feature_bits	= FEATURE_WRSR_WREN,
6168 		.tested		= TEST_UNTESTED,
6169 		.probe		= probe_spi_rdid,
6170 		.probe_timing	= TIMING_ZERO,
6171 		.block_erasers	=
6172 		{
6173 			{
6174 				.eraseblocks = { {4 * 1024, 32} },
6175 				.block_erase = spi_block_erase_20,
6176 			}, {
6177 				.eraseblocks = { {32 * 1024, 4} },
6178 				.block_erase = spi_block_erase_52,
6179 			}, {
6180 				.eraseblocks = { {64 * 1024, 2} },
6181 				.block_erase = spi_block_erase_d8,
6182 			}, {
6183 				.eraseblocks = { {128 * 1024, 1} },
6184 				.block_erase = spi_block_erase_60,
6185 			}, {
6186 				.eraseblocks = { {128 * 1024, 1} },
6187 				.block_erase = spi_block_erase_c7,
6188 			}
6189 		},
6190 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6191 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6192 		.write		= spi_chip_write_256,
6193 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6194 		.voltage	= {2700, 3600},
6195 	},
6196 
6197 	{
6198 		.vendor		= "GigaDevice",
6199 		.name		= "GD25Q127C/GD25Q128C",
6200 		.bustype	= BUS_SPI,
6201 		.manufacture_id	= GIGADEVICE_ID,
6202 		.model_id	= GIGADEVICE_GD25Q128,
6203 		.total_size	= 16384,
6204 		.page_size	= 256,
6205 		/* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6206 		/* QPI: enable 0x38, disable 0xFF */
6207 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6208 		.tested		= TEST_OK_PREW,
6209 		.probe		= probe_spi_rdid,
6210 		.probe_timing	= TIMING_ZERO,
6211 		.block_erasers	=
6212 		{
6213 			{
6214 				.eraseblocks = { {4 * 1024, 4096} },
6215 				.block_erase = spi_block_erase_20,
6216 			}, {
6217 				.eraseblocks = { {32 * 1024, 512} },
6218 				.block_erase = spi_block_erase_52,
6219 			}, {
6220 				.eraseblocks = { {64 * 1024, 256} },
6221 				.block_erase = spi_block_erase_d8,
6222 			}, {
6223 				.eraseblocks = { {16 * 1024 * 1024, 1} },
6224 				.block_erase = spi_block_erase_60,
6225 			}, {
6226 				.eraseblocks = { {16 * 1024 * 1024, 1} },
6227 				.block_erase = spi_block_erase_c7,
6228 			}
6229 		},
6230 		/* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6231 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6232 		.unlock		= spi_disable_blockprotect_bp4_srwd,
6233 		.write		= spi_chip_write_256,
6234 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6235 		.voltage	= {2700, 3600},
6236 	},
6237 
6238 	{
6239 		.vendor		= "GigaDevice",
6240 		.name		= "GD25Q16(B)",
6241 		.bustype	= BUS_SPI,
6242 		.manufacture_id	= GIGADEVICE_ID,
6243 		.model_id	= GIGADEVICE_GD25Q16,
6244 		.total_size	= 2048,
6245 		.page_size	= 256,
6246 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
6247 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6248 		.tested		= TEST_OK_PREW,
6249 		.probe		= probe_spi_rdid,
6250 		.probe_timing	= TIMING_ZERO,
6251 		.block_erasers	=
6252 		{
6253 			{
6254 				.eraseblocks = { {4 * 1024, 512} },
6255 				.block_erase = spi_block_erase_20,
6256 			}, {
6257 				.eraseblocks = { {32 * 1024, 64} },
6258 				.block_erase = spi_block_erase_52,
6259 			}, {
6260 				.eraseblocks = { {64 * 1024, 32} },
6261 				.block_erase = spi_block_erase_d8,
6262 			}, {
6263 				.eraseblocks = { {2 * 1024 * 1024, 1} },
6264 				.block_erase = spi_block_erase_60,
6265 			}, {
6266 				.eraseblocks = { {2 * 1024 * 1024, 1} },
6267 				.block_erase = spi_block_erase_c7,
6268 			}
6269 		},
6270 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6271 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6272 		.write		= spi_chip_write_256,
6273 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6274 		.voltage	= {2700, 3600},
6275 	},
6276 
6277 	{
6278 		.vendor		= "GigaDevice",
6279 		.name		= "GD25Q20(B)",
6280 		.bustype	= BUS_SPI,
6281 		.manufacture_id	= GIGADEVICE_ID,
6282 		.model_id	= GIGADEVICE_GD25Q20,
6283 		.total_size	= 256,
6284 		.page_size	= 256,
6285 		.feature_bits	= FEATURE_WRSR_WREN,
6286 		.tested		= TEST_OK_PREW,
6287 		.probe		= probe_spi_rdid,
6288 		.probe_timing	= TIMING_ZERO,
6289 		.block_erasers	=
6290 		{
6291 			{
6292 				.eraseblocks = { {4 * 1024, 64} },
6293 				.block_erase = spi_block_erase_20,
6294 			}, {
6295 				.eraseblocks = { {32 * 1024, 8} },
6296 				.block_erase = spi_block_erase_52,
6297 			}, {
6298 				.eraseblocks = { {64 * 1024, 4} },
6299 				.block_erase = spi_block_erase_d8,
6300 			}, {
6301 				.eraseblocks = { {256 * 1024, 1} },
6302 				.block_erase = spi_block_erase_60,
6303 			}, {
6304 				.eraseblocks = { {256 * 1024, 1} },
6305 				.block_erase = spi_block_erase_c7,
6306 			}
6307 		},
6308 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6309 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6310 		.write		= spi_chip_write_256,
6311 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6312 		.voltage	= {2700, 3600},
6313 	},
6314 
6315 	{
6316 		.vendor		= "GigaDevice",
6317 		.name		= "GD25Q256D",
6318 		.bustype	= BUS_SPI,
6319 		.manufacture_id	= GIGADEVICE_ID,
6320 		.model_id	= GIGADEVICE_GD25Q256D,
6321 		.total_size	= 32768,
6322 		.page_size	= 256,
6323 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
6324 		.tested		= TEST_UNTESTED,
6325 		.probe		= probe_spi_rdid,
6326 		.probe_timing	= TIMING_ZERO,
6327 		.block_erasers	=
6328 		{
6329 			{
6330 				.eraseblocks = { {4 * 1024, 8192} },
6331 				.block_erase = spi_block_erase_21,
6332 			}, {
6333 				.eraseblocks = { {4 * 1024, 8192} },
6334 				.block_erase = spi_block_erase_20,
6335 			}, {
6336 				.eraseblocks = { {32 * 1024, 1024} },
6337 				.block_erase = spi_block_erase_5c,
6338 			}, {
6339 				.eraseblocks = { {32 * 1024, 1024} },
6340 				.block_erase = spi_block_erase_52,
6341 			}, {
6342 				.eraseblocks = { {64 * 1024, 512} },
6343 				.block_erase = spi_block_erase_dc,
6344 			}, {
6345 				.eraseblocks = { {64 * 1024, 512} },
6346 				.block_erase = spi_block_erase_d8,
6347 			}, {
6348 				.eraseblocks = { {32 * 1024 * 1024, 1} },
6349 				.block_erase = spi_block_erase_60,
6350 			}, {
6351 				.eraseblocks = { {32 * 1024 * 1024, 1} },
6352 				.block_erase = spi_block_erase_c7,
6353 			}
6354 		},
6355 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
6356 		.unlock		= spi_disable_blockprotect,
6357 		.write		= spi_chip_write_256,
6358 		.read		= spi_chip_read,
6359 		.voltage	= {2700, 3600},
6360 	},
6361 
6362 	{
6363 		.vendor		= "GigaDevice",
6364 		.name		= "GD25Q32(B)",
6365 		.bustype	= BUS_SPI,
6366 		.manufacture_id	= GIGADEVICE_ID,
6367 		.model_id	= GIGADEVICE_GD25Q32,
6368 		.total_size	= 4096,
6369 		.page_size	= 256,
6370 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6371 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6372 		.tested		= TEST_OK_PREW,
6373 		.probe		= probe_spi_rdid,
6374 		.probe_timing	= TIMING_ZERO,
6375 		.block_erasers	=
6376 		{
6377 			{
6378 				.eraseblocks = { {4 * 1024, 1024} },
6379 				.block_erase = spi_block_erase_20,
6380 			}, {
6381 				.eraseblocks = { {32 * 1024, 128} },
6382 				.block_erase = spi_block_erase_52,
6383 			}, {
6384 				.eraseblocks = { {64 * 1024, 64} },
6385 				.block_erase = spi_block_erase_d8,
6386 			}, {
6387 				.eraseblocks = { {4 * 1024 * 1024, 1} },
6388 				.block_erase = spi_block_erase_60,
6389 			}, {
6390 				.eraseblocks = { {4 * 1024 * 1024, 1} },
6391 				.block_erase = spi_block_erase_c7,
6392 			}
6393 		},
6394 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6395 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6396 		.write		= spi_chip_write_256,
6397 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6398 		.voltage	= {2700, 3600},
6399 	},
6400 
6401 	{
6402 		.vendor		= "GigaDevice",
6403 		.name		= "GD25Q40(B)",
6404 		.bustype	= BUS_SPI,
6405 		.manufacture_id	= GIGADEVICE_ID,
6406 		.model_id	= GIGADEVICE_GD25Q40,
6407 		.total_size	= 512,
6408 		.page_size	= 256,
6409 		.feature_bits	= FEATURE_WRSR_WREN,
6410 		.tested		= TEST_UNTESTED,
6411 		.probe		= probe_spi_rdid,
6412 		.probe_timing	= TIMING_ZERO,
6413 		.block_erasers	=
6414 		{
6415 			{
6416 				.eraseblocks = { {4 * 1024, 128} },
6417 				.block_erase = spi_block_erase_20,
6418 			}, {
6419 				.eraseblocks = { {32 * 1024, 16} },
6420 				.block_erase = spi_block_erase_52,
6421 			}, {
6422 				.eraseblocks = { {64 * 1024, 8} },
6423 				.block_erase = spi_block_erase_d8,
6424 			}, {
6425 				.eraseblocks = { {512 * 1024, 1} },
6426 				.block_erase = spi_block_erase_60,
6427 			}, {
6428 				.eraseblocks = { {512 * 1024, 1} },
6429 				.block_erase = spi_block_erase_c7,
6430 			}
6431 		},
6432 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6433 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6434 		.write		= spi_chip_write_256,
6435 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6436 		.voltage	= {2700, 3600},
6437 	},
6438 
6439 	{
6440 		.vendor		= "GigaDevice",
6441 		.name		= "GD25Q512",
6442 		.bustype	= BUS_SPI,
6443 		.manufacture_id	= GIGADEVICE_ID,
6444 		.model_id	= GIGADEVICE_GD25Q512,
6445 		.total_size	= 64,
6446 		.page_size	= 256,
6447 		.feature_bits	= FEATURE_WRSR_WREN,
6448 		.tested		= TEST_OK_PREW,
6449 		.probe		= probe_spi_rdid,
6450 		.probe_timing	= TIMING_ZERO,
6451 		.block_erasers	=
6452 		{
6453 			{
6454 				.eraseblocks = { {4 * 1024, 16} },
6455 				.block_erase = spi_block_erase_20,
6456 			}, {
6457 				.eraseblocks = { {32 * 1024, 2} },
6458 				.block_erase = spi_block_erase_52,
6459 			}, {
6460 				.eraseblocks = { {64 * 1024, 1} },
6461 				.block_erase = spi_block_erase_60,
6462 			}, {
6463 				.eraseblocks = { {64 * 1024, 1} },
6464 				.block_erase = spi_block_erase_c7,
6465 			}
6466 		},
6467 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6468 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6469 		.write		= spi_chip_write_256,
6470 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6471 		.voltage	= {2700, 3600},
6472 	},
6473 
6474 	{
6475 		.vendor		= "GigaDevice",
6476 		.name		= "GD25Q64(B)",
6477 		.bustype	= BUS_SPI,
6478 		.manufacture_id	= GIGADEVICE_ID,
6479 		.model_id	= GIGADEVICE_GD25Q64,
6480 		.total_size	= 8192,
6481 		.page_size	= 256,
6482 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6483 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6484 		.tested		= TEST_OK_PREW,
6485 		.probe		= probe_spi_rdid,
6486 		.probe_timing	= TIMING_ZERO,
6487 		.block_erasers	=
6488 		{
6489 			{
6490 				.eraseblocks = { {4 * 1024, 2048} },
6491 				.block_erase = spi_block_erase_20,
6492 			}, {
6493 				.eraseblocks = { {32 * 1024, 256} },
6494 				.block_erase = spi_block_erase_52,
6495 			}, {
6496 				.eraseblocks = { {64 * 1024, 128} },
6497 				.block_erase = spi_block_erase_d8,
6498 			}, {
6499 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6500 				.block_erase = spi_block_erase_60,
6501 			}, {
6502 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6503 				.block_erase = spi_block_erase_c7,
6504 			}
6505 		},
6506 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6507 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6508 		.write		= spi_chip_write_256,
6509 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6510 		.voltage	= {2700, 3600},
6511 	},
6512 
6513 	{
6514 		.vendor		= "GigaDevice",
6515 		.name		= "GD25Q80(B)",
6516 		.bustype	= BUS_SPI,
6517 		.manufacture_id	= GIGADEVICE_ID,
6518 		.model_id	= GIGADEVICE_GD25Q80,
6519 		.total_size	= 1024,
6520 		.page_size	= 256,
6521 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
6522 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6523 		.tested		= TEST_OK_PREW,
6524 		.probe		= probe_spi_rdid,
6525 		.probe_timing	= TIMING_ZERO,
6526 		.block_erasers	=
6527 		{
6528 			{
6529 				.eraseblocks = { {4 * 1024, 256} },
6530 				.block_erase = spi_block_erase_20,
6531 			}, {
6532 				.eraseblocks = { {32 * 1024, 32} },
6533 				.block_erase = spi_block_erase_52,
6534 			}, {
6535 				.eraseblocks = { {64 * 1024, 16} },
6536 				.block_erase = spi_block_erase_d8,
6537 			}, {
6538 				.eraseblocks = { {1024 * 1024, 1} },
6539 				.block_erase = spi_block_erase_60,
6540 			}, {
6541 				.eraseblocks = { {1024 * 1024, 1} },
6542 				.block_erase = spi_block_erase_c7,
6543 			}
6544 		},
6545 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6546 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6547 		.write		= spi_chip_write_256,
6548 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6549 		.voltage	= {2700, 3600},
6550 	},
6551 
6552 	{
6553 		.vendor		= "GigaDevice",
6554 		.name		= "GD25T80",
6555 		.bustype	= BUS_SPI,
6556 		.manufacture_id	= GIGADEVICE_ID,
6557 		.model_id	= GIGADEVICE_GD25T80,
6558 		.total_size	= 1024,
6559 		.page_size	= 256,
6560 		/* OTP: 256B total; enter 0x3A */
6561 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6562 		.tested		= TEST_UNTESTED,
6563 		.probe		= probe_spi_rdid,
6564 		.probe_timing	= TIMING_ZERO,
6565 		.block_erasers	=
6566 		{
6567 			{
6568 				.eraseblocks = { {4 * 1024, 256} },
6569 				.block_erase = spi_block_erase_20,
6570 			}, {
6571 				.eraseblocks = { {64 * 1024, 16} },
6572 				.block_erase = spi_block_erase_52,
6573 			}, {
6574 				.eraseblocks = { {64 * 1024, 16} },
6575 				.block_erase = spi_block_erase_d8,
6576 			}, {
6577 				.eraseblocks = { {1024 * 1024, 1} },
6578 				.block_erase = spi_block_erase_60,
6579 			}, {
6580 				.eraseblocks = { {1024 * 1024, 1} },
6581 				.block_erase = spi_block_erase_c7,
6582 			}
6583 		},
6584 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
6585 		.unlock		= spi_disable_blockprotect,
6586 		.write		= spi_chip_write_256,
6587 		.read		= spi_chip_read,
6588 		.voltage	= {2700, 3600},
6589 	},
6590 
6591 	{
6592 		.vendor		= "GigaDevice",
6593 		.name		= "GD25VQ16C",
6594 		.bustype	= BUS_SPI,
6595 		.manufacture_id	= GIGADEVICE_ID,
6596 		.model_id	= GIGADEVICE_GD25VQ16C,
6597 		.total_size	= 2 * 1024,
6598 		.page_size	= 256,
6599 		/* Supports SFDP */
6600 		/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6601 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6602 		.tested		= TEST_UNTESTED,
6603 		.probe		= probe_spi_rdid,
6604 		.probe_timing	= TIMING_ZERO,
6605 		.block_erasers	=
6606 		{
6607 			{
6608 				.eraseblocks = { { 4 * 1024, 512} },
6609 				.block_erase = spi_block_erase_20,
6610 			}, {
6611 				.eraseblocks = { { 32 * 1024, 64} },
6612 				.block_erase = spi_block_erase_52,
6613 			}, {
6614 				.eraseblocks = { { 64 * 1024, 32} },
6615 				.block_erase = spi_block_erase_d8,
6616 			}, {
6617 				.eraseblocks = { {2 * 1024 * 1024, 1} },
6618 				.block_erase = spi_block_erase_60,
6619 			}, {
6620 				.eraseblocks = { {2 * 1024 * 1024, 1} },
6621 				.block_erase = spi_block_erase_c7,
6622 			}
6623 		},
6624 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6625 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6626 		.write		= spi_chip_write_256,
6627 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6628 		.voltage	= {2300, 3600},
6629 	},
6630 
6631 	{
6632 		.vendor		= "GigaDevice",
6633 		.name		= "GD25VQ21B",
6634 		.bustype	= BUS_SPI,
6635 		.manufacture_id	= GIGADEVICE_ID,
6636 		.model_id	= GIGADEVICE_GD25VQ21B,
6637 		.total_size	= 256,
6638 		.page_size	= 256,
6639 		/* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6640 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6641 		.tested		= TEST_UNTESTED,
6642 		.probe		= probe_spi_rdid,
6643 		.probe_timing	= TIMING_ZERO,
6644 		.block_erasers	=
6645 		{
6646 			{
6647 				.eraseblocks = { { 4 * 1024, 64} },
6648 				.block_erase = spi_block_erase_20,
6649 			}, {
6650 				.eraseblocks = { { 32 * 1024, 8} },
6651 				.block_erase = spi_block_erase_52,
6652 			}, {
6653 				.eraseblocks = { { 64 * 1024, 4} },
6654 				.block_erase = spi_block_erase_d8,
6655 			}, {
6656 				.eraseblocks = { {256 * 1024, 1} },
6657 				.block_erase = spi_block_erase_60,
6658 			}, {
6659 				.eraseblocks = { {256 * 1024, 1} },
6660 				.block_erase = spi_block_erase_c7,
6661 			}
6662 		},
6663 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6664 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6665 		.write		= spi_chip_write_256,
6666 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6667 		.voltage	= {2300, 3600},
6668 	},
6669 
6670 	{
6671 		.vendor		= "GigaDevice",
6672 		.name		= "GD25VQ40C",
6673 		.bustype	= BUS_SPI,
6674 		.manufacture_id	= GIGADEVICE_ID,
6675 		.model_id	= GIGADEVICE_GD25VQ41B,
6676 		.total_size	= 512,
6677 		.page_size	= 256,
6678 		/* Supports SFDP */
6679 		/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6680 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6681 		.tested		= TEST_UNTESTED,
6682 		.probe		= probe_spi_rdid,
6683 		.probe_timing	= TIMING_ZERO,
6684 		.block_erasers	=
6685 		{
6686 			{
6687 				.eraseblocks = { { 4 * 1024, 128} },
6688 				.block_erase = spi_block_erase_20,
6689 			}, {
6690 				.eraseblocks = { { 32 * 1024, 16} },
6691 				.block_erase = spi_block_erase_52,
6692 			}, {
6693 				.eraseblocks = { { 64 * 1024, 8} },
6694 				.block_erase = spi_block_erase_d8,
6695 			}, {
6696 				.eraseblocks = { {512 * 1024, 1} },
6697 				.block_erase = spi_block_erase_60,
6698 			}, {
6699 				.eraseblocks = { {512 * 1024, 1} },
6700 				.block_erase = spi_block_erase_c7,
6701 			}
6702 		},
6703 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6704 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6705 		.write		= spi_chip_write_256,
6706 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6707 		.voltage	= {2300, 3600},
6708 	},
6709 
6710 	{
6711 		.vendor		= "GigaDevice",
6712 		.name		= "GD25VQ41B",
6713 		.bustype	= BUS_SPI,
6714 		.manufacture_id	= GIGADEVICE_ID,
6715 		.model_id	= GIGADEVICE_GD25VQ41B,
6716 		.total_size	= 512,
6717 		.page_size	= 256,
6718 		/* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6719 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6720 		.tested		= TEST_OK_PREW,
6721 		.probe		= probe_spi_rdid,
6722 		.probe_timing	= TIMING_ZERO,
6723 		.block_erasers	=
6724 		{
6725 			{
6726 				.eraseblocks = { { 4 * 1024, 128} },
6727 				.block_erase = spi_block_erase_20,
6728 			}, {
6729 				.eraseblocks = { { 32 * 1024, 16} },
6730 				.block_erase = spi_block_erase_52,
6731 			}, {
6732 				.eraseblocks = { { 64 * 1024, 8} },
6733 				.block_erase = spi_block_erase_d8,
6734 			}, {
6735 				.eraseblocks = { {512 * 1024, 1} },
6736 				.block_erase = spi_block_erase_60,
6737 			}, {
6738 				.eraseblocks = { {512 * 1024, 1} },
6739 				.block_erase = spi_block_erase_c7,
6740 			}
6741 		},
6742 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6743 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6744 		.write		= spi_chip_write_256,
6745 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6746 		.voltage	= {2300, 3600},
6747 	},
6748 
6749 	{
6750 		.vendor		= "GigaDevice",
6751 		.name		= "GD25VQ80C",
6752 		.bustype	= BUS_SPI,
6753 		.manufacture_id	= GIGADEVICE_ID,
6754 		.model_id	= GIGADEVICE_GD25VQ80C,
6755 		.total_size	= 1024,
6756 		.page_size	= 256,
6757 		/* Supports SFDP */
6758 		/* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6759 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6760 		.tested		= TEST_UNTESTED,
6761 		.probe		= probe_spi_rdid,
6762 		.probe_timing	= TIMING_ZERO,
6763 		.block_erasers	=
6764 		{
6765 			{
6766 				.eraseblocks = { { 4 * 1024, 256} },
6767 				.block_erase = spi_block_erase_20,
6768 			}, {
6769 				.eraseblocks = { { 32 * 1024, 32} },
6770 				.block_erase = spi_block_erase_52,
6771 			}, {
6772 				.eraseblocks = { { 64 * 1024, 16} },
6773 				.block_erase = spi_block_erase_d8,
6774 			}, {
6775 				.eraseblocks = { {1024 * 1024, 1} },
6776 				.block_erase = spi_block_erase_60,
6777 			}, {
6778 				.eraseblocks = { {1024 * 1024, 1} },
6779 				.block_erase = spi_block_erase_c7,
6780 			}
6781 		},
6782 		.printlock	= spi_prettyprint_status_register_bp4_srwd,
6783 		.unlock		= spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6784 		.write		= spi_chip_write_256,
6785 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6786 		.voltage	= {2300, 3600},
6787 	},
6788 
6789 	{
6790 		.vendor		= "Hyundai",
6791 		.name		= "HY29F002B",
6792 		.bustype	= BUS_PARALLEL,
6793 		.manufacture_id	= HYUNDAI_ID,
6794 		.model_id	= HYUNDAI_HY29F002B,
6795 		.total_size	= 256,
6796 		.page_size	= 256 * 1024,
6797 		.feature_bits	= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6798 		.tested		= TEST_UNTESTED,
6799 		.probe		= probe_jedec,
6800 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
6801 		.block_erasers	=
6802 		{
6803 			{
6804 				.eraseblocks = {
6805 					{16 * 1024, 1},
6806 					{8 * 1024, 2},
6807 					{32 * 1024, 1},
6808 					{64 * 1024, 3},
6809 				},
6810 				.block_erase = erase_sector_jedec,
6811 			}, {
6812 				.eraseblocks = { {256 * 1024, 1} },
6813 				.block_erase = erase_chip_block_jedec,
6814 			},
6815 		},
6816 		.write		= write_jedec_1,
6817 		.read		= read_memmapped,
6818 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
6819 	},
6820 
6821 	{
6822 		.vendor		= "Hyundai",
6823 		.name		= "HY29F002T",
6824 		.bustype	= BUS_PARALLEL,
6825 		.manufacture_id	= HYUNDAI_ID,
6826 		.model_id	= HYUNDAI_HY29F002T,
6827 		.total_size	= 256,
6828 		.page_size	= 256 * 1024,
6829 		.feature_bits	= FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6830 		.tested		= TEST_OK_PRE,
6831 		.probe		= probe_jedec,
6832 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
6833 		.block_erasers	=
6834 		{
6835 			{
6836 				.eraseblocks = {
6837 					{64 * 1024, 3},
6838 					{32 * 1024, 1},
6839 					{8 * 1024, 2},
6840 					{16 * 1024, 1},
6841 				},
6842 				.block_erase = erase_sector_jedec,
6843 			}, {
6844 				.eraseblocks = { {256 * 1024, 1} },
6845 				.block_erase = erase_chip_block_jedec,
6846 			},
6847 		},
6848 		.write		= write_jedec_1,
6849 		.read		= read_memmapped,
6850 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
6851 	},
6852 
6853 	{
6854 		.vendor		= "Hyundai",
6855 		.name		= "HY29F040A",
6856 		.bustype	= BUS_PARALLEL,
6857 		.manufacture_id	= HYUNDAI_ID,
6858 		.model_id	= HYUNDAI_HY29F040A,
6859 		.total_size	= 512,
6860 		.page_size	= 64 * 1024,
6861 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6862 		.tested		= TEST_UNTESTED,
6863 		.probe		= probe_jedec,
6864 		.probe_timing	= TIMING_ZERO,
6865 		.block_erasers	=
6866 		{
6867 			{
6868 				.eraseblocks = { {64 * 1024, 8} },
6869 				.block_erase = erase_sector_jedec,
6870 			}, {
6871 				.eraseblocks = { {512 * 1024, 1} },
6872 				.block_erase = erase_chip_block_jedec,
6873 			},
6874 		},
6875 		.write		= write_jedec_1,
6876 		.read		= read_memmapped,
6877 		.voltage	= {4500, 5500},
6878 	},
6879 
6880 	{
6881 		.vendor		= "ISSI",
6882 		.name		= "IS25LP064",
6883 		.bustype	= BUS_SPI,
6884 		.manufacture_id	= ISSI_ID_SPI,
6885 		.model_id	= ISSI_IS25LP064,
6886 		.total_size	= 8192,
6887 		.page_size	= 256,
6888 		/* OTP: 1024B total; read 0x48; write 0x42 */
6889 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6890 		.tested		= TEST_UNTESTED,
6891 		.probe		= probe_spi_rdid,
6892 		.probe_timing	= TIMING_ZERO,
6893 		.block_erasers	=
6894 		{
6895 			{
6896 				.eraseblocks = { {4 * 1024, 2048} },
6897 				.block_erase = spi_block_erase_20,
6898 			}, {
6899 				.eraseblocks = { {4 * 1024, 2048} },
6900 				.block_erase = spi_block_erase_d7,
6901 			}, {
6902 				.eraseblocks = { {32 * 1024, 256} },
6903 				.block_erase = spi_block_erase_52,
6904 			}, {
6905 				.eraseblocks = { {64 * 1024, 128} },
6906 				.block_erase = spi_block_erase_d8,
6907 			}, {
6908 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6909 				.block_erase = spi_block_erase_60,
6910 			}, {
6911 				.eraseblocks = { {8 * 1024 * 1024, 1} },
6912 				.block_erase = spi_block_erase_c7,
6913 			}
6914 		},
6915 		.unlock		= spi_disable_blockprotect,
6916 		.write		= spi_chip_write_256,
6917 		.read		= spi_chip_read,
6918 		.voltage	= {2300, 3600},
6919 	},
6920 
6921 	{
6922 		.vendor		= "ISSI",
6923 		.name		= "IS25LP128",
6924 		.bustype	= BUS_SPI,
6925 		.manufacture_id	= ISSI_ID_SPI,
6926 		.model_id	= ISSI_IS25LP128,
6927 		.total_size	= 16384,
6928 		.page_size	= 256,
6929 		/* OTP: 1024B total; read 0x48; write 0x42 */
6930 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
6931 		.tested		= TEST_OK_PREW,
6932 		.probe		= probe_spi_rdid,
6933 		.probe_timing	= TIMING_ZERO,
6934 		.block_erasers	=
6935 		{
6936 			{
6937 				.eraseblocks = { {4 * 1024, 4096} },
6938 				.block_erase = spi_block_erase_20,
6939 			}, {
6940 				.eraseblocks = { {4 * 1024, 4096} },
6941 				.block_erase = spi_block_erase_d7,
6942 			}, {
6943 				.eraseblocks = { {32 * 1024, 512} },
6944 				.block_erase = spi_block_erase_52,
6945 			}, {
6946 				.eraseblocks = { {64 * 1024, 256} },
6947 				.block_erase = spi_block_erase_d8,
6948 			}, {
6949 				.eraseblocks = { {16 * 1024 * 1024, 1} },
6950 				.block_erase = spi_block_erase_60,
6951 			}, {
6952 				.eraseblocks = { {16 * 1024 * 1024, 1} },
6953 				.block_erase = spi_block_erase_c7,
6954 			}
6955 		},
6956 		.unlock		= spi_disable_blockprotect,
6957 		.write		= spi_chip_write_256,
6958 		.read		= spi_chip_read,
6959 		.voltage	= {2300, 3600},
6960 	},
6961 
6962 	{
6963 		.vendor		= "ISSI",
6964 		.name		= "IS25LP256",
6965 		.bustype	= BUS_SPI,
6966 		.manufacture_id	= ISSI_ID_SPI,
6967 		.model_id	= ISSI_IS25LP256,
6968 		.total_size	= 32768,
6969 		.page_size	= 256,
6970 		/* supports SFDP */
6971 		/* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
6972 		/* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
6973 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
6974 		.tested		= TEST_OK_PREW,
6975 		.probe		= probe_spi_rdid,
6976 		.probe_timing	= TIMING_ZERO,
6977 		.block_erasers	=
6978 		{
6979 			{
6980 				.eraseblocks = { {4 * 1024, 8192} },
6981 				.block_erase = spi_block_erase_21,
6982 			}, {
6983 				.eraseblocks = { {4 * 1024, 8192} },
6984 				.block_erase = spi_block_erase_20,
6985 				/* could also use spi_block_erase_d7 */
6986 			}, {
6987 				.eraseblocks = { {32 * 1024, 1024} },
6988 				.block_erase = spi_block_erase_5c,
6989 			}, {
6990 				.eraseblocks = { {32 * 1024, 1024} },
6991 				.block_erase = spi_block_erase_52,
6992 			}, {
6993 				.eraseblocks = { {64 * 1024, 512} },
6994 				.block_erase = spi_block_erase_dc,
6995 			}, {
6996 				.eraseblocks = { {64 * 1024, 512} },
6997 				.block_erase = spi_block_erase_d8,
6998 			}, {
6999 				.eraseblocks = { {32 * 1024 * 1024, 1} },
7000 				.block_erase = spi_block_erase_60,
7001 			}, {
7002 				.eraseblocks = { {32 * 1024 * 1024, 1} },
7003 				.block_erase = spi_block_erase_c7,
7004 			}
7005 		},
7006 		.unlock		= spi_disable_blockprotect,
7007 		.write		= spi_chip_write_256,
7008 		.read		= spi_chip_read,
7009 		.voltage	= {2300, 3600},
7010 	},
7011 
7012 	{
7013 		.vendor		= "ISSI",
7014 		.name		= "IS25WP032",
7015 		.bustype	= BUS_SPI,
7016 		.manufacture_id	= ISSI_ID_SPI,
7017 		.model_id	= ISSI_IS25WP032,
7018 		.total_size	= 4096,
7019 		.page_size	= 256,
7020 		/* OTP: 1024B total; read 0x48; write 0x42 */
7021 		/* QPI enable 0x35, disable 0xF5 */
7022 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7023 		.tested		= TEST_UNTESTED,
7024 		.probe		= probe_spi_rdid,
7025 		.probe_timing	= TIMING_ZERO,
7026 		.block_erasers	=
7027 		{
7028 			{
7029 				.eraseblocks = { {4 * 1024, 1024} },
7030 				.block_erase = spi_block_erase_20,
7031 			}, {
7032 				.eraseblocks = { {4 * 1024, 1024} },
7033 				.block_erase = spi_block_erase_d7,
7034 			}, {
7035 				.eraseblocks = { {32 * 1024, 128} },
7036 				.block_erase = spi_block_erase_52,
7037 			}, {
7038 				.eraseblocks = { {64 * 1024, 64} },
7039 				.block_erase = spi_block_erase_d8,
7040 			}, {
7041 				.eraseblocks = { {4 * 1024 * 1024, 1} },
7042 				.block_erase = spi_block_erase_60,
7043 			}, {
7044 				.eraseblocks = { {4 * 1024 * 1024, 1} },
7045 				.block_erase = spi_block_erase_c7,
7046 			}
7047 		},
7048 		.unlock		= spi_disable_blockprotect,
7049 		.write		= spi_chip_write_256,
7050 		.read		= spi_chip_read,
7051 		.voltage	= {1650, 1950},
7052 	},
7053 
7054 	{
7055 		.vendor		= "ISSI",
7056 		.name		= "IS25WP064",
7057 		.bustype	= BUS_SPI,
7058 		.manufacture_id	= ISSI_ID_SPI,
7059 		.model_id	= ISSI_IS25WP064,
7060 		.total_size	= 8192,
7061 		.page_size	= 256,
7062 		/* OTP: 1024B total; read 0x48; write 0x42 */
7063 		/* QPI enable 0x35, disable 0xF5 */
7064 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7065 		.tested		= TEST_OK_PREW,
7066 		.probe		= probe_spi_rdid,
7067 		.probe_timing	= TIMING_ZERO,
7068 		.block_erasers	=
7069 		{
7070 			{
7071 				.eraseblocks = { {4 * 1024, 2048} },
7072 				.block_erase = spi_block_erase_20,
7073 			}, {
7074 				.eraseblocks = { {4 * 1024, 2048} },
7075 				.block_erase = spi_block_erase_d7,
7076 			}, {
7077 				.eraseblocks = { {32 * 1024, 256} },
7078 				.block_erase = spi_block_erase_52,
7079 			}, {
7080 				.eraseblocks = { {64 * 1024, 128} },
7081 				.block_erase = spi_block_erase_d8,
7082 			}, {
7083 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7084 				.block_erase = spi_block_erase_60,
7085 			}, {
7086 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7087 				.block_erase = spi_block_erase_c7,
7088 			}
7089 		},
7090 		.unlock		= spi_disable_blockprotect,
7091 		.write		= spi_chip_write_256,
7092 		.read		= spi_chip_read,
7093 		.voltage	= {1650, 1950},
7094 	},
7095 
7096 	{
7097 		.vendor		= "ISSI",
7098 		.name		= "IS25WP128",
7099 		.bustype	= BUS_SPI,
7100 		.manufacture_id	= ISSI_ID_SPI,
7101 		.model_id	= ISSI_IS25WP128,
7102 		.total_size	= 16384,
7103 		.page_size	= 256,
7104 		/* OTP: 1024B total; read 0x48; write 0x42 */
7105 		/* QPI enable 0x35, disable 0xF5 */
7106 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7107 		.tested		= TEST_OK_PREW,
7108 		.probe		= probe_spi_rdid,
7109 		.probe_timing	= TIMING_ZERO,
7110 		.block_erasers	=
7111 		{
7112 			{
7113 				.eraseblocks = { {4 * 1024, 4096} },
7114 				.block_erase = spi_block_erase_20,
7115 			}, {
7116 				.eraseblocks = { {4 * 1024, 4096} },
7117 				.block_erase = spi_block_erase_d7,
7118 			}, {
7119 				.eraseblocks = { {32 * 1024, 512} },
7120 				.block_erase = spi_block_erase_52,
7121 			}, {
7122 				.eraseblocks = { {64 * 1024, 256} },
7123 				.block_erase = spi_block_erase_d8,
7124 			}, {
7125 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7126 				.block_erase = spi_block_erase_60,
7127 			}, {
7128 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7129 				.block_erase = spi_block_erase_c7,
7130 			}
7131 		},
7132 		.unlock		= spi_disable_blockprotect,
7133 		.write		= spi_chip_write_256,
7134 		.read		= spi_chip_read,
7135 		.voltage	= {1650, 1950},
7136 	},
7137 
7138 	{
7139 		.vendor		= "ISSI",
7140 		.name		= "IS25WP256",
7141 		.bustype	= BUS_SPI,
7142 		.manufacture_id	= ISSI_ID_SPI,
7143 		.model_id	= ISSI_IS25WP256,
7144 		.total_size	= 32768,
7145 		.page_size	= 256,
7146 		/* supports SFDP */
7147 		/* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7148 		/* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7149 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7150 		.tested		= TEST_OK_PREW,
7151 		.probe		= probe_spi_rdid,
7152 		.probe_timing	= TIMING_ZERO,
7153 		.block_erasers	=
7154 		{
7155 			{
7156 				.eraseblocks = { {4 * 1024, 8192} },
7157 				.block_erase = spi_block_erase_21,
7158 			}, {
7159 				.eraseblocks = { {4 * 1024, 8192} },
7160 				.block_erase = spi_block_erase_20,
7161 				/* could also use spi_block_erase_d7 */
7162 			}, {
7163 				.eraseblocks = { {32 * 1024, 1024} },
7164 				.block_erase = spi_block_erase_5c,
7165 			}, {
7166 				.eraseblocks = { {32 * 1024, 1024} },
7167 				.block_erase = spi_block_erase_52,
7168 			}, {
7169 				.eraseblocks = { {64 * 1024, 512} },
7170 				.block_erase = spi_block_erase_dc,
7171 			}, {
7172 				.eraseblocks = { {64 * 1024, 512} },
7173 				.block_erase = spi_block_erase_d8,
7174 			}, {
7175 				.eraseblocks = { {32 * 1024 * 1024, 1} },
7176 				.block_erase = spi_block_erase_60,
7177 			}, {
7178 				.eraseblocks = { {32 * 1024 * 1024, 1} },
7179 				.block_erase = spi_block_erase_c7,
7180 			}
7181 		},
7182 		.unlock		= spi_disable_blockprotect,
7183 		.write		= spi_chip_write_256,
7184 		.read		= spi_chip_read,
7185 		.voltage	= {1650, 1950},
7186 	},
7187 
7188 	{
7189 		.vendor		= "ISSI",
7190 		.name		= "IS29GL064B",
7191 		.bustype	= BUS_PARALLEL,
7192 		.manufacture_id	= ISSI_ID,
7193 		.model_id	= ISSI_PMC_IS29GL064B,
7194 		.total_size	= 8192,
7195 		.page_size	= 128 * 1024, /* actual page size is 16 */
7196 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7197 		.tested		= TEST_UNTESTED,
7198 		.probe		= probe_jedec_29gl,
7199 		.probe_timing	= TIMING_ZERO,
7200 		.block_erasers	=
7201 		{
7202 			{
7203 				.eraseblocks = {
7204 					{8 * 1024, 8},
7205 					{64 * 1024, 127},
7206 				},
7207 				.block_erase = erase_sector_jedec,
7208 			}, {
7209 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7210 				.block_erase = erase_chip_block_jedec,
7211 			},
7212 		},
7213 		.write		= write_jedec_1,
7214 		.read		= read_memmapped,
7215 		.voltage	= {2700, 3600},
7216 	},
7217 
7218 	{
7219 		.vendor		= "ISSI",
7220 		.name		= "IS29GL064H/L",
7221 		.bustype	= BUS_PARALLEL,
7222 		.manufacture_id	= ISSI_ID,
7223 		.model_id	= ISSI_PMC_IS29GL064HL,
7224 		.total_size	= 8192,
7225 		.page_size	= 128 * 1024, /* actual page size is 16 */
7226 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7227 		.tested		= TEST_UNTESTED,
7228 		.probe		= probe_jedec_29gl,
7229 		.probe_timing	= TIMING_ZERO,
7230 		.block_erasers	=
7231 		{
7232 			{
7233 				.eraseblocks = { {64 * 1024, 128} },
7234 				.block_erase = erase_sector_jedec,
7235 			}, {
7236 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7237 				.block_erase = erase_chip_block_jedec,
7238 			},
7239 		},
7240 		.write		= write_jedec_1,
7241 		.read		= read_memmapped,
7242 		.voltage	= {2700, 3600},
7243 	},
7244 
7245 	{
7246 		.vendor		= "ISSI",
7247 		.name		= "IS29GL064T",
7248 		.bustype	= BUS_PARALLEL,
7249 		.manufacture_id	= ISSI_ID,
7250 		.model_id	= ISSI_PMC_IS29GL064T,
7251 		.total_size	= 8192,
7252 		.page_size	= 128 * 1024, /* actual page size is 16 */
7253 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7254 		.tested		= TEST_UNTESTED,
7255 		.probe		= probe_jedec_29gl,
7256 		.probe_timing	= TIMING_ZERO,
7257 		.block_erasers	=
7258 		{
7259 			{
7260 				.eraseblocks = {
7261 					{64 * 1024, 127},
7262 					{8 * 1024, 8},
7263 				},
7264 				.block_erase = erase_sector_jedec,
7265 			}, {
7266 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7267 				.block_erase = erase_chip_block_jedec,
7268 			},
7269 		},
7270 		.write		= write_jedec_1,
7271 		.read		= read_memmapped,
7272 		.voltage	= {2700, 3600},
7273 	},
7274 
7275 	{
7276 		.vendor		= "ISSI",
7277 		.name		= "IS29GL128H/L",
7278 		.bustype	= BUS_PARALLEL,
7279 		.manufacture_id	= ISSI_ID,
7280 		.model_id	= ISSI_PMC_IS29GL128HL,
7281 		.total_size	= 16384,
7282 		.page_size	= 128 * 1024, /* actual page size is 16 */
7283 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7284 		.tested		= TEST_UNTESTED,
7285 		.probe		= probe_jedec_29gl,
7286 		.probe_timing	= TIMING_ZERO,
7287 		.block_erasers	=
7288 		{
7289 			{
7290 				.eraseblocks = { {128 * 1024, 128} },
7291 				.block_erase = erase_sector_jedec,
7292 			}, {
7293 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7294 				.block_erase = erase_chip_block_jedec,
7295 			},
7296 		},
7297 		.write		= write_jedec_1,
7298 		.read		= read_memmapped,
7299 		.voltage	= {2700, 3600},
7300 	},
7301 
7302 	{
7303 		.vendor		= "Intel",
7304 		.name		= "25F160S33B8",
7305 		.bustype	= BUS_SPI,
7306 		.manufacture_id	= INTEL_ID,
7307 		.model_id	= INTEL_25F160S33B8,
7308 		.total_size	= 2048,
7309 		.page_size	= 256,
7310 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7311 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7312 		.tested		= TEST_UNTESTED,
7313 		.probe		= probe_spi_rdid,
7314 		.probe_timing	= TIMING_ZERO,
7315 		.block_erasers	=
7316 		{
7317 			{
7318 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7319 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7320 				 * have no effect on the memory contents, but sets a flag in the SR.
7321 				.eraseblocks = {
7322 					{8 * 1024, 8},
7323 					{64 * 1024, 31} // inaccessible
7324 				},
7325 				.block_erase = spi_block_erase_40,
7326 			}, { */
7327 				.eraseblocks = { {64 * 1024, 32} },
7328 				.block_erase = spi_block_erase_d8,
7329 			}, {
7330 				.eraseblocks = { {2 * 1024 * 1024, 1} },
7331 				.block_erase = spi_block_erase_c7,
7332 			}
7333 		},
7334 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7335 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7336 		.write		= spi_chip_write_256,
7337 		.read		= spi_chip_read,	/* also fast read 0x0B */
7338 		.voltage	= {2700, 3600},
7339 	},
7340 
7341 	{
7342 		.vendor		= "Intel",
7343 		.name		= "25F160S33T8",
7344 		.bustype	= BUS_SPI,
7345 		.manufacture_id	= INTEL_ID,
7346 		.model_id	= INTEL_25F160S33T8,
7347 		.total_size	= 2048,
7348 		.page_size	= 256,
7349 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7350 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7351 		.tested		= TEST_UNTESTED,
7352 		.probe		= probe_spi_rdid,
7353 		.probe_timing	= TIMING_ZERO,
7354 		.block_erasers	=
7355 		{
7356 			{
7357 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7358 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7359 				 * have no effect on the memory contents, but sets a flag in the SR.
7360 				.eraseblocks = {
7361 					{64 * 1024, 31}, // inaccessible
7362 					{8 * 1024, 8}
7363 				},
7364 				.block_erase = spi_block_erase_40,
7365 			}, { */
7366 				.eraseblocks = { {64 * 1024, 32} },
7367 				.block_erase = spi_block_erase_d8,
7368 			}, {
7369 				.eraseblocks = { {2 * 1024 * 1024, 1} },
7370 				.block_erase = spi_block_erase_c7,
7371 			}
7372 		},
7373 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7374 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7375 		.write		= spi_chip_write_256,
7376 		.read		= spi_chip_read,	/* also fast read 0x0B */
7377 		.voltage	= {2700, 3600},
7378 	},
7379 
7380 	{
7381 		.vendor		= "Intel",
7382 		.name		= "25F320S33B8",
7383 		.bustype	= BUS_SPI,
7384 		.manufacture_id	= INTEL_ID,
7385 		.model_id	= INTEL_25F320S33B8,
7386 		.total_size	= 4096,
7387 		.page_size	= 256,
7388 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7389 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7390 		.tested		= TEST_UNTESTED,
7391 		.probe		= probe_spi_rdid,
7392 		.probe_timing	= TIMING_ZERO,
7393 		.block_erasers	=
7394 		{
7395 			{
7396 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7397 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7398 				 * have no effect on the memory contents, but sets a flag in the SR.
7399 				.eraseblocks = {
7400 					{8 * 1024, 8},
7401 					{64 * 1024, 63} // inaccessible
7402 				},
7403 				.block_erase = spi_block_erase_40,
7404 			}, { */
7405 				.eraseblocks = { {64 * 1024, 64} },
7406 				.block_erase = spi_block_erase_d8,
7407 			}, {
7408 				.eraseblocks = { {4 * 1024 * 1024, 1} },
7409 				.block_erase = spi_block_erase_c7,
7410 			}
7411 		},
7412 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7413 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7414 		.write		= spi_chip_write_256,
7415 		.read		= spi_chip_read,	/* also fast read 0x0B */
7416 		.voltage	= {2700, 3600},
7417 	},
7418 
7419 	{
7420 		.vendor		= "Intel",
7421 		.name		= "25F320S33T8",
7422 		.bustype	= BUS_SPI,
7423 		.manufacture_id	= INTEL_ID,
7424 		.model_id	= INTEL_25F320S33T8,
7425 		.total_size	= 4096,
7426 		.page_size	= 256,
7427 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7428 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7429 		.tested		= TEST_UNTESTED,
7430 		.probe		= probe_spi_rdid,
7431 		.probe_timing	= TIMING_ZERO,
7432 		.block_erasers	=
7433 		{
7434 			{
7435 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7436 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7437 				 * have no effect on the memory contents, but sets a flag in the SR.
7438 				.eraseblocks = {
7439 					{64 * 1024, 63}, // inaccessible
7440 					{8 * 1024, 8}
7441 				},
7442 				.block_erase = spi_block_erase_40,
7443 			}, { */
7444 				.eraseblocks = { {64 * 1024, 64} },
7445 				.block_erase = spi_block_erase_d8,
7446 			}, {
7447 				.eraseblocks = { {4 * 1024 * 1024, 1} },
7448 				.block_erase = spi_block_erase_c7,
7449 			}
7450 		},
7451 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7452 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7453 		.write		= spi_chip_write_256,
7454 		.read		= spi_chip_read,	/* also fast read 0x0B */
7455 		.voltage	= {2700, 3600},
7456 	},
7457 
7458 	{
7459 		.vendor		= "Intel",
7460 		.name		= "25F640S33B8",
7461 		.bustype	= BUS_SPI,
7462 		.manufacture_id	= INTEL_ID,
7463 		.model_id	= INTEL_25F640S33B8,
7464 		.total_size	= 8192,
7465 		.page_size	= 256,
7466 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7467 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7468 		.tested		= TEST_UNTESTED,
7469 		.probe		= probe_spi_rdid,
7470 		.probe_timing	= TIMING_ZERO,
7471 		.block_erasers	=
7472 		{
7473 			{
7474 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7475 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7476 				 * have no effect on the memory contents, but sets a flag in the SR.
7477 				.eraseblocks = {
7478 					{8 * 1024, 8},
7479 					{64 * 1024, 127} // inaccessible
7480 				},
7481 				.block_erase = spi_block_erase_40,
7482 			}, { */
7483 				.eraseblocks = { {64 * 1024, 128} },
7484 				.block_erase = spi_block_erase_d8,
7485 			}, {
7486 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7487 				.block_erase = spi_block_erase_c7,
7488 			}
7489 		},
7490 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7491 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7492 		.write		= spi_chip_write_256,
7493 		.read		= spi_chip_read,	/* also fast read 0x0B */
7494 		.voltage	= {2700, 3600},
7495 	},
7496 
7497 	{
7498 		.vendor		= "Intel",
7499 		.name		= "25F640S33T8",
7500 		.bustype	= BUS_SPI,
7501 		.manufacture_id	= INTEL_ID,
7502 		.model_id	= INTEL_25F640S33T8,
7503 		.total_size	= 8192,
7504 		.page_size	= 256,
7505 		/* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7506 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7507 		.tested		= TEST_UNTESTED,
7508 		.probe		= probe_spi_rdid,
7509 		.probe_timing	= TIMING_ZERO,
7510 		.block_erasers	=
7511 		{
7512 			{
7513 				/* This chip supports erasing of the 8 so-called "parameter blocks" with
7514 				 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7515 				 * have no effect on the memory contents, but sets a flag in the SR.
7516 				.eraseblocks = {
7517 					{64 * 1024, 127}, // inaccessible
7518 					{8 * 1024, 8}
7519 				},
7520 				.block_erase = spi_block_erase_40,
7521 			}, { */
7522 				.eraseblocks = { {64 * 1024, 128} },
7523 				.block_erase = spi_block_erase_d8,
7524 			}, {
7525 				.eraseblocks = { {8 * 1024 * 1024, 1} },
7526 				.block_erase = spi_block_erase_c7,
7527 			}
7528 		},
7529 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd,
7530 		.unlock		= spi_disable_blockprotect_bp2_ep_srwd,
7531 		.write		= spi_chip_write_256,
7532 		.read		= spi_chip_read,	/* also fast read 0x0B */
7533 		.voltage	= {2700, 3600},
7534 	},
7535 
7536 	{
7537 		.vendor		= "Intel",
7538 		.name		= "28F001BN/BX-B",
7539 		.bustype	= BUS_PARALLEL,
7540 		.manufacture_id	= INTEL_ID,
7541 		.model_id	= INTEL_28F001B,
7542 		.total_size	= 128,
7543 		.page_size	= 128 * 1024, /* 8k + 2x4k + 112k */
7544 		.tested		= TEST_UNTESTED,
7545 		.probe		= probe_jedec,
7546 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7547 		.block_erasers	=
7548 		{
7549 			{
7550 				.eraseblocks = {
7551 					{8 * 1024, 1},
7552 					{4 * 1024, 2},
7553 					{112 * 1024, 1},
7554 				},
7555 				.block_erase = erase_block_82802ab,
7556 			},
7557 		},
7558 		.write		= write_82802ab,
7559 		.read		= read_memmapped,
7560 		.voltage	= {4500, 5500},
7561 	},
7562 
7563 	{
7564 		.vendor		= "Intel",
7565 		.name		= "28F001BN/BX-T",
7566 		.bustype	= BUS_PARALLEL,
7567 		.manufacture_id	= INTEL_ID,
7568 		.model_id	= INTEL_28F001T,
7569 		.total_size	= 128,
7570 		.page_size	= 128 * 1024, /* 112k + 2x4k + 8k */
7571 		.tested		= TEST_OK_PREW,
7572 		.probe		= probe_jedec,
7573 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7574 		.block_erasers	=
7575 		{
7576 			{
7577 				.eraseblocks = {
7578 					{112 * 1024, 1},
7579 					{4 * 1024, 2},
7580 					{8 * 1024, 1},
7581 				},
7582 				.block_erase = erase_block_82802ab,
7583 			},
7584 		},
7585 		.write		= write_82802ab,
7586 		.read		= read_memmapped,
7587 		.voltage	= {4500, 5500},
7588 	},
7589 
7590 	{
7591 		.vendor		= "Intel",
7592 		.name		= "28F002BC/BL/BV/BX-T",
7593 		.bustype	= BUS_PARALLEL,
7594 		.manufacture_id	= INTEL_ID,
7595 		.model_id	= INTEL_28F002T,
7596 		.total_size	= 256,
7597 		.page_size	= 256 * 1024,
7598 		.tested		= TEST_OK_PRE,
7599 		.probe		= probe_82802ab,
7600 		.probe_timing	= TIMING_ZERO, /* Datasheet has no timing info specified */
7601 		.block_erasers	=
7602 		{
7603 			{
7604 				.eraseblocks = {
7605 					{128 * 1024, 1},
7606 					{96 * 1024, 1},
7607 					{8 * 1024, 2},
7608 					{16 * 1024, 1},
7609 				},
7610 				.block_erase = erase_block_82802ab,
7611 			},
7612 		},
7613 		.write		= write_82802ab,
7614 		.read		= read_memmapped,
7615 	},
7616 
7617 	{
7618 		.vendor		= "Intel",
7619 		.name		= "28F004B5/BE/BV/BX-B",
7620 		.bustype	= BUS_PARALLEL,
7621 		.manufacture_id	= INTEL_ID,
7622 		.model_id	= INTEL_28F004B,
7623 		.total_size	= 512,
7624 		.page_size	= 128 * 1024, /* maximal block size */
7625 		.tested		= TEST_UNTESTED,
7626 		.probe		= probe_82802ab,
7627 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7628 		.block_erasers	=
7629 		{
7630 			{
7631 				.eraseblocks = {
7632 					{16 * 1024, 1},
7633 					{8 * 1024, 2},
7634 					{96 * 1024, 1},
7635 					{128 * 1024, 3},
7636 				},
7637 				.block_erase = erase_block_82802ab,
7638 			},
7639 		},
7640 		.write		= write_82802ab,
7641 		.read		= read_memmapped,
7642 	},
7643 
7644 	{
7645 		.vendor		= "Intel",
7646 		.name		= "28F004B5/BE/BV/BX-T",
7647 		.bustype	= BUS_PARALLEL,
7648 		.manufacture_id	= INTEL_ID,
7649 		.model_id	= INTEL_28F004T,
7650 		.total_size	= 512,
7651 		.page_size	= 128 * 1024, /* maximal block size */
7652 		.tested		= TEST_UNTESTED,
7653 		.probe		= probe_82802ab,
7654 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7655 		.block_erasers	=
7656 		{
7657 			{
7658 				.eraseblocks = {
7659 					{128 * 1024, 3},
7660 					{96 * 1024, 1},
7661 					{8 * 1024, 2},
7662 					{16 * 1024, 1},
7663 				},
7664 				.block_erase = erase_block_82802ab,
7665 			},
7666 		},
7667 		.write		= write_82802ab,
7668 		.read		= read_memmapped,
7669 	},
7670 
7671 	{
7672 		.vendor		= "Intel",
7673 		.name		= "28F008S3/S5/SC",
7674 		.bustype	= BUS_PARALLEL,
7675 		.manufacture_id	= INTEL_ID,
7676 		.model_id	= INTEL_28F004S3,
7677 		.total_size	= 512,
7678 		.page_size	= 256,
7679 		.tested		= TEST_UNTESTED,
7680 		.probe		= probe_82802ab,
7681 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7682 		.block_erasers	=
7683 		{
7684 			{
7685 				.eraseblocks = { {64 * 1024, 8} },
7686 				.block_erase = erase_block_82802ab,
7687 			},
7688 		},
7689 		.unlock		= unlock_28f004s5,
7690 		.write		= write_82802ab,
7691 		.read		= read_memmapped,
7692 	},
7693 
7694 	{
7695 		.vendor		= "Intel",
7696 		.name		= "28F400BV/BX/CE/CV-B",
7697 		.bustype	= BUS_PARALLEL,
7698 		.manufacture_id	= INTEL_ID,
7699 		.model_id	= INTEL_28F400B,
7700 		.total_size	= 512,
7701 		.page_size	= 128 * 1024, /* maximal block size */
7702 		.feature_bits	= FEATURE_ADDR_SHIFTED,
7703 		.tested		= TEST_UNTESTED,
7704 		.probe		= probe_82802ab,
7705 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7706 		.block_erasers	=
7707 		{
7708 			{
7709 				.eraseblocks = {
7710 					{16 * 1024, 1},
7711 					{8 * 1024, 2},
7712 					{96 * 1024, 1},
7713 					{128 * 1024, 3},
7714 				},
7715 				.block_erase = erase_block_82802ab,
7716 			},
7717 		},
7718 		.write		= write_82802ab,
7719 		.read		= read_memmapped,
7720 	},
7721 
7722 	{
7723 		.vendor		= "Intel",
7724 		.name		= "28F400BV/BX/CE/CV-T",
7725 		.bustype	= BUS_PARALLEL,
7726 		.manufacture_id	= INTEL_ID,
7727 		.model_id	= INTEL_28F400T,
7728 		.total_size	= 512,
7729 		.page_size	= 128 * 1024, /* maximal block size */
7730 		.feature_bits	= FEATURE_ADDR_SHIFTED,
7731 		.tested		= TEST_UNTESTED,
7732 		.probe		= probe_82802ab,
7733 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
7734 		.block_erasers	=
7735 		{
7736 			{
7737 				.eraseblocks = {
7738 					{128 * 1024, 3},
7739 					{96 * 1024, 1},
7740 					{8 * 1024, 2},
7741 					{16 * 1024, 1},
7742 				},
7743 				.block_erase = erase_block_82802ab,
7744 			},
7745 		},
7746 		.write		= write_82802ab,
7747 		.read		= read_memmapped,
7748 	},
7749 
7750 	{
7751 		.vendor		= "Intel",
7752 		.name		= "82802AB",
7753 		.bustype	= BUS_FWH,
7754 		.manufacture_id	= INTEL_ID,
7755 		.model_id	= INTEL_82802AB,
7756 		.total_size	= 512,
7757 		.page_size	= 64 * 1024,
7758 		.feature_bits	= FEATURE_REGISTERMAP,
7759 		.tested		= TEST_OK_PREW,
7760 		.probe		= probe_82802ab,
7761 		.probe_timing	= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
7762 		.block_erasers	=
7763 		{
7764 			{
7765 				.eraseblocks = { {64 * 1024, 8} },
7766 				.block_erase = erase_block_82802ab,
7767 			},
7768 		},
7769 		.unlock		= unlock_regspace2_uniform_64k,
7770 		.write		= write_82802ab,
7771 		.read		= read_memmapped,
7772 		.voltage	= {3000, 3600},
7773 	},
7774 
7775 	{
7776 		.vendor		= "Intel",
7777 		.name		= "82802AC",
7778 		.bustype	= BUS_FWH,
7779 		.manufacture_id	= INTEL_ID,
7780 		.model_id	= INTEL_82802AC,
7781 		.total_size	= 1024,
7782 		.page_size	= 64 * 1024,
7783 		.feature_bits	= FEATURE_REGISTERMAP,
7784 		.tested		= TEST_OK_PR,
7785 		.probe		= probe_82802ab,
7786 		.probe_timing	= TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
7787 		.block_erasers	=
7788 		{
7789 			{
7790 				.eraseblocks = { {64 * 1024, 16} },
7791 				.block_erase = erase_block_82802ab,
7792 			},
7793 		},
7794 		.unlock		= unlock_regspace2_uniform_64k,
7795 		.write		= write_82802ab,
7796 		.read		= read_memmapped,
7797 		.voltage	= {3000, 3600},
7798 	},
7799 
7800 	{
7801 		.vendor		= "Macronix",
7802 		.name		= "MX23L12854",
7803 		.bustype	= BUS_SPI,
7804 		.manufacture_id	= MACRONIX_ID,
7805 		.model_id	= MACRONIX_MX23L12854,
7806 		.total_size	= 16384,
7807 		.page_size	= 256,
7808 		.tested		= {.probe = NT, .read = NT, .erase = NA, .write = NA},
7809 		.probe		= probe_spi_rdid,
7810 		.probe_timing	= TIMING_ZERO,
7811 		.write		= NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7812 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7813 		.voltage	= {3000, 3600},
7814 	},
7815 
7816 	{
7817 		.vendor		= "Macronix",
7818 		.name		= "MX23L1654",
7819 		.bustype	= BUS_SPI,
7820 		.manufacture_id	= MACRONIX_ID,
7821 		.model_id	= MACRONIX_MX23L1654,
7822 		.total_size	= 2048,
7823 		.page_size	= 256,
7824 		.tested		= {.probe = NT, .read = NT, .erase = NA, .write = NA},
7825 		.probe		= probe_spi_rdid,
7826 		.probe_timing	= TIMING_ZERO,
7827 		.write		= NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7828 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7829 		.voltage	= {3000, 3600},
7830 	},
7831 
7832 	{
7833 		.vendor		= "Macronix",
7834 		.name		= "MX23L3254",
7835 		.bustype	= BUS_SPI,
7836 		.manufacture_id	= MACRONIX_ID,
7837 		.model_id	= MACRONIX_MX23L3254,
7838 		.total_size	= 4096,
7839 		.page_size	= 256,
7840 		.tested		= {.probe = OK, .read = OK, .erase = NA, .write = NA},
7841 		.probe		= probe_spi_rdid,
7842 		.probe_timing	= TIMING_ZERO,
7843 		.write		= NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7844 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7845 		.voltage	= {3000, 3600},
7846 	},
7847 
7848 	{
7849 		.vendor		= "Macronix",
7850 		.name		= "MX23L6454",
7851 		.bustype	= BUS_SPI,
7852 		.manufacture_id	= MACRONIX_ID,
7853 		.model_id	= MACRONIX_MX23L6454,
7854 		.total_size	= 8192,
7855 		.page_size	= 256,
7856 		.tested		= {.probe = OK, .read = OK, .erase = NA, .write = NA},
7857 		.probe		= probe_spi_rdid,
7858 		.probe_timing	= TIMING_ZERO,
7859 		.write		= NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7860 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7861 		.voltage	= {3000, 3600},
7862 	},
7863 
7864 	{
7865 		.vendor		= "Macronix",
7866 		.name		= "MX25L1005(C)/MX25L1006E",
7867 		.bustype	= BUS_SPI,
7868 		.manufacture_id	= MACRONIX_ID,
7869 		.model_id	= MACRONIX_MX25L1005,
7870 		.total_size	= 128,
7871 		.page_size	= 256,
7872 		/* MX25L1006E supports SFDP */
7873 		.feature_bits	= FEATURE_WRSR_WREN,
7874 		.tested		= TEST_OK_PREW,
7875 		.probe		= probe_spi_rdid,
7876 		.probe_timing	= TIMING_ZERO,
7877 		.block_erasers	=
7878 		{
7879 			{
7880 				.eraseblocks = { {4 * 1024, 32} },
7881 				.block_erase = spi_block_erase_20,
7882 			}, {
7883 				.eraseblocks = { {64 * 1024, 2} },
7884 				.block_erase = spi_block_erase_d8,
7885 			}, {
7886 				.eraseblocks = { {128 * 1024, 1} },
7887 				.block_erase = spi_block_erase_60,
7888 			}, {
7889 				.eraseblocks = { {128 * 1024, 1} },
7890 				.block_erase = spi_block_erase_c7,
7891 			},
7892 		},
7893 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
7894 		.unlock		= spi_disable_blockprotect,
7895 		.write		= spi_chip_write_256,
7896 		.read		= spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
7897 		.voltage	= {2700, 3600},
7898 	},
7899 
7900 	{
7901 		.vendor		= "Macronix",
7902 		.name		= "MX25L12805D",
7903 		.bustype	= BUS_SPI,
7904 		.manufacture_id	= MACRONIX_ID,
7905 		.model_id	= MACRONIX_MX25L12805D,
7906 		.total_size	= 16384,
7907 		.page_size	= 256,
7908 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
7909 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7910 		.tested		= TEST_OK_PREW,
7911 		.probe		= probe_spi_rdid,
7912 		.probe_timing	= TIMING_ZERO,
7913 		.block_erasers	=
7914 		{
7915 			{
7916 				.eraseblocks = { {4 * 1024, 4096} },
7917 				.block_erase = spi_block_erase_20,
7918 			}, {
7919 				.eraseblocks = { {64 * 1024, 256} },
7920 				.block_erase = spi_block_erase_d8,
7921 			}, {
7922 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7923 				.block_erase = spi_block_erase_60,
7924 			}, {
7925 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7926 				.block_erase = spi_block_erase_c7,
7927 			}
7928 		},
7929 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
7930 		.unlock		= spi_disable_blockprotect_bp3_srwd,
7931 		.write		= spi_chip_write_256,
7932 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7933 		.voltage	= {2700, 3600},
7934 	},
7935 
7936 	{
7937 		.vendor		= "Macronix",
7938 		.name		= "MX25L12835F/MX25L12845E/MX25L12865E",
7939 		.bustype	= BUS_SPI,
7940 		.manufacture_id	= MACRONIX_ID,
7941 		.model_id	= MACRONIX_MX25L12805D,
7942 		.total_size	= 16384,
7943 		.page_size	= 256,
7944 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
7945 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
7946 		.tested		= TEST_OK_PREW,
7947 		.probe		= probe_spi_rdid,
7948 		.probe_timing	= TIMING_ZERO,
7949 		.block_erasers	=
7950 		{
7951 			{
7952 				.eraseblocks = { {4 * 1024, 4096} },
7953 				.block_erase = spi_block_erase_20,
7954 			}, {
7955 				.eraseblocks = { {32 * 1024, 512} },
7956 				.block_erase = spi_block_erase_52,
7957 			}, {
7958 				.eraseblocks = { {64 * 1024, 256} },
7959 				.block_erase = spi_block_erase_d8,
7960 			}, {
7961 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7962 				.block_erase = spi_block_erase_60,
7963 			}, {
7964 				.eraseblocks = { {16 * 1024 * 1024, 1} },
7965 				.block_erase = spi_block_erase_c7,
7966 			}
7967 		},
7968 		/* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
7969 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
7970 		.unlock		= spi_disable_blockprotect_bp3_srwd,
7971 		.write		= spi_chip_write_256,
7972 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
7973 		.voltage	= {2700, 3600},
7974 	},
7975 
7976 	{
7977 		.vendor		= "Macronix",
7978 		.name		= "MX25L1605",
7979 		.bustype	= BUS_SPI,
7980 		.manufacture_id	= MACRONIX_ID,
7981 		.model_id	= MACRONIX_MX25L1605,
7982 		.total_size	= 2048,
7983 		.page_size	= 256,
7984 		.feature_bits	= FEATURE_WRSR_WREN,
7985 		.tested		= TEST_OK_PREW,
7986 		.probe		= probe_spi_rdid,
7987 		.probe_timing	= TIMING_ZERO,
7988 		.block_erasers	=
7989 		{
7990 			{
7991 				.eraseblocks = { {64 * 1024, 32} },
7992 				.block_erase = spi_block_erase_20,
7993 			}, {
7994 				.eraseblocks = { {64 * 1024, 32} },
7995 				.block_erase = spi_block_erase_d8,
7996 			}, {
7997 				.eraseblocks = { {2 * 1024 * 1024, 1} },
7998 				.block_erase = spi_block_erase_60,
7999 			}, {
8000 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8001 				.block_erase = spi_block_erase_c7,
8002 			},
8003 		},
8004 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
8005 		.unlock		= spi_disable_blockprotect,
8006 		.write		= spi_chip_write_256,
8007 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8008 		.voltage	= {2700, 3600},
8009 	},
8010 
8011 	{
8012 		.vendor		= "Macronix",
8013 		.name		= "MX25L1605A/MX25L1606E/MX25L1608E",
8014 		.bustype	= BUS_SPI,
8015 		.manufacture_id	= MACRONIX_ID,
8016 		.model_id	= MACRONIX_MX25L1605,
8017 		.total_size	= 2048,
8018 		.page_size	= 256,
8019 		/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
8020 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8021 		.tested		= TEST_OK_PREW,
8022 		.probe		= probe_spi_rdid,
8023 		.probe_timing	= TIMING_ZERO,
8024 		.block_erasers	=
8025 		{
8026 			{
8027 				.eraseblocks = { {4 * 1024, 512} },
8028 				.block_erase = spi_block_erase_20,
8029 			}, {
8030 				.eraseblocks = { {64 * 1024, 32} },
8031 				.block_erase = spi_block_erase_52,
8032 			}, {
8033 				.eraseblocks = { {64 * 1024, 32} },
8034 				.block_erase = spi_block_erase_d8,
8035 			}, {
8036 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8037 				.block_erase = spi_block_erase_60,
8038 			}, {
8039 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8040 				.block_erase = spi_block_erase_c7,
8041 			},
8042 		},
8043 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
8044 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8045 		.write		= spi_chip_write_256,
8046 		.read		= spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
8047 		.voltage	= {2700, 3600},
8048 	},
8049 
8050 	{
8051 		.vendor		= "Macronix",
8052 		.name		= "MX25L1605D/MX25L1608D/MX25L1673E",
8053 		.bustype	= BUS_SPI,
8054 		.manufacture_id	= MACRONIX_ID,
8055 		.model_id	= MACRONIX_MX25L1605,
8056 		.total_size	= 2048,
8057 		.page_size	= 256,
8058 		.feature_bits	= FEATURE_WRSR_WREN,
8059 		.tested		= TEST_OK_PREW,
8060 		.probe		= probe_spi_rdid,
8061 		.probe_timing	= TIMING_ZERO,
8062 		.block_erasers	=
8063 		{
8064 			{
8065 				.eraseblocks = { {4 * 1024, 512} },
8066 				.block_erase = spi_block_erase_20,
8067 			}, {
8068 				.eraseblocks = { {64 * 1024, 32} },
8069 				.block_erase = spi_block_erase_d8,
8070 			}, {
8071 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8072 				.block_erase = spi_block_erase_60,
8073 			}, {
8074 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8075 				.block_erase = spi_block_erase_c7,
8076 			},
8077 		},
8078 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
8079 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8080 		.write		= spi_chip_write_256,
8081 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8082 		.voltage	= {2700, 3600},
8083 	},
8084 
8085 	{
8086 		.vendor		= "Macronix",
8087 		.name		= "MX25L1635D",
8088 		.bustype	= BUS_SPI,
8089 		.manufacture_id	= MACRONIX_ID,
8090 		.model_id	= MACRONIX_MX25L1635D,
8091 		.total_size	= 2048,
8092 		.page_size	= 256,
8093 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8094 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8095 		.tested		= TEST_UNTESTED,
8096 		.probe		= probe_spi_rdid,
8097 		.probe_timing	= TIMING_ZERO,
8098 		.block_erasers	=
8099 		{
8100 			{
8101 				.eraseblocks = { {4 * 1024, 512} },
8102 				.block_erase = spi_block_erase_20,
8103 			}, {
8104 				.eraseblocks = { {64 * 1024, 32} },
8105 				.block_erase = spi_block_erase_d8,
8106 			}, {
8107 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8108 				.block_erase = spi_block_erase_60,
8109 			}, {
8110 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8111 				.block_erase = spi_block_erase_c7,
8112 			}
8113 		},
8114 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8115 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8116 		.write		= spi_chip_write_256,
8117 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8118 		.voltage	= {2700, 3600},
8119 	},
8120 
8121 	{
8122 		.vendor		= "Macronix",
8123 		.name		= "MX25L1635E",
8124 		.bustype	= BUS_SPI,
8125 		.manufacture_id	= MACRONIX_ID,
8126 		.model_id	= MACRONIX_MX25L1635E,
8127 		.total_size	= 2048,
8128 		.page_size	= 256,
8129 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8130 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8131 		.tested		= TEST_UNTESTED,
8132 		.probe		= probe_spi_rdid,
8133 		.probe_timing	= TIMING_ZERO,
8134 		.block_erasers	=
8135 		{
8136 			{
8137 				.eraseblocks = { {4 * 1024, 512} },
8138 				.block_erase = spi_block_erase_20,
8139 			}, {
8140 				.eraseblocks = { {64 * 1024, 32} },
8141 				.block_erase = spi_block_erase_d8,
8142 			}, {
8143 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8144 				.block_erase = spi_block_erase_60,
8145 			}, {
8146 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8147 				.block_erase = spi_block_erase_c7,
8148 			}
8149 		},
8150 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8151 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8152 		.write		= spi_chip_write_256,
8153 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8154 		.voltage	= {2700, 3600},
8155 	},
8156 
8157 	{
8158 		.vendor		= "Macronix",
8159 		.name		= "MX25L2005(C)/MX25L2006E",
8160 		.bustype	= BUS_SPI,
8161 		.manufacture_id	= MACRONIX_ID,
8162 		.model_id	= MACRONIX_MX25L2005,
8163 		.total_size	= 256,
8164 		.page_size	= 256,
8165 		.feature_bits	= FEATURE_WRSR_WREN,
8166 		.tested		= TEST_OK_PREW,
8167 		.probe		= probe_spi_rdid,
8168 		.probe_timing	= TIMING_ZERO,
8169 		.block_erasers	=
8170 		{
8171 			{
8172 				.eraseblocks = { {4 * 1024, 64} },
8173 				.block_erase = spi_block_erase_20,
8174 			}, {
8175 				.eraseblocks = { {64 * 1024, 4} },
8176 				.block_erase = spi_block_erase_52,
8177 			}, {
8178 				.eraseblocks = { {64 * 1024, 4} },
8179 				.block_erase = spi_block_erase_d8,
8180 			}, {
8181 				.eraseblocks = { {256 * 1024, 1} },
8182 				.block_erase = spi_block_erase_60,
8183 			}, {
8184 				.eraseblocks = { {256 * 1024, 1} },
8185 				.block_erase = spi_block_erase_c7,
8186 			},
8187 		},
8188 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
8189 		.unlock		= spi_disable_blockprotect,
8190 		.write		= spi_chip_write_256,
8191 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8192 		.voltage	= {2700, 3600},
8193 	},
8194 
8195 	{
8196 		.vendor		= "Macronix",
8197 		.name		= "MX25L25635F/MX25L25645G",
8198 		.bustype	= BUS_SPI,
8199 		.manufacture_id	= MACRONIX_ID,
8200 		.model_id	= MACRONIX_MX25L25635F,
8201 		.total_size	= 32768,
8202 		.page_size	= 256,
8203 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8204 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8205 		.tested		= TEST_OK_PREW,
8206 		.probe		= probe_spi_rdid,
8207 		.probe_timing	= TIMING_ZERO,
8208 		.block_erasers	=
8209 		{
8210 			{
8211 				.eraseblocks = { {4 * 1024, 8192} },
8212 				.block_erase = spi_block_erase_21,
8213 			}, {
8214 				.eraseblocks = { {4 * 1024, 8192} },
8215 				.block_erase = spi_block_erase_20,
8216 			}, {
8217 				.eraseblocks = { {32 * 1024, 1024} },
8218 				.block_erase = spi_block_erase_5c,
8219 			}, {
8220 				.eraseblocks = { {32 * 1024, 1024} },
8221 				.block_erase = spi_block_erase_52,
8222 			}, {
8223 				.eraseblocks = { {64 * 1024, 512} },
8224 				.block_erase = spi_block_erase_dc,
8225 			}, {
8226 				.eraseblocks = { {64 * 1024, 512} },
8227 				.block_erase = spi_block_erase_d8,
8228 			}, {
8229 				.eraseblocks = { {32 * 1024 * 1024, 1} },
8230 				.block_erase = spi_block_erase_60,
8231 			}, {
8232 				.eraseblocks = { {32 * 1024 * 1024, 1} },
8233 				.block_erase = spi_block_erase_c7,
8234 			}
8235 		},
8236 		/* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8237 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8238 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8239 		.write		= spi_chip_write_256,
8240 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8241 		.voltage	= {2700, 3600},
8242 	},
8243 
8244 	{
8245 		.vendor		= "Macronix",
8246 		.name		= "MX25L3205(A)",
8247 		.bustype	= BUS_SPI,
8248 		.manufacture_id	= MACRONIX_ID,
8249 		.model_id	= MACRONIX_MX25L3205,
8250 		.total_size	= 4096,
8251 		.page_size	= 256,
8252 		.feature_bits	= FEATURE_WRSR_WREN,
8253 		.tested		= TEST_OK_PREW,
8254 		.probe		= probe_spi_rdid,
8255 		.probe_timing	= TIMING_ZERO,
8256 		.block_erasers	=
8257 		{
8258 			{
8259 				.eraseblocks = { {64 * 1024, 64} },
8260 				.block_erase = spi_block_erase_20,
8261 			}, {
8262 				.eraseblocks = { {64 * 1024, 64} },
8263 				.block_erase = spi_block_erase_d8,
8264 			}, {
8265 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8266 				.block_erase = spi_block_erase_60,
8267 			}, {
8268 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8269 				.block_erase = spi_block_erase_c7,
8270 			},
8271 		},
8272 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
8273 		.unlock		= spi_disable_blockprotect,
8274 		.write		= spi_chip_write_256,
8275 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8276 		.voltage	= {2700, 3600},
8277 	},
8278 
8279 	{
8280 		.vendor		= "Macronix",
8281 		.name		= "MX25L3205D/MX25L3208D",
8282 		.bustype	= BUS_SPI,
8283 		.manufacture_id	= MACRONIX_ID,
8284 		.model_id	= MACRONIX_MX25L3205,
8285 		.total_size	= 4096,
8286 		.page_size	= 256,
8287 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8288 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8289 		.tested		= TEST_OK_PREW,
8290 		.probe		= probe_spi_rdid,
8291 		.probe_timing	= TIMING_ZERO,
8292 		.block_erasers	=
8293 		{
8294 			{
8295 				.eraseblocks = { {4 * 1024, 1024} },
8296 				.block_erase = spi_block_erase_20,
8297 			}, {
8298 				.eraseblocks = { {64 * 1024, 64} },
8299 				.block_erase = spi_block_erase_d8,
8300 			}, {
8301 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8302 				.block_erase = spi_block_erase_60,
8303 			}, {
8304 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8305 				.block_erase = spi_block_erase_c7,
8306 			},
8307 		},
8308 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8309 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8310 		.write		= spi_chip_write_256,
8311 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8312 		.voltage	= {2700, 3600},
8313 	},
8314 
8315 	{
8316 		.vendor		= "Macronix",
8317 		.name		= "MX25L3206E/MX25L3208E",
8318 		.bustype	= BUS_SPI,
8319 		.manufacture_id	= MACRONIX_ID,
8320 		.model_id	= MACRONIX_MX25L3205,
8321 		.total_size	= 4096,
8322 		.page_size	= 256,
8323 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8324 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8325 		.tested		= TEST_OK_PREW,
8326 		.probe		= probe_spi_rdid,
8327 		.probe_timing	= TIMING_ZERO,
8328 		.block_erasers	=
8329 		{
8330 			{
8331 				.eraseblocks = { {4 * 1024, 1024} },
8332 				.block_erase = spi_block_erase_20,
8333 			}, {
8334 				.eraseblocks = { {64 * 1024, 64} },
8335 				.block_erase = spi_block_erase_d8,
8336 			}, {
8337 				.eraseblocks = { {64 * 1024, 64} },
8338 				.block_erase = spi_block_erase_52,
8339 			}, {
8340 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8341 				.block_erase = spi_block_erase_60,
8342 			}, {
8343 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8344 				.block_erase = spi_block_erase_c7,
8345 			},
8346 		},
8347 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
8348 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8349 		.write		= spi_chip_write_256,
8350 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8351 		.voltage	= {2700, 3600},
8352 	},
8353 
8354 	{
8355 		.vendor		= "Macronix",
8356 		.name		= "MX25L3235D",
8357 		.bustype	= BUS_SPI,
8358 		.manufacture_id	= MACRONIX_ID,
8359 		.model_id	= MACRONIX_MX25L3235D,
8360 		.total_size	= 4096,
8361 		.page_size	= 256,
8362 		/* OTP: 256B total; enter 0xB1, exit 0xC1 */
8363 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8364 		.tested		= TEST_UNTESTED,
8365 		.probe		= probe_spi_rdid,
8366 		.probe_timing	= TIMING_ZERO,
8367 		.block_erasers	=
8368 		{
8369 			{
8370 				.eraseblocks = { {4 * 1024, 1024} },
8371 				.block_erase = spi_block_erase_20,
8372 			}, {
8373 				.eraseblocks = { {64 * 1024, 64} },
8374 				.block_erase = spi_block_erase_d8,
8375 			}, {
8376 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8377 				.block_erase = spi_block_erase_60,
8378 			}, {
8379 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8380 				.block_erase = spi_block_erase_c7,
8381 			}
8382 		},
8383 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8384 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8385 		.write		= spi_chip_write_256,
8386 		.read		= spi_chip_read,
8387 		.voltage	= {2700, 3600},
8388 	},
8389 
8390 	{
8391 		.vendor		= "Macronix",
8392 		.name		= "MX25L3273E",
8393 		.bustype	= BUS_SPI,
8394 		.manufacture_id	= MACRONIX_ID,
8395 		.model_id	= MACRONIX_MX25L3205,
8396 		.total_size	= 4096,
8397 		.page_size	= 256,
8398 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8399 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8400 		.tested		= TEST_OK_PREW,
8401 		.probe		= probe_spi_rdid,
8402 		.probe_timing	= TIMING_ZERO,
8403 		.block_erasers	=
8404 		{
8405 			{
8406 				.eraseblocks = { {4 * 1024, 1024} },
8407 				.block_erase = spi_block_erase_20,
8408 			}, {
8409 				.eraseblocks = { {32 * 1024, 128} },
8410 				.block_erase = spi_block_erase_52,
8411 			}, {
8412 				.eraseblocks = { {64 * 1024, 64} },
8413 				.block_erase = spi_block_erase_d8,
8414 			}, {
8415 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8416 				.block_erase = spi_block_erase_60,
8417 			}, {
8418 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8419 				.block_erase = spi_block_erase_c7,
8420 			},
8421 		},
8422 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
8423 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8424 		.write		= spi_chip_write_256,
8425 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8426 		.voltage	= {2700, 3600},
8427 	},
8428 
8429 	{
8430 		.vendor		= "Macronix",
8431 		.name		= "MX25L4005(A/C)/MX25L4006E",
8432 		.bustype	= BUS_SPI,
8433 		.manufacture_id	= MACRONIX_ID,
8434 		.model_id	= MACRONIX_MX25L4005,
8435 		.total_size	= 512,
8436 		.page_size	= 256,
8437 		.feature_bits	= FEATURE_WRSR_WREN,
8438 		.tested		= TEST_OK_PREW,
8439 		.probe		= probe_spi_rdid,
8440 		.probe_timing	= TIMING_ZERO,
8441 		.block_erasers	=
8442 		{
8443 			{
8444 				.eraseblocks = { {4 * 1024, 128} },
8445 				.block_erase = spi_block_erase_20,
8446 			}, {
8447 				.eraseblocks = { {64 * 1024, 8} },
8448 				.block_erase = spi_block_erase_52,
8449 			}, {
8450 				.eraseblocks = { {64 * 1024, 8} },
8451 				.block_erase = spi_block_erase_d8,
8452 			}, {
8453 				.eraseblocks = { {512 * 1024, 1} },
8454 				.block_erase = spi_block_erase_60,
8455 			}, {
8456 				.eraseblocks = { {512 * 1024, 1} },
8457 				.block_erase = spi_block_erase_c7,
8458 			},
8459 		},
8460 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
8461 		.unlock		= spi_disable_blockprotect,
8462 		.write		= spi_chip_write_256,
8463 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8464 		.voltage	= {2700, 3600},
8465 	},
8466 
8467 	{
8468 		.vendor		= "Macronix",
8469 		.name		= "MX25L512(E)/MX25V512(C)",
8470 		.bustype	= BUS_SPI,
8471 		.manufacture_id	= MACRONIX_ID,
8472 		.model_id	= MACRONIX_MX25L512,
8473 		.total_size	= 64,
8474 		.page_size	= 256,
8475 		/* MX25L512E supports SFDP */
8476 		.feature_bits	= FEATURE_WRSR_WREN,
8477 		.tested		= TEST_OK_PREW,
8478 		.probe		= probe_spi_rdid,
8479 		.probe_timing	= TIMING_ZERO,
8480 		.block_erasers	=
8481 		{
8482 			{
8483 				.eraseblocks = { {4 * 1024, 16} },
8484 				.block_erase = spi_block_erase_20,
8485 			}, {
8486 				.eraseblocks = { {64 * 1024, 1} },
8487 				.block_erase = spi_block_erase_52,
8488 			}, {
8489 				.eraseblocks = { {64 * 1024, 1} },
8490 				.block_erase = spi_block_erase_d8,
8491 			}, {
8492 				.eraseblocks = { {64 * 1024, 1} },
8493 				.block_erase = spi_block_erase_60,
8494 			}, {
8495 				.eraseblocks = { {64 * 1024, 1} },
8496 				.block_erase = spi_block_erase_c7,
8497 			},
8498 		},
8499 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
8500 		.unlock		= spi_disable_blockprotect,
8501 		.write		= spi_chip_write_256,
8502 		.read		= spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
8503 		.voltage	= {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
8504 	},
8505 
8506 	{
8507 		.vendor		= "Macronix",
8508 		.name		= "MX25L6405",
8509 		.bustype	= BUS_SPI,
8510 		.manufacture_id	= MACRONIX_ID,
8511 		.model_id	= MACRONIX_MX25L6405,
8512 		.total_size	= 8192,
8513 		.page_size	= 256,
8514 		/* Has an additional 512B EEPROM sector */
8515 		.feature_bits	= FEATURE_WRSR_WREN,
8516 		.tested		= TEST_OK_PREW,
8517 		.probe		= probe_spi_rdid,
8518 		.probe_timing	= TIMING_ZERO,
8519 		.block_erasers	=
8520 		{
8521 			{
8522 				.eraseblocks = { {64 * 1024, 128} },
8523 				.block_erase = spi_block_erase_20,
8524 			}, {
8525 				.eraseblocks = { {64 * 1024, 128} },
8526 				.block_erase = spi_block_erase_d8,
8527 			}, {
8528 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8529 				.block_erase = spi_block_erase_60,
8530 			}, {
8531 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8532 				.block_erase = spi_block_erase_c7,
8533 			}
8534 		},
8535 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
8536 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8537 		.write		= spi_chip_write_256,
8538 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8539 		.voltage	= {2700, 3600},
8540 	},
8541 
8542 	{
8543 		.vendor		= "Macronix",
8544 		.name		= "MX25L6405D",
8545 		.bustype	= BUS_SPI,
8546 		.manufacture_id	= MACRONIX_ID,
8547 		.model_id	= MACRONIX_MX25L6405,
8548 		.total_size	= 8192,
8549 		.page_size	= 256,
8550 		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
8551 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8552 		.tested		= TEST_OK_PREW,
8553 		.probe		= probe_spi_rdid,
8554 		.probe_timing	= TIMING_ZERO,
8555 		.block_erasers	=
8556 		{
8557 			{
8558 				.eraseblocks = { {4 * 1024, 2048} },
8559 				.block_erase = spi_block_erase_20,
8560 			}, {
8561 				.eraseblocks = { {64 * 1024, 128} },
8562 				.block_erase = spi_block_erase_d8,
8563 			}, {
8564 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8565 				.block_erase = spi_block_erase_60,
8566 			}, {
8567 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8568 				.block_erase = spi_block_erase_c7,
8569 			}
8570 		},
8571 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8572 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8573 		.write		= spi_chip_write_256,
8574 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
8575 		.voltage	= {2700, 3600},
8576 	},
8577 
8578 	{
8579 		.vendor		= "Macronix",
8580 		.name		= "MX25L6406E/MX25L6408E",
8581 		.bustype	= BUS_SPI,
8582 		.manufacture_id	= MACRONIX_ID,
8583 		.model_id	= MACRONIX_MX25L6405,
8584 		.total_size	= 8192,
8585 		.page_size	= 256,
8586 		/* MX25L6406E supports SFDP */
8587 		/* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
8588 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8589 		.tested		= TEST_OK_PREW,
8590 		.probe		= probe_spi_rdid,
8591 		.probe_timing	= TIMING_ZERO,
8592 		.block_erasers	=
8593 		{
8594 			{
8595 				.eraseblocks = { {4 * 1024, 2048} },
8596 				.block_erase = spi_block_erase_20,
8597 			}, {
8598 				.eraseblocks = { {64 * 1024, 128} },
8599 				.block_erase = spi_block_erase_52,
8600 			}, {
8601 				.eraseblocks = { {64 * 1024, 128} },
8602 				.block_erase = spi_block_erase_d8,
8603 			}, {
8604 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8605 				.block_erase = spi_block_erase_60,
8606 			}, {
8607 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8608 				.block_erase = spi_block_erase_c7,
8609 			}
8610 		},
8611 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
8612 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8613 		.write		= spi_chip_write_256,
8614 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
8615 		.voltage	= {2700, 3600},
8616 	},
8617 
8618 	{
8619 		.vendor		= "Macronix",
8620 		.name		= "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
8621 		.bustype	= BUS_SPI,
8622 		.manufacture_id	= MACRONIX_ID,
8623 		.model_id	= MACRONIX_MX25L6405,
8624 		.total_size	= 8192,
8625 		.page_size	= 256,
8626 		/* supports SFDP */
8627 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8628 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8629 		.tested		= TEST_OK_PREW,
8630 		.probe		= probe_spi_rdid,
8631 		.probe_timing	= TIMING_ZERO,
8632 		.block_erasers	=
8633 		{
8634 			{
8635 				.eraseblocks = { {4 * 1024, 2048} },
8636 				.block_erase = spi_block_erase_20,
8637 			}, {
8638 				.eraseblocks = { {32 * 1024, 256} },
8639 				.block_erase = spi_block_erase_52,
8640 			}, {
8641 				.eraseblocks = { {64 * 1024, 128} },
8642 				.block_erase = spi_block_erase_d8,
8643 			}, {
8644 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8645 				.block_erase = spi_block_erase_60,
8646 			}, {
8647 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8648 				.block_erase = spi_block_erase_c7,
8649 			}
8650 		},
8651 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8652 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8653 		.write		= spi_chip_write_256,
8654 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8655 		.voltage	= {2700, 3600},
8656 	},
8657 
8658 	{
8659 		.vendor		= "Macronix",
8660 		.name		= "MX25L6495F",
8661 		.bustype	= BUS_SPI,
8662 		.manufacture_id	= MACRONIX_ID,
8663 		.model_id	= MACRONIX_MX25L6495F,
8664 		.total_size	= 8192,
8665 		.page_size	= 256,
8666 		/* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8667 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8668 		.tested		= TEST_OK_PREW,
8669 		.probe		= probe_spi_rdid,
8670 		.probe_timing	= TIMING_ZERO,
8671 		.block_erasers	=
8672 		{
8673 			{
8674 				.eraseblocks = { {4 * 1024, 2048} },
8675 				.block_erase = spi_block_erase_20,
8676 			}, {
8677 				.eraseblocks = { {64 * 1024, 128} },
8678 				.block_erase = spi_block_erase_d8,
8679 			}, {
8680 				.eraseblocks = { {32 * 1024, 256} },
8681 				.block_erase = spi_block_erase_52,
8682 			}, {
8683 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8684 				.block_erase = spi_block_erase_60,
8685 			}, {
8686 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8687 				.block_erase = spi_block_erase_c7,
8688 			}
8689 		},
8690 		.unlock		= spi_disable_blockprotect,
8691 		.write		= spi_chip_write_256,
8692 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8693 		.voltage	= {2700, 3600},
8694 	},
8695 
8696 	{
8697 		.vendor		= "Macronix",
8698 		.name		= "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
8699 		.bustype	= BUS_SPI,
8700 		.manufacture_id	= MACRONIX_ID,
8701 		.model_id	= MACRONIX_MX25L8005,
8702 		.total_size	= 1024,
8703 		.page_size	= 256,
8704 		/* MX25L8006E, MX25L8008E support SFDP */
8705 		/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
8706 		.feature_bits	= FEATURE_WRSR_WREN,
8707 		.tested		= TEST_OK_PREW,
8708 		.probe		= probe_spi_rdid,
8709 		.probe_timing	= TIMING_ZERO,
8710 		.block_erasers	=
8711 		{
8712 			{
8713 				.eraseblocks = { {4 * 1024, 256} },
8714 				.block_erase = spi_block_erase_20,
8715 			}, {
8716 				.eraseblocks = { {64 * 1024, 16} },
8717 				.block_erase = spi_block_erase_52,
8718 			}, {
8719 				.eraseblocks = { {64 * 1024, 16} },
8720 				.block_erase = spi_block_erase_d8,
8721 			}, {
8722 				.eraseblocks = { {1024 * 1024, 1} },
8723 				.block_erase = spi_block_erase_60,
8724 			}, {
8725 				.eraseblocks = { {1024 * 1024, 1} },
8726 				.block_erase = spi_block_erase_c7,
8727 			},
8728 		},
8729 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
8730 		.unlock		= spi_disable_blockprotect,
8731 		.write		= spi_chip_write_256,
8732 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
8733 		.voltage	= {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
8734 	},
8735 
8736 	{
8737 		.vendor		= "Macronix",
8738 		.name		= "MX25R6435F",
8739 		.bustype	= BUS_SPI,
8740 		.manufacture_id	= MACRONIX_ID,
8741 		.model_id	= MACRONIX_MX25R6435F,
8742 		.total_size	= 8192,
8743 		.page_size	= 256,
8744 		/* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8745 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
8746 		.tested		= TEST_OK_PREW,
8747 		.probe		= probe_spi_rdid,
8748 		.probe_timing	= TIMING_ZERO,
8749 		.block_erasers	=
8750 		{
8751 			{
8752 				.eraseblocks = { {4 * 1024, 2048} },
8753 				.block_erase = spi_block_erase_20,
8754 			}, {
8755 				.eraseblocks = { {64 * 1024, 128} },
8756 				.block_erase = spi_block_erase_d8,
8757 			}, {
8758 				.eraseblocks = { {32 * 1024, 256} },
8759 				.block_erase = spi_block_erase_52,
8760 			}, {
8761 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8762 				.block_erase = spi_block_erase_60,
8763 			}, {
8764 				.eraseblocks = { {8 * 1024 * 1024, 1} },
8765 				.block_erase = spi_block_erase_c7,
8766 			}
8767 		},
8768 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8769 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8770 		.write		= spi_chip_write_256,
8771 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8772 		.voltage	= {1650, 3600},
8773 	},
8774 
8775 	{
8776 		.vendor		= "Macronix",
8777 		.name		= "MX25U12835F",
8778 		.bustype	= BUS_SPI,
8779 		.manufacture_id	= MACRONIX_ID,
8780 		.model_id	= MACRONIX_MX25U12835E,
8781 		.total_size	= 16384,
8782 		.page_size	= 256,
8783 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8784 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8785 		.tested		= TEST_OK_PREW,
8786 		.probe		= probe_spi_rdid,
8787 		.probe_timing	= TIMING_ZERO,
8788 		.block_erasers	=
8789 		{
8790 			{
8791 				.eraseblocks = { {4 * 1024, 4096} },
8792 				.block_erase = spi_block_erase_20,
8793 			}, {
8794 				.eraseblocks = { {32 * 1024, 512} },
8795 				.block_erase = spi_block_erase_52,
8796 			}, {
8797 				.eraseblocks = { {64 * 1024, 256} },
8798 				.block_erase = spi_block_erase_d8,
8799 			}, {
8800 				.eraseblocks = { {16 * 1024 * 1024, 1} },
8801 				.block_erase = spi_block_erase_60,
8802 			}, {
8803 				.eraseblocks = { {16 * 1024 * 1024, 1} },
8804 				.block_erase = spi_block_erase_c7,
8805 			}
8806 		},
8807 		/* TODO: security register */
8808 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8809 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8810 		.write		= spi_chip_write_256, /* Multi I/O supported */
8811 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8812 		.voltage	= {1650, 2000},
8813 	},
8814 
8815 	{
8816 		.vendor		= "Macronix",
8817 		.name		= "MX25U1635E",
8818 		.bustype	= BUS_SPI,
8819 		.manufacture_id	= MACRONIX_ID,
8820 		.model_id	= MACRONIX_MX25U1635E,
8821 		.total_size	= 2048,
8822 		.page_size	= 256,
8823 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8824 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8825 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8826 		.tested		= TEST_OK_PR,
8827 		.probe		= probe_spi_rdid,
8828 		.probe_timing	= TIMING_ZERO,
8829 		.block_erasers	=
8830 		{
8831 			{
8832 				.eraseblocks = { {4 * 1024, 512} },
8833 				.block_erase = spi_block_erase_20,
8834 			}, {
8835 				.eraseblocks = { {32 * 1024, 64} },
8836 				.block_erase = spi_block_erase_52,
8837 			}, {
8838 				.eraseblocks = { {64 * 1024, 32} },
8839 				.block_erase = spi_block_erase_d8,
8840 			}, {
8841 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8842 				.block_erase = spi_block_erase_60,
8843 			}, {
8844 				.eraseblocks = { {2 * 1024 * 1024, 1} },
8845 				.block_erase = spi_block_erase_c7,
8846 			}
8847 		},
8848 		/* TODO: security register */
8849 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8850 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8851 		.write		= spi_chip_write_256,
8852 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8853 		.voltage	= {1650, 2000},
8854 	},
8855 
8856 	{
8857 		.vendor		= "Macronix",
8858 		.name		= "MX25U25635F",
8859 		.bustype	= BUS_SPI,
8860 		.manufacture_id	= MACRONIX_ID,
8861 		.model_id	= MACRONIX_MX25U25635F,
8862 		.total_size	= 32768,
8863 		.page_size	= 256,
8864 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8865 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8866 		.tested		= TEST_OK_PR,
8867 		.probe		= probe_spi_rdid,
8868 		.probe_timing	= TIMING_ZERO,
8869 		.block_erasers	=
8870 		{
8871 			{
8872 				.eraseblocks = { {4 * 1024, 8192} },
8873 				.block_erase = spi_block_erase_21,
8874 			}, {
8875 				.eraseblocks = { {4 * 1024, 8192} },
8876 				.block_erase = spi_block_erase_20,
8877 			}, {
8878 				.eraseblocks = { {32 * 1024, 1024} },
8879 				.block_erase = spi_block_erase_5c,
8880 			}, {
8881 				.eraseblocks = { {32 * 1024, 1024} },
8882 				.block_erase = spi_block_erase_52,
8883 			}, {
8884 				.eraseblocks = { {64 * 1024, 512} },
8885 				.block_erase = spi_block_erase_dc,
8886 			}, {
8887 				.eraseblocks = { {64 * 1024, 512} },
8888 				.block_erase = spi_block_erase_d8,
8889 			}, {
8890 				.eraseblocks = { {32 * 1024 * 1024, 1} },
8891 				.block_erase = spi_block_erase_60,
8892 			}, {
8893 				.eraseblocks = { {32 * 1024 * 1024, 1} },
8894 				.block_erase = spi_block_erase_c7,
8895 			}
8896 		},
8897 		/* TODO: security register */
8898 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8899 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8900 		.write		= spi_chip_write_256, /* Multi I/O supported */
8901 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8902 		.voltage	= {1650, 2000},
8903 	},
8904 
8905 	{
8906 		.vendor		= "Macronix",
8907 		.name		= "MX25U3235E/F",
8908 		.bustype	= BUS_SPI,
8909 		.manufacture_id	= MACRONIX_ID,
8910 		.model_id	= MACRONIX_MX25U3235E,
8911 		.total_size	= 4096,
8912 		.page_size	= 256,
8913 		/* F model supports SFDP */
8914 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
8915 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
8916 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
8917 		.tested		= TEST_OK_PREW,
8918 		.probe		= probe_spi_rdid,
8919 		.probe_timing	= TIMING_ZERO,
8920 		.block_erasers	=
8921 		{
8922 			{
8923 				.eraseblocks = { {4 * 1024, 1024} },
8924 				.block_erase = spi_block_erase_20,
8925 			}, {
8926 				.eraseblocks = { {32 * 1024, 128} },
8927 				.block_erase = spi_block_erase_52,
8928 			}, {
8929 				.eraseblocks = { {64 * 1024, 64} },
8930 				.block_erase = spi_block_erase_d8,
8931 			}, {
8932 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8933 				.block_erase = spi_block_erase_60,
8934 			}, {
8935 				.eraseblocks = { {4 * 1024 * 1024, 1} },
8936 				.block_erase = spi_block_erase_c7,
8937 			}
8938 		},
8939 		/* TODO: security register */
8940 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8941 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8942 		.write		= spi_chip_write_256,
8943 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8944 		.voltage	= {1650, 2000},
8945 	},
8946 
8947 	{
8948 		.vendor		= "Macronix",
8949 		.name		= "MX25U51245G",
8950 		.bustype	= BUS_SPI,
8951 		.manufacture_id	= MACRONIX_ID,
8952 		.model_id	= MACRONIX_MX25U51245G,
8953 		.total_size	= 65536,
8954 		.page_size	= 256,
8955 		/* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
8956 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
8957 		.tested		= TEST_OK_PREW,
8958 		.probe		= probe_spi_rdid,
8959 		.probe_timing	= TIMING_ZERO,
8960 		.block_erasers	=
8961 		{
8962 			{
8963 				.eraseblocks = { {4 * 1024, 16384} },
8964 				.block_erase = spi_block_erase_21,
8965 			}, {
8966 				.eraseblocks = { {4 * 1024, 16384} },
8967 				.block_erase = spi_block_erase_20,
8968 			}, {
8969 				.eraseblocks = { {32 * 1024, 2048} },
8970 				.block_erase = spi_block_erase_5c,
8971 			}, {
8972 				.eraseblocks = { {32 * 1024, 2048} },
8973 				.block_erase = spi_block_erase_52,
8974 			}, {
8975 				.eraseblocks = { {64 * 1024, 1024} },
8976 				.block_erase = spi_block_erase_dc,
8977 			}, {
8978 				.eraseblocks = { {64 * 1024, 1024} },
8979 				.block_erase = spi_block_erase_d8,
8980 			}, {
8981 				.eraseblocks = { {64 * 1024 * 1024, 1} },
8982 				.block_erase = spi_block_erase_60,
8983 			}, {
8984 				.eraseblocks = { {64 * 1024 * 1024, 1} },
8985 				.block_erase = spi_block_erase_c7,
8986 			}
8987 		},
8988 		/* TODO: security register */
8989 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8990 		.unlock		= spi_disable_blockprotect_bp3_srwd,
8991 		.write		= spi_chip_write_256, /* Multi I/O supported */
8992 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8993 		.voltage	= {1650, 2000},
8994 	},
8995 
8996 	{
8997 		.vendor		= "Macronix",
8998 		.name		= "MX25U6435E/F",
8999 		.bustype	= BUS_SPI,
9000 		.manufacture_id	= MACRONIX_ID,
9001 		.model_id	= MACRONIX_MX25U6435E,
9002 		.total_size	= 8192,
9003 		.page_size	= 256,
9004 		/* F model supports SFDP */
9005 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
9006 		/* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9007 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9008 		.tested		= TEST_OK_PREW,
9009 		.probe		= probe_spi_rdid,
9010 		.probe_timing	= TIMING_ZERO,
9011 		.block_erasers	=
9012 		{
9013 			{
9014 				.eraseblocks = { {4 * 1024, 2048} },
9015 				.block_erase = spi_block_erase_20,
9016 			}, {
9017 				.eraseblocks = { {32 * 1024, 256} },
9018 				.block_erase = spi_block_erase_52,
9019 			}, {
9020 				.eraseblocks = { {64 * 1024, 128} },
9021 				.block_erase = spi_block_erase_d8,
9022 			}, {
9023 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9024 				.block_erase = spi_block_erase_60,
9025 			}, {
9026 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9027 				.block_erase = spi_block_erase_c7,
9028 			}
9029 		},
9030 		/* TODO: security register */
9031 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9032 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9033 		.write		= spi_chip_write_256,
9034 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9035 		.voltage	= {1650, 2000},
9036 	},
9037 
9038 	{
9039 		.vendor		= "Macronix",
9040 		.name		= "MX25U8032E",
9041 		.bustype	= BUS_SPI,
9042 		.manufacture_id	= MACRONIX_ID,
9043 		.model_id	= MACRONIX_MX25U8032E,
9044 		.total_size	= 1024,
9045 		.page_size	= 256,
9046 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
9047 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
9048 		.tested		= TEST_OK_PREW,
9049 		.probe		= probe_spi_rdid,
9050 		.probe_timing	= TIMING_ZERO,
9051 		.block_erasers	=
9052 		{
9053 			{
9054 				.eraseblocks = { {4 * 1024, 256} },
9055 				.block_erase = spi_block_erase_20,
9056 			}, {
9057 				.eraseblocks = { {32 * 1024, 32} },
9058 				.block_erase = spi_block_erase_52,
9059 			}, {
9060 				.eraseblocks = { {64 * 1024, 16} },
9061 				.block_erase = spi_block_erase_d8,
9062 			}, {
9063 				.eraseblocks = { {1024 * 1024, 1} },
9064 				.block_erase = spi_block_erase_60,
9065 			}, {
9066 				.eraseblocks = { {1024 * 1024, 1} },
9067 				.block_erase = spi_block_erase_c7,
9068 			}
9069 		},
9070 		/* TODO: security register */
9071 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9072 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9073 		.write		= spi_chip_write_256,
9074 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9075 		.voltage	= {1650, 2000},
9076 	},
9077 
9078 	{
9079 		.vendor		= "Macronix",
9080 		.name		= "MX29F001B",
9081 		.bustype	= BUS_PARALLEL,
9082 		.manufacture_id	= MACRONIX_ID,
9083 		.model_id	= MACRONIX_MX29F001B,
9084 		.total_size	= 128,
9085 		.page_size	= 32 * 1024,
9086 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9087 		.tested		= TEST_UNTESTED,
9088 		.probe		= probe_jedec,
9089 		.probe_timing	= TIMING_ZERO,
9090 		.block_erasers	=
9091 		{
9092 			{
9093 				.eraseblocks = {
9094 					{8 * 1024, 1},
9095 					{4 * 1024, 2},
9096 					{8 * 1024, 2},
9097 					{32 * 1024, 1},
9098 					{64 * 1024, 1},
9099 				},
9100 				.block_erase = erase_sector_jedec,
9101 			}, {
9102 				.eraseblocks = { {128 * 1024, 1} },
9103 				.block_erase = erase_chip_block_jedec,
9104 			}
9105 		},
9106 		.write		= write_jedec_1,
9107 		.read		= read_memmapped,
9108 		.voltage	= {4500, 5500},
9109 	},
9110 
9111 	{
9112 		.vendor		= "Macronix",
9113 		.name		= "MX29F001T",
9114 		.bustype	= BUS_PARALLEL,
9115 		.manufacture_id	= MACRONIX_ID,
9116 		.model_id	= MACRONIX_MX29F001T,
9117 		.total_size	= 128,
9118 		.page_size	= 32 * 1024,
9119 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9120 		.tested		= TEST_OK_PREW,
9121 		.probe		= probe_jedec,
9122 		.probe_timing	= TIMING_ZERO,
9123 		.block_erasers	=
9124 		{
9125 			{
9126 				.eraseblocks = {
9127 					{64 * 1024, 1},
9128 					{32 * 1024, 1},
9129 					{8 * 1024, 2},
9130 					{4 * 1024, 2},
9131 					{8 * 1024, 1},
9132 				},
9133 				.block_erase = erase_sector_jedec,
9134 			}, {
9135 				.eraseblocks = { {128 * 1024, 1} },
9136 				.block_erase = erase_chip_block_jedec,
9137 			}
9138 		},
9139 		.write		= write_jedec_1,
9140 		.read		= read_memmapped,
9141 		.voltage	= {4500, 5500},
9142 	},
9143 
9144 	{
9145 		.vendor		= "Macronix",
9146 		.name		= "MX29F002(N)B",
9147 		.bustype	= BUS_PARALLEL,
9148 		.manufacture_id	= MACRONIX_ID,
9149 		.model_id	= MACRONIX_MX29F002B,
9150 		.total_size	= 256,
9151 		.page_size	= 64 * 1024,
9152 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9153 		.tested		= TEST_UNTESTED,
9154 		.probe		= probe_jedec,
9155 		.probe_timing	= TIMING_ZERO,
9156 		.block_erasers	=
9157 		{
9158 			{
9159 				.eraseblocks = {
9160 					{16 * 1024, 1},
9161 					{8 * 1024, 2},
9162 					{32 * 1024, 1},
9163 					{64 * 1024, 3},
9164 				},
9165 				.block_erase = erase_sector_jedec,
9166 			}, {
9167 				.eraseblocks = { {256 * 1024, 1} },
9168 				.block_erase = erase_chip_block_jedec,
9169 			},
9170 		},
9171 		.write		= write_jedec_1,
9172 		.read		= read_memmapped,
9173 		.voltage	= {4500, 5500},
9174 	},
9175 
9176 	{
9177 		.vendor		= "Macronix",
9178 		.name		= "MX29F002(N)T",
9179 		.bustype	= BUS_PARALLEL,
9180 		.manufacture_id	= MACRONIX_ID,
9181 		.model_id	= MACRONIX_MX29F002T,
9182 		.total_size	= 256,
9183 		.page_size	= 64 * 1024,
9184 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9185 		.tested		= TEST_OK_PREW,
9186 		.probe		= probe_jedec,
9187 		.probe_timing	= TIMING_ZERO,
9188 		.block_erasers	=
9189 		{
9190 			{
9191 				.eraseblocks = {
9192 					{64 * 1024, 3},
9193 					{32 * 1024, 1},
9194 					{8 * 1024, 2},
9195 					{16 * 1024, 1},
9196 				},
9197 				.block_erase = erase_sector_jedec,
9198 			}, {
9199 				.eraseblocks = { {256 * 1024, 1} },
9200 				.block_erase = erase_chip_block_jedec,
9201 			},
9202 		},
9203 		.write		= write_jedec_1,
9204 		.read		= read_memmapped,
9205 		.voltage	= {4500, 5500},
9206 	},
9207 
9208 	{
9209 		.vendor		= "Macronix",
9210 		.name		= "MX29F022(N)B",
9211 		.bustype	= BUS_PARALLEL,
9212 		.manufacture_id	= MACRONIX_ID,
9213 		.model_id	= MACRONIX_MX29F022B,
9214 		.total_size	= 256,
9215 		.page_size	= 0, /* unused */
9216 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9217 		.tested		= TEST_UNTESTED,
9218 		.probe		= probe_jedec,
9219 		.probe_timing	= TIMING_ZERO,
9220 		.block_erasers	=
9221 		{
9222 			{
9223 				.eraseblocks = {
9224 					{16 * 1024, 1},
9225 					{8 * 1024, 2},
9226 					{32 * 1024, 1},
9227 					{64 * 1024, 3},
9228 				},
9229 				.block_erase = erase_sector_jedec,
9230 			}, {
9231 				.eraseblocks = { {256 * 1024, 1} },
9232 				.block_erase = erase_chip_block_jedec,
9233 			}
9234 		},
9235 		.write		= write_jedec_1,
9236 		.read		= read_memmapped,
9237 		.voltage	= {4500, 5500},
9238 	},
9239 
9240 	{
9241 		.vendor		= "Macronix",
9242 		.name		= "MX29F022(N)T",
9243 		.bustype	= BUS_PARALLEL,
9244 		.manufacture_id	= MACRONIX_ID,
9245 		.model_id	= MACRONIX_MX29F022T,
9246 		.total_size	= 256,
9247 		.page_size	= 0, /* unused */
9248 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9249 		.tested		= TEST_OK_PREW,
9250 		.probe		= probe_jedec,
9251 		.probe_timing	= TIMING_ZERO,
9252 		.block_erasers	=
9253 		{
9254 			{
9255 				.eraseblocks = {
9256 					{64 * 1024, 3},
9257 					{32 * 1024, 1},
9258 					{8 * 1024, 2},
9259 					{16 * 1024, 1},
9260 				},
9261 				.block_erase = erase_sector_jedec,
9262 			}, {
9263 				.eraseblocks = { {256 * 1024, 1} },
9264 				.block_erase = erase_chip_block_jedec,
9265 			}
9266 		},
9267 		.write		= write_jedec_1,
9268 		.read		= read_memmapped,
9269 		.voltage	= {4500, 5500},
9270 	},
9271 
9272 	{
9273 		.vendor		= "Macronix",
9274 		.name		= "MX29F040",
9275 		.bustype	= BUS_PARALLEL,
9276 		.manufacture_id	= MACRONIX_ID,
9277 		.model_id	= MACRONIX_MX29F040,
9278 		.total_size	= 512,
9279 		.page_size	= 64 * 1024,
9280 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9281 		.tested		= TEST_UNTESTED,
9282 		.probe		= probe_jedec,
9283 		.probe_timing	= TIMING_ZERO,
9284 		.block_erasers	=
9285 		{
9286 			{
9287 				.eraseblocks = { {64 * 1024, 8} },
9288 				.block_erase = erase_sector_jedec,
9289 			}, {
9290 				.eraseblocks = { {512 * 1024, 1} },
9291 				.block_erase = erase_chip_block_jedec,
9292 			},
9293 		},
9294 		.write		= write_jedec_1,
9295 		.read		= read_memmapped,
9296 		.voltage	= {4500, 5500},
9297 	},
9298 
9299 	{
9300 		.vendor		= "Macronix",
9301 		.name		= "MX29GL128F",
9302 		.bustype	= BUS_PARALLEL,
9303 		.manufacture_id	= MACRONIX_ID,
9304 		.model_id	= MACRONIX_MX29GL128F,
9305 		.total_size	= 16384,
9306 		.page_size	= 128 * 1024, /* actual page size is 16 */
9307 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9308 		.tested		= TEST_UNTESTED,
9309 		.probe		= probe_jedec_29gl,
9310 		.probe_timing	= TIMING_ZERO,
9311 		.block_erasers	=
9312 		{
9313 			{
9314 				.eraseblocks = { {128 * 1024, 128} },
9315 				.block_erase = erase_sector_jedec,
9316 			}, {
9317 				.eraseblocks = { {16 * 1024 * 1024, 1} },
9318 				.block_erase = erase_chip_block_jedec,
9319 			},
9320 		},
9321 		.write		= write_jedec_1,
9322 		.read		= read_memmapped,
9323 		.voltage	= {2700, 3600},
9324 	},
9325 
9326 	{
9327 		.vendor		= "Macronix",
9328 		.name		= "MX29GL320EB",
9329 		.bustype	= BUS_PARALLEL,
9330 		.manufacture_id	= MACRONIX_ID,
9331 		.model_id	= MACRONIX_MX29GL320EB,
9332 		.total_size	= 4096,
9333 		.page_size	= 128 * 1024, /* actual page size is 16 */
9334 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9335 		.tested		= TEST_UNTESTED,
9336 		.probe		= probe_jedec_29gl,
9337 		.probe_timing	= TIMING_ZERO,
9338 		.block_erasers	=
9339 		{
9340 			{
9341 				.eraseblocks = {
9342 					{8 * 1024, 8},
9343 					{64 * 1024, 63},
9344 				},
9345 				.block_erase = erase_sector_jedec,
9346 			}, {
9347 				.eraseblocks = { {4 * 1024 * 1024, 1} },
9348 				.block_erase = erase_chip_block_jedec,
9349 			},
9350 		},
9351 		.write		= write_jedec_1,
9352 		.read		= read_memmapped,
9353 		.voltage	= {2700, 3600},
9354 	},
9355 
9356 	{
9357 		.vendor		= "Macronix",
9358 		.name		= "MX29GL320EH/L",
9359 		.bustype	= BUS_PARALLEL,
9360 		.manufacture_id	= MACRONIX_ID,
9361 		.model_id	= MACRONIX_MX29GL320EHL,
9362 		.total_size	= 4096,
9363 		.page_size	= 128 * 1024, /* actual page size is 16 */
9364 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9365 		.tested		= TEST_UNTESTED,
9366 		.probe		= probe_jedec_29gl,
9367 		.probe_timing	= TIMING_ZERO,
9368 		.block_erasers	=
9369 		{
9370 			{
9371 				.eraseblocks = { {64 * 1024, 64} },
9372 				.block_erase = erase_sector_jedec,
9373 			}, {
9374 				.eraseblocks = { {4 * 1024 * 1024, 1} },
9375 				.block_erase = erase_chip_block_jedec,
9376 			},
9377 		},
9378 		.write		= write_jedec_1,
9379 		.read		= read_memmapped,
9380 		.voltage	= {2700, 3600},
9381 	},
9382 
9383 	{
9384 		.vendor		= "Macronix",
9385 		.name		= "MX29GL320ET",
9386 		.bustype	= BUS_PARALLEL,
9387 		.manufacture_id	= MACRONIX_ID,
9388 		.model_id	= MACRONIX_MX29GL320ET,
9389 		.total_size	= 4096,
9390 		.page_size	= 128 * 1024, /* actual page size is 16 */
9391 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9392 		.tested		= TEST_UNTESTED,
9393 		.probe		= probe_jedec_29gl,
9394 		.probe_timing	= TIMING_ZERO,
9395 		.block_erasers	=
9396 		{
9397 			{
9398 				.eraseblocks = {
9399 					{64 * 1024, 63},
9400 					{8 * 1024, 8},
9401 				},
9402 				.block_erase = erase_sector_jedec,
9403 			}, {
9404 				.eraseblocks = { {4 * 1024 * 1024, 1} },
9405 				.block_erase = erase_chip_block_jedec,
9406 			},
9407 		},
9408 		.write		= write_jedec_1,
9409 		.read		= read_memmapped,
9410 		.voltage	= {2700, 3600},
9411 	},
9412 
9413 	{
9414 		.vendor		= "Macronix",
9415 		.name		= "MX29GL640EB",
9416 		.bustype	= BUS_PARALLEL,
9417 		.manufacture_id	= MACRONIX_ID,
9418 		.model_id	= MACRONIX_MX29GL640EB,
9419 		.total_size	= 8192,
9420 		.page_size	= 128 * 1024, /* actual page size is 16 */
9421 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9422 		.tested		= TEST_UNTESTED,
9423 		.probe		= probe_jedec_29gl,
9424 		.probe_timing	= TIMING_ZERO,
9425 		.block_erasers	=
9426 		{
9427 			{
9428 				.eraseblocks = {
9429 					{8 * 1024, 8},
9430 					{64 * 1024, 127},
9431 				},
9432 				.block_erase = erase_sector_jedec,
9433 			}, {
9434 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9435 				.block_erase = erase_chip_block_jedec,
9436 			},
9437 		},
9438 		.write		= write_jedec_1,
9439 		.read		= read_memmapped,
9440 		.voltage	= {2700, 3600},
9441 	},
9442 
9443 	{
9444 		.vendor		= "Macronix",
9445 		.name		= "MX29GL640EH/L",
9446 		.bustype	= BUS_PARALLEL,
9447 		.manufacture_id	= MACRONIX_ID,
9448 		.model_id	= MACRONIX_MX29GL640EHL,
9449 		.total_size	= 8192,
9450 		.page_size	= 128 * 1024, /* actual page size is 16 */
9451 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9452 		.tested		= TEST_UNTESTED,
9453 		.probe		= probe_jedec_29gl,
9454 		.probe_timing	= TIMING_ZERO,
9455 		.block_erasers	=
9456 		{
9457 			{
9458 				.eraseblocks = { {64 * 1024, 128} },
9459 				.block_erase = erase_sector_jedec,
9460 			}, {
9461 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9462 				.block_erase = erase_chip_block_jedec,
9463 			},
9464 		},
9465 		.write		= write_jedec_1,
9466 		.read		= read_memmapped,
9467 		.voltage	= {2700, 3600},
9468 	},
9469 
9470 	{
9471 		.vendor		= "Macronix",
9472 		.name		= "MX29GL640ET",
9473 		.bustype	= BUS_PARALLEL,
9474 		.manufacture_id	= MACRONIX_ID,
9475 		.model_id	= MACRONIX_MX29GL640ET,
9476 		.total_size	= 8192,
9477 		.page_size	= 128 * 1024, /* actual page size is 16 */
9478 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9479 		.tested		= TEST_UNTESTED,
9480 		.probe		= probe_jedec_29gl,
9481 		.probe_timing	= TIMING_ZERO,
9482 		.block_erasers	=
9483 		{
9484 			{
9485 				.eraseblocks = {
9486 					{64 * 1024, 127},
9487 					{8 * 1024, 8},
9488 				},
9489 				.block_erase = erase_sector_jedec,
9490 			}, {
9491 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9492 				.block_erase = erase_chip_block_jedec,
9493 			},
9494 		},
9495 		.write		= write_jedec_1,
9496 		.read		= read_memmapped,
9497 		.voltage	= {2700, 3600},
9498 	},
9499 
9500 	{
9501 		.vendor		= "Macronix",
9502 		.name		= "MX29LV040",
9503 		.bustype	= BUS_PARALLEL,
9504 		.manufacture_id	= MACRONIX_ID,
9505 		.model_id	= MACRONIX_MX29LV040,
9506 		.total_size	= 512,
9507 		.page_size	= 64 * 1024,
9508 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9509 		.tested		= TEST_UNTESTED,
9510 		.probe		= probe_jedec,
9511 		.probe_timing	= TIMING_ZERO,
9512 		.block_erasers	=
9513 		{
9514 			{
9515 				.eraseblocks = { {64 * 1024, 8} },
9516 				.block_erase = erase_sector_jedec,
9517 			}, {
9518 				.eraseblocks = { {512 * 1024, 1} },
9519 				.block_erase = erase_chip_block_jedec,
9520 			},
9521 		},
9522 		.write		= write_jedec_1,
9523 		.read		= read_memmapped,
9524 		.voltage	= {2700, 3600},
9525 	},
9526 
9527 	{
9528 		.vendor		= "Macronix",
9529 		.name		= "MX66L51235F/MX25L51245G",
9530 		.bustype	= BUS_SPI,
9531 		.manufacture_id	= MACRONIX_ID,
9532 		.model_id	= MACRONIX_MX66L51235F,
9533 		.total_size	= 65536,
9534 		.page_size	= 256,
9535 		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
9536 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
9537 		.tested		= TEST_OK_PREW,
9538 		.probe		= probe_spi_rdid,
9539 		.probe_timing	= TIMING_ZERO,
9540 		.block_erasers	=
9541 		{
9542 			{
9543 				.eraseblocks = { {4 * 1024, 16384} },
9544 				.block_erase = spi_block_erase_21,
9545 			}, {
9546 				.eraseblocks = { {4 * 1024, 16384} },
9547 				.block_erase = spi_block_erase_20,
9548 			}, {
9549 				.eraseblocks = { {32 * 1024, 2048} },
9550 				.block_erase = spi_block_erase_5c,
9551 			}, {
9552 				.eraseblocks = { {32 * 1024, 2048} },
9553 				.block_erase = spi_block_erase_52,
9554 			}, {
9555 				.eraseblocks = { {64 * 1024, 1024} },
9556 				.block_erase = spi_block_erase_dc,
9557 			}, {
9558 				.eraseblocks = { {64 * 1024, 1024} },
9559 				.block_erase = spi_block_erase_d8,
9560 			}, {
9561 				.eraseblocks = { {64 * 1024 * 1024, 1} },
9562 				.block_erase = spi_block_erase_60,
9563 			}, {
9564 				.eraseblocks = { {64 * 1024 * 1024, 1} },
9565 				.block_erase = spi_block_erase_c7,
9566 			}
9567 		},
9568 		/* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
9569 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9570 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9571 		.write		= spi_chip_write_256,
9572 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
9573 		.voltage	= {2700, 3600},
9574 	},
9575 
9576 	/* The ST M25P05 is a bit of a problem. It has the same ID as the
9577 	 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
9578 	 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
9579 	 * only is successful if RDID does not work.
9580 	 */
9581 	{
9582 		.vendor		= "Micron/Numonyx/ST",
9583 		.name		= "M25P05",
9584 		.bustype	= BUS_SPI,
9585 		.manufacture_id	= 0, /* Not used. */
9586 		.model_id	= ST_M25P05_RES,
9587 		.total_size	= 64,
9588 		.page_size	= 256,
9589 		.feature_bits	= FEATURE_WRSR_WREN,
9590 		.tested		= TEST_UNTESTED,
9591 		.probe		= probe_spi_res1,
9592 		.probe_timing	= TIMING_ZERO,
9593 		.block_erasers	=
9594 		{
9595 			{
9596 				.eraseblocks = { {32 * 1024, 2} },
9597 				.block_erase = spi_block_erase_d8,
9598 			}, {
9599 				.eraseblocks = { {64 * 1024, 1} },
9600 				.block_erase = spi_block_erase_c7,
9601 			}
9602 		},
9603 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9604 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9605 		.write		= spi_chip_write_1, /* 128 */
9606 		.read		= spi_chip_read,
9607 		.voltage	= {2700, 3600},
9608 	},
9609 
9610 	{
9611 		.vendor		= "Micron/Numonyx/ST",
9612 		.name		= "M25P05-A",
9613 		.bustype	= BUS_SPI,
9614 		.manufacture_id	= ST_ID,
9615 		.model_id	= ST_M25P05A,
9616 		.total_size	= 64,
9617 		.page_size	= 256,
9618 		.feature_bits	= FEATURE_WRSR_WREN,
9619 		.tested		= TEST_OK_PREW,
9620 		.probe		= probe_spi_rdid,
9621 		.probe_timing	= TIMING_ZERO,
9622 		.block_erasers	=
9623 		{
9624 			{
9625 				.eraseblocks = { {32 * 1024, 2} },
9626 				.block_erase = spi_block_erase_d8,
9627 			}, {
9628 				.eraseblocks = { {64 * 1024, 1} },
9629 				.block_erase = spi_block_erase_c7,
9630 			}
9631 		},
9632 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9633 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9634 		.write		= spi_chip_write_256,
9635 		.read		= spi_chip_read,
9636 		.voltage	= {2700, 3600},
9637 	},
9638 
9639 	/* The ST M25P10 has the same problem as the M25P05. */
9640 	{
9641 		.vendor		= "Micron/Numonyx/ST",
9642 		.name		= "M25P10",
9643 		.bustype	= BUS_SPI,
9644 		.manufacture_id	= 0, /* Not used. */
9645 		.model_id	= ST_M25P10_RES,
9646 		.total_size	= 128,
9647 		.page_size	= 256,
9648 		.feature_bits	= FEATURE_WRSR_WREN,
9649 		.tested		= TEST_UNTESTED,
9650 		.probe		= probe_spi_res1,
9651 		.probe_timing	= TIMING_ZERO,
9652 		.block_erasers	=
9653 		{
9654 			{
9655 				.eraseblocks = { {32 * 1024, 4} },
9656 				.block_erase = spi_block_erase_d8,
9657 			}, {
9658 				.eraseblocks = { {128 * 1024, 1} },
9659 				.block_erase = spi_block_erase_c7,
9660 			}
9661 		},
9662 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9663 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9664 		.write		= spi_chip_write_1, /* 128 */
9665 		.read		= spi_chip_read,
9666 		.voltage	= {2700, 3600},
9667 	},
9668 
9669 	{
9670 		.vendor		= "Micron/Numonyx/ST",
9671 		.name		= "M25P10-A",
9672 		.bustype	= BUS_SPI,
9673 		.manufacture_id	= ST_ID,
9674 		.model_id	= ST_M25P10A,
9675 		.total_size	= 128,
9676 		.page_size	= 256,
9677 		.feature_bits	= FEATURE_WRSR_WREN,
9678 		.tested		= TEST_OK_PREW,
9679 		.probe		= probe_spi_rdid,
9680 		.probe_timing	= TIMING_ZERO,
9681 		.block_erasers	=
9682 		{
9683 			{
9684 				.eraseblocks = { {32 * 1024, 4} },
9685 				.block_erase = spi_block_erase_d8,
9686 			}, {
9687 				.eraseblocks = { {128 * 1024, 1} },
9688 				.block_erase = spi_block_erase_c7,
9689 			}
9690 		},
9691 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9692 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9693 		.write		= spi_chip_write_256,
9694 		.read		= spi_chip_read,
9695 		.voltage	= {2700, 3600},
9696 	},
9697 
9698 	{
9699 		.vendor		= "Micron/Numonyx/ST",
9700 		.name		= "M25P128",
9701 		.bustype	= BUS_SPI,
9702 		.manufacture_id	= ST_ID,
9703 		.model_id	= ST_M25P128,
9704 		.total_size	= 16384,
9705 		.page_size	= 256,
9706 		.feature_bits	= FEATURE_WRSR_WREN,
9707 		.tested		= TEST_OK_PREW,
9708 		.probe		= probe_spi_rdid,
9709 		.probe_timing	= TIMING_ZERO,
9710 		.block_erasers	=
9711 		{
9712 			{
9713 				.eraseblocks = { {256 * 1024, 64} },
9714 				.block_erase = spi_block_erase_d8,
9715 			}, {
9716 				.eraseblocks = { {16 * 1024 * 1024, 1} },
9717 				.block_erase = spi_block_erase_c7,
9718 			}
9719 		},
9720 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9721 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9722 		.write		= spi_chip_write_256,
9723 		.read		= spi_chip_read,
9724 		.voltage	= {2700, 3600},
9725 	},
9726 
9727 	{
9728 		.vendor		= "Micron/Numonyx/ST",
9729 		.name		= "M25P16",
9730 		.bustype	= BUS_SPI,
9731 		.manufacture_id	= ST_ID,
9732 		.model_id	= ST_M25P16,
9733 		.total_size	= 2048,
9734 		.page_size	= 256,
9735 		.feature_bits	= FEATURE_WRSR_WREN,
9736 		.tested		= TEST_OK_PREW,
9737 		.probe		= probe_spi_rdid,
9738 		.probe_timing	= TIMING_ZERO,
9739 		.block_erasers	=
9740 		{
9741 			{
9742 				.eraseblocks = { {64 * 1024, 32} },
9743 				.block_erase = spi_block_erase_d8,
9744 			}, {
9745 				.eraseblocks = { {2 * 1024 * 1024, 1} },
9746 				.block_erase = spi_block_erase_c7,
9747 			}
9748 		},
9749 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9750 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9751 		.write		= spi_chip_write_256,
9752 		.read		= spi_chip_read,
9753 		.voltage	= {2700, 3600},
9754 	},
9755 
9756 	{
9757 		.vendor		= "Micron/Numonyx/ST", /* Numonyx */
9758 		.name		= "M25P20",
9759 		.bustype	= BUS_SPI,
9760 		.manufacture_id	= ST_ID,
9761 		.model_id	= ST_M25P20,
9762 		.total_size	= 256,
9763 		.page_size	= 256,
9764 		.feature_bits	= FEATURE_WRSR_WREN,
9765 		.tested		= TEST_UNTESTED,
9766 		.probe		= probe_spi_rdid,
9767 		.probe_timing	= TIMING_ZERO,
9768 		.block_erasers	=
9769 		{
9770 			{
9771 				.eraseblocks = { {64 * 1024, 4} },
9772 				.block_erase = spi_block_erase_d8,
9773 			}, {
9774 				.eraseblocks = { {256 * 1024, 1} },
9775 				.block_erase = spi_block_erase_c7,
9776 			}
9777 		},
9778 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
9779 		.unlock		= spi_disable_blockprotect,
9780 		.write		= spi_chip_write_256,
9781 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
9782 		.voltage	= {2700, 3600},
9783 	},
9784 
9785 	{
9786 		.vendor		= "Micron/Numonyx/ST",
9787 		.name		= "M25P20-old",
9788 		.bustype	= BUS_SPI,
9789 		.manufacture_id	= 0, /* Not used. */
9790 		.model_id	= ST_M25P20_RES,
9791 		.total_size	= 256,
9792 		.page_size	= 256,
9793 		.feature_bits	= FEATURE_WRSR_WREN,
9794 		.tested		= TEST_OK_PREW,
9795 		.probe		= probe_spi_res1,
9796 		.probe_timing	= TIMING_ZERO,
9797 		.block_erasers	=
9798 		{
9799 			{
9800 				.eraseblocks = { {64 * 1024, 4} },
9801 				.block_erase = spi_block_erase_d8,
9802 			}, {
9803 				.eraseblocks = { {256 * 1024, 1} },
9804 				.block_erase = spi_block_erase_c7,
9805 			}
9806 		},
9807 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
9808 		.unlock		= spi_disable_blockprotect,
9809 		.write		= spi_chip_write_256,
9810 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
9811 		.voltage	= {2700, 3600},
9812 	},
9813 
9814 	{
9815 		.vendor		= "Micron/Numonyx/ST",
9816 		.name		= "M25P32",
9817 		.bustype	= BUS_SPI,
9818 		.manufacture_id	= ST_ID,
9819 		.model_id	= ST_M25P32,
9820 		.total_size	= 4096,
9821 		.page_size	= 256,
9822 		.feature_bits	= FEATURE_WRSR_WREN,
9823 		.tested		= TEST_OK_PREW,
9824 		.probe		= probe_spi_rdid,
9825 		.probe_timing	= TIMING_ZERO,
9826 		.block_erasers	=
9827 		{
9828 			{
9829 				.eraseblocks = { {64 * 1024, 64} },
9830 				.block_erase = spi_block_erase_d8,
9831 			}, {
9832 				.eraseblocks = { {4 * 1024 * 1024, 1} },
9833 				.block_erase = spi_block_erase_c7,
9834 			}
9835 		},
9836 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9837 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9838 		.write		= spi_chip_write_256,
9839 		.read		= spi_chip_read,
9840 		.voltage	= {2700, 3600},
9841 	},
9842 
9843 	{
9844 		.vendor		= "Micron/Numonyx/ST", /* Numonyx */
9845 		.name		= "M25P40",
9846 		.bustype	= BUS_SPI,
9847 		.manufacture_id	= ST_ID,
9848 		.model_id	= ST_M25P40,
9849 		.total_size	= 512,
9850 		.page_size	= 256,
9851 		.feature_bits	= FEATURE_WRSR_WREN,
9852 		.tested		= TEST_OK_PREW,
9853 		.probe		= probe_spi_rdid,
9854 		.probe_timing	= TIMING_ZERO,
9855 		.block_erasers	=
9856 		{
9857 			{
9858 				.eraseblocks = { {64 * 1024, 8} },
9859 				.block_erase = spi_block_erase_d8,
9860 			}, {
9861 				.eraseblocks = { {512 * 1024, 1} },
9862 				.block_erase = spi_block_erase_c7,
9863 			}
9864 		},
9865 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9866 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9867 		.write		= spi_chip_write_256,
9868 		.read		= spi_chip_read,
9869 		.voltage	= {2700, 3600},
9870 	},
9871 
9872 	{
9873 		.vendor		= "Micron/Numonyx/ST",
9874 		.name		= "M25P40-old",
9875 		.bustype	= BUS_SPI,
9876 		.manufacture_id	= 0, /* Not used. */
9877 		.model_id	= ST_M25P40_RES,
9878 		.total_size	= 512,
9879 		.page_size	= 256,
9880 		.feature_bits	= FEATURE_WRSR_WREN,
9881 		.tested		= TEST_UNTESTED,
9882 		.probe		= probe_spi_res1,
9883 		.probe_timing	= TIMING_ZERO,
9884 		.block_erasers	=
9885 		{
9886 			{
9887 				.eraseblocks = { {64 * 1024, 8} },
9888 				.block_erase = spi_block_erase_d8,
9889 			}, {
9890 				.eraseblocks = { {512 * 1024, 1} },
9891 				.block_erase = spi_block_erase_c7,
9892 			}
9893 		},
9894 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9895 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9896 		.write		= spi_chip_write_256,
9897 		.read		= spi_chip_read,
9898 	},
9899 
9900 	{
9901 		.vendor		= "Micron/Numonyx/ST",
9902 		.name		= "M25P64",
9903 		.bustype	= BUS_SPI,
9904 		.manufacture_id	= ST_ID,
9905 		.model_id	= ST_M25P64,
9906 		.total_size	= 8192,
9907 		.page_size	= 256,
9908 		.feature_bits	= FEATURE_WRSR_WREN,
9909 		.tested		= TEST_OK_PREW,
9910 		.probe		= probe_spi_rdid,
9911 		.probe_timing	= TIMING_ZERO,
9912 		.block_erasers	=
9913 		{
9914 			{
9915 				.eraseblocks = { {64 * 1024, 128} },
9916 				.block_erase = spi_block_erase_d8,
9917 			}, {
9918 				.eraseblocks = { {8 * 1024 * 1024, 1} },
9919 				.block_erase = spi_block_erase_c7,
9920 			}
9921 		},
9922 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9923 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9924 		.write		= spi_chip_write_256,
9925 		.read		= spi_chip_read,
9926 		.voltage	= {2700, 3600},
9927 	},
9928 
9929 	{
9930 		.vendor		= "Micron/Numonyx/ST",
9931 		.name		= "M25P80",
9932 		.bustype	= BUS_SPI,
9933 		.manufacture_id	= ST_ID,
9934 		.model_id	= ST_M25P80,
9935 		.total_size	= 1024,
9936 		.page_size	= 256,
9937 		.feature_bits	= FEATURE_WRSR_WREN,
9938 		.tested		= TEST_OK_PREW,
9939 		.probe		= probe_spi_rdid,
9940 		.probe_timing	= TIMING_ZERO,
9941 		.block_erasers	=
9942 		{
9943 			{
9944 				.eraseblocks = { {64 * 1024, 16} },
9945 				.block_erase = spi_block_erase_d8,
9946 			}, {
9947 				.eraseblocks = { {1024 * 1024, 1} },
9948 				.block_erase = spi_block_erase_c7,
9949 			}
9950 		},
9951 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9952 		.unlock		= spi_disable_blockprotect_bp3_srwd,
9953 		.write		= spi_chip_write_256,
9954 		.read		= spi_chip_read,
9955 		.voltage	= {2700, 3600},
9956 	},
9957 
9958 	{
9959 		.vendor		= "Micron/Numonyx/ST",
9960 		.name		= "M25PE10",
9961 		.bustype	= BUS_SPI,
9962 		.manufacture_id	= ST_ID,
9963 		.model_id	= ST_M25PE10,
9964 		.total_size	= 128,
9965 		.page_size	= 256,
9966 		.feature_bits	= FEATURE_WRSR_WREN,
9967 		.tested		= TEST_UNTESTED,
9968 		.probe		= probe_spi_rdid,
9969 		.probe_timing	= TIMING_ZERO,
9970 		.block_erasers	=
9971 		{
9972 			{
9973 				.eraseblocks = { {4 * 1024, 32} },
9974 				.block_erase = spi_block_erase_20,
9975 			}, {
9976 				.eraseblocks = { {64 * 1024, 2} },
9977 				.block_erase = spi_block_erase_d8,
9978 			}, {
9979 				.eraseblocks = { {128 * 1024, 1} },
9980 				.block_erase = spi_block_erase_c7,
9981 			}
9982 		},
9983 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
9984 		.unlock		= spi_disable_blockprotect,
9985 		.write		= spi_chip_write_256,
9986 		.read		= spi_chip_read,
9987 		.voltage	= {2700, 3600},
9988 	},
9989 
9990 	{
9991 		.vendor		= "Micron/Numonyx/ST",
9992 		.name		= "M25PE16",
9993 		.bustype	= BUS_SPI,
9994 		.manufacture_id	= ST_ID,
9995 		.model_id	= ST_M25PE16,
9996 		.total_size	= 2048,
9997 		.page_size	= 256,
9998 		.feature_bits	= FEATURE_WRSR_WREN,
9999 		.tested		= TEST_UNTESTED,
10000 		.probe		= probe_spi_rdid,
10001 		.probe_timing	= TIMING_ZERO,
10002 		.block_erasers	=
10003 		{
10004 			{
10005 				.eraseblocks = { {4 * 1024, 512} },
10006 				.block_erase = spi_block_erase_20,
10007 			}, {
10008 				.eraseblocks = { {64 * 1024, 32} },
10009 				.block_erase = spi_block_erase_d8,
10010 			}, {
10011 				.eraseblocks = { {2 * 1024 * 1024, 1} },
10012 				.block_erase = spi_block_erase_c7,
10013 			}
10014 		},
10015 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
10016 		.unlock		= spi_disable_blockprotect,
10017 		.write		= spi_chip_write_256,
10018 		.read		= spi_chip_read,
10019 		.voltage	= {2700, 3600},
10020 	},
10021 
10022 	{
10023 		.vendor		= "Micron/Numonyx/ST",
10024 		.name		= "M25PE20",
10025 		.bustype	= BUS_SPI,
10026 		.manufacture_id	= ST_ID,
10027 		.model_id	= ST_M25PE20,
10028 		.total_size	= 256,
10029 		.page_size	= 256,
10030 		.feature_bits	= FEATURE_WRSR_WREN,
10031 		.tested		= TEST_UNTESTED,
10032 		.probe		= probe_spi_rdid,
10033 		.probe_timing	= TIMING_ZERO,
10034 		.block_erasers	=
10035 		{
10036 			{
10037 				.eraseblocks = { {4 * 1024, 64} },
10038 				.block_erase = spi_block_erase_20,
10039 			}, {
10040 				.eraseblocks = { {64 * 1024, 4} },
10041 				.block_erase = spi_block_erase_d8,
10042 			}, {
10043 				.eraseblocks = { {256 * 1024, 1} },
10044 				.block_erase = spi_block_erase_c7,
10045 			}
10046 		},
10047 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
10048 		.unlock		= spi_disable_blockprotect,
10049 		.write		= spi_chip_write_256,
10050 		.read		= spi_chip_read,
10051 		.voltage	= {2700, 3600},
10052 	},
10053 
10054 	{
10055 		.vendor		= "Micron/Numonyx/ST",
10056 		.name		= "M25PE40",
10057 		.bustype	= BUS_SPI,
10058 		.manufacture_id	= ST_ID,
10059 		.model_id	= ST_M25PE40,
10060 		.total_size	= 512,
10061 		.page_size	= 256,
10062 		.feature_bits	= FEATURE_WRSR_WREN,
10063 		.tested		= TEST_OK_PREW,
10064 		.probe		= probe_spi_rdid,
10065 		.probe_timing	= TIMING_ZERO,
10066 		.block_erasers	=
10067 		{
10068 			{
10069 				.eraseblocks = { {4 * 1024, 128} },
10070 				.block_erase = spi_block_erase_20,
10071 			}, {
10072 				.eraseblocks = { {64 * 1024, 8} },
10073 				.block_erase = spi_block_erase_d8,
10074 			}, {
10075 				.eraseblocks = { {512 * 1024, 1} },
10076 				.block_erase = spi_block_erase_c7,
10077 			}
10078 		},
10079 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
10080 		.unlock		= spi_disable_blockprotect,
10081 		.write		= spi_chip_write_256,
10082 		.read		= spi_chip_read,
10083 		.voltage	= {2700, 3600},
10084 	},
10085 
10086 	{
10087 		.vendor		= "Micron/Numonyx/ST",
10088 		.name		= "M25PE80",
10089 		.bustype	= BUS_SPI,
10090 		.manufacture_id	= ST_ID,
10091 		.model_id	= ST_M25PE80,
10092 		.total_size	= 1024,
10093 		.page_size	= 256,
10094 		.feature_bits	= FEATURE_WRSR_WREN,
10095 		.tested		= TEST_OK_PREW,
10096 		.probe		= probe_spi_rdid,
10097 		.probe_timing	= TIMING_ZERO,
10098 		.block_erasers	=
10099 		{
10100 			{
10101 				.eraseblocks = { {4 * 1024, 256} },
10102 				.block_erase = spi_block_erase_20,
10103 			}, {
10104 				.eraseblocks = { {64 * 1024, 16} },
10105 				.block_erase = spi_block_erase_d8,
10106 			}, {
10107 				.eraseblocks = { {1024 * 1024, 1} },
10108 				.block_erase = spi_block_erase_c7,
10109 			}
10110 		},
10111 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
10112 		.unlock		= spi_disable_blockprotect,
10113 		.write		= spi_chip_write_256,
10114 		.read		= spi_chip_read,
10115 		.voltage	= {2700, 3600},
10116 	},
10117 
10118 	{
10119 		.vendor		= "Micron/Numonyx/ST",
10120 		.name		= "M25PX16",
10121 		.bustype	= BUS_SPI,
10122 		.manufacture_id	= ST_ID,
10123 		.model_id	= ST_M25PX16,
10124 		.total_size	= 2048,
10125 		.page_size	= 256,
10126 		/* OTP: 64B total; read 0x4B; write 0x42 */
10127 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10128 		.tested		= TEST_OK_PREW,
10129 		.probe		= probe_spi_rdid,
10130 		.probe_timing	= TIMING_ZERO,
10131 		.block_erasers	=
10132 		{
10133 			{
10134 				.eraseblocks = { { 4 * 1024, 512 } },
10135 				.block_erase = spi_block_erase_20,
10136 			}, {
10137 				.eraseblocks = { {64 * 1024, 32} },
10138 				.block_erase = spi_block_erase_d8,
10139 			}, {
10140 				.eraseblocks = { {2 * 1024 * 1024, 1} },
10141 				.block_erase = spi_block_erase_c7,
10142 			}
10143 		},
10144 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10145 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10146 		.write		= spi_chip_write_256,
10147 		.read		= spi_chip_read,
10148 		.voltage	= {2300, 3600},
10149 	},
10150 
10151 	{
10152 		.vendor		= "Micron/Numonyx/ST",
10153 		.name		= "M25PX32",
10154 		.bustype	= BUS_SPI,
10155 		.manufacture_id	= ST_ID,
10156 		.model_id	= ST_M25PX32,
10157 		.total_size	= 4096,
10158 		.page_size	= 256,
10159 		/* OTP: 64B total; read 0x4B; write 0x42 */
10160 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10161 		.tested		= TEST_OK_PRE,
10162 		.probe		= probe_spi_rdid,
10163 		.probe_timing	= TIMING_ZERO,
10164 		.block_erasers	=
10165 		{
10166 			{
10167 				.eraseblocks = { { 4 * 1024, 1024 } },
10168 				.block_erase = spi_block_erase_20,
10169 			}, {
10170 				.eraseblocks = { {64 * 1024, 64} },
10171 				.block_erase = spi_block_erase_d8,
10172 			}, {
10173 				.eraseblocks = { {4 * 1024 * 1024, 1} },
10174 				.block_erase = spi_block_erase_c7,
10175 			}
10176 		},
10177 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10178 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10179 		.write		= spi_chip_write_256,
10180 		.read		= spi_chip_read,
10181 		.voltage	= {2700, 3600},
10182 	},
10183 
10184 	{
10185 		.vendor		= "Micron/Numonyx/ST",
10186 		.name		= "M25PX64",
10187 		.bustype	= BUS_SPI,
10188 		.manufacture_id	= ST_ID,
10189 		.model_id	= ST_M25PX64,
10190 		.total_size	= 8192,
10191 		.page_size	= 256,
10192 		/* OTP: 64B total; read 0x4B; write 0x42 */
10193 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10194 		.tested		= TEST_OK_PREW,
10195 		.probe		= probe_spi_rdid,
10196 		.probe_timing	= TIMING_ZERO,
10197 		.block_erasers	=
10198 		{
10199 			{
10200 				.eraseblocks = { { 4 * 1024, 2048 } },
10201 				.block_erase = spi_block_erase_20,
10202 			}, {
10203 				.eraseblocks = { {64 * 1024, 128} },
10204 				.block_erase = spi_block_erase_d8,
10205 			}, {
10206 				.eraseblocks = { {8 * 1024 * 1024, 1} },
10207 				.block_erase = spi_block_erase_c7,
10208 			}
10209 		},
10210 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10211 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10212 		.write		= spi_chip_write_256,
10213 		.read		= spi_chip_read,
10214 		.voltage	= {2700, 3600},
10215 	},
10216 
10217 	{
10218 		.vendor		= "Micron/Numonyx/ST",
10219 		.name		= "M25PX80",
10220 		.bustype	= BUS_SPI,
10221 		.manufacture_id	= ST_ID,
10222 		.model_id	= ST_M25PX80,
10223 		.total_size	= 1024,
10224 		.page_size	= 256,
10225 		/* OTP: 64B total; read 0x4B, write 0x42 */
10226 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10227 		.tested		= TEST_OK_PREW,
10228 		.probe		= probe_spi_rdid,
10229 		.probe_timing	= TIMING_ZERO,
10230 		.block_erasers	=
10231 		{
10232 			{
10233 				.eraseblocks = { { 4 * 1024, 256 } },
10234 				.block_erase = spi_block_erase_20,
10235 			}, {
10236 				.eraseblocks = { {64 * 1024, 16} },
10237 				.block_erase = spi_block_erase_d8,
10238 			}, {
10239 				.eraseblocks = { {1024 * 1024, 1} },
10240 				.block_erase = spi_block_erase_c7,
10241 			}
10242 		},
10243 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10244 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10245 		.write		= spi_chip_write_256,
10246 		.read		= spi_chip_read,
10247 		.voltage	= {2700, 3600},
10248 	},
10249 
10250 	{
10251 		.vendor		= "Micron/Numonyx/ST",
10252 		.name		= "M45PE10",
10253 		.bustype	= BUS_SPI,
10254 		.manufacture_id	= ST_ID,
10255 		.model_id	= ST_M45PE10,
10256 		.total_size	= 128,
10257 		.page_size	= 256,
10258 		.tested		= TEST_UNTESTED,
10259 		.probe		= probe_spi_rdid,
10260 		.probe_timing	= TIMING_ZERO,
10261 		.block_erasers	=
10262 		{
10263 			{
10264 				.eraseblocks = { {256, 512} },
10265 				.block_erase = spi_block_erase_db,
10266 			}, {
10267 				.eraseblocks = { {64 * 1024, 2} },
10268 				.block_erase = spi_block_erase_d8,
10269 			}
10270 		},
10271 		.printlock	= spi_prettyprint_status_register_default_welwip,
10272 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
10273 		.write		= spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10274 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
10275 		.voltage	= {2700, 3600},
10276 	},
10277 
10278 	{
10279 		.vendor		= "Micron/Numonyx/ST",
10280 		.name		= "M45PE16",
10281 		.bustype	= BUS_SPI,
10282 		.manufacture_id	= ST_ID,
10283 		.model_id	= ST_M45PE16,
10284 		.total_size	= 2048,
10285 		.page_size	= 256,
10286 		.tested		= TEST_UNTESTED,
10287 		.probe		= probe_spi_rdid,
10288 		.probe_timing	= TIMING_ZERO,
10289 		.block_erasers	=
10290 		{
10291 			{
10292 				.eraseblocks = { {256, 8192} },
10293 				.block_erase = spi_block_erase_db,
10294 			}, {
10295 				.eraseblocks = { {64 * 1024, 32} },
10296 				.block_erase = spi_block_erase_d8,
10297 			}
10298 		},
10299 		.printlock	= spi_prettyprint_status_register_default_welwip,
10300 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
10301 		.write		= spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10302 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
10303 		.voltage	= {2700, 3600},
10304 	},
10305 
10306 	{
10307 		.vendor		= "Micron/Numonyx/ST",
10308 		.name		= "M45PE20",
10309 		.bustype	= BUS_SPI,
10310 		.manufacture_id	= ST_ID,
10311 		.model_id	= ST_M45PE20,
10312 		.total_size	= 256,
10313 		.page_size	= 256,
10314 		.tested		= TEST_UNTESTED,
10315 		.probe		= probe_spi_rdid,
10316 		.probe_timing	= TIMING_ZERO,
10317 		.block_erasers	=
10318 		{
10319 			{
10320 				.eraseblocks = { {256, 1024} },
10321 				.block_erase = spi_block_erase_db,
10322 			}, {
10323 				.eraseblocks = { {64 * 1024, 4} },
10324 				.block_erase = spi_block_erase_d8,
10325 			}
10326 		},
10327 		.printlock	= spi_prettyprint_status_register_default_welwip,
10328 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
10329 		.write		= spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10330 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
10331 		.voltage	= {2700, 3600},
10332 	},
10333 
10334 	{
10335 		.vendor		= "Micron/Numonyx/ST",
10336 		.name		= "M45PE40",
10337 		.bustype	= BUS_SPI,
10338 		.manufacture_id	= ST_ID,
10339 		.model_id	= ST_M45PE40,
10340 		.total_size	= 512,
10341 		.page_size	= 256,
10342 		.tested		= TEST_UNTESTED,
10343 		.probe		= probe_spi_rdid,
10344 		.probe_timing	= TIMING_ZERO,
10345 		.block_erasers	=
10346 		{
10347 			{
10348 				.eraseblocks = { {256, 2048} },
10349 				.block_erase = spi_block_erase_db,
10350 			}, {
10351 				.eraseblocks = { {64 * 1024, 8} },
10352 				.block_erase = spi_block_erase_d8,
10353 			}
10354 		},
10355 		.printlock	= spi_prettyprint_status_register_default_welwip,
10356 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
10357 		.write		= spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
10358 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
10359 		.voltage	= {2700, 3600},
10360 	},
10361 
10362 	{
10363 		.vendor		= "Micron/Numonyx/ST",
10364 		.name		= "M45PE80",
10365 		.bustype	= BUS_SPI,
10366 		.manufacture_id	= ST_ID,
10367 		.model_id	= ST_M45PE80,
10368 		.total_size	= 1024,
10369 		.page_size	= 256,
10370 		.tested		= TEST_UNTESTED,
10371 		.probe		= probe_spi_rdid,
10372 		.probe_timing	= TIMING_ZERO,
10373 		.block_erasers	=
10374 		{
10375 			{
10376 				.eraseblocks = { {256, 4096} },
10377 				.block_erase = spi_block_erase_db,
10378 			}, {
10379 				.eraseblocks = { {64 * 1024, 16} },
10380 				.block_erase = spi_block_erase_d8,
10381 			}
10382 		},
10383 		.printlock	= spi_prettyprint_status_register_default_welwip,
10384 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
10385 		.write		= spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10386 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
10387 		.voltage	= {2700, 3600},
10388 	},
10389 
10390 	{
10391 		.vendor		= "Micron/Numonyx/ST",
10392 		.name		= "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10393 		.bustype	= BUS_SPI,
10394 		.manufacture_id	= ST_ID,
10395 		.model_id	= ST_N25Q00A__1G,
10396 		.total_size	= 131072,
10397 		.page_size	= 256,
10398 		/* supports SFDP */
10399 		/* OTP: 64B total; read 0x4B, write 0x42 */
10400 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10401 		.tested		= TEST_UNTESTED,
10402 		.probe		= probe_spi_rdid,
10403 		.probe_timing	= TIMING_ZERO,
10404 		.block_erasers	=
10405 		{
10406 			{
10407 				.eraseblocks = { {4 * 1024, 32768} },
10408 				.block_erase = spi_block_erase_21,
10409 			}, {
10410 				.eraseblocks = { {4 * 1024, 32768} },
10411 				.block_erase = spi_block_erase_20,
10412 			}, {
10413 				.eraseblocks = { {64 * 1024, 2048} },
10414 				.block_erase = spi_block_erase_dc,
10415 			}, {
10416 				.eraseblocks = { {64 * 1024, 2048} },
10417 				.block_erase = spi_block_erase_d8,
10418 			}, {
10419 				.eraseblocks = { {32768 * 1024, 4} },
10420 				.block_erase = spi_block_erase_c4,
10421 			}
10422 		},
10423 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10424 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10425 		.write		= spi_chip_write_256, /* Multi I/O supported */
10426 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10427 		.voltage	= {1700, 2000},
10428 	},
10429 
10430 	{
10431 		.vendor		= "Micron/Numonyx/ST",
10432 		.name		= "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
10433 		.bustype	= BUS_SPI,
10434 		.manufacture_id	= ST_ID,
10435 		.model_id	= ST_N25Q00A__3G,
10436 		.total_size	= 131072,
10437 		.page_size	= 256,
10438 		/* supports SFDP */
10439 		/* OTP: 64B total; read 0x4B, write 0x42 */
10440 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10441 		.tested		= TEST_UNTESTED,
10442 		.probe		= probe_spi_rdid,
10443 		.probe_timing	= TIMING_ZERO,
10444 		.block_erasers	=
10445 		{
10446 			{
10447 				.eraseblocks = { {4 * 1024, 32768} },
10448 				.block_erase = spi_block_erase_21,
10449 			}, {
10450 				.eraseblocks = { {4 * 1024, 32768} },
10451 				.block_erase = spi_block_erase_20,
10452 			}, {
10453 				.eraseblocks = { {64 * 1024, 2048} },
10454 				.block_erase = spi_block_erase_dc,
10455 			}, {
10456 				.eraseblocks = { {64 * 1024, 2048} },
10457 				.block_erase = spi_block_erase_d8,
10458 			}, {
10459 				.eraseblocks = { {32768 * 1024, 4} },
10460 				.block_erase = spi_block_erase_c4,
10461 			}
10462 		},
10463 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10464 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10465 		.write		= spi_chip_write_256, /* Multi I/O supported */
10466 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10467 		.voltage	= {2700, 3600},
10468 	},
10469 
10470 	{
10471 		.vendor		= "Micron/Numonyx/ST",
10472 		.name		= "N25Q016",
10473 		.bustype	= BUS_SPI,
10474 		.manufacture_id	= ST_ID,
10475 		.model_id	= ST_N25Q016__1E,
10476 		.total_size	= 2048,
10477 		.page_size	= 256,
10478 		/* supports SFDP */
10479 		/* OTP: 64B total; read 0x4B, write 0x42 */
10480 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10481 		.tested		= TEST_UNTESTED,
10482 		.probe		= probe_spi_rdid,
10483 		.probe_timing	= TIMING_ZERO,
10484 		.block_erasers	=
10485 		{
10486 			{
10487 				.eraseblocks = { {4 * 1024, 512} },
10488 				.block_erase = spi_block_erase_20,
10489 			}, {
10490 				.eraseblocks = { {32 * 1024, 64} },
10491 				.block_erase = spi_block_erase_52,
10492 			}, {
10493 				.eraseblocks = { {64 * 1024, 32} },
10494 				.block_erase = spi_block_erase_d8,
10495 			}, {
10496 				.eraseblocks = { {2 * 1024 * 1024, 1} },
10497 				.block_erase = spi_block_erase_c7,
10498 			}
10499 		},
10500 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10501 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10502 		.write		= spi_chip_write_256, /* Multi I/O supported */
10503 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10504 		.voltage	= {1700, 2000},
10505 	},
10506 
10507 	{
10508 		.vendor		= "Micron/Numonyx/ST",
10509 		.name		= "N25Q032..1E",
10510 		.bustype	= BUS_SPI,
10511 		.manufacture_id	= ST_ID,
10512 		.model_id	= ST_N25Q032__1E,
10513 		.total_size	= 4096,
10514 		.page_size	= 256,
10515 		/* supports SFDP */
10516 		/* OTP: 64B total; read 0x4B, write 0x42 */
10517 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10518 		.tested		= TEST_UNTESTED,
10519 		.probe		= probe_spi_rdid,
10520 		.probe_timing	= TIMING_ZERO,
10521 		.block_erasers	=
10522 		{
10523 			{
10524 				.eraseblocks = { {4 * 1024, 1024} },
10525 				.block_erase = spi_block_erase_20,
10526 			}, {
10527 				.eraseblocks = { {64 * 1024, 64} },
10528 				.block_erase = spi_block_erase_d8,
10529 			}, {
10530 				.eraseblocks = { {4 * 1024 * 1024, 1} },
10531 				.block_erase = spi_block_erase_c7,
10532 			}
10533 		},
10534 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10535 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10536 		.write		= spi_chip_write_256, /* Multi I/O supported */
10537 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10538 		.voltage	= {1700, 2000},
10539 	},
10540 
10541 	{
10542 		.vendor		= "Micron/Numonyx/ST",
10543 		.name		= "N25Q032..3E",
10544 		.bustype	= BUS_SPI,
10545 		.manufacture_id	= ST_ID,
10546 		.model_id	= ST_N25Q032__3E,
10547 		.total_size	= 4096,
10548 		.page_size	= 256,
10549 		/* supports SFDP */
10550 		/* OTP: 64B total; read 0x4B, write 0x42 */
10551 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10552 		.tested		= TEST_OK_PREW,
10553 		.probe		= probe_spi_rdid,
10554 		.probe_timing	= TIMING_ZERO,
10555 		.block_erasers	=
10556 		{
10557 			{
10558 				.eraseblocks = { {4 * 1024, 1024} },
10559 				.block_erase = spi_block_erase_20,
10560 			}, {
10561 				.eraseblocks = { {64 * 1024, 64} },
10562 				.block_erase = spi_block_erase_d8,
10563 			}, {
10564 				.eraseblocks = { {4 * 1024 * 1024, 1} },
10565 				.block_erase = spi_block_erase_c7,
10566 			}
10567 		},
10568 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10569 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10570 		.write		= spi_chip_write_256, /* Multi I/O supported */
10571 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10572 		.voltage	= {2700, 3600},
10573 	},
10574 
10575 	{
10576 		.vendor		= "Micron/Numonyx/ST",
10577 		.name		= "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10578 		.bustype	= BUS_SPI,
10579 		.manufacture_id	= ST_ID,
10580 		.model_id	= ST_N25Q064__1E,
10581 		.total_size	= 8192,
10582 		.page_size	= 256,
10583 		/* supports SFDP */
10584 		/* OTP: 64B total; read 0x4B, write 0x42 */
10585 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10586 		.tested		= TEST_OK_PREW,
10587 		.probe		= probe_spi_rdid,
10588 		.probe_timing	= TIMING_ZERO,
10589 		.block_erasers	=
10590 		{
10591 			{
10592 				.eraseblocks = { {4 * 1024, 2048 } },
10593 				.block_erase = spi_block_erase_20,
10594 			}, {
10595 				.eraseblocks = { {64 * 1024, 128} },
10596 				.block_erase = spi_block_erase_d8,
10597 			}, {
10598 				.eraseblocks = { {8 * 1024 * 1024, 1} },
10599 				.block_erase = spi_block_erase_c7,
10600 			}
10601 		},
10602 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10603 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10604 		.write		= spi_chip_write_256, /* Multi I/O supported */
10605 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10606 		.voltage	= {1700, 2000},
10607 	},
10608 
10609 	{
10610 		.vendor		= "Micron/Numonyx/ST",
10611 		.name		= "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10612 		.bustype	= BUS_SPI,
10613 		.manufacture_id	= ST_ID,
10614 		.model_id	= ST_N25Q064__3E,
10615 		.total_size	= 8192,
10616 		.page_size	= 256,
10617 		/* supports SFDP */
10618 		/* OTP: 64B total; read 0x4B, write 0x42 */
10619 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10620 		.tested		= TEST_OK_PREW,
10621 		.probe		= probe_spi_rdid,
10622 		.probe_timing	= TIMING_ZERO,
10623 		.block_erasers	=
10624 		{
10625 			{
10626 				.eraseblocks = { {4 * 1024, 2048 } },
10627 				.block_erase = spi_block_erase_20,
10628 			}, {
10629 				.eraseblocks = { {64 * 1024, 128} },
10630 				.block_erase = spi_block_erase_d8,
10631 			}, {
10632 				.eraseblocks = { {8 * 1024 * 1024, 1} },
10633 				.block_erase = spi_block_erase_c7,
10634 			}
10635 		},
10636 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10637 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10638 		.write		= spi_chip_write_256, /* Multi I/O supported */
10639 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10640 		.voltage	= {2700, 3600},
10641 	},
10642 
10643 	{
10644 		.vendor		= "Micron/Numonyx/ST",
10645 		.name		= "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10646 		.bustype	= BUS_SPI,
10647 		.manufacture_id	= ST_ID,
10648 		.model_id	= ST_N25Q128__1E,
10649 		.total_size	= 16384,
10650 		.page_size	= 256,
10651 		/* supports SFDP */
10652 		/* OTP: 64B total; read 0x4B, write 0x42 */
10653 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10654 		.tested		= TEST_OK_PREW,
10655 		.probe		= probe_spi_rdid,
10656 		.probe_timing	= TIMING_ZERO,
10657 		.block_erasers	=
10658 		{
10659 			{
10660 				.eraseblocks = { {4 * 1024, 4096 } },
10661 				.block_erase = spi_block_erase_20,
10662 			}, {
10663 				.eraseblocks = { {64 * 1024, 256} },
10664 				.block_erase = spi_block_erase_d8,
10665 			}, {
10666 				.eraseblocks = { {16384 * 1024, 1} },
10667 				.block_erase = spi_block_erase_c7,
10668 			}
10669 		},
10670 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10671 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10672 		.write		= spi_chip_write_256, /* Multi I/O supported */
10673 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10674 		.voltage	= {1700, 2000},
10675 	},
10676 
10677 	{
10678 		.vendor		= "Micron/Numonyx/ST",
10679 		.name		= "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10680 		.bustype	= BUS_SPI,
10681 		.manufacture_id	= ST_ID,
10682 		.model_id	= ST_N25Q128__3E,
10683 		.total_size	= 16384,
10684 		.page_size	= 256,
10685 		/* supports SFDP */
10686 		/* OTP: 64B total; read 0x4B, write 0x42 */
10687 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
10688 		.tested		= TEST_OK_PREW,
10689 		.probe		= probe_spi_rdid,
10690 		.probe_timing	= TIMING_ZERO,
10691 		.block_erasers	=
10692 		{
10693 			{
10694 				.eraseblocks = { {4 * 1024, 4096 } },
10695 				.block_erase = spi_block_erase_20,
10696 			}, {
10697 				.eraseblocks = { {64 * 1024, 256} },
10698 				.block_erase = spi_block_erase_d8,
10699 			}, {
10700 				.eraseblocks = { {16384 * 1024, 1} },
10701 				.block_erase = spi_block_erase_c7,
10702 			}
10703 		},
10704 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10705 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10706 		.write		= spi_chip_write_256, /* Multi I/O supported */
10707 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10708 		.voltage	= {2700, 3600},
10709 	},
10710 
10711 	{
10712 		.vendor		= "Micron/Numonyx/ST",
10713 		.name		= "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10714 		.bustype	= BUS_SPI,
10715 		.manufacture_id	= ST_ID,
10716 		.model_id	= ST_N25Q256__1E,
10717 		.total_size	= 32768,
10718 		.page_size	= 256,
10719 		/* supports SFDP */
10720 		/* OTP: 64B total; read 0x4B, write 0x42 */
10721 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10722 		.tested		= TEST_UNTESTED,
10723 		.probe		= probe_spi_rdid,
10724 		.probe_timing	= TIMING_ZERO,
10725 		.block_erasers	=
10726 		{
10727 			{
10728 				.eraseblocks = { {4 * 1024, 8192} },
10729 				.block_erase = spi_block_erase_21,
10730 			}, {
10731 				.eraseblocks = { {4 * 1024, 8192} },
10732 				.block_erase = spi_block_erase_20,
10733 			}, {
10734 				.eraseblocks = { {64 * 1024, 512} },
10735 				.block_erase = spi_block_erase_dc,
10736 			}, {
10737 				.eraseblocks = { {64 * 1024, 512} },
10738 				.block_erase = spi_block_erase_d8,
10739 			}, {
10740 				.eraseblocks = { {32768 * 1024, 1} },
10741 				.block_erase = spi_block_erase_c7,
10742 			}
10743 		},
10744 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10745 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10746 		.write		= spi_chip_write_256, /* Multi I/O supported */
10747 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10748 		.voltage	= {1700, 2000},
10749 	},
10750 
10751 	{
10752 		.vendor		= "Micron/Numonyx/ST",
10753 		.name		= "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10754 		.bustype	= BUS_SPI,
10755 		.manufacture_id	= ST_ID,
10756 		.model_id	= ST_N25Q256__3E,
10757 		.total_size	= 32768,
10758 		.page_size	= 256,
10759 		/* supports SFDP */
10760 		/* OTP: 64B total; read 0x4B, write 0x42 */
10761 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10762 		.tested		= TEST_UNTESTED,
10763 		.probe		= probe_spi_rdid,
10764 		.probe_timing	= TIMING_ZERO,
10765 		.block_erasers	=
10766 		{
10767 			{
10768 				.eraseblocks = { {4 * 1024, 8192} },
10769 				.block_erase = spi_block_erase_21,
10770 			}, {
10771 				.eraseblocks = { {4 * 1024, 8192} },
10772 				.block_erase = spi_block_erase_20,
10773 			}, {
10774 				.eraseblocks = { {64 * 1024, 512} },
10775 				.block_erase = spi_block_erase_dc,
10776 			}, {
10777 				.eraseblocks = { {64 * 1024, 512} },
10778 				.block_erase = spi_block_erase_d8,
10779 			}, {
10780 				.eraseblocks = { {32768 * 1024, 1} },
10781 				.block_erase = spi_block_erase_c7,
10782 			}
10783 		},
10784 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10785 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10786 		.write		= spi_chip_write_256, /* Multi I/O supported */
10787 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10788 		.voltage	= {2700, 3600},
10789 	},
10790 
10791 	{
10792 		.vendor		= "Micron/Numonyx/ST",
10793 		.name		= "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10794 		.bustype	= BUS_SPI,
10795 		.manufacture_id	= ST_ID,
10796 		.model_id	= ST_N25Q512__1G,
10797 		.total_size	= 65536,
10798 		.page_size	= 256,
10799 		/* supports SFDP */
10800 		/* OTP: 64B total; read 0x4B, write 0x42 */
10801 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10802 		.tested		= TEST_UNTESTED,
10803 		.probe		= probe_spi_rdid,
10804 		.probe_timing	= TIMING_ZERO,
10805 		.block_erasers	=
10806 		{
10807 			{
10808 				.eraseblocks = { {4 * 1024, 16384} },
10809 				.block_erase = spi_block_erase_21,
10810 			}, {
10811 				.eraseblocks = { {4 * 1024, 16384} },
10812 				.block_erase = spi_block_erase_20,
10813 			}, {
10814 				.eraseblocks = { {64 * 1024, 1024} },
10815 				.block_erase = spi_block_erase_dc,
10816 			}, {
10817 				.eraseblocks = { {64 * 1024, 1024} },
10818 				.block_erase = spi_block_erase_d8,
10819 			}, {
10820 				.eraseblocks = { {32768 * 1024, 2} },
10821 				.block_erase = spi_block_erase_c4,
10822 			}
10823 		},
10824 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10825 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10826 		.write		= spi_chip_write_256, /* Multi I/O supported */
10827 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10828 		.voltage	= {1700, 2000},
10829 	},
10830 
10831 	{
10832 		.vendor		= "Micron/Numonyx/ST",
10833 		.name		= "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
10834 		.bustype	= BUS_SPI,
10835 		.manufacture_id	= ST_ID,
10836 		.model_id	= ST_N25Q512__3G,
10837 		.total_size	= 65536,
10838 		.page_size	= 256,
10839 		/* supports SFDP */
10840 		/* OTP: 64B total; read 0x4B, write 0x42 */
10841 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10842 		.tested		= TEST_OK_PREW,
10843 		.probe		= probe_spi_rdid,
10844 		.probe_timing	= TIMING_ZERO,
10845 		.block_erasers	=
10846 		{
10847 			{
10848 				.eraseblocks = { {4 * 1024, 16384} },
10849 				.block_erase = spi_block_erase_21,
10850 			}, {
10851 				.eraseblocks = { {4 * 1024, 16384} },
10852 				.block_erase = spi_block_erase_20,
10853 			}, {
10854 				.eraseblocks = { {64 * 1024, 1024} },
10855 				.block_erase = spi_block_erase_dc,
10856 			}, {
10857 				.eraseblocks = { {64 * 1024, 1024} },
10858 				.block_erase = spi_block_erase_d8,
10859 			}, {
10860 				.eraseblocks = { {32768 * 1024, 2} },
10861 				.block_erase = spi_block_erase_c4,
10862 			}
10863 		},
10864 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10865 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10866 		.write		= spi_chip_write_256, /* Multi I/O supported */
10867 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10868 		.voltage	= {2700, 3600},
10869 	},
10870 
10871 	{
10872 		.vendor		= "Micron",
10873 		.name		= "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
10874 		.bustype	= BUS_SPI,
10875 		.manufacture_id	= ST_ID,
10876 		.model_id	= ST_N25Q00A__3G,
10877 		.total_size	= 131072,
10878 		.page_size	= 256,
10879 		/* supports SFDP */
10880 		/* OTP: 64B total; read 0x4B, write 0x42 */
10881 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10882 		.tested		= TEST_OK_PREW,
10883 		.probe		= probe_spi_rdid,
10884 		.probe_timing	= TIMING_ZERO,
10885 		.block_erasers	=
10886 		{
10887 			{
10888 				.eraseblocks = { {4 * 1024, 32768} },
10889 				.block_erase = spi_block_erase_21,
10890 			}, {
10891 				.eraseblocks = { {4 * 1024, 32768} },
10892 				.block_erase = spi_block_erase_20,
10893 			}, {
10894 				.eraseblocks = { {32 * 1024, 4096} },
10895 				.block_erase = spi_block_erase_5c,
10896 			}, {
10897 				.eraseblocks = { {32 * 1024, 4096} },
10898 				.block_erase = spi_block_erase_52,
10899 			}, {
10900 				.eraseblocks = { {64 * 1024, 2048} },
10901 				.block_erase = spi_block_erase_dc,
10902 			}, {
10903 				.eraseblocks = { {64 * 1024, 2048} },
10904 				.block_erase = spi_block_erase_d8,
10905 			}, {
10906 				.eraseblocks = { {65536 * 1024, 2} },
10907 				.block_erase = spi_block_erase_c4,
10908 			}
10909 		},
10910 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10911 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10912 		.write		= spi_chip_write_256, /* Multi I/O supported */
10913 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10914 		.voltage	= {2700, 3600},
10915 	},
10916 
10917 	{
10918 		.vendor		= "Micron",
10919 		.name		= "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
10920 		.bustype	= BUS_SPI,
10921 		.manufacture_id	= ST_ID,
10922 		.model_id	= ST_N25Q00A__1G,
10923 		.total_size	= 131072,
10924 		.page_size	= 256,
10925 		/* supports SFDP */
10926 		/* OTP: 64B total; read 0x4B, write 0x42 */
10927 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10928 		.tested		= TEST_UNTESTED,
10929 		.probe		= probe_spi_rdid,
10930 		.probe_timing	= TIMING_ZERO,
10931 		.block_erasers	=
10932 		{
10933 			{
10934 				.eraseblocks = { {4 * 1024, 32768} },
10935 				.block_erase = spi_block_erase_21,
10936 			}, {
10937 				.eraseblocks = { {4 * 1024, 32768} },
10938 				.block_erase = spi_block_erase_20,
10939 			}, {
10940 				.eraseblocks = { {32 * 1024, 4096} },
10941 				.block_erase = spi_block_erase_5c,
10942 			}, {
10943 				.eraseblocks = { {32 * 1024, 4096} },
10944 				.block_erase = spi_block_erase_52,
10945 			}, {
10946 				.eraseblocks = { {64 * 1024, 2048} },
10947 				.block_erase = spi_block_erase_dc,
10948 			}, {
10949 				.eraseblocks = { {64 * 1024, 2048} },
10950 				.block_erase = spi_block_erase_d8,
10951 			}, {
10952 				.eraseblocks = { {65536 * 1024, 2} },
10953 				.block_erase = spi_block_erase_c4,
10954 			}
10955 		},
10956 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10957 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10958 		.write		= spi_chip_write_256, /* Multi I/O supported */
10959 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10960 		.voltage	= {1700, 2000},
10961 	},
10962 
10963 	{
10964 		.vendor		= "Micron",
10965 		.name		= "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
10966 		.bustype	= BUS_SPI,
10967 		.manufacture_id	= ST_ID,
10968 		.model_id	= ST_MT25QL02G,
10969 		.total_size	= 262144,
10970 		.page_size	= 256,
10971 		/* supports SFDP */
10972 		/* OTP: 64B total; read 0x4B, write 0x42 */
10973 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10974 		.tested		= TEST_UNTESTED,
10975 		.probe		= probe_spi_rdid,
10976 		.probe_timing	= TIMING_ZERO,
10977 		.block_erasers	=
10978 		{
10979 			{
10980 				.eraseblocks = { {4 * 1024, 65536} },
10981 				.block_erase = spi_block_erase_21,
10982 			}, {
10983 				.eraseblocks = { {4 * 1024, 65536} },
10984 				.block_erase = spi_block_erase_20,
10985 			}, {
10986 				.eraseblocks = { {32 * 1024, 8192} },
10987 				.block_erase = spi_block_erase_5c,
10988 			}, {
10989 				.eraseblocks = { {32 * 1024, 8192} },
10990 				.block_erase = spi_block_erase_52,
10991 			}, {
10992 				.eraseblocks = { {64 * 1024, 4096} },
10993 				.block_erase = spi_block_erase_dc,
10994 			}, {
10995 				.eraseblocks = { {64 * 1024, 4096} },
10996 				.block_erase = spi_block_erase_d8,
10997 			}, {
10998 				.eraseblocks = { {65536 * 1024, 4} },
10999 				.block_erase = spi_block_erase_c4,
11000 			}
11001 		},
11002 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11003 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11004 		.write		= spi_chip_write_256, /* Multi I/O supported */
11005 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11006 		.voltage	= {2700, 3600},
11007 	},
11008 
11009 	{
11010 		.vendor		= "Micron",
11011 		.name		= "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11012 		.bustype	= BUS_SPI,
11013 		.manufacture_id	= ST_ID,
11014 		.model_id	= ST_MT25QU02G,
11015 		.total_size	= 262144,
11016 		.page_size	= 256,
11017 		/* supports SFDP */
11018 		/* OTP: 64B total; read 0x4B, write 0x42 */
11019 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11020 		.tested		= TEST_UNTESTED,
11021 		.probe		= probe_spi_rdid,
11022 		.probe_timing	= TIMING_ZERO,
11023 		.block_erasers	=
11024 		{
11025 			{
11026 				.eraseblocks = { {4 * 1024, 65536} },
11027 				.block_erase = spi_block_erase_21,
11028 			}, {
11029 				.eraseblocks = { {4 * 1024, 65536} },
11030 				.block_erase = spi_block_erase_20,
11031 			}, {
11032 				.eraseblocks = { {32 * 1024, 8192} },
11033 				.block_erase = spi_block_erase_5c,
11034 			}, {
11035 				.eraseblocks = { {32 * 1024, 8192} },
11036 				.block_erase = spi_block_erase_52,
11037 			}, {
11038 				.eraseblocks = { {64 * 1024, 4096} },
11039 				.block_erase = spi_block_erase_dc,
11040 			}, {
11041 				.eraseblocks = { {64 * 1024, 4096} },
11042 				.block_erase = spi_block_erase_d8,
11043 			}, {
11044 				.eraseblocks = { {65536 * 1024, 4} },
11045 				.block_erase = spi_block_erase_c4,
11046 			}
11047 		},
11048 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11049 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11050 		.write		= spi_chip_write_256, /* Multi I/O supported */
11051 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11052 		.voltage	= {1700, 2000},
11053 	},
11054 
11055 	{
11056 		.vendor		= "Micron",
11057 		.name		= "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11058 		.bustype	= BUS_SPI,
11059 		.manufacture_id	= ST_ID,
11060 		.model_id	= ST_N25Q128__1E,
11061 		.total_size	= 16384,
11062 		.page_size	= 256,
11063 		/* supports SFDP */
11064 		/* OTP: 64B total; read 0x4B, write 0x42 */
11065 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11066 		.tested		= TEST_UNTESTED,
11067 		.probe		= probe_spi_rdid,
11068 		.probe_timing	= TIMING_ZERO,
11069 		.block_erasers	=
11070 		{
11071 			{
11072 				.eraseblocks = { {4 * 1024, 4096} },
11073 				.block_erase = spi_block_erase_20,
11074 			}, {
11075 				.eraseblocks = { {32 * 1024, 512} },
11076 				.block_erase = spi_block_erase_52,
11077 			}, {
11078 				.eraseblocks = { {64 * 1024, 256} },
11079 				.block_erase = spi_block_erase_d8,
11080 			}, {
11081 				.eraseblocks = { {16384 * 1024, 1} },
11082 				.block_erase = spi_block_erase_c7,
11083 			}, {
11084 				.eraseblocks = { {16384 * 1024, 1} },
11085 				.block_erase = spi_block_erase_60,
11086 			}
11087 		},
11088 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11089 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11090 		.write		= spi_chip_write_256, /* Multi I/O supported */
11091 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11092 		.voltage	= {1700, 2000},
11093 	},
11094 
11095 	{
11096 		.vendor		= "Micron",
11097 		.name		= "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11098 		.bustype	= BUS_SPI,
11099 		.manufacture_id	= ST_ID,
11100 		.model_id	= ST_N25Q128__3E,
11101 		.total_size	= 16384,
11102 		.page_size	= 256,
11103 		/* supports SFDP */
11104 		/* OTP: 64B total; read 0x4B, write 0x42 */
11105 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11106 		.tested		= TEST_UNTESTED,
11107 		.probe		= probe_spi_rdid,
11108 		.probe_timing	= TIMING_ZERO,
11109 		.block_erasers	=
11110 		{
11111 			{
11112 				.eraseblocks = { {4 * 1024, 4096} },
11113 				.block_erase = spi_block_erase_20,
11114 			}, {
11115 				.eraseblocks = { {32 * 1024, 512} },
11116 				.block_erase = spi_block_erase_52,
11117 			}, {
11118 				.eraseblocks = { {64 * 1024, 256} },
11119 				.block_erase = spi_block_erase_d8,
11120 			}, {
11121 				.eraseblocks = { {16384 * 1024, 1} },
11122 				.block_erase = spi_block_erase_c7,
11123 			}, {
11124 				.eraseblocks = { {16384 * 1024, 1} },
11125 				.block_erase = spi_block_erase_60,
11126 			}
11127 		},
11128 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11129 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11130 		.write		= spi_chip_write_256, /* Multi I/O supported */
11131 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11132 		.voltage	= {2700, 3600},
11133 	},
11134 
11135 	{
11136 		.vendor		= "Micron",
11137 		.name		= "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11138 		.bustype	= BUS_SPI,
11139 		.manufacture_id	= ST_ID,
11140 		.model_id	= ST_N25Q256__3E,
11141 		.total_size	= 32768,
11142 		.page_size	= 256,
11143 		/* supports SFDP */
11144 		/* OTP: 64B total; read 0x4B, write 0x42 */
11145 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11146 		.tested		= TEST_UNTESTED,
11147 		.probe		= probe_spi_rdid,
11148 		.probe_timing	= TIMING_ZERO,
11149 		.block_erasers	=
11150 		{
11151 			{
11152 				.eraseblocks = { {4 * 1024, 8192} },
11153 				.block_erase = spi_block_erase_21,
11154 			}, {
11155 				.eraseblocks = { {4 * 1024, 8192} },
11156 				.block_erase = spi_block_erase_20,
11157 			}, {
11158 				.eraseblocks = { {32 * 1024, 1024} },
11159 				.block_erase = spi_block_erase_5c,
11160 			}, {
11161 				.eraseblocks = { {32 * 1024, 1024} },
11162 				.block_erase = spi_block_erase_52,
11163 			}, {
11164 				.eraseblocks = { {64 * 1024, 512} },
11165 				.block_erase = spi_block_erase_dc,
11166 			}, {
11167 				.eraseblocks = { {64 * 1024, 512} },
11168 				.block_erase = spi_block_erase_d8,
11169 			}, {
11170 				.eraseblocks = { {32768 * 1024, 1} },
11171 				.block_erase = spi_block_erase_c7,
11172 			}, {
11173 				.eraseblocks = { {32768 * 1024, 1} },
11174 				.block_erase = spi_block_erase_60,
11175 			}
11176 		},
11177 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11178 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11179 		.write		= spi_chip_write_256, /* Multi I/O supported */
11180 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11181 		.voltage	= {2700, 3600},
11182 	},
11183 
11184 	{
11185 		.vendor		= "Micron",
11186 		.name		= "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11187 		.bustype	= BUS_SPI,
11188 		.manufacture_id	= ST_ID,
11189 		.model_id	= ST_N25Q256__1E,
11190 		.total_size	= 32768,
11191 		.page_size	= 256,
11192 		/* supports SFDP */
11193 		/* OTP: 64B total; read 0x4B, write 0x42 */
11194 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11195 		.tested		= TEST_UNTESTED,
11196 		.probe		= probe_spi_rdid,
11197 		.probe_timing	= TIMING_ZERO,
11198 		.block_erasers	=
11199 		{
11200 			{
11201 				.eraseblocks = { {4 * 1024, 8192} },
11202 				.block_erase = spi_block_erase_21,
11203 			}, {
11204 				.eraseblocks = { {4 * 1024, 8192} },
11205 				.block_erase = spi_block_erase_20,
11206 			}, {
11207 				.eraseblocks = { {32 * 1024, 1024} },
11208 				.block_erase = spi_block_erase_5c,
11209 			}, {
11210 				.eraseblocks = { {32 * 1024, 1024} },
11211 				.block_erase = spi_block_erase_52,
11212 			}, {
11213 				.eraseblocks = { {64 * 1024, 512} },
11214 				.block_erase = spi_block_erase_dc,
11215 			}, {
11216 				.eraseblocks = { {64 * 1024, 512} },
11217 				.block_erase = spi_block_erase_d8,
11218 			}, {
11219 				.eraseblocks = { {32768 * 1024, 1} },
11220 				.block_erase = spi_block_erase_c7,
11221 			}, {
11222 				.eraseblocks = { {32768 * 1024, 1} },
11223 				.block_erase = spi_block_erase_60,
11224 			}
11225 		},
11226 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11227 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11228 		.write		= spi_chip_write_256, /* Multi I/O supported */
11229 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11230 		.voltage	= {1700, 2000},
11231 	},
11232 
11233 	{
11234 		.vendor		= "Micron",
11235 		.name		= "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11236 		.bustype	= BUS_SPI,
11237 		.manufacture_id	= ST_ID,
11238 		.model_id	= ST_N25Q512__3G,
11239 		.total_size	= 65536,
11240 		.page_size	= 256,
11241 		/* supports SFDP */
11242 		/* OTP: 64B total; read 0x4B, write 0x42 */
11243 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11244 		.tested		= TEST_OK_PREW,
11245 		.probe		= probe_spi_rdid,
11246 		.probe_timing	= TIMING_ZERO,
11247 		.block_erasers	=
11248 		{
11249 			{
11250 				.eraseblocks = { {4 * 1024, 16384} },
11251 				.block_erase = spi_block_erase_21,
11252 			}, {
11253 				.eraseblocks = { {4 * 1024, 16384} },
11254 				.block_erase = spi_block_erase_20,
11255 			}, {
11256 				.eraseblocks = { {32 * 1024, 2048} },
11257 				.block_erase = spi_block_erase_5c,
11258 			}, {
11259 				.eraseblocks = { {32 * 1024, 2048} },
11260 				.block_erase = spi_block_erase_52,
11261 			}, {
11262 				.eraseblocks = { {64 * 1024, 1024} },
11263 				.block_erase = spi_block_erase_dc,
11264 			}, {
11265 				.eraseblocks = { {64 * 1024, 1024} },
11266 				.block_erase = spi_block_erase_d8,
11267 			}, {
11268 				.eraseblocks = { {65536 * 1024, 1} },
11269 				.block_erase = spi_block_erase_c7,
11270 			}, {
11271 				.eraseblocks = { {65536 * 1024, 1} },
11272 				.block_erase = spi_block_erase_60,
11273 			}
11274 		},
11275 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11276 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11277 		.write		= spi_chip_write_256, /* Multi I/O supported */
11278 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11279 		.voltage	= {2700, 3600},
11280 	},
11281 
11282 	{
11283 		.vendor		= "Micron",
11284 		.name		= "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11285 		.bustype	= BUS_SPI,
11286 		.manufacture_id	= ST_ID,
11287 		.model_id	= ST_N25Q512__1G,
11288 		.total_size	= 65536,
11289 		.page_size	= 256,
11290 		/* supports SFDP */
11291 		/* OTP: 64B total; read 0x4B, write 0x42 */
11292 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11293 		.tested		= TEST_OK_PREW,
11294 		.probe		= probe_spi_rdid,
11295 		.probe_timing	= TIMING_ZERO,
11296 		.block_erasers	=
11297 		{
11298 			{
11299 				.eraseblocks = { {4 * 1024, 16384} },
11300 				.block_erase = spi_block_erase_21,
11301 			}, {
11302 				.eraseblocks = { {4 * 1024, 16384} },
11303 				.block_erase = spi_block_erase_20,
11304 			}, {
11305 				.eraseblocks = { {32 * 1024, 2048} },
11306 				.block_erase = spi_block_erase_5c,
11307 			}, {
11308 				.eraseblocks = { {32 * 1024, 2048} },
11309 				.block_erase = spi_block_erase_52,
11310 			}, {
11311 				.eraseblocks = { {64 * 1024, 1024} },
11312 				.block_erase = spi_block_erase_dc,
11313 			}, {
11314 				.eraseblocks = { {64 * 1024, 1024} },
11315 				.block_erase = spi_block_erase_d8,
11316 			}, {
11317 				.eraseblocks = { {65536 * 1024, 1} },
11318 				.block_erase = spi_block_erase_c7,
11319 			}, {
11320 				.eraseblocks = { {65536 * 1024, 1} },
11321 				.block_erase = spi_block_erase_60,
11322 			}
11323 		},
11324 		.printlock	= spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11325 		.unlock		= spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11326 		.write		= spi_chip_write_256, /* Multi I/O supported */
11327 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11328 		.voltage	= {1700, 2000},
11329 	},
11330 
11331 	{
11332 		.vendor		= "MoselVitelic",
11333 		.name		= "V29C51000B",
11334 		.bustype	= BUS_PARALLEL,
11335 		.manufacture_id	= SYNCMOS_MVC_ID,
11336 		.model_id	= MVC_V29C51000B,
11337 		.total_size	= 64,
11338 		.page_size	= 512,
11339 		.feature_bits	= FEATURE_EITHER_RESET,
11340 		.tested		= TEST_UNTESTED,
11341 		.probe		= probe_jedec,
11342 		.probe_timing	= TIMING_ZERO,
11343 		.block_erasers	=
11344 		{
11345 			{
11346 				.eraseblocks = { {512, 128} },
11347 				.block_erase = erase_sector_jedec,
11348 			}, {
11349 				.eraseblocks = { {64 * 1024, 1} },
11350 				.block_erase = erase_chip_block_jedec,
11351 			},
11352 		},
11353 		.write		= write_jedec_1,
11354 		.read		= read_memmapped,
11355 		.voltage	= {4500, 5500},
11356 	},
11357 
11358 	{
11359 		.vendor		= "MoselVitelic",
11360 		.name		= "V29C51000T",
11361 		.bustype	= BUS_PARALLEL,
11362 		.manufacture_id	= SYNCMOS_MVC_ID,
11363 		.model_id	= MVC_V29C51000T,
11364 		.total_size	= 64,
11365 		.page_size	= 512,
11366 		.feature_bits	= FEATURE_EITHER_RESET,
11367 		.tested		= TEST_UNTESTED,
11368 		.probe		= probe_jedec,
11369 		.probe_timing	= TIMING_ZERO,
11370 		.block_erasers	=
11371 		{
11372 			{
11373 				.eraseblocks = { {512, 128} },
11374 				.block_erase = erase_sector_jedec,
11375 			}, {
11376 				.eraseblocks = { {64 * 1024, 1} },
11377 				.block_erase = erase_chip_block_jedec,
11378 			},
11379 		},
11380 		.write		= write_jedec_1,
11381 		.read		= read_memmapped,
11382 		.voltage	= {4500, 5500},
11383 	},
11384 
11385 	{
11386 		.vendor		= "MoselVitelic",
11387 		.name		= "V29C51400B",
11388 		.bustype	= BUS_PARALLEL,
11389 		.manufacture_id	= SYNCMOS_MVC_ID,
11390 		.model_id	= MVC_V29C51400B,
11391 		.total_size	= 512,
11392 		.page_size	= 1024,
11393 		.feature_bits	= FEATURE_EITHER_RESET,
11394 		.tested		= TEST_UNTESTED,
11395 		.probe		= probe_jedec,
11396 		.probe_timing	= TIMING_ZERO,
11397 		.block_erasers	=
11398 		{
11399 			{
11400 				.eraseblocks = { {1024, 512} },
11401 				.block_erase = erase_sector_jedec,
11402 			}, {
11403 				.eraseblocks = { {512 * 1024, 1} },
11404 				.block_erase = erase_chip_block_jedec,
11405 			},
11406 		},
11407 		.write		= write_jedec_1,
11408 		.read		= read_memmapped,
11409 		.voltage	= {4500, 5500},
11410 	},
11411 
11412 	{
11413 		.vendor		= "MoselVitelic",
11414 		.name		= "V29C51400T",
11415 		.bustype	= BUS_PARALLEL,
11416 		.manufacture_id	= SYNCMOS_MVC_ID,
11417 		.model_id	= MVC_V29C51400T,
11418 		.total_size	= 512,
11419 		.page_size	= 1024,
11420 		.feature_bits	= FEATURE_EITHER_RESET,
11421 		.tested		= TEST_UNTESTED,
11422 		.probe		= probe_jedec,
11423 		.probe_timing	= TIMING_ZERO,
11424 		.block_erasers	=
11425 		{
11426 			{
11427 				.eraseblocks = { {1024, 512} },
11428 				.block_erase = erase_sector_jedec,
11429 			}, {
11430 				.eraseblocks = { {512 * 1024, 1} },
11431 				.block_erase = erase_chip_block_jedec,
11432 			},
11433 		},
11434 		.write		= write_jedec_1,
11435 		.read		= read_memmapped,
11436 		.voltage	= {4500, 5500},
11437 	},
11438 
11439 	{
11440 		.vendor		= "MoselVitelic",
11441 		.name		= "V29LC51000",
11442 		.bustype	= BUS_PARALLEL,
11443 		.manufacture_id	= SYNCMOS_MVC_ID,
11444 		.model_id	= MVC_V29LC51000,
11445 		.total_size	= 64,
11446 		.page_size	= 512,
11447 		.feature_bits	= FEATURE_EITHER_RESET,
11448 		.tested		= TEST_UNTESTED,
11449 		.probe		= probe_jedec,
11450 		.probe_timing	= TIMING_ZERO,
11451 		.block_erasers	=
11452 		{
11453 			{
11454 				.eraseblocks = { {512, 128} },
11455 				.block_erase = erase_sector_jedec,
11456 			}, {
11457 				.eraseblocks = { {64 * 1024, 1} },
11458 				.block_erase = erase_chip_block_jedec,
11459 			},
11460 		},
11461 		.write		= write_jedec_1,
11462 		.read		= read_memmapped,
11463 		.voltage	= {4500, 5500},
11464 	},
11465 
11466 	{
11467 		.vendor		= "MoselVitelic",
11468 		.name		= "V29LC51001",
11469 		.bustype	= BUS_PARALLEL,
11470 		.manufacture_id	= SYNCMOS_MVC_ID,
11471 		.model_id	= MVC_V29LC51001,
11472 		.total_size	= 128,
11473 		.page_size	= 512,
11474 		.feature_bits	= FEATURE_EITHER_RESET,
11475 		.tested		= TEST_UNTESTED,
11476 		.probe		= probe_jedec,
11477 		.probe_timing	= TIMING_ZERO,
11478 		.block_erasers	=
11479 		{
11480 			{
11481 				.eraseblocks = { {512, 256} },
11482 				.block_erase = erase_sector_jedec,
11483 			}, {
11484 				.eraseblocks = { {128 * 1024, 1} },
11485 				.block_erase = erase_chip_block_jedec,
11486 			},
11487 		},
11488 		.write		= write_jedec_1,
11489 		.read		= read_memmapped,
11490 		.voltage	= {4500, 5500},
11491 	},
11492 
11493 	{
11494 		.vendor		= "MoselVitelic",
11495 		.name		= "V29LC51002",
11496 		.bustype	= BUS_PARALLEL,
11497 		.manufacture_id	= SYNCMOS_MVC_ID,
11498 		.model_id	= MVC_V29LC51002,
11499 		.total_size	= 256,
11500 		.page_size	= 512,
11501 		.feature_bits	= FEATURE_EITHER_RESET,
11502 		.tested		= TEST_UNTESTED,
11503 		.probe		= probe_jedec,
11504 		.probe_timing	= TIMING_ZERO,
11505 		.block_erasers	=
11506 		{
11507 			{
11508 				.eraseblocks = { {512, 512} },
11509 				.block_erase = erase_sector_jedec,
11510 			}, {
11511 				.eraseblocks = { {256 * 1024, 1} },
11512 				.block_erase = erase_chip_block_jedec,
11513 			},
11514 		},
11515 		.write		= write_jedec_1,
11516 		.read		= read_memmapped,
11517 		.voltage	= {4500, 5500},
11518 	},
11519 
11520 	{
11521 		.vendor		= "Nantronics",
11522 		.name		= "N25S10",
11523 		.bustype	= BUS_SPI,
11524 		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
11525 		.model_id	= NANTRONICS_N25S10,
11526 		.total_size	= 128,
11527 		.page_size	= 256,
11528 		.feature_bits	= FEATURE_WRSR_WREN,
11529 		.tested		= TEST_UNTESTED,
11530 		.probe		= probe_spi_rdid,
11531 		.probe_timing	= TIMING_ZERO,
11532 		.block_erasers	=
11533 		{
11534 			{
11535 				.eraseblocks = { {4 * 1024, 32} },
11536 				.block_erase = spi_block_erase_20,
11537 			}, {
11538 				.eraseblocks = { {4 * 1024, 32} },
11539 				.block_erase = spi_block_erase_d7,
11540 			}, {
11541 				.eraseblocks = { {32 * 1024, 4} },
11542 				.block_erase = spi_block_erase_52,
11543 			}, {
11544 				.eraseblocks = { {64 * 1024, 2} },
11545 				.block_erase = spi_block_erase_d8,
11546 			}, {
11547 				.eraseblocks = { {128 * 1024, 1} },
11548 				.block_erase = spi_block_erase_60,
11549 			}, {
11550 				.eraseblocks = { {128 * 1024, 1} },
11551 				.block_erase = spi_block_erase_c7,
11552 			}
11553 		},
11554 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
11555 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11556 		.write		= spi_chip_write_256,
11557 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11558 		.voltage	= {2700, 3600},
11559 	},
11560 
11561 	{
11562 		.vendor		= "Nantronics",
11563 		.name		= "N25S16",
11564 		.bustype	= BUS_SPI,
11565 		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
11566 		.model_id	= NANTRONICS_N25S16,
11567 		.total_size	= 2048,
11568 		.page_size	= 256,
11569 		.feature_bits	= FEATURE_WRSR_WREN,
11570 		.tested		= TEST_UNTESTED,
11571 		.probe		= probe_spi_rdid,
11572 		.probe_timing	= TIMING_ZERO,
11573 		.block_erasers	=
11574 		{
11575 			{
11576 				.eraseblocks = { {4 * 1024, 512} },
11577 				.block_erase = spi_block_erase_20,
11578 			}, {
11579 				.eraseblocks = { {64 * 1024, 32} },
11580 				.block_erase = spi_block_erase_d8,
11581 			}, {
11582 				.eraseblocks = { {2048 * 1024, 1} },
11583 				.block_erase = spi_block_erase_60,
11584 			}, {
11585 				.eraseblocks = { {2048 * 1024, 1} },
11586 				.block_erase = spi_block_erase_c7,
11587 			}
11588 		},
11589 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
11590 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11591 		.write		= spi_chip_write_256,
11592 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11593 		.voltage	= {2700, 3600},
11594 	},
11595 
11596 	{
11597 		.vendor		= "Nantronics",
11598 		.name		= "N25S20",
11599 		.bustype	= BUS_SPI,
11600 		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
11601 		.model_id	= NANTRONICS_N25S20,
11602 		.total_size	= 256,
11603 		.page_size	= 256,
11604 		.feature_bits	= FEATURE_WRSR_WREN,
11605 		.tested		= TEST_UNTESTED,
11606 		.probe		= probe_spi_rdid,
11607 		.probe_timing	= TIMING_ZERO,
11608 		.block_erasers	=
11609 		{
11610 			{
11611 				.eraseblocks = { {4 * 1024, 64} },
11612 				.block_erase = spi_block_erase_20,
11613 			}, {
11614 				.eraseblocks = { {4 * 1024, 64} },
11615 				.block_erase = spi_block_erase_d7,
11616 			}, {
11617 				.eraseblocks = { {32 * 1024, 8} },
11618 				.block_erase = spi_block_erase_52,
11619 			}, {
11620 				.eraseblocks = { {64 * 1024, 4} },
11621 				.block_erase = spi_block_erase_d8,
11622 			}, {
11623 				.eraseblocks = { {256 * 1024, 1} },
11624 				.block_erase = spi_block_erase_60,
11625 			}, {
11626 				.eraseblocks = { {256 * 1024, 1} },
11627 				.block_erase = spi_block_erase_c7,
11628 			}
11629 		},
11630 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
11631 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11632 		.write		= spi_chip_write_256,
11633 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11634 		.voltage	= {2700, 3600},
11635 	},
11636 
11637 	{
11638 		.vendor		= "Nantronics",
11639 		.name		= "N25S40",
11640 		.bustype	= BUS_SPI,
11641 		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
11642 		.model_id	= NANTRONICS_N25S40,
11643 		.total_size	= 512,
11644 		.page_size	= 256,
11645 		.feature_bits	= FEATURE_WRSR_WREN,
11646 		.tested		= TEST_UNTESTED,
11647 		.probe		= probe_spi_rdid,
11648 		.probe_timing	= TIMING_ZERO,
11649 		.block_erasers	=
11650 		{
11651 			{
11652 				.eraseblocks = { {4 * 1024, 128} },
11653 				.block_erase = spi_block_erase_20,
11654 			}, {
11655 				.eraseblocks = { {4 * 1024, 128} },
11656 				.block_erase = spi_block_erase_d7,
11657 			}, {
11658 				.eraseblocks = { {32 * 1024, 16} },
11659 				.block_erase = spi_block_erase_52,
11660 			}, {
11661 				.eraseblocks = { {64 * 1024, 8} },
11662 				.block_erase = spi_block_erase_d8,
11663 			}, {
11664 				.eraseblocks = { {512 * 1024, 1} },
11665 				.block_erase = spi_block_erase_60,
11666 			}, {
11667 				.eraseblocks = { {512 * 1024, 1} },
11668 				.block_erase = spi_block_erase_c7,
11669 			}
11670 		},
11671 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
11672 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11673 		.write		= spi_chip_write_256,
11674 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11675 		.voltage	= {2700, 3600},
11676 	},
11677 
11678 	{
11679 		.vendor		= "Nantronics",
11680 		.name		= "N25S80",
11681 		.bustype	= BUS_SPI,
11682 		.manufacture_id	= NANTRONICS_ID_NOPREFIX,
11683 		.model_id	= NANTRONICS_N25S80,
11684 		.total_size	= 1024,
11685 		.page_size	= 256,
11686 		.feature_bits	= FEATURE_WRSR_WREN,
11687 		.tested		= TEST_UNTESTED,
11688 		.probe		= probe_spi_rdid,
11689 		.probe_timing	= TIMING_ZERO,
11690 		.block_erasers	=
11691 		{
11692 			{
11693 				.eraseblocks = { {4 * 1024, 256} },
11694 				.block_erase = spi_block_erase_20,
11695 			}, {
11696 				.eraseblocks = { {32 * 1024, 32} },
11697 				.block_erase = spi_block_erase_52,
11698 			}, {
11699 				.eraseblocks = { {64 * 1024, 16} },
11700 				.block_erase = spi_block_erase_d8,
11701 			}, {
11702 				.eraseblocks = { {1024 * 1024, 1} },
11703 				.block_erase = spi_block_erase_60,
11704 			}, {
11705 				.eraseblocks = { {1024 * 1024, 1} },
11706 				.block_erase = spi_block_erase_c7,
11707 			}
11708 		},
11709 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
11710 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11711 		.write		= spi_chip_write_256,
11712 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11713 		.voltage	= {2700, 3600},
11714 	},
11715 
11716 	{
11717 		.vendor		= "PMC",
11718 		.name		= "Pm25LD010(C)",
11719 		.bustype	= BUS_SPI,
11720 		.manufacture_id	= PMC_ID,
11721 		.model_id	= PMC_PM25LD010,
11722 		.total_size	= 128,
11723 		.page_size	= 256,
11724 		.feature_bits	= FEATURE_WRSR_WREN,
11725 		.tested		= TEST_OK_PREW,
11726 		.probe		= probe_spi_rdid,
11727 		.probe_timing	= TIMING_ZERO,
11728 		.block_erasers	=
11729 		{
11730 			{
11731 				.eraseblocks = { {4 * 1024, 32} },
11732 				.block_erase = spi_block_erase_20,
11733 			}, {
11734 				.eraseblocks = { {4 * 1024, 32} },
11735 				.block_erase = spi_block_erase_d7,
11736 			}, {
11737 				.eraseblocks = { {32 * 1024, 4} },
11738 				.block_erase = spi_block_erase_d8,
11739 			}, {
11740 				.eraseblocks = { {128 * 1024, 1} },
11741 				.block_erase = spi_block_erase_60,
11742 			}, {
11743 				.eraseblocks = { {128 * 1024, 1} },
11744 				.block_erase = spi_block_erase_c7,
11745 			}
11746 		},
11747 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
11748 		.unlock		= spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11749 		.write		= spi_chip_write_256,
11750 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11751 		.voltage	= {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
11752 	},
11753 
11754 	{
11755 		.vendor		= "PMC",
11756 		.name		= "Pm25LD020(C)",
11757 		.bustype	= BUS_SPI,
11758 		.manufacture_id	= PMC_ID,
11759 		.model_id	= PMC_PM25LD020,
11760 		.total_size	= 256,
11761 		.page_size	= 256,
11762 		.feature_bits	= FEATURE_WRSR_WREN,
11763 		.tested		= TEST_OK_PREW,
11764 		.probe		= probe_spi_rdid,
11765 		.probe_timing	= TIMING_ZERO,
11766 		.block_erasers	=
11767 		{
11768 			{
11769 				.eraseblocks = { {4 * 1024, 64} },
11770 				.block_erase = spi_block_erase_20,
11771 			}, {
11772 				.eraseblocks = { {4 * 1024, 64} },
11773 				.block_erase = spi_block_erase_d7,
11774 			}, {
11775 				.eraseblocks = { {64 * 1024, 4} },
11776 				.block_erase = spi_block_erase_d8,
11777 			}, {
11778 				.eraseblocks = { {256 * 1024, 1} },
11779 				.block_erase = spi_block_erase_60,
11780 			}, {
11781 				.eraseblocks = { {256 * 1024, 1} },
11782 				.block_erase = spi_block_erase_c7,
11783 			}
11784 		},
11785 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
11786 		.unlock		= spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11787 		.write		= spi_chip_write_256,
11788 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11789 		.voltage	= {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
11790 	},
11791 
11792 	{
11793 		.vendor		= "PMC",
11794 		.name		= "Pm25LD040(C)",
11795 		.bustype	= BUS_SPI,
11796 		.manufacture_id	= PMC_ID,
11797 		.model_id	= PMC_PM25LV040,
11798 		.total_size	= 512,
11799 		.page_size	= 256,
11800 		.feature_bits	= FEATURE_WRSR_WREN,
11801 		.tested		= TEST_OK_PREW,
11802 		.probe		= probe_spi_rdid,
11803 		.probe_timing	= TIMING_ZERO,
11804 		.block_erasers	=
11805 		{
11806 			{
11807 				.eraseblocks = { {4 * 1024, 128} },
11808 				.block_erase = spi_block_erase_20,
11809 			}, {
11810 				.eraseblocks = { {4 * 1024, 128} },
11811 				.block_erase = spi_block_erase_d7,
11812 			}, {
11813 				.eraseblocks = { {64 * 1024, 8} },
11814 				.block_erase = spi_block_erase_d8,
11815 			}, {
11816 				.eraseblocks = { {512 * 1024, 1} },
11817 				.block_erase = spi_block_erase_60,
11818 			}, {
11819 				.eraseblocks = { {512 * 1024, 1} },
11820 				.block_erase = spi_block_erase_c7,
11821 			}
11822 		},
11823 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
11824 		.unlock		= spi_disable_blockprotect,
11825 		.write		= spi_chip_write_256,
11826 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11827 		.voltage	= {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
11828 	},
11829 
11830 	{
11831 		.vendor		= "PMC",
11832 		.name		= "Pm25LD256C",
11833 		.bustype	= BUS_SPI,
11834 		.manufacture_id	= PMC_ID,
11835 		.model_id	= PMC_PM25LD256C,
11836 		.total_size	= 32,
11837 		.page_size	= 256,
11838 		.feature_bits	= FEATURE_WRSR_WREN,
11839 		.tested		= TEST_UNTESTED,
11840 		.probe		= probe_spi_rdid,
11841 		.probe_timing	= TIMING_ZERO,
11842 		.block_erasers	=
11843 		{
11844 			{
11845 				.eraseblocks = { {4 * 1024, 8} },
11846 				.block_erase = spi_block_erase_20,
11847 			}, {
11848 				.eraseblocks = { {4 * 1024, 8} },
11849 				.block_erase = spi_block_erase_d7,
11850 			}, {
11851 				.eraseblocks = { {32 * 1024, 1} },
11852 				.block_erase = spi_block_erase_d8,
11853 			}, {
11854 				.eraseblocks = { {32 * 1024, 1} },
11855 				.block_erase = spi_block_erase_60,
11856 			}, {
11857 				.eraseblocks = { {32 * 1024, 1} },
11858 				.block_erase = spi_block_erase_c7,
11859 			}
11860 		},
11861 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
11862 		.unlock		= spi_disable_blockprotect,
11863 		.write		= spi_chip_write_256,
11864 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11865 		.voltage	= {2700, 3600},
11866 	},
11867 
11868 	{
11869 		.vendor		= "PMC",
11870 		.name		= "Pm25LD512(C)",
11871 		.bustype	= BUS_SPI,
11872 		.manufacture_id	= PMC_ID,
11873 		.model_id	= PMC_PM25LD512,
11874 		.total_size	= 64,
11875 		.page_size	= 256,
11876 		.feature_bits	= FEATURE_WRSR_WREN,
11877 		.tested		= TEST_OK_PREW,
11878 		.probe		= probe_spi_rdid,
11879 		.probe_timing	= TIMING_ZERO,
11880 		.block_erasers	=
11881 		{
11882 			{
11883 				.eraseblocks = { {4 * 1024, 16} },
11884 				.block_erase = spi_block_erase_20,
11885 			}, {
11886 				.eraseblocks = { {4 * 1024, 16} },
11887 				.block_erase = spi_block_erase_d7,
11888 			}, {
11889 				.eraseblocks = { {32 * 1024, 2} },
11890 				.block_erase = spi_block_erase_d8,
11891 			}, {
11892 				.eraseblocks = { {64 * 1024, 1} },
11893 				.block_erase = spi_block_erase_60,
11894 			}, {
11895 				.eraseblocks = { {64 * 1024, 1} },
11896 				.block_erase = spi_block_erase_c7,
11897 			}
11898 		},
11899 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
11900 		.unlock		= spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
11901 		.write		= spi_chip_write_256,
11902 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
11903 		.voltage	= {2300, 3600},
11904 	},
11905 
11906 	{
11907 		.vendor		= "PMC",
11908 		.name		= "Pm25LQ016",
11909 		.bustype	= BUS_SPI,
11910 		.manufacture_id	= PMC_ID,
11911 		.model_id	= PMC_PM25LQ016,
11912 		.total_size	= 2048,
11913 		.page_size	= 256,
11914 		/* OTP: 256B total; read 0x4B, write 0xB1 */
11915 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
11916 		.tested		= TEST_UNTESTED,
11917 		.probe		= probe_spi_rdid,
11918 		.probe_timing	= TIMING_ZERO,
11919 		.block_erasers	=
11920 		{
11921 			{
11922 				.eraseblocks = { {4 * 1024, 512} },
11923 				.block_erase = spi_block_erase_20,
11924 			}, {
11925 				.eraseblocks = { {4 * 1024, 512} },
11926 				.block_erase = spi_block_erase_d7,
11927 			}, {
11928 				.eraseblocks = { {64 * 1024, 32} },
11929 				.block_erase = spi_block_erase_d8,
11930 			}, {
11931 				.eraseblocks = { {2048 * 1024, 1} },
11932 				.block_erase = spi_block_erase_60,
11933 			}, {
11934 				.eraseblocks = { {2048 * 1024, 1} },
11935 				.block_erase = spi_block_erase_c7,
11936 			}
11937 		},
11938 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11939 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11940 		.write		= spi_chip_write_256,
11941 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11942 		.voltage	= {2300, 3600},
11943 	},
11944 
11945 	{
11946 		.vendor		= "PMC",
11947 		.name		= "Pm25LQ020",
11948 		.bustype	= BUS_SPI,
11949 		.manufacture_id	= PMC_ID,
11950 		.model_id	= PMC_PM25LQ020,
11951 		.total_size	= 256,
11952 		.page_size	= 256,
11953 		/* OTP: 256B total; read 0x4B, write 0xB1 */
11954 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
11955 		.tested		= TEST_UNTESTED,
11956 		.probe		= probe_spi_rdid,
11957 		.probe_timing	= TIMING_ZERO,
11958 		.block_erasers	=
11959 		{
11960 			{
11961 				.eraseblocks = { {4 * 1024, 64} },
11962 				.block_erase = spi_block_erase_20,
11963 			}, {
11964 				.eraseblocks = { {4 * 1024, 64} },
11965 				.block_erase = spi_block_erase_d7,
11966 			}, {
11967 				.eraseblocks = { {64 * 1024, 4} },
11968 				.block_erase = spi_block_erase_d8,
11969 			}, {
11970 				.eraseblocks = { {256 * 1024, 1} },
11971 				.block_erase = spi_block_erase_60,
11972 			}, {
11973 				.eraseblocks = { {256 * 1024, 1} },
11974 				.block_erase = spi_block_erase_c7,
11975 			}
11976 		},
11977 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
11978 		.unlock		= spi_disable_blockprotect_bp3_srwd,
11979 		.write		= spi_chip_write_256,
11980 		.read		= spi_chip_read,
11981 		.voltage	= {2300, 3600},
11982 	},
11983 
11984 	{
11985 		.vendor		= "PMC",
11986 		.name		= "Pm25LQ032C",
11987 		.bustype	= BUS_SPI,
11988 		.manufacture_id	= PMC_ID,
11989 		.model_id	= PMC_PM25LQ032C,
11990 		.total_size	= 4096,
11991 		.page_size	= 256,
11992 		/* OTP: 64B total; read 0x4B, write 0xB1 */
11993 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
11994 		.tested		= TEST_OK_PREW,
11995 		.probe		= probe_spi_rdid,
11996 		.probe_timing	= TIMING_ZERO,
11997 		.block_erasers	=
11998 		{
11999 			{
12000 				.eraseblocks = { {4 * 1024, 1024} },
12001 				.block_erase = spi_block_erase_20,
12002 			}, {
12003 				.eraseblocks = { {4 * 1024, 1024} },
12004 				.block_erase = spi_block_erase_d7,
12005 			}, {
12006 				.eraseblocks = { {64 * 1024, 64} },
12007 				.block_erase = spi_block_erase_d8,
12008 			}, {
12009 				.eraseblocks = { {4096 * 1024, 1} },
12010 				.block_erase = spi_block_erase_60,
12011 			}, {
12012 				.eraseblocks = { {4096 * 1024, 1} },
12013 				.block_erase = spi_block_erase_c7,
12014 			}
12015 		},
12016 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12017 		.unlock		= spi_disable_blockprotect_bp3_srwd,
12018 		.write		= spi_chip_write_256,
12019 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12020 		.voltage	= {2700, 3600},
12021 	},
12022 
12023 	{
12024 		.vendor		= "PMC",
12025 		.name		= "Pm25LQ040",
12026 		.bustype	= BUS_SPI,
12027 		.manufacture_id	= PMC_ID,
12028 		.model_id	= PMC_PM25LQ040,
12029 		.total_size	= 512,
12030 		.page_size	= 256,
12031 		/* OTP: 256B total; read 0x4B, write 0xB1 */
12032 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
12033 		.tested		= TEST_UNTESTED,
12034 		.probe		= probe_spi_rdid,
12035 		.probe_timing	= TIMING_ZERO,
12036 		.block_erasers	=
12037 		{
12038 			{
12039 				.eraseblocks = { {4 * 1024, 128} },
12040 				.block_erase = spi_block_erase_20,
12041 			}, {
12042 				.eraseblocks = { {4 * 1024, 128} },
12043 				.block_erase = spi_block_erase_d7,
12044 			}, {
12045 				.eraseblocks = { {64 * 1024, 8} },
12046 				.block_erase = spi_block_erase_d8,
12047 			}, {
12048 				.eraseblocks = { {512 * 1024, 1} },
12049 				.block_erase = spi_block_erase_60,
12050 			}, {
12051 				.eraseblocks = { {512 * 1024, 1} },
12052 				.block_erase = spi_block_erase_c7,
12053 			}
12054 		},
12055 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12056 		.unlock		= spi_disable_blockprotect_bp3_srwd,
12057 		.write		= spi_chip_write_256,
12058 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12059 		.voltage	= {2300, 3600},
12060 	},
12061 
12062 	{
12063 		.vendor		= "PMC",
12064 		.name		= "Pm25LQ080",
12065 		.bustype	= BUS_SPI,
12066 		.manufacture_id	= PMC_ID,
12067 		.model_id	= PMC_PM25LQ080,
12068 		.total_size	= 1024,
12069 		.page_size	= 256,
12070 		/* OTP: 64B total; read 0x4B, write 0xB1 */
12071 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
12072 		.tested		= TEST_UNTESTED,
12073 		.probe		= probe_spi_rdid,
12074 		.probe_timing	= TIMING_ZERO,
12075 		.block_erasers	=
12076 		{
12077 			{
12078 				.eraseblocks = { {4 * 1024, 256} },
12079 				.block_erase = spi_block_erase_20,
12080 			}, {
12081 				.eraseblocks = { {4 * 1024, 256} },
12082 				.block_erase = spi_block_erase_d7,
12083 			}, {
12084 				.eraseblocks = { {64 * 1024, 16} },
12085 				.block_erase = spi_block_erase_d8,
12086 			}, {
12087 				.eraseblocks = { {1024 * 1024, 1} },
12088 				.block_erase = spi_block_erase_60,
12089 			}, {
12090 				.eraseblocks = { {1024 * 1024, 1} },
12091 				.block_erase = spi_block_erase_c7,
12092 			}
12093 		},
12094 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12095 		.unlock		= spi_disable_blockprotect_bp3_srwd,
12096 		.write		= spi_chip_write_256,
12097 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12098 		.voltage	= {2300, 3600},
12099 	},
12100 
12101 	{
12102 		.vendor		= "PMC",
12103 		.name		= "Pm25LV010",
12104 		.bustype	= BUS_SPI,
12105 		.manufacture_id	= PMC_ID_NOPREFIX,
12106 		.model_id	= PMC_PM25LV010,
12107 		.total_size	= 128,
12108 		.page_size	= 256,
12109 		.feature_bits	= FEATURE_WRSR_WREN,
12110 		.tested		= TEST_OK_PREW,
12111 		.probe		= probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
12112 		.probe_timing	= TIMING_ZERO,
12113 		.block_erasers	=
12114 		{
12115 			{
12116 				.eraseblocks = { {4 * 1024, 32} },
12117 				.block_erase = spi_block_erase_d7,
12118 			}, {
12119 				.eraseblocks = { {32 * 1024, 4} },
12120 				.block_erase = spi_block_erase_d8,
12121 			}, {
12122 				.eraseblocks = { {128 * 1024, 1} },
12123 				.block_erase = spi_block_erase_c7,
12124 			}
12125 		},
12126 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
12127 		.unlock		= spi_disable_blockprotect,
12128 		.write		= spi_chip_write_256,
12129 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12130 		.voltage	= {2700, 3600},
12131 	},
12132 
12133 	{
12134 		.vendor		= "PMC",
12135 		.name		= "Pm25LV010A",
12136 		.bustype	= BUS_SPI,
12137 		.manufacture_id	= PMC_ID,
12138 		.model_id	= PMC_PM25LV010,
12139 		.total_size	= 128,
12140 		.page_size	= 256,
12141 		.feature_bits	= FEATURE_WRSR_WREN,
12142 		.tested		= TEST_OK_PREW,
12143 		.probe		= probe_spi_rdid,
12144 		.probe_timing	= TIMING_ZERO,
12145 		.block_erasers	=
12146 		{
12147 			{
12148 				.eraseblocks = { {4 * 1024, 32} },
12149 				.block_erase = spi_block_erase_d7,
12150 			}, {
12151 				.eraseblocks = { {32 * 1024, 4} },
12152 				.block_erase = spi_block_erase_d8,
12153 			}, {
12154 				.eraseblocks = { {128 * 1024, 1} },
12155 				.block_erase = spi_block_erase_c7,
12156 			}
12157 		},
12158 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
12159 		.unlock		= spi_disable_blockprotect,
12160 		.write		= spi_chip_write_256,
12161 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12162 		.voltage	= {2700, 3600},
12163 	},
12164 
12165 	{
12166 		.vendor		= "PMC",
12167 		.name		= "Pm25LV016B",
12168 		.bustype	= BUS_SPI,
12169 		.manufacture_id	= PMC_ID,
12170 		.model_id	= PMC_PM25LV016B,
12171 		.total_size	= 2048,
12172 		.page_size	= 256,
12173 		.feature_bits	= FEATURE_WRSR_WREN,
12174 		.tested		= TEST_UNTESTED,
12175 		.probe		= probe_spi_rdid,
12176 		.probe_timing	= TIMING_ZERO,
12177 		.block_erasers	=
12178 		{
12179 			{
12180 				.eraseblocks = { {4 * 1024, 512} },
12181 				.block_erase = spi_block_erase_d7,
12182 			}, {
12183 				.eraseblocks = { {4 * 1024, 512} },
12184 				.block_erase = spi_block_erase_20,
12185 			}, {
12186 				.eraseblocks = { {64 * 1024, 32} },
12187 				.block_erase = spi_block_erase_d8,
12188 			}, {
12189 				.eraseblocks = { {2 * 1024 * 1024, 1} },
12190 				.block_erase = spi_block_erase_60,
12191 			}, {
12192 				.eraseblocks = { {2 * 1024 * 1024, 1} },
12193 				.block_erase = spi_block_erase_c7,
12194 			}
12195 		},
12196 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
12197 		.unlock		= spi_disable_blockprotect,
12198 		.write		= spi_chip_write_256,
12199 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12200 		.voltage	= {2700, 3600},
12201 	},
12202 
12203 	{
12204 		.vendor		= "PMC",
12205 		.name		= "Pm25LV020",
12206 		.bustype	= BUS_SPI,
12207 		.manufacture_id	= PMC_ID,
12208 		.model_id	= PMC_PM25LV020,
12209 		.total_size	= 256,
12210 		.page_size	= 256,
12211 		.feature_bits	= FEATURE_WRSR_WREN,
12212 		.tested		= TEST_UNTESTED,
12213 		.probe		= probe_spi_rdid,
12214 		.probe_timing	= TIMING_ZERO,
12215 		.block_erasers	=
12216 		{
12217 			{
12218 				.eraseblocks = { {4 * 1024, 64} },
12219 				.block_erase = spi_block_erase_d7,
12220 			}, {
12221 				.eraseblocks = { {64 * 1024, 4} },
12222 				.block_erase = spi_block_erase_d8,
12223 			}, {
12224 				.eraseblocks = { {256 * 1024, 1} },
12225 				.block_erase = spi_block_erase_c7,
12226 			}
12227 		},
12228 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
12229 		.unlock		= spi_disable_blockprotect,
12230 		.write		= spi_chip_write_256,
12231 		.read		= spi_chip_read,
12232 		.voltage	= {2700, 3600},
12233 	},
12234 
12235 	{
12236 		.vendor		= "PMC",
12237 		.name		= "Pm25LV040",
12238 		.bustype	= BUS_SPI,
12239 		.manufacture_id	= PMC_ID,
12240 		.model_id	= PMC_PM25LV040,
12241 		.total_size	= 512,
12242 		.page_size	= 256,
12243 		.feature_bits	= FEATURE_WRSR_WREN,
12244 		.tested		= TEST_OK_PREW,
12245 		.probe		= probe_spi_rdid,
12246 		.probe_timing	= TIMING_ZERO,
12247 		.block_erasers	=
12248 		{
12249 			{
12250 				.eraseblocks = { {4 * 1024, 128} },
12251 				.block_erase = spi_block_erase_d7,
12252 			}, {
12253 				.eraseblocks = { {64 * 1024, 8} },
12254 				.block_erase = spi_block_erase_d8,
12255 			}, {
12256 				.eraseblocks = { {512 * 1024, 1} },
12257 				.block_erase = spi_block_erase_c7,
12258 			}
12259 		},
12260 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
12261 		.unlock		= spi_disable_blockprotect,
12262 		.write		= spi_chip_write_256,
12263 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12264 		.voltage	= {2700, 3600},
12265 	},
12266 
12267 	{
12268 		.vendor		= "PMC",
12269 		.name		= "Pm25LV080B",
12270 		.bustype	= BUS_SPI,
12271 		.manufacture_id	= PMC_ID,
12272 		.model_id	= PMC_PM25LV080B,
12273 		.total_size	= 1024,
12274 		.page_size	= 256,
12275 		.feature_bits	= FEATURE_WRSR_WREN,
12276 		.tested		= TEST_UNTESTED,
12277 		.probe		= probe_spi_rdid,
12278 		.probe_timing	= TIMING_ZERO,
12279 		.block_erasers	=
12280 		{
12281 			{
12282 				.eraseblocks = { {4 * 1024, 256} },
12283 				.block_erase = spi_block_erase_d7,
12284 			}, {
12285 				.eraseblocks = { {4 * 1024, 256} },
12286 				.block_erase = spi_block_erase_20,
12287 			}, {
12288 				.eraseblocks = { {64 * 1024, 16} },
12289 				.block_erase = spi_block_erase_d8,
12290 			}, {
12291 				.eraseblocks = { {1024 * 1024, 1} },
12292 				.block_erase = spi_block_erase_60,
12293 			}, {
12294 				.eraseblocks = { {1024 * 1024, 1} },
12295 				.block_erase = spi_block_erase_c7,
12296 			}
12297 		},
12298 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
12299 		.unlock		= spi_disable_blockprotect,
12300 		.write		= spi_chip_write_256,
12301 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12302 		.voltage	= {2700, 3600},
12303 	},
12304 
12305 	{
12306 		.vendor		= "PMC",
12307 		.name		= "Pm25LV512(A)",
12308 		.bustype	= BUS_SPI,
12309 		.manufacture_id	= PMC_ID_NOPREFIX,
12310 		.model_id	= PMC_PM25LV512,
12311 		.total_size	= 64,
12312 		.page_size	= 256,
12313 		.feature_bits	= FEATURE_WRSR_WREN,
12314 		.tested		= TEST_OK_PREW,
12315 		.probe		= probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
12316 		.probe_timing	= TIMING_ZERO,
12317 		.block_erasers	=
12318 		{
12319 			{
12320 				.eraseblocks = { {4 * 1024, 16} },
12321 				.block_erase = spi_block_erase_d7,
12322 			}, {
12323 				.eraseblocks = { {32 * 1024, 2} },
12324 				.block_erase = spi_block_erase_d8,
12325 			}, {
12326 				.eraseblocks = { {64 * 1024, 1} },
12327 				.block_erase = spi_block_erase_c7,
12328 			}
12329 		},
12330 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
12331 		.unlock		= spi_disable_blockprotect,
12332 		.write		= spi_chip_write_256,
12333 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12334 		.voltage	= {2700, 3600},
12335 	},
12336 
12337 	{
12338 		.vendor		= "PMC",
12339 		.name		= "Pm29F002B",
12340 		.bustype	= BUS_PARALLEL,
12341 		.manufacture_id	= PMC_ID_NOPREFIX,
12342 		.model_id	= PMC_PM29F002B,
12343 		.total_size	= 256,
12344 		.page_size	= 8 * 1024,
12345 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12346 		.tested		= TEST_UNTESTED,
12347 		.probe		= probe_jedec,
12348 		.probe_timing	= TIMING_FIXME,
12349 		.block_erasers	=
12350 		{
12351 			{
12352 				.eraseblocks = {
12353 					{16 * 1024, 1},
12354 					{8 * 1024, 2},
12355 					{96 * 1024, 1},
12356 					{128 * 1024, 1},
12357 				},
12358 				.block_erase = erase_sector_jedec,
12359 			}, {
12360 				.eraseblocks = { {256 * 1024, 1} },
12361 				.block_erase = erase_chip_block_jedec,
12362 			},
12363 		},
12364 		.write		= write_jedec_1,
12365 		.read		= read_memmapped,
12366 		.voltage	= {4500, 5500},
12367 	},
12368 
12369 	{
12370 		.vendor		= "PMC",
12371 		.name		= "Pm29F002T",
12372 		.bustype	= BUS_PARALLEL,
12373 		.manufacture_id	= PMC_ID_NOPREFIX,
12374 		.model_id	= PMC_PM29F002T,
12375 		.total_size	= 256,
12376 		.page_size	= 8 * 1024,
12377 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12378 		.tested		= TEST_OK_PREW,
12379 		.probe		= probe_jedec,
12380 		.probe_timing	= TIMING_FIXME,
12381 		.block_erasers	=
12382 		{
12383 			{
12384 				.eraseblocks = {
12385 					{128 * 1024, 1},
12386 					{96 * 1024, 1},
12387 					{8 * 1024, 2},
12388 					{16 * 1024, 1},
12389 				},
12390 				.block_erase = erase_sector_jedec,
12391 			}, {
12392 				.eraseblocks = { {256 * 1024, 1} },
12393 				.block_erase = erase_chip_block_jedec,
12394 			},
12395 		},
12396 		.write		= write_jedec_1,
12397 		.read		= read_memmapped,
12398 		.voltage	= {4500, 5500},
12399 	},
12400 
12401 	{
12402 		.vendor		= "PMC",
12403 		.name		= "Pm39LV010",
12404 		.bustype	= BUS_PARALLEL,
12405 		.manufacture_id	= PMC_ID_NOPREFIX,
12406 		.model_id	= PMC_PM39F010,	/* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
12407 		.total_size	= 128,
12408 		.page_size	= 4096,
12409 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12410 		.tested		= TEST_OK_PREW,
12411 		.probe		= probe_jedec,
12412 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
12413 		.block_erasers	=
12414 		{
12415 			{
12416 				.eraseblocks = { {4 * 1024, 32} },
12417 				.block_erase = erase_sector_jedec,
12418 			}, {
12419 				.eraseblocks = { {64 * 1024, 2} },
12420 				.block_erase = erase_block_jedec,
12421 			}, {
12422 				.eraseblocks = { {128 * 1024, 1} },
12423 				.block_erase = erase_chip_block_jedec,
12424 			}
12425 		},
12426 		.write		= write_jedec_1,
12427 		.read		= read_memmapped,
12428 		.voltage	= {2700, 3600},
12429 	},
12430 
12431 	{
12432 		.vendor		= "PMC",
12433 		.name		= "Pm39LV020",
12434 		.bustype	= BUS_PARALLEL,
12435 		.manufacture_id	= PMC_ID_NOPREFIX,
12436 		.model_id	= PMC_PM39LV020,
12437 		.total_size	= 256,
12438 		.page_size	= 4096,
12439 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12440 		.tested		= TEST_UNTESTED,
12441 		.probe		= probe_jedec,
12442 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
12443 		.block_erasers	=
12444 		{
12445 			{
12446 				.eraseblocks = { {4 * 1024, 64} },
12447 				.block_erase = erase_sector_jedec,
12448 			}, {
12449 				.eraseblocks = { {64 * 1024, 4} },
12450 				.block_erase = erase_block_jedec,
12451 			}, {
12452 				.eraseblocks = { {256 * 1024, 1} },
12453 				.block_erase = erase_chip_block_jedec,
12454 			}
12455 		},
12456 		.write		= write_jedec_1,
12457 		.read		= read_memmapped,
12458 		.voltage	= {2700, 3600},
12459 	},
12460 
12461 	{
12462 		.vendor		= "PMC",
12463 		.name		= "Pm39LV040",
12464 		.bustype	= BUS_PARALLEL,
12465 		.manufacture_id	= PMC_ID_NOPREFIX,
12466 		.model_id	= PMC_PM39LV040,
12467 		.total_size	= 512,
12468 		.page_size	= 4096,
12469 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12470 		.tested		= TEST_OK_PR,
12471 		.probe		= probe_jedec,
12472 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
12473 		.block_erasers	=
12474 		{
12475 			{
12476 				.eraseblocks = { {4 * 1024, 128} },
12477 				.block_erase = erase_sector_jedec,
12478 			}, {
12479 				.eraseblocks = { {64 * 1024, 8} },
12480 				.block_erase = erase_block_jedec,
12481 			}, {
12482 				.eraseblocks = { {512 * 1024, 1} },
12483 				.block_erase = erase_chip_block_jedec,
12484 			}
12485 		},
12486 		.write		= write_jedec_1,
12487 		.read		= read_memmapped,
12488 		.voltage	= {2700, 3600},
12489 	},
12490 
12491 	{
12492 		.vendor		= "PMC",
12493 		.name		= "Pm39LV512",
12494 		.bustype	= BUS_PARALLEL,
12495 		.manufacture_id	= PMC_ID_NOPREFIX,
12496 		.model_id	= PMC_PM39LV512,
12497 		.total_size	= 64,
12498 		.page_size	= 4096,
12499 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12500 		.tested		= TEST_OK_PREW,
12501 		.probe		= probe_jedec,
12502 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
12503 		.block_erasers	=
12504 		{
12505 			{
12506 				.eraseblocks = { {4 * 1024, 16} },
12507 				.block_erase = erase_sector_jedec,
12508 			}, {
12509 				.eraseblocks = { {64 * 1024, 1} },
12510 				.block_erase = erase_block_jedec,
12511 			}, {
12512 				.eraseblocks = { {64 * 1024, 1} },
12513 				.block_erase = erase_chip_block_jedec,
12514 			}
12515 		},
12516 		.write		= write_jedec_1,
12517 		.read		= read_memmapped,
12518 		.voltage	= {2700, 3600},
12519 	},
12520 
12521 	{
12522 		.vendor		= "PMC",
12523 		.name		= "Pm49FL002",
12524 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
12525 		.manufacture_id	= PMC_ID_NOPREFIX,
12526 		.model_id	= PMC_PM49FL002,
12527 		.total_size	= 256,
12528 		.page_size	= 16 * 1024,
12529 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
12530 		.tested		= TEST_OK_PR,
12531 		.probe		= probe_jedec,
12532 		.probe_timing	= TIMING_ZERO,	/* routine is wrapper to probe_jedec (pm49fl00x.c) */
12533 		.block_erasers	=
12534 		{
12535 			{
12536 				.eraseblocks = { {4 * 1024, 64} },
12537 				.block_erase = erase_sector_jedec,
12538 			}, {
12539 				.eraseblocks = { {16 * 1024, 16} },
12540 				.block_erase = erase_block_jedec,
12541 			}, {
12542 				.eraseblocks = { {256 * 1024, 1} },
12543 				.block_erase = erase_chip_block_jedec,
12544 			}
12545 		},
12546 		.unlock		= unlock_regspace2_uniform_32k,
12547 		.write		= write_jedec_1,
12548 		.read		= read_memmapped,
12549 		.voltage	= {3000, 3600},
12550 	},
12551 
12552 	{
12553 		.vendor		= "PMC",
12554 		.name		= "Pm49FL004",
12555 		.bustype	= BUS_LPC | BUS_FWH, /* A/A Mux */
12556 		.manufacture_id	= PMC_ID_NOPREFIX,
12557 		.model_id	= PMC_PM49FL004,
12558 		.total_size	= 512,
12559 		.page_size	= 64 * 1024,
12560 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
12561 		.tested		= TEST_OK_PREW,
12562 		.probe		= probe_jedec,
12563 		.probe_timing	= TIMING_ZERO,
12564 		.block_erasers	=
12565 		{
12566 			{
12567 				.eraseblocks = { {4 * 1024, 128} },
12568 				.block_erase = erase_sector_jedec,
12569 			}, {
12570 				.eraseblocks = { {64 * 1024, 8} },
12571 				.block_erase = erase_block_jedec,
12572 			}, {
12573 				.eraseblocks = { {512 * 1024, 1} },
12574 				.block_erase = erase_chip_block_jedec,
12575 			}
12576 		},
12577 		.unlock		= unlock_regspace2_uniform_64k,
12578 		.write		= write_jedec_1,
12579 		.read		= read_memmapped,
12580 		.voltage	= {3000, 3600},
12581 	},
12582 
12583 	{
12584 		.vendor		= "SST",
12585 		.name		= "SST25LF020A",
12586 		.bustype	= BUS_SPI,
12587 		.manufacture_id	= SST_ID,
12588 		.model_id	= SST_SST25VF020_REMS,
12589 		.total_size	= 256,
12590 		.page_size	= 256,
12591 		.feature_bits	= FEATURE_WRSR_EWSR,
12592 		.tested		= TEST_OK_PREW,
12593 		.probe		= probe_spi_rems,
12594 		.probe_timing	= TIMING_ZERO,
12595 		.block_erasers	=
12596 		{
12597 			{
12598 				.eraseblocks = { {4 * 1024, 64} },
12599 				.block_erase = spi_block_erase_20,
12600 			}, {
12601 				.eraseblocks = { {32 * 1024, 8} },
12602 				.block_erase = spi_block_erase_52,
12603 			}, {
12604 				.eraseblocks = { {256 * 1024, 1} },
12605 				.block_erase = spi_block_erase_60,
12606 			},
12607 		},
12608 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12609 		.unlock		= spi_disable_blockprotect,
12610 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12611 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12612 		.voltage	= {2700, 3600},
12613 	},
12614 
12615 	{
12616 		.vendor		= "SST",
12617 		.name		= "SST25LF040A",
12618 		.bustype	= BUS_SPI,
12619 		.manufacture_id	= SST_ID,
12620 		.model_id	= SST_SST25VF040_REMS,
12621 		.total_size	= 512,
12622 		.page_size	= 256,
12623 		.feature_bits	= FEATURE_WRSR_EWSR,
12624 		.tested		= TEST_OK_PREW,
12625 		.probe		= probe_spi_res2,
12626 		.probe_timing	= TIMING_ZERO,
12627 		.block_erasers	=
12628 		{
12629 			{
12630 				.eraseblocks = { {4 * 1024, 128} },
12631 				.block_erase = spi_block_erase_20,
12632 			}, {
12633 				.eraseblocks = { {32 * 1024, 16} },
12634 				.block_erase = spi_block_erase_52,
12635 			}, {
12636 				.eraseblocks = { {512 * 1024, 1} },
12637 				.block_erase = spi_block_erase_60,
12638 			},
12639 		},
12640 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
12641 		.unlock		= spi_disable_blockprotect,
12642 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12643 		.read		= spi_chip_read,
12644 		.voltage	= {3000, 3600},
12645 	},
12646 
12647 	{
12648 		.vendor		= "SST",
12649 		.name		= "SST25LF080(A)",
12650 		.bustype	= BUS_SPI,
12651 		.manufacture_id	= SST_ID,
12652 		.model_id	= SST_SST25VF080_REMS,
12653 		.total_size	= 1024,
12654 		.page_size	= 256,
12655 		.feature_bits	= FEATURE_WRSR_EITHER,
12656 		.tested		= TEST_UNTESTED,
12657 		.probe		= probe_spi_res2,
12658 		.probe_timing	= TIMING_ZERO,
12659 		.block_erasers	=
12660 		{
12661 			{
12662 				.eraseblocks = { {4 * 1024, 256} },
12663 				.block_erase = spi_block_erase_20,
12664 			}, {
12665 				.eraseblocks = { {32 * 1024, 32} },
12666 				.block_erase = spi_block_erase_52,
12667 			}, {
12668 				.eraseblocks = { {1024 * 1024, 1} },
12669 				.block_erase = spi_block_erase_60,
12670 			},
12671 		},
12672 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
12673 		.unlock		= spi_disable_blockprotect,
12674 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12675 		.read		= spi_chip_read,
12676 		.voltage	= {3000, 3600},
12677 	},
12678 
12679 	{
12680 		.vendor		= "SST",
12681 		.name		= "SST25VF010(A)",
12682 		.bustype	= BUS_SPI,
12683 		.manufacture_id	= SST_ID,
12684 		.model_id	= SST_SST25VF010_REMS,
12685 		.total_size	= 128,
12686 		.page_size	= 256,
12687 		.feature_bits	= FEATURE_WRSR_EWSR,
12688 		.tested		= TEST_OK_PREW,
12689 		.probe		= probe_spi_rems,
12690 		.probe_timing	= TIMING_ZERO,
12691 		.block_erasers	=
12692 		{
12693 			{
12694 				.eraseblocks = { {4 * 1024, 32} },
12695 				.block_erase = spi_block_erase_20,
12696 			}, {
12697 				.eraseblocks = { {32 * 1024, 4} },
12698 				.block_erase = spi_block_erase_52,
12699 			}, {
12700 				.eraseblocks = { {32 * 1024, 4} },
12701 				.block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
12702 			}, {
12703 				.eraseblocks = { {128 * 1024, 1} },
12704 				.block_erase = spi_block_erase_60,
12705 			}, {
12706 				.eraseblocks = { {128 * 1024, 1} },
12707 				.block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
12708 			},
12709 		},
12710 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12711 		.unlock		= spi_disable_blockprotect,
12712 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12713 		.read		= spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
12714 		.voltage	= {2700, 3600},
12715 	},
12716 
12717 	{
12718 		.vendor		= "SST",
12719 		.name		= "SST25VF016B",
12720 		.bustype	= BUS_SPI,
12721 		.manufacture_id	= SST_ID,
12722 		.model_id	= SST_SST25VF016B,
12723 		.total_size	= 2048,
12724 		.page_size	= 256,
12725 		.feature_bits	= FEATURE_WRSR_EITHER,
12726 		.tested		= TEST_OK_PREW,
12727 		.probe		= probe_spi_rdid,
12728 		.probe_timing	= TIMING_ZERO,
12729 		.block_erasers	=
12730 		{
12731 			{
12732 				.eraseblocks = { {4 * 1024, 512} },
12733 				.block_erase = spi_block_erase_20,
12734 			}, {
12735 				.eraseblocks = { {32 * 1024, 64} },
12736 				.block_erase = spi_block_erase_52,
12737 			}, {
12738 				.eraseblocks = { {64 * 1024, 32} },
12739 				.block_erase = spi_block_erase_d8,
12740 			}, {
12741 				.eraseblocks = { {2 * 1024 * 1024, 1} },
12742 				.block_erase = spi_block_erase_60,
12743 			}, {
12744 				.eraseblocks = { {2 * 1024 * 1024, 1} },
12745 				.block_erase = spi_block_erase_c7,
12746 			},
12747 		},
12748 		.printlock	= spi_prettyprint_status_register_sst25vf016,
12749 		.unlock		= spi_disable_blockprotect,
12750 		.write		= spi_aai_write,
12751 		.read		= spi_chip_read,
12752 		.voltage	= {2700, 3600},
12753 	},
12754 
12755 	{
12756 		.vendor		= "SST",
12757 		.name		= "SST25VF020",
12758 		.bustype	= BUS_SPI,
12759 		.manufacture_id	= SST_ID,
12760 		.model_id	= SST_SST25VF020_REMS,
12761 		.total_size	= 256,
12762 		.page_size	= 256,
12763 		.feature_bits	= FEATURE_WRSR_EWSR,
12764 		.tested		= TEST_UNTESTED,
12765 		.probe		= probe_spi_rems,
12766 		.probe_timing	= TIMING_ZERO,
12767 		.block_erasers	=
12768 		{
12769 			{
12770 				.eraseblocks = { {4 * 1024, 64} },
12771 				.block_erase = spi_block_erase_20,
12772 			}, {
12773 				.eraseblocks = { {32 * 1024, 8} },
12774 				.block_erase = spi_block_erase_52,
12775 			}, {
12776 				.eraseblocks = { {256 * 1024, 1} },
12777 				.block_erase = spi_block_erase_60,
12778 			},
12779 		},
12780 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12781 		.unlock		= spi_disable_blockprotect,
12782 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12783 		.read		= spi_chip_read, /* only */
12784 		.voltage	= {2700, 3600},
12785 	},
12786 
12787 	{
12788 		.vendor		= "SST",
12789 		.name		= "SST25VF020B",
12790 		.bustype	= BUS_SPI,
12791 		.manufacture_id	= SST_ID,
12792 		.model_id	= SST_SST25VF020B,
12793 		.total_size	= 256,
12794 		.page_size	= 256,
12795 		.feature_bits	= FEATURE_WRSR_EWSR,
12796 		.tested		= TEST_OK_PREW,
12797 		.probe		= probe_spi_rdid,
12798 		.probe_timing	= TIMING_ZERO,
12799 		.block_erasers	=
12800 		{
12801 			{
12802 				.eraseblocks = { {4 * 1024, 64} },
12803 				.block_erase = spi_block_erase_20,
12804 			}, {
12805 				.eraseblocks = { {32 * 1024, 8} },
12806 				.block_erase = spi_block_erase_52,
12807 			}, {
12808 				.eraseblocks = { {64 * 1024, 4} },
12809 				.block_erase = spi_block_erase_d8,
12810 			}, {
12811 				.eraseblocks = { {256 * 1024, 1} },
12812 				.block_erase = spi_block_erase_60,
12813 			}, {
12814 				.eraseblocks = { {256 * 1024, 1} },
12815 				.block_erase = spi_block_erase_c7,
12816 			},
12817 		},
12818 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
12819 		.unlock		= spi_disable_blockprotect, /* FIXME: 2nd SR */
12820 		.write		= spi_aai_write, /* AAI supported (0xAD) */
12821 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12822 		.voltage	= {2700, 3600},
12823 	},
12824 
12825 	{
12826 		.vendor		= "SST",
12827 		.name		= "SST25VF032B",
12828 		.bustype	= BUS_SPI,
12829 		.manufacture_id	= SST_ID,
12830 		.model_id	= SST_SST25VF032B,
12831 		.total_size	= 4096,
12832 		.page_size	= 256,
12833 		.feature_bits	= FEATURE_WRSR_EWSR,
12834 		.tested		= TEST_OK_PREW,
12835 		.probe		= probe_spi_rdid,
12836 		.probe_timing	= TIMING_ZERO,
12837 		.block_erasers	=
12838 		{
12839 			{
12840 				.eraseblocks = { {4 * 1024, 1024} },
12841 				.block_erase = spi_block_erase_20,
12842 			}, {
12843 				.eraseblocks = { {32 * 1024, 128} },
12844 				.block_erase = spi_block_erase_52,
12845 			}, {
12846 				.eraseblocks = { {64 * 1024, 64} },
12847 				.block_erase = spi_block_erase_d8,
12848 			}, {
12849 				.eraseblocks = { {4 * 1024 * 1024, 1} },
12850 				.block_erase = spi_block_erase_60,
12851 			}, {
12852 				.eraseblocks = { {4 * 1024 * 1024, 1} },
12853 				.block_erase = spi_block_erase_c7,
12854 			},
12855 		},
12856 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
12857 		.unlock		= spi_disable_blockprotect,
12858 		.write		= spi_aai_write,
12859 		.read		= spi_chip_read,
12860 		.voltage	= {2700, 3600},
12861 	},
12862 
12863 	{
12864 		.vendor		= "SST",
12865 		.name		= "SST25VF040",
12866 		.bustype	= BUS_SPI,
12867 		.manufacture_id	= SST_ID,
12868 		.model_id	= SST_SST25VF040_REMS,
12869 		.total_size	= 512,
12870 		.page_size	= 256,
12871 		.feature_bits	= FEATURE_WRSR_EWSR,
12872 		.tested		= TEST_OK_PR,
12873 		.probe		= probe_spi_rems,
12874 		.probe_timing	= TIMING_ZERO,
12875 		.block_erasers	=
12876 		{
12877 			{
12878 				.eraseblocks = { {4 * 1024, 128} },
12879 				.block_erase = spi_block_erase_20,
12880 			}, {
12881 				.eraseblocks = { {32 * 1024, 16} },
12882 				.block_erase = spi_block_erase_52,
12883 			}, {
12884 				.eraseblocks = { {512 * 1024, 1} },
12885 				.block_erase = spi_block_erase_60,
12886 			},
12887 		},
12888 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
12889 		.unlock		= spi_disable_blockprotect,
12890 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12891 		.read		= spi_chip_read,
12892 		.voltage	= {2700, 3600},
12893 	},
12894 
12895 	{
12896 		.vendor		= "SST",
12897 		.name		= "SST25VF040B",
12898 		.bustype	= BUS_SPI,
12899 		.manufacture_id	= SST_ID,
12900 		.model_id	= SST_SST25VF040B,
12901 		.total_size	= 512,
12902 		.page_size	= 256,
12903 		.feature_bits	= FEATURE_WRSR_EWSR,
12904 		.tested		= TEST_OK_PREW,
12905 		.probe		= probe_spi_rdid,
12906 		.probe_timing	= TIMING_ZERO,
12907 		.block_erasers	=
12908 		{
12909 			{
12910 				.eraseblocks = { {4 * 1024, 128} },
12911 				.block_erase = spi_block_erase_20,
12912 			}, {
12913 				.eraseblocks = { {32 * 1024, 16} },
12914 				.block_erase = spi_block_erase_52,
12915 			}, {
12916 				.eraseblocks = { {64 * 1024, 8} },
12917 				.block_erase = spi_block_erase_d8,
12918 			}, {
12919 				.eraseblocks = { {512 * 1024, 1} },
12920 				.block_erase = spi_block_erase_60,
12921 			}, {
12922 				.eraseblocks = { {512 * 1024, 1} },
12923 				.block_erase = spi_block_erase_c7,
12924 			},
12925 		},
12926 		.printlock	= spi_prettyprint_status_register_sst25vf040b,
12927 		.unlock		= spi_disable_blockprotect,
12928 		.write		= spi_aai_write, /* AAI supported (0xAD) */
12929 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
12930 		.voltage	= {2700, 3600},
12931 	},
12932 
12933 	{
12934 		.vendor		= "SST",
12935 		.name		= "SST25VF040B.REMS",
12936 		.bustype	= BUS_SPI,
12937 		.manufacture_id	= SST_ID,
12938 		.model_id	= SST_SST25VF040B_REMS,
12939 		.total_size	= 512,
12940 		.page_size	= 256,
12941 		.feature_bits	= FEATURE_WRSR_EWSR,
12942 		.tested		= TEST_OK_PREW,
12943 		.probe		= probe_spi_rems,
12944 		.probe_timing	= TIMING_ZERO,
12945 		.block_erasers	=
12946 		{
12947 			{
12948 				.eraseblocks = { {4 * 1024, 128} },
12949 				.block_erase = spi_block_erase_20,
12950 			}, {
12951 				.eraseblocks = { {32 * 1024, 16} },
12952 				.block_erase = spi_block_erase_52,
12953 			}, {
12954 				.eraseblocks = { {64 * 1024, 8} },
12955 				.block_erase = spi_block_erase_d8,
12956 			}, {
12957 				.eraseblocks = { {512 * 1024, 1} },
12958 				.block_erase = spi_block_erase_60,
12959 			}, {
12960 				.eraseblocks = { {512 * 1024, 1} },
12961 				.block_erase = spi_block_erase_c7,
12962 			},
12963 		},
12964 		.printlock	= spi_prettyprint_status_register_sst25vf040b,
12965 		.unlock		= spi_disable_blockprotect,
12966 		.write		= spi_aai_write,
12967 		.read		= spi_chip_read,
12968 		.voltage	= {2700, 3600},
12969 	},
12970 
12971 	{
12972 		.vendor		= "SST",
12973 		.name		= "SST25VF064C",
12974 		.bustype	= BUS_SPI,
12975 		.manufacture_id	= SST_ID,
12976 		.model_id	= SST_SST25VF064C,
12977 		.total_size	= 8192,
12978 		.page_size	= 256,
12979 		.feature_bits	= FEATURE_WRSR_EWSR,
12980 		.tested		= TEST_OK_PREW,
12981 		.probe		= probe_spi_rdid,
12982 		.probe_timing	= TIMING_ZERO,
12983 		.block_erasers	=
12984 		{
12985 			{
12986 				.eraseblocks = { {4 * 1024, 2048} },
12987 				.block_erase = spi_block_erase_20,
12988 			}, {
12989 				.eraseblocks = { {32 * 1024, 256} },
12990 				.block_erase = spi_block_erase_52,
12991 			}, {
12992 				.eraseblocks = { {64 * 1024, 128} },
12993 				.block_erase = spi_block_erase_d8,
12994 			}, {
12995 				.eraseblocks = { {8 * 1024 * 1024, 1} },
12996 				.block_erase = spi_block_erase_60,
12997 			}, {
12998 				.eraseblocks = { {8 * 1024 * 1024, 1} },
12999 				.block_erase = spi_block_erase_c7,
13000 			},
13001 		},
13002 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
13003 		.unlock		= spi_disable_blockprotect,
13004 		.write		= spi_chip_write_256,
13005 		.read		= spi_chip_read,
13006 		.voltage	= {2700, 3600},
13007 	},
13008 
13009 	{
13010 		.vendor		= "SST",
13011 		.name		= "SST25VF080B",
13012 		.bustype	= BUS_SPI,
13013 		.manufacture_id	= SST_ID,
13014 		.model_id	= SST_SST25VF080B,
13015 		.total_size	= 1024,
13016 		.page_size	= 256,
13017 		.feature_bits	= FEATURE_WRSR_EWSR,
13018 		.tested		= TEST_OK_PREW,
13019 		.probe		= probe_spi_rdid,
13020 		.probe_timing	= TIMING_ZERO,
13021 		.block_erasers	=
13022 		{
13023 			{
13024 				.eraseblocks = { {4 * 1024, 256} },
13025 				.block_erase = spi_block_erase_20,
13026 			}, {
13027 				.eraseblocks = { {32 * 1024, 32} },
13028 				.block_erase = spi_block_erase_52,
13029 			}, {
13030 				.eraseblocks = { {64 * 1024, 16} },
13031 				.block_erase = spi_block_erase_d8,
13032 			}, {
13033 				.eraseblocks = { {1024 * 1024, 1} },
13034 				.block_erase = spi_block_erase_60,
13035 			}, {
13036 				.eraseblocks = { {1024 * 1024, 1} },
13037 				.block_erase = spi_block_erase_c7,
13038 			},
13039 		},
13040 		.printlock	= spi_prettyprint_status_register_sst25, /* TODO: check */
13041 		.unlock		= spi_disable_blockprotect,
13042 		.write		= spi_aai_write,
13043 		.read		= spi_chip_read,
13044 		.voltage	= {2700, 3600},
13045 	},
13046 
13047 	{
13048 		.vendor		= "SST",
13049 		.name		= "SST25VF512(A)",
13050 		.bustype	= BUS_SPI,
13051 		.manufacture_id	= SST_ID,
13052 		.model_id	= SST_SST25VF512_REMS,
13053 		.total_size	= 64,
13054 		.page_size	= 256,
13055 		.feature_bits	= FEATURE_WRSR_EWSR,
13056 		.tested		= TEST_OK_PREW,
13057 		.probe		= probe_spi_rems,
13058 		.probe_timing	= TIMING_ZERO,
13059 		.block_erasers	=
13060 		{
13061 			{
13062 				.eraseblocks = { {4 * 1024, 16} },
13063 				.block_erase = spi_block_erase_20,
13064 			}, {
13065 				.eraseblocks = { {32 * 1024, 2} },
13066 				.block_erase = spi_block_erase_52,
13067 			}, {
13068 				.eraseblocks = { {32 * 1024, 2} },
13069 				.block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
13070 			}, {
13071 				.eraseblocks = { {64 * 1024, 1} },
13072 				.block_erase = spi_block_erase_60,
13073 			}, {
13074 				.eraseblocks = { {64 * 1024, 1} },
13075 				.block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
13076 			},
13077 		},
13078 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13079 		.unlock		= spi_disable_blockprotect,
13080 		.write		= spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13081 		.read		= spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
13082 		.voltage	= {2700, 3600},
13083 	},
13084 
13085 	{
13086 		.vendor		= "SST",
13087 		.name		= "SST25WF010",
13088 		.bustype	= BUS_SPI,
13089 		.manufacture_id	= SST_ID,
13090 		.model_id	= SST_SST25WF010,
13091 		.total_size	= 128,
13092 		.page_size	= 256,
13093 		.feature_bits	= FEATURE_WRSR_EITHER,
13094 		.tested		= TEST_UNTESTED,
13095 		.probe		= probe_spi_rdid,
13096 		.probe_timing	= TIMING_ZERO,
13097 		.block_erasers	=
13098 		{
13099 			{
13100 				.eraseblocks = { {4 * 1024, 32} },
13101 				.block_erase = spi_block_erase_20,
13102 			}, {
13103 				.eraseblocks = { {32 * 1024, 4} },
13104 				.block_erase = spi_block_erase_52,
13105 			}, {
13106 				.eraseblocks = { {1024 * 128, 1} },
13107 				.block_erase = spi_block_erase_60,
13108 			}, {
13109 				.eraseblocks = { {1024 * 128, 1} },
13110 				.block_erase = spi_block_erase_c7,
13111 			},
13112 		},
13113 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13114 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13115 		.write		= spi_aai_write,
13116 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13117 		.voltage	= {1650, 1950},
13118 	},
13119 
13120 	{
13121 		.vendor		= "SST",
13122 		.name		= "SST25WF020",
13123 		.bustype	= BUS_SPI,
13124 		.manufacture_id	= SST_ID,
13125 		.model_id	= SST_SST25WF020,
13126 		.total_size	= 256,
13127 		.page_size	= 256,
13128 		.feature_bits	= FEATURE_WRSR_EITHER,
13129 		.tested		= TEST_UNTESTED,
13130 		.probe		= probe_spi_rdid,
13131 		.probe_timing	= TIMING_ZERO,
13132 		.block_erasers	=
13133 		{
13134 			{
13135 				.eraseblocks = { {4 * 1024, 64} },
13136 				.block_erase = spi_block_erase_20,
13137 			}, {
13138 				.eraseblocks = { {32 * 1024, 8} },
13139 				.block_erase = spi_block_erase_52,
13140 			}, {
13141 				.eraseblocks = { {64 * 1024, 4} },
13142 				.block_erase = spi_block_erase_d8,
13143 			}, {
13144 				.eraseblocks = { {1024 * 256, 1} },
13145 				.block_erase = spi_block_erase_60,
13146 			}, {
13147 				.eraseblocks = { {1024 * 256, 1} },
13148 				.block_erase = spi_block_erase_c7,
13149 			},
13150 		},
13151 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13152 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13153 		.write		= spi_aai_write,
13154 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13155 		.voltage	= {1650, 1950},
13156 	},
13157 
13158 	{
13159 		.vendor		= "SST",
13160 		.name		= "SST25WF020A",
13161 		.bustype	= BUS_SPI,
13162 		.manufacture_id	= SANYO_ID, /* See flashchips.h */
13163 		.model_id	= SST_SST25WF020A,
13164 		.total_size	= 256,
13165 		.page_size	= 256,
13166 		.feature_bits	= FEATURE_WRSR_WREN,
13167 		.tested		= TEST_UNTESTED,
13168 		.probe		= probe_spi_rdid,
13169 		.probe_timing	= TIMING_ZERO,
13170 		.block_erasers	=
13171 		{
13172 			{
13173 				.eraseblocks = { {4 * 1024, 64} },
13174 				.block_erase = spi_block_erase_20,
13175 			}, {
13176 				.eraseblocks = { {64 * 1024, 4} },
13177 				.block_erase = spi_block_erase_d8,
13178 			}, {
13179 				.eraseblocks = { {256 * 1024, 1} },
13180 				.block_erase = spi_block_erase_60,
13181 			}, {
13182 				.eraseblocks = { {256 * 1024, 1} },
13183 				.block_erase = spi_block_erase_c7,
13184 			},
13185 		},
13186 		.printlock	= spi_prettyprint_status_register_bp2_tb_bpl,
13187 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13188 		.write		= spi_chip_write_256,
13189 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13190 		.voltage	= {1650, 1950},
13191 	},
13192 
13193 	{
13194 		.vendor		= "SST",
13195 		.name		= "SST25WF040",
13196 		.bustype	= BUS_SPI,
13197 		.manufacture_id	= SST_ID,
13198 		.model_id	= SST_SST25WF040,
13199 		.total_size	= 512,
13200 		.page_size	= 256,
13201 		.feature_bits	= FEATURE_WRSR_EITHER,
13202 		.tested		= TEST_UNTESTED,
13203 		.probe		= probe_spi_rdid,
13204 		.probe_timing	= TIMING_ZERO,
13205 		.block_erasers	=
13206 		{
13207 			{
13208 				.eraseblocks = { {4 * 1024, 128} },
13209 				.block_erase = spi_block_erase_20,
13210 			}, {
13211 				.eraseblocks = { {32 * 1024, 16} },
13212 				.block_erase = spi_block_erase_52,
13213 			}, {
13214 				.eraseblocks = { {64 * 1024, 8} },
13215 				.block_erase = spi_block_erase_d8,
13216 			}, {
13217 				.eraseblocks = { {1024 * 512, 1} },
13218 				.block_erase = spi_block_erase_60,
13219 			}, {
13220 				.eraseblocks = { {1024 * 512, 1} },
13221 				.block_erase = spi_block_erase_c7,
13222 			},
13223 		},
13224 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13225 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13226 		.write		= spi_aai_write,
13227 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13228 		.voltage	= {1650, 1950},
13229 	},
13230 
13231 	{
13232 		.vendor		= "SST",
13233 		.name		= "SST25WF040B",
13234 		.bustype	= BUS_SPI,
13235 		.manufacture_id	= SANYO_ID, /* See flashchips.h */
13236 		.model_id	= SST_SST25WF040B,
13237 		.total_size	= 512,
13238 		.page_size	= 256,
13239 		.feature_bits	= FEATURE_WRSR_WREN,
13240 		.tested		= TEST_UNTESTED,
13241 		.probe		= probe_spi_rdid,
13242 		.probe_timing	= TIMING_ZERO,
13243 		.block_erasers	=
13244 		{
13245 			{
13246 				.eraseblocks = { {4 * 1024, 128} },
13247 				.block_erase = spi_block_erase_20,
13248 			}, {
13249 				.eraseblocks = { {64 * 1024, 8} },
13250 				.block_erase = spi_block_erase_d8,
13251 			}, {
13252 				.eraseblocks = { {512 * 1024, 1} },
13253 				.block_erase = spi_block_erase_60,
13254 			}, {
13255 				.eraseblocks = { {512 * 1024, 1} },
13256 				.block_erase = spi_block_erase_c7,
13257 			},
13258 		},
13259 		.printlock	= spi_prettyprint_status_register_bp2_tb_bpl,
13260 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13261 		.write		= spi_chip_write_256,
13262 		.read		= spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13263 		.voltage	= {1650, 1950},
13264 	},
13265 
13266 	{
13267 		.vendor		= "SST",
13268 		.name		= "SST25WF080",
13269 		.bustype	= BUS_SPI,
13270 		.manufacture_id	= SST_ID,
13271 		.model_id	= SST_SST25WF080,
13272 		.total_size	= 1024,
13273 		.page_size	= 256,
13274 		.feature_bits	= FEATURE_WRSR_EITHER,
13275 		.tested		= TEST_OK_PREW,
13276 		.probe		= probe_spi_rdid,
13277 		.probe_timing	= TIMING_ZERO,
13278 		.block_erasers	=
13279 		{
13280 			{
13281 				.eraseblocks = { {4 * 1024, 256} },
13282 				.block_erase = spi_block_erase_20,
13283 			}, {
13284 				.eraseblocks = { {32 * 1024, 32} },
13285 				.block_erase = spi_block_erase_52,
13286 			}, {
13287 				.eraseblocks = { {64 * 1024, 16} },
13288 				.block_erase = spi_block_erase_d8,
13289 			}, {
13290 				.eraseblocks = { {1024 * 1024, 1} },
13291 				.block_erase = spi_block_erase_60,
13292 			}, {
13293 				.eraseblocks = { {1024 * 1024, 1} },
13294 				.block_erase = spi_block_erase_c7,
13295 			},
13296 		},
13297 		.printlock	= spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13298 		.unlock		= spi_disable_blockprotect_bp3_srwd,
13299 		.write		= spi_aai_write,
13300 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13301 		.voltage	= {1650, 1950},
13302 	},
13303 
13304 	{
13305 		.vendor		= "SST",
13306 		.name		= "SST25WF080B",
13307 		.bustype	= BUS_SPI,
13308 		.manufacture_id	= SANYO_ID, /* See flashchips.h */
13309 		.model_id	= SST_SST25WF080B,
13310 		.total_size	= 1024,
13311 		.page_size	= 256,
13312 		.feature_bits	= FEATURE_WRSR_WREN,
13313 		.tested		= TEST_OK_PREW,
13314 		.probe		= probe_spi_rdid,
13315 		.probe_timing	= TIMING_ZERO,
13316 		.block_erasers	=
13317 		{
13318 			{
13319 				.eraseblocks = { {4 * 1024, 256} },
13320 				.block_erase = spi_block_erase_20,
13321 			}, {
13322 				.eraseblocks = { {64 * 1024, 16} },
13323 				.block_erase = spi_block_erase_d8,
13324 			}, {
13325 				.eraseblocks = { {1024 * 1024, 1} },
13326 				.block_erase = spi_block_erase_60,
13327 			}, {
13328 				.eraseblocks = { {1024 * 1024, 1} },
13329 				.block_erase = spi_block_erase_c7,
13330 			},
13331 		},
13332 		.printlock	= spi_prettyprint_status_register_bp2_tb_bpl,
13333 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13334 		.write		= spi_chip_write_256,
13335 		.read		= spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13336 		.voltage	= {1650, 1950},
13337 	},
13338 
13339 	{
13340 		.vendor		= "SST",
13341 		.name		= "SST25WF512",
13342 		.bustype	= BUS_SPI,
13343 		.manufacture_id	= SST_ID,
13344 		.model_id	= SST_SST25WF512,
13345 		.total_size	= 64,
13346 		.page_size	= 256,
13347 		.feature_bits	= FEATURE_WRSR_EITHER,
13348 		.tested		= TEST_UNTESTED,
13349 		.probe		= probe_spi_rdid,
13350 		.probe_timing	= TIMING_ZERO,
13351 		.block_erasers	=
13352 		{
13353 			{
13354 				.eraseblocks = { {4 * 1024, 16} },
13355 				.block_erase = spi_block_erase_20,
13356 			}, {
13357 				.eraseblocks = { {32 * 1024, 2} },
13358 				.block_erase = spi_block_erase_52,
13359 			}, {
13360 				.eraseblocks = { {1024 * 64, 1} },
13361 				.block_erase = spi_block_erase_60,
13362 			}, {
13363 				.eraseblocks = { {1024 * 64, 1} },
13364 				.block_erase = spi_block_erase_c7,
13365 			},
13366 		},
13367 		.printlock	= spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13368 		.unlock		= spi_disable_blockprotect_bp2_srwd,
13369 		.write		= spi_aai_write,
13370 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
13371 		.voltage	= {1650, 1950},
13372 	},
13373 
13374 	{
13375 		.vendor		= "SST",
13376 		.name		= "SST26VF016B(A)",
13377 		.bustype	= BUS_SPI,
13378 		.manufacture_id	= SST_ID,
13379 		.model_id	= SST_SST26VF016B,
13380 		.total_size	= 2048,
13381 		.page_size	= 256,
13382 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
13383 		.tested		= TEST_OK_PREW,
13384 		.probe		= probe_spi_rdid,
13385 		.probe_timing	= TIMING_ZERO,
13386 		.block_erasers	=
13387 		{
13388 			{
13389 				.eraseblocks = { {4 * 1024, 512} },
13390 				.block_erase = spi_block_erase_20,
13391 			}, {
13392 				.eraseblocks = {
13393 					{8 * 1024, 4},
13394 					{32 * 1024, 1},
13395 					{64 * 1024, 30},
13396 					{32 * 1024, 1},
13397 					{8 * 1024, 4},
13398 				},
13399 				.block_erase = spi_block_erase_d8,
13400 			}, {
13401 				.eraseblocks = { {2 * 1024 * 1024, 1} },
13402 				.block_erase = spi_block_erase_c7,
13403 			},
13404 		},
13405 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
13406 		.unlock		= spi_disable_blockprotect_sst26_global_unprotect,
13407 		.write		= spi_chip_write_256, /* Multi I/O supported */
13408 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13409 		.voltage	= {2700, 3600},
13410 	},
13411 
13412 	{
13413 		.vendor		= "SST",
13414 		.name		= "SST26VF032B(A)",
13415 		.bustype	= BUS_SPI,
13416 		.manufacture_id	= SST_ID,
13417 		.model_id	= SST_SST26VF032B,
13418 		.total_size	= 4096,
13419 		.page_size	= 256,
13420 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
13421 		.tested		= TEST_UNTESTED,
13422 		.probe		= probe_spi_rdid,
13423 		.probe_timing	= TIMING_ZERO,
13424 		.block_erasers	=
13425 		{
13426 			{
13427 				.eraseblocks = { {4 * 1024, 1024} },
13428 				.block_erase = spi_block_erase_20,
13429 			}, {
13430 				.eraseblocks = {
13431 					{8 * 1024, 4},
13432 					{32 * 1024, 1},
13433 					{64 * 1024, 62},
13434 					{32 * 1024, 1},
13435 					{8 * 1024, 4},
13436 				},
13437 				.block_erase = spi_block_erase_d8,
13438 			}, {
13439 				.eraseblocks = { {4 * 1024 * 1024, 1} },
13440 				.block_erase = spi_block_erase_c7,
13441 			},
13442 		},
13443 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
13444 		.unlock		= spi_disable_blockprotect_sst26_global_unprotect,
13445 		.write		= spi_chip_write_256, /* Multi I/O supported */
13446 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13447 		.voltage	= {2700, 3600},
13448 	},
13449 
13450 	{
13451 		.vendor		= "SST",
13452 		.name		= "SST26VF064B(A)",
13453 		.bustype	= BUS_SPI,
13454 		.manufacture_id	= SST_ID,
13455 		.model_id	= SST_SST26VF064B,
13456 		.total_size	= 8192,
13457 		.page_size	= 256,
13458 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
13459 		.tested		= TEST_OK_PREW,
13460 		.probe		= probe_spi_rdid,
13461 		.probe_timing	= TIMING_ZERO,
13462 		.block_erasers	=
13463 		{
13464 			{
13465 				.eraseblocks = { {4 * 1024, 2048} },
13466 				.block_erase = spi_block_erase_20,
13467 			}, {
13468 				.eraseblocks = {
13469 					{8 * 1024, 4},
13470 					{32 * 1024, 1},
13471 					{64 * 1024, 126},
13472 					{32 * 1024, 1},
13473 					{8 * 1024, 4},
13474 				},
13475 				.block_erase = spi_block_erase_d8,
13476 			}, {
13477 				.eraseblocks = { {8 * 1024 * 1024, 1} },
13478 				.block_erase = spi_block_erase_c7,
13479 			},
13480 		},
13481 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
13482 		.unlock		= spi_disable_blockprotect_sst26_global_unprotect,
13483 		.write		= spi_chip_write_256, /* Multi I/O supported */
13484 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13485 		.voltage	= {2700, 3600},
13486 	},
13487 
13488 	{
13489 		.vendor		= "SST",
13490 		.name		= "SST28SF040A",
13491 		.bustype	= BUS_PARALLEL,
13492 		.manufacture_id	= SST_ID,
13493 		.model_id	= SST_SST28SF040,
13494 		.total_size	= 512,
13495 		.page_size	= 256,
13496 		.feature_bits	= 0,
13497 		.tested		= TEST_UNTESTED,
13498 		.probe		= probe_82802ab,
13499 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
13500 		.block_erasers	=
13501 		{
13502 			{
13503 				.eraseblocks = { {128, 4096} },
13504 				.block_erase = erase_sector_28sf040,
13505 			}, {
13506 				.eraseblocks = { {512 * 1024, 1} },
13507 				.block_erase = erase_chip_28sf040,
13508 			}
13509 		},
13510 		.unlock		= unprotect_28sf040,
13511 		.write		= write_28sf040,
13512 		.read		= read_memmapped,
13513 		.voltage	= {4500, 5500},
13514 	},
13515 
13516 	{
13517 		.vendor		= "SST",
13518 		.name		= "SST29EE010",
13519 		.bustype	= BUS_PARALLEL,
13520 		.manufacture_id	= SST_ID,
13521 		.model_id	= SST_SST29EE010,
13522 		.total_size	= 128,
13523 		.page_size	= 128,
13524 		.feature_bits	= FEATURE_LONG_RESET,
13525 		.tested		= TEST_OK_PR,
13526 		.probe		= probe_jedec,
13527 		.probe_timing	= 10,
13528 		.block_erasers	=
13529 		{
13530 			{
13531 				.eraseblocks = { {128 * 1024, 1} },
13532 				.block_erase = erase_chip_block_jedec,
13533 			}
13534 		},
13535 		.write		= write_jedec,
13536 		.read		= read_memmapped,
13537 		.voltage	= {4500, 5500},
13538 	},
13539 
13540 	{
13541 		.vendor		= "SST",
13542 		.name		= "SST29EE020A",
13543 		.bustype	= BUS_PARALLEL,
13544 		.manufacture_id	= SST_ID,
13545 		.model_id	= SST_SST29EE020A,
13546 		.total_size	= 256,
13547 		.page_size	= 128,
13548 		.feature_bits	= FEATURE_LONG_RESET,
13549 		.tested		= TEST_OK_PRE,
13550 		.probe		= probe_jedec,
13551 		.probe_timing	= 10,
13552 		.block_erasers	=
13553 		{
13554 			{
13555 				.eraseblocks = { {256 * 1024, 1} },
13556 				.block_erase = erase_chip_block_jedec,
13557 			}
13558 		},
13559 		.write		= write_jedec,
13560 		.read		= read_memmapped,
13561 		.voltage	= {4500, 5500},
13562 	},
13563 
13564 	{
13565 		.vendor		= "SST",
13566 		.name		= "SST29LE010",
13567 		.bustype	= BUS_PARALLEL,
13568 		.manufacture_id	= SST_ID,
13569 		.model_id	= SST_SST29LE010,
13570 		.total_size	= 128,
13571 		.page_size	= 128,
13572 		.feature_bits	= FEATURE_LONG_RESET,
13573 		.tested		= TEST_UNTESTED,
13574 		.probe		= probe_jedec,
13575 		.probe_timing	= 10,
13576 		.block_erasers	=
13577 		{
13578 			{
13579 				.eraseblocks = { {128 * 1024, 1} },
13580 				.block_erase = erase_chip_block_jedec,
13581 			}
13582 		},
13583 		.write		= write_jedec,
13584 		.read		= read_memmapped,
13585 		.voltage	= {3000, 3600},
13586 	},
13587 
13588 	{
13589 		.vendor		= "SST",
13590 		.name		= "SST29LE020",
13591 		.bustype	= BUS_PARALLEL,
13592 		.manufacture_id	= SST_ID,
13593 		.model_id	= SST_SST29LE020,
13594 		.total_size	= 256,
13595 		.page_size	= 128,
13596 		.feature_bits	= FEATURE_LONG_RESET,
13597 		.tested		= TEST_OK_PRE,
13598 		.probe		= probe_jedec,
13599 		.probe_timing	= 10,
13600 		.block_erasers	=
13601 		{
13602 			{
13603 				.eraseblocks = { {256 * 1024, 1} },
13604 				.block_erase = erase_chip_block_jedec,
13605 			}
13606 		},
13607 		.write		= write_jedec,
13608 		.read		= read_memmapped,
13609 		.voltage	= {3000, 3600},
13610 	},
13611 
13612 	{
13613 		.vendor		= "SST",
13614 		.name		= "SST39SF010A",
13615 		.bustype	= BUS_PARALLEL,
13616 		.manufacture_id	= SST_ID,
13617 		.model_id	= SST_SST39SF010,
13618 		.total_size	= 128,
13619 		.page_size	= 4096,
13620 		.feature_bits	= FEATURE_EITHER_RESET,
13621 		.tested		= TEST_OK_PREW,
13622 		.probe		= probe_jedec,
13623 		.probe_timing	= 1,			/* 150 ns */
13624 		.block_erasers	=
13625 		{
13626 			{
13627 				.eraseblocks = { {4 * 1024, 32} },
13628 				.block_erase = erase_sector_jedec,
13629 			}, {
13630 				.eraseblocks = { {128 * 1024, 1} },
13631 				.block_erase = erase_chip_block_jedec,
13632 			}
13633 		},
13634 		.write		= write_jedec_1,
13635 		.read		= read_memmapped,
13636 		.voltage	= {4500, 5500},
13637 	},
13638 
13639 	{
13640 		.vendor		= "SST",
13641 		.name		= "SST39SF020A",
13642 		.bustype	= BUS_PARALLEL,
13643 		.manufacture_id	= SST_ID,
13644 		.model_id	= SST_SST39SF020,
13645 		.total_size	= 256,
13646 		.page_size	= 4096,
13647 		.feature_bits	= FEATURE_EITHER_RESET,
13648 		.tested		= TEST_OK_PREW,
13649 		.probe		= probe_jedec,
13650 		.probe_timing	= 1,			/* 150 ns */
13651 		.block_erasers	=
13652 		{
13653 			{
13654 				.eraseblocks = { {4 * 1024, 64} },
13655 				.block_erase = erase_sector_jedec,
13656 			}, {
13657 				.eraseblocks = { {256 * 1024, 1} },
13658 				.block_erase = erase_chip_block_jedec,
13659 			}
13660 		},
13661 		.write		= write_jedec_1,
13662 		.read		= read_memmapped,
13663 		.voltage	= {4500, 5500},
13664 	},
13665 
13666 	{
13667 		.vendor		= "SST",
13668 		.name		= "SST39SF040",
13669 		.bustype	= BUS_PARALLEL,
13670 		.manufacture_id	= SST_ID,
13671 		.model_id	= SST_SST39SF040,
13672 		.total_size	= 512,
13673 		.page_size	= 4096,
13674 		.feature_bits	= FEATURE_EITHER_RESET,
13675 		.tested		= TEST_OK_PREW,
13676 		.probe		= probe_jedec,
13677 		.probe_timing	= 1,			/* 150 ns */
13678 		.block_erasers	=
13679 		{
13680 			{
13681 				.eraseblocks = { {4 * 1024, 128} },
13682 				.block_erase = erase_sector_jedec,
13683 			}, {
13684 				.eraseblocks = { {512 * 1024, 1} },
13685 				.block_erase = erase_chip_block_jedec,
13686 			}
13687 		},
13688 		.write		= write_jedec_1,
13689 		.read		= read_memmapped,
13690 		.voltage	= {4500, 5500},
13691 	},
13692 
13693 	{
13694 		.vendor		= "SST",
13695 		.name		= "SST39SF512",
13696 		.bustype	= BUS_PARALLEL,
13697 		.manufacture_id	= SST_ID,
13698 		.model_id	= SST_SST39SF512,
13699 		.total_size	= 64,
13700 		.page_size	= 4096,
13701 		.feature_bits	= FEATURE_EITHER_RESET,
13702 		.tested		= TEST_OK_PREW,
13703 		.probe		= probe_jedec,
13704 		.probe_timing	= 1,			/* 150 ns */
13705 		.block_erasers	=
13706 		{
13707 			{
13708 				.eraseblocks = { {4 * 1024, 16} },
13709 				.block_erase = erase_sector_jedec,
13710 			}, {
13711 				.eraseblocks = { {64 * 1024, 1} },
13712 				.block_erase = erase_chip_block_jedec,
13713 			}
13714 		},
13715 		.write		= write_jedec_1,
13716 		.read		= read_memmapped,
13717 		.voltage	= {4500, 5500},
13718 	},
13719 
13720 	{
13721 		.vendor		= "SST",
13722 		.name		= "SST39VF010",
13723 		.bustype	= BUS_PARALLEL,
13724 		.manufacture_id	= SST_ID,
13725 		.model_id	= SST_SST39VF010,
13726 		.total_size	= 128,
13727 		.page_size	= 4096,
13728 		.feature_bits	= FEATURE_EITHER_RESET,
13729 		.tested		= TEST_OK_PREW,
13730 		.probe		= probe_jedec,
13731 		.probe_timing	= 1,			/* 150 ns */
13732 		.block_erasers	=
13733 		{
13734 			{
13735 				.eraseblocks = { {4 * 1024, 32} },
13736 				.block_erase = erase_sector_jedec,
13737 			}, {
13738 				.eraseblocks = { {128 * 1024, 1} },
13739 				.block_erase = erase_chip_block_jedec,
13740 			}
13741 		},
13742 		.write		= write_jedec_1,
13743 		.read		= read_memmapped,
13744 		.voltage	= {2700, 3600},
13745 	},
13746 
13747 	{
13748 		.vendor		= "SST",
13749 		.name		= "SST39VF020",
13750 		.bustype	= BUS_PARALLEL,
13751 		.manufacture_id	= SST_ID,
13752 		.model_id	= SST_SST39VF020,
13753 		.total_size	= 256,
13754 		.page_size	= 4096,
13755 		.feature_bits	= FEATURE_EITHER_RESET,
13756 		.tested		= TEST_OK_PREW,
13757 		.probe		= probe_jedec,
13758 		.probe_timing	= 1,			/* 150 ns */
13759 		.block_erasers	=
13760 		{
13761 			{
13762 				.eraseblocks = { {4 * 1024, 64} },
13763 				.block_erase = erase_sector_jedec,
13764 			}, {
13765 				.eraseblocks = { {256 * 1024, 1} },
13766 				.block_erase = erase_chip_block_jedec,
13767 			}
13768 		},
13769 		.write		= write_jedec_1,
13770 		.read		= read_memmapped,
13771 		.voltage	= {2700, 3600},
13772 	},
13773 
13774 	{
13775 		.vendor		= "SST",
13776 		.name		= "SST39VF040",
13777 		.bustype	= BUS_PARALLEL,
13778 		.manufacture_id	= SST_ID,
13779 		.model_id	= SST_SST39VF040,
13780 		.total_size	= 512,
13781 		.page_size	= 4096,
13782 		.feature_bits	= FEATURE_EITHER_RESET,
13783 		.tested		= TEST_OK_PREW,
13784 		.probe		= probe_jedec,
13785 		.probe_timing	= 1,			/* 150 ns */
13786 		.block_erasers	=
13787 		{
13788 			{
13789 				.eraseblocks = { {4 * 1024, 128} },
13790 				.block_erase = erase_sector_jedec,
13791 			}, {
13792 				.eraseblocks = { {512 * 1024, 1} },
13793 				.block_erase = erase_chip_block_jedec,
13794 			}
13795 		},
13796 		.write		= write_jedec_1,
13797 		.read		= read_memmapped,
13798 		.voltage	= {2700, 3600},
13799 	},
13800 
13801 	{
13802 		.vendor		= "SST",
13803 		.name		= "SST39VF080",
13804 		.bustype	= BUS_PARALLEL,
13805 		.manufacture_id	= SST_ID,
13806 		.model_id	= SST_SST39VF080,
13807 		.total_size	= 1024,
13808 		.page_size	= 4096,
13809 		.feature_bits	= FEATURE_EITHER_RESET,
13810 		.tested		= TEST_UNTESTED,
13811 		.probe		= probe_jedec,
13812 		.probe_timing	= 1,			/* 150 ns */
13813 		.block_erasers	=
13814 		{
13815 			{
13816 				.eraseblocks = { {4 * 1024, 256} },
13817 				.block_erase = erase_sector_jedec,
13818 			}, {
13819 				.eraseblocks = { {64 * 1024, 16} },
13820 				.block_erase = erase_block_jedec,
13821 			}, {
13822 				.eraseblocks = { {1024 * 1024, 1} },
13823 				.block_erase = erase_chip_block_jedec,
13824 			}
13825 		},
13826 		.write		= write_jedec_1,
13827 		.read		= read_memmapped,
13828 		.voltage	= {2700, 3600},
13829 	},
13830 
13831 	{
13832 		.vendor		= "SST",
13833 		.name		= "SST39VF512",
13834 		.bustype	= BUS_PARALLEL,
13835 		.manufacture_id	= SST_ID,
13836 		.model_id	= SST_SST39VF512,
13837 		.total_size	= 64,
13838 		.page_size	= 4096,
13839 		.feature_bits	= FEATURE_EITHER_RESET,
13840 		.tested		= TEST_OK_PREW,
13841 		.probe		= probe_jedec,
13842 		.probe_timing	= 1,			/* 150 ns */
13843 		.block_erasers	=
13844 		{
13845 			{
13846 				.eraseblocks = { {4 * 1024, 16} },
13847 				.block_erase = erase_sector_jedec,
13848 			}, {
13849 				.eraseblocks = { {64 * 1024, 1} },
13850 				.block_erase = erase_chip_block_jedec,
13851 			}
13852 		},
13853 		.write		= write_jedec_1,
13854 		.read		= read_memmapped,
13855 		.voltage	= {2700, 3600},
13856 	},
13857 
13858 	{
13859 		.vendor		= "SST",
13860 		.name		= "SST49LF002A/B",
13861 		.bustype	= BUS_FWH, /* A/A Mux */
13862 		.manufacture_id	= SST_ID,
13863 		.model_id	= SST_SST49LF002A,
13864 		.total_size	= 256,
13865 		.page_size	= 16 * 1024,
13866 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
13867 		.tested		= TEST_OK_PREW,
13868 		.probe		= probe_jedec,
13869 		.probe_timing	= 1,		/* 150 ns */
13870 		.block_erasers	=
13871 		{
13872 			{
13873 				.eraseblocks = { {4 * 1024, 64} },
13874 				.block_erase = erase_sector_jedec,
13875 			}, {
13876 				.eraseblocks = { {16 * 1024, 16} },
13877 				.block_erase = erase_block_jedec,
13878 			}, {
13879 				.eraseblocks = { {256 * 1024, 1} },
13880 				.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13881 			}
13882 		},
13883 		.printlock	= printlock_sst_fwhub,
13884 		.unlock		= unlock_sst_fwhub,
13885 		.write		= write_jedec_1,
13886 		.read		= read_memmapped,
13887 		.voltage	= {3000, 3600},
13888 	},
13889 
13890 	{
13891 		.vendor		= "SST",
13892 		.name		= "SST49LF003A/B",
13893 		.bustype	= BUS_FWH, /* A/A Mux */
13894 		.manufacture_id	= SST_ID,
13895 		.model_id	= SST_SST49LF003A,
13896 		.total_size	= 384,
13897 		.page_size	= 64 * 1024,
13898 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
13899 		.tested		= TEST_OK_PREW,
13900 		.probe		= probe_jedec,
13901 		.probe_timing	= 1,		/* 150 ns */
13902 		.block_erasers	=
13903 		{
13904 			{
13905 				.eraseblocks = { {4 * 1024, 96} },
13906 				.block_erase = erase_sector_jedec,
13907 			}, {
13908 				.eraseblocks = { {64 * 1024, 6} },
13909 				.block_erase = erase_block_jedec,
13910 			}, {
13911 				.eraseblocks = { {384 * 1024, 1} },
13912 				.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13913 			}
13914 		},
13915 		.printlock	= printlock_sst_fwhub,
13916 		.unlock		= unlock_sst_fwhub,
13917 		.write		= write_jedec_1,
13918 		.read		= read_memmapped,
13919 		.voltage	= {3000, 3600},
13920 	},
13921 
13922 	{
13923 		/* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
13924 		 * and is only honored for 64k block erase, but not 4k sector erase.
13925 		 */
13926 		.vendor		= "SST",
13927 		.name		= "SST49LF004A/B",
13928 		.bustype	= BUS_FWH, /* A/A Mux */
13929 		.manufacture_id	= SST_ID,
13930 		.model_id	= SST_SST49LF004A,
13931 		.total_size	= 512,
13932 		.page_size	= 64 * 1024,
13933 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
13934 		.tested		= TEST_OK_PREW,
13935 		.probe		= probe_jedec,
13936 		.probe_timing	= 1,		/* 150 ns */
13937 		.block_erasers	=
13938 		{
13939 			{
13940 				.eraseblocks = { {4 * 1024, 128} },
13941 				.block_erase = erase_sector_jedec,
13942 			}, {
13943 				.eraseblocks = { {64 * 1024, 8} },
13944 				.block_erase = erase_block_jedec,
13945 			}, {
13946 				.eraseblocks = { {512 * 1024, 1} },
13947 				.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
13948 			},
13949 		},
13950 		.printlock	= printlock_sst_fwhub,
13951 		.unlock		= unlock_sst_fwhub,
13952 		.write		= write_jedec_1,
13953 		.read		= read_memmapped,
13954 		.voltage	= {3000, 3600},
13955 	},
13956 
13957 	{
13958 		.vendor		= "SST",
13959 		.name		= "SST49LF004C",
13960 		.bustype	= BUS_FWH,
13961 		.manufacture_id	= SST_ID,
13962 		.model_id	= SST_SST49LF004C,
13963 		.total_size	= 512,
13964 		.page_size	= 4 * 1024,
13965 		.feature_bits	= FEATURE_REGISTERMAP,
13966 		.tested		= TEST_UNTESTED,
13967 		.probe		= probe_82802ab,
13968 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
13969 		.block_erasers	=
13970 		{
13971 			{
13972 				.eraseblocks = { {4 * 1024, 128} },
13973 				.block_erase = erase_sector_49lfxxxc,
13974 			}, {
13975 				.eraseblocks = {
13976 					{64 * 1024, 7},
13977 					{32 * 1024, 1},
13978 					{8 * 1024, 2},
13979 					{16 * 1024, 1},
13980 				},
13981 				.block_erase = erase_block_82802ab,
13982 			}
13983 		},
13984 		.printlock	= printlock_regspace2_block_eraser_1,
13985 		.unlock		= unlock_regspace2_block_eraser_1,
13986 		.write		= write_82802ab,
13987 		.read		= read_memmapped,
13988 		.voltage	= {3000, 3600},
13989 	},
13990 
13991 	{
13992 		.vendor		= "SST",
13993 		.name		= "SST49LF008A",
13994 		.bustype	= BUS_FWH, /* A/A Mux */
13995 		.manufacture_id	= SST_ID,
13996 		.model_id	= SST_SST49LF008A,
13997 		.total_size	= 1024,
13998 		.page_size	= 64 * 1024,
13999 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
14000 		.tested		= TEST_OK_PREW,
14001 		.probe		= probe_jedec,
14002 		.probe_timing	= 1,		/* 150 ns */
14003 		.block_erasers	=
14004 		{
14005 			{
14006 				.eraseblocks = { {4 * 1024, 256} },
14007 				.block_erase = erase_sector_jedec,
14008 			}, {
14009 				.eraseblocks = { {64 * 1024, 16} },
14010 				.block_erase = erase_block_jedec,
14011 			}, {
14012 				.eraseblocks = { {1024 * 1024, 1} },
14013 				.block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14014 			}
14015 		},
14016 		.printlock	= printlock_sst_fwhub,
14017 		.unlock		= unlock_sst_fwhub,
14018 		.write		= write_jedec_1,
14019 		.read		= read_memmapped,
14020 		.voltage	= {3000, 3600},
14021 	},
14022 
14023 	{
14024 		.vendor		= "SST",
14025 		.name		= "SST49LF008C",
14026 		.bustype	= BUS_FWH,
14027 		.manufacture_id	= SST_ID,
14028 		.model_id	= SST_SST49LF008C,
14029 		.total_size	= 1024,
14030 		.page_size	= 4 * 1024,
14031 		.feature_bits	= FEATURE_REGISTERMAP,
14032 		.tested		= TEST_UNTESTED,
14033 		.probe		= probe_82802ab,
14034 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
14035 		.block_erasers	=
14036 		{
14037 			{
14038 				.eraseblocks = { {4 * 1024, 256} },
14039 				.block_erase = erase_sector_49lfxxxc,
14040 			}, {
14041 				.eraseblocks = {
14042 					{64 * 1024, 15},
14043 					{32 * 1024, 1},
14044 					{8 * 1024, 2},
14045 					{16 * 1024, 1},
14046 				},
14047 				.block_erase = erase_block_82802ab,
14048 			}
14049 		},
14050 		.printlock	= printlock_regspace2_block_eraser_1,
14051 		.unlock		= unlock_regspace2_block_eraser_1,
14052 		.write		= write_82802ab,
14053 		.read		= read_memmapped,
14054 		.voltage	= {3000, 3600},
14055 	},
14056 
14057 	{
14058 		.vendor		= "SST",
14059 		.name		= "SST49LF016C",
14060 		.bustype	= BUS_FWH,
14061 		.manufacture_id	= SST_ID,
14062 		.model_id	= SST_SST49LF016C,
14063 		.total_size	= 2048,
14064 		.page_size	= 4 * 1024,
14065 		.feature_bits	= FEATURE_REGISTERMAP,
14066 		.tested		= TEST_OK_PREW,
14067 		.probe		= probe_82802ab,
14068 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
14069 		.block_erasers	=
14070 		{
14071 			{
14072 				.eraseblocks = { {4 * 1024, 512} },
14073 				.block_erase = erase_sector_49lfxxxc,
14074 			}, {
14075 				.eraseblocks = {
14076 					{64 * 1024, 31},
14077 					{32 * 1024, 1},
14078 					{8 * 1024, 2},
14079 					{16 * 1024, 1},
14080 				},
14081 				.block_erase = erase_block_82802ab,
14082 			}
14083 		},
14084 		.printlock	= printlock_regspace2_block_eraser_1,
14085 		.unlock		= unlock_regspace2_block_eraser_1,
14086 		.write		= write_82802ab,
14087 		.read		= read_memmapped,
14088 		.voltage	= {3000, 3600},
14089 	},
14090 
14091 	{
14092 		.vendor		= "SST",
14093 		.name		= "SST49LF020",
14094 		.bustype	= BUS_LPC,
14095 		.manufacture_id	= SST_ID,
14096 		.model_id	= SST_SST49LF020,
14097 		.total_size	= 256,
14098 		.page_size	= 16 * 1024,
14099 		.feature_bits	= FEATURE_EITHER_RESET,
14100 		.tested		= TEST_OK_PREW,
14101 		.probe		= probe_jedec,
14102 		.probe_timing	= 1,			/* 150 ns */
14103 		.block_erasers	=
14104 		{
14105 			{
14106 				.eraseblocks = { {4 * 1024, 64} },
14107 				.block_erase = erase_sector_jedec,
14108 			}, {
14109 				.eraseblocks = { {16 * 1024, 16} },
14110 				.block_erase = erase_block_jedec,
14111 			}, {
14112 				.eraseblocks = { {256 * 1024, 1} },
14113 				.block_erase = NULL,
14114 			}
14115 		},
14116 		.write		= write_jedec_1,
14117 		.read		= read_memmapped,
14118 		.voltage	= {3000, 3600},
14119 	},
14120 
14121 	{
14122 		.vendor		= "SST",
14123 		.name		= "SST49LF020A",
14124 		.bustype	= BUS_LPC,
14125 		.manufacture_id	= SST_ID,
14126 		.model_id	= SST_SST49LF020A,
14127 		.total_size	= 256,
14128 		.page_size	= 4 * 1024,
14129 		.feature_bits	= FEATURE_EITHER_RESET,
14130 		.tested		= TEST_OK_PRE,
14131 		.probe		= probe_jedec,
14132 		.probe_timing	= 1,			/* 150 ns */
14133 		.block_erasers	=
14134 		{
14135 			{
14136 				.eraseblocks = { {4 * 1024, 64} },
14137 				.block_erase = erase_sector_jedec,
14138 			}, {
14139 				.eraseblocks = { {16 * 1024, 16} },
14140 				.block_erase = erase_block_jedec,
14141 			}, {
14142 				.eraseblocks = { {256 * 1024, 1} },
14143 				.block_erase = NULL,
14144 			}
14145 		},
14146 		.write		= write_jedec_1,
14147 		.read		= read_memmapped,
14148 		.voltage	= {3000, 3600},
14149 	},
14150 
14151 	{
14152 		.vendor		= "SST",
14153 		.name		= "SST49LF040",
14154 		.bustype	= BUS_LPC,
14155 		.manufacture_id	= SST_ID,
14156 		.model_id	= SST_SST49LF040,
14157 		.total_size	= 512,
14158 		.page_size	= 4096,
14159 		.feature_bits	= FEATURE_EITHER_RESET,
14160 		.tested		= TEST_OK_PREW,
14161 		.probe		= probe_jedec,
14162 		.probe_timing	= 1,			/* 150 ns */
14163 		.block_erasers	=
14164 		{
14165 			{
14166 				.eraseblocks = { {4 * 1024, 128} },
14167 				.block_erase = erase_sector_jedec,
14168 			}, {
14169 				.eraseblocks = { {64 * 1024, 8} },
14170 				.block_erase = erase_block_jedec,
14171 			}, {
14172 				.eraseblocks = { {512 * 1024, 1} },
14173 				.block_erase = NULL,
14174 			}
14175 		},
14176 		.write		= write_jedec_1,
14177 		.read		= read_memmapped,
14178 		.voltage	= {3000, 3600},
14179 	},
14180 
14181 	{
14182 		.vendor		= "SST",
14183 		.name		= "SST49LF040B",
14184 		.bustype	= BUS_LPC, /* A/A Mux */
14185 		.manufacture_id	= SST_ID,
14186 		.model_id	= SST_SST49LF040B,
14187 		.total_size	= 512,
14188 		.page_size	= 64 * 1024,
14189 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
14190 		.tested		= TEST_OK_PREW,
14191 		.probe		= probe_jedec,
14192 		.probe_timing	= 1,		/* 150ns */
14193 		.block_erasers	=
14194 		{
14195 			{
14196 				.eraseblocks = { {4 * 1024, 128} },
14197 				.block_erase = erase_sector_jedec,
14198 			}, {
14199 				.eraseblocks = { {64 * 1024, 8} },
14200 				.block_erase = erase_block_jedec,
14201 			}, {
14202 				.eraseblocks = { {512 * 1024, 1} },
14203 				.block_erase = NULL,
14204 			}
14205 		},
14206 		.unlock		= unlock_regspace2_uniform_64k,
14207 		.write		= write_jedec_1,
14208 		.read		= read_memmapped,
14209 		.voltage	= {3000, 3600},
14210 	},
14211 
14212 	{
14213 		.vendor		= "SST",
14214 		.name		= "SST49LF080A",
14215 		.bustype	= BUS_LPC, /* A/A Mux */
14216 		.manufacture_id	= SST_ID,
14217 		.model_id	= SST_SST49LF080A,
14218 		.total_size	= 1024,
14219 		.page_size	= 4096,
14220 		.feature_bits	= FEATURE_EITHER_RESET,
14221 		.tested		= TEST_OK_PREW,
14222 		.probe		= probe_jedec,
14223 		.probe_timing	= TIMING_FIXME,
14224 		.block_erasers	=
14225 		{
14226 			{
14227 				.eraseblocks = { {4 * 1024, 256} },
14228 				.block_erase = erase_sector_jedec,
14229 			}, {
14230 				.eraseblocks = { {64 * 1024, 16} },
14231 				.block_erase = erase_block_jedec,
14232 			}, {
14233 				.eraseblocks = { {1024 * 1024, 1} },
14234 				.block_erase = NULL,
14235 			}
14236 		},
14237 		.write		= write_jedec_1,
14238 		.read		= read_memmapped,
14239 		.voltage	= {3000, 3600},
14240 	},
14241 
14242 	{
14243 		.vendor		= "SST",
14244 		.name		= "SST49LF160C",
14245 		.bustype	= BUS_LPC,
14246 		.manufacture_id	= SST_ID,
14247 		.model_id	= SST_SST49LF160C,
14248 		.total_size	= 2048,
14249 		.page_size	= 4 * 1024,
14250 		.feature_bits	= FEATURE_REGISTERMAP,
14251 		.tested		= TEST_OK_PR,
14252 		.probe		= probe_82802ab,
14253 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
14254 		.block_erasers	=
14255 		{
14256 			{
14257 				.eraseblocks = { {4 * 1024, 512} },
14258 				.block_erase = erase_sector_49lfxxxc,
14259 			}, {
14260 				.eraseblocks = {
14261 					{64 * 1024, 31},
14262 					{32 * 1024, 1},
14263 					{8 * 1024, 2},
14264 					{16 * 1024, 1},
14265 				},
14266 				.block_erase = erase_block_82802ab,
14267 			}
14268 		},
14269 		.printlock	= printlock_regspace2_block_eraser_1,
14270 		.unlock		= unlock_regspace2_block_eraser_1,
14271 		.write		= write_82802ab,
14272 		.read		= read_memmapped,
14273 		.voltage	= {3000, 3600},
14274 	},
14275 
14276 	{
14277 		.vendor		= "ST",
14278 		.name		= "M29F002B",
14279 		.bustype	= BUS_PARALLEL,
14280 		.manufacture_id	= ST_ID,
14281 		.model_id	= ST_M29F002B,
14282 		.total_size	= 256,
14283 		.page_size	= 64 * 1024,
14284 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
14285 		.tested		= TEST_UNTESTED,
14286 		.probe		= probe_jedec,
14287 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14288 		.block_erasers	=
14289 		{
14290 			{
14291 				.eraseblocks = {
14292 					{16 * 1024, 1},
14293 					{8 * 1024, 2},
14294 					{32 * 1024, 1},
14295 					{64 * 1024, 3},
14296 				},
14297 				.block_erase = erase_sector_jedec,
14298 			}, {
14299 				.eraseblocks = { {256 * 1024, 1} },
14300 				.block_erase = erase_chip_block_jedec,
14301 			}
14302 		},
14303 		.write		= write_jedec_1,
14304 		.read		= read_memmapped,
14305 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
14306 	},
14307 
14308 	{
14309 		.vendor		= "ST",
14310 		.name		= "M29F002T/NT",
14311 		.bustype	= BUS_PARALLEL,
14312 		.manufacture_id	= ST_ID,
14313 		.model_id	= ST_M29F002T,
14314 		.total_size	= 256,
14315 		.page_size	= 64 * 1024,
14316 		.feature_bits	= FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
14317 		.tested		= TEST_OK_PREW,
14318 		.probe		= probe_jedec,
14319 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14320 		.block_erasers	=
14321 		{
14322 			{
14323 				.eraseblocks = {
14324 					{64 * 1024, 3},
14325 					{32 * 1024, 1},
14326 					{8 * 1024, 2},
14327 					{16 * 1024, 1},
14328 				},
14329 				.block_erase = erase_sector_jedec,
14330 			}, {
14331 				.eraseblocks = { {256 * 1024, 1} },
14332 				.block_erase = erase_chip_block_jedec,
14333 			}
14334 		},
14335 		.write		= write_jedec_1,
14336 		.read		= read_memmapped,
14337 		.voltage	= {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
14338 	},
14339 
14340 	{
14341 		.vendor		= "ST",
14342 		.name		= "M29F040B",
14343 		.bustype	= BUS_PARALLEL,
14344 		.manufacture_id	= ST_ID,
14345 		.model_id	= ST_M29F040B,
14346 		.total_size	= 512,
14347 		.page_size	= 64 * 1024,
14348 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14349 		.tested		= TEST_UNTESTED,
14350 		.probe		= probe_jedec,
14351 		.probe_timing	= TIMING_ZERO, /* datasheet specifies no timing */
14352 		.block_erasers	=
14353 		{
14354 			{
14355 				.eraseblocks = { {64 * 1024, 8} },
14356 				.block_erase = erase_sector_jedec,
14357 			}, {
14358 				.eraseblocks = { {512 * 1024, 1} },
14359 				.block_erase = erase_chip_block_jedec,
14360 			}
14361 		},
14362 		.write		= write_jedec_1,
14363 		.read		= read_memmapped,
14364 		.voltage	= {4500, 5500},
14365 	},
14366 
14367 	{
14368 		/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14369 		.vendor		= "ST",
14370 		.name		= "M29F400BB",
14371 		.bustype	= BUS_PARALLEL,
14372 		.manufacture_id	= ST_ID,
14373 		.model_id	= ST_M29F400BB,
14374 		.total_size	= 512,
14375 		.page_size	= 64 * 1024,
14376 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14377 		.tested		= TEST_UNTESTED,
14378 		.probe		= probe_jedec,
14379 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
14380 		.block_erasers	=
14381 		{
14382 			{
14383 				.eraseblocks = {
14384 					{16 * 1024, 1},
14385 					{8 * 1024, 2},
14386 					{32 * 1024, 1},
14387 					{64 * 1024, 7},
14388 				},
14389 				.block_erase = erase_sector_jedec,
14390 			}, {
14391 				.eraseblocks = { {512 * 1024, 1} },
14392 				.block_erase = erase_chip_block_jedec,
14393 			}
14394 		},
14395 		.write		= write_jedec_1,
14396 		.read		= read_memmapped,
14397 		.voltage	= {4500, 5500},
14398 	},
14399 
14400 	{
14401 		/* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14402 		.vendor		= "ST",
14403 		.name		= "M29F400BT",
14404 		.bustype	= BUS_PARALLEL,
14405 		.manufacture_id	= ST_ID,
14406 		.model_id	= ST_M29F400BT,
14407 		.total_size	= 512,
14408 		.page_size	= 64 * 1024,
14409 		.feature_bits	= FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14410 		.tested		= TEST_UNTESTED,
14411 		.probe		= probe_jedec,
14412 		.probe_timing	= 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
14413 		.block_erasers	=
14414 		{
14415 			{
14416 				.eraseblocks = {
14417 					{64 * 1024, 7},
14418 					{32 * 1024, 1},
14419 					{8 * 1024, 2},
14420 					{16 * 1024, 1},
14421 				},
14422 				.block_erase = erase_sector_jedec,
14423 			}, {
14424 				.eraseblocks = { {512 * 1024, 1} },
14425 				.block_erase = erase_chip_block_jedec,
14426 			}
14427 		},
14428 		.write		= write_jedec_1,
14429 		.read		= read_memmapped,
14430 		.voltage	= {4500, 5500},
14431 	},
14432 
14433 	{
14434 		.vendor		= "ST",
14435 		.name		= "M29W010B",
14436 		.bustype	= BUS_PARALLEL,
14437 		.manufacture_id	= ST_ID,
14438 		.model_id	= ST_M29W010B,
14439 		.total_size	= 128,
14440 		.page_size	= 16 * 1024,
14441 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14442 		.tested		= TEST_UNTESTED,
14443 		.probe		= probe_jedec,
14444 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14445 		.block_erasers	=
14446 		{
14447 			{
14448 				.eraseblocks = { {16 * 1024, 8} },
14449 				.block_erase = erase_sector_jedec,
14450 			}, {
14451 				.eraseblocks = { {128 * 1024, 1} },
14452 				.block_erase = erase_chip_block_jedec,
14453 			}
14454 		},
14455 		.write		= write_jedec_1,
14456 		.read		= read_memmapped,
14457 		.voltage	= {2700, 3600},
14458 	},
14459 
14460 	{
14461 		.vendor		= "ST",
14462 		.name		= "M29W040B",
14463 		.bustype	= BUS_PARALLEL,
14464 		.manufacture_id	= ST_ID,
14465 		.model_id	= ST_M29W040B,
14466 		.total_size	= 512,
14467 		.page_size	= 64 * 1024,
14468 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14469 		.tested		= TEST_UNTESTED,
14470 		.probe		= probe_jedec,
14471 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14472 		.block_erasers	=
14473 		{
14474 			{
14475 				.eraseblocks = { {64 * 1024, 8} },
14476 				.block_erase = erase_sector_jedec,
14477 			}, {
14478 				.eraseblocks = { {512 * 1024, 1} },
14479 				.block_erase = erase_chip_block_jedec,
14480 			}
14481 		},
14482 		.write		= write_jedec_1,
14483 		.read		= read_memmapped,
14484 		.voltage	= {2700, 3600},
14485 	},
14486 
14487 	{
14488 		.vendor		= "ST",
14489 		.name		= "M29W512B",
14490 		.bustype	= BUS_PARALLEL,
14491 		.manufacture_id	= ST_ID,
14492 		.model_id	= ST_M29W512B,
14493 		.total_size	= 64,
14494 		.page_size	= 64 * 1024,
14495 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14496 		.tested		= TEST_OK_PREW,
14497 		.probe		= probe_jedec,
14498 		.probe_timing	= TIMING_ZERO,
14499 		.block_erasers	=
14500 		{
14501 			{
14502 				.eraseblocks = { {64 * 1024, 1} },
14503 				.block_erase = erase_chip_block_jedec,
14504 			}
14505 		},
14506 		.write		= write_jedec_1,
14507 		.read		= read_memmapped,
14508 		.voltage	= {2700, 3600},
14509 	},
14510 
14511 	{
14512 		.vendor		= "ST",
14513 		.name		= "M50FLW040A",
14514 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
14515 		.manufacture_id	= ST_ID,
14516 		.model_id	= ST_M50FLW040A,
14517 		.total_size	= 512,
14518 		.page_size	= 0,
14519 		.feature_bits	= FEATURE_REGISTERMAP,
14520 		.tested		= TEST_UNTESTED,
14521 		.probe		= probe_82802ab,
14522 		.probe_timing	= TIMING_FIXME,
14523 		.block_erasers	=
14524 		{
14525 			{
14526 				.eraseblocks = {
14527 					{4 * 1024, 16}, /* sector */
14528 					{64 * 1024, 5}, /* block */
14529 					{4 * 1024, 16}, /* sector */
14530 					{4 * 1024, 16}, /* sector */
14531 				},
14532 				.block_erase = erase_sector_stm50,
14533 			}, {
14534 				.eraseblocks = { {64 * 1024, 8} },
14535 				.block_erase = erase_block_82802ab,
14536 			}
14537 		},
14538 		.unlock		= unlock_regspace2_uniform_64k,
14539 		.write		= write_82802ab,
14540 		.read		= read_memmapped,
14541 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14542 	},
14543 
14544 	{
14545 		.vendor		= "ST",
14546 		.name		= "M50FLW040B",
14547 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
14548 		.manufacture_id	= ST_ID,
14549 		.model_id	= ST_M50FLW040B,
14550 		.total_size	= 512,
14551 		.page_size	= 0,
14552 		.feature_bits	= FEATURE_REGISTERMAP,
14553 		.tested		= TEST_UNTESTED,
14554 		.probe		= probe_82802ab,
14555 		.probe_timing	= TIMING_FIXME,
14556 		.block_erasers	=
14557 		{
14558 			{
14559 				.eraseblocks = {
14560 					{4 * 1024, 16}, /* sector */
14561 					{4 * 1024, 16}, /* sector */
14562 					{64 * 1024, 5}, /* block */
14563 					{4 * 1024, 16}, /* sector */
14564 				},
14565 				.block_erase = erase_sector_stm50,
14566 			}, {
14567 				.eraseblocks = { {64 * 1024, 8} },
14568 				.block_erase = erase_block_82802ab,
14569 			}
14570 		},
14571 		.unlock		= unlock_regspace2_uniform_64k,
14572 		.write		= write_82802ab,
14573 		.read		= read_memmapped,
14574 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14575 	},
14576 
14577 	{
14578 		.vendor		= "ST",
14579 		.name		= "M50FLW080A",
14580 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
14581 		.manufacture_id	= ST_ID,
14582 		.model_id	= ST_M50FLW080A,
14583 		.total_size	= 1024,
14584 		.page_size	= 0,
14585 		.feature_bits	= FEATURE_REGISTERMAP,
14586 		.tested		= TEST_OK_PR,
14587 		.probe		= probe_82802ab,
14588 		.probe_timing	= TIMING_FIXME,
14589 		.block_erasers	=
14590 		{
14591 			{
14592 				.eraseblocks = {
14593 					{4 * 1024, 16}, /* sector */
14594 					{64 * 1024, 13}, /* block */
14595 					{4 * 1024, 16}, /* sector */
14596 					{4 * 1024, 16}, /* sector */
14597 				},
14598 				.block_erase = erase_sector_stm50,
14599 			}, {
14600 				.eraseblocks = { {64 * 1024, 16} },
14601 				.block_erase = erase_block_82802ab,
14602 			}
14603 		},
14604 		.printlock	= printlock_regspace2_block_eraser_0,
14605 		.unlock		= unlock_regspace2_block_eraser_0,
14606 		.write		= write_82802ab,
14607 		.read		= read_memmapped,
14608 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14609 	},
14610 
14611 	{
14612 		.vendor		= "ST",
14613 		.name		= "M50FLW080B",
14614 		.bustype	= BUS_FWH | BUS_LPC, /* A/A Mux */
14615 		.manufacture_id	= ST_ID,
14616 		.model_id	= ST_M50FLW080B,
14617 		.total_size	= 1024,
14618 		.page_size	= 0,
14619 		.feature_bits	= FEATURE_REGISTERMAP,
14620 		.tested		= TEST_UNTESTED,
14621 		.probe		= probe_82802ab,
14622 		.probe_timing	= TIMING_FIXME,
14623 		.block_erasers	=
14624 		{
14625 			{
14626 				.eraseblocks = {
14627 					{4 * 1024, 16}, /* sector */
14628 					{4 * 1024, 16}, /* sector */
14629 					{64 * 1024, 13}, /* block */
14630 					{4 * 1024, 16}, /* sector */
14631 				},
14632 				.block_erase = erase_sector_stm50,
14633 			}, {
14634 				.eraseblocks = { {64 * 1024, 16} },
14635 				.block_erase = erase_block_82802ab,
14636 			}
14637 		},
14638 		.printlock	= printlock_regspace2_block_eraser_0,
14639 		.unlock		= unlock_regspace2_block_eraser_0,
14640 		.write		= write_82802ab,
14641 		.read		= read_memmapped,
14642 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14643 	},
14644 
14645 	{
14646 		.vendor		= "ST",
14647 		.name		= "M50FW002",
14648 		.bustype	= BUS_FWH, /* A/A Mux */
14649 		.manufacture_id	= ST_ID,
14650 		.model_id	= ST_M50FW002,
14651 		.total_size	= 256,
14652 		.page_size	= 0,
14653 		.feature_bits	= FEATURE_REGISTERMAP,
14654 		.tested		= TEST_OK_PR,
14655 		.probe		= probe_82802ab,
14656 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
14657 		.block_erasers	=
14658 		{
14659 			{
14660 				.eraseblocks = {
14661 					{64 * 1024, 3},
14662 					{32 * 1024, 1},
14663 					{8 * 1024, 2},
14664 					{16 * 1024, 1},
14665 				},
14666 				.block_erase = erase_block_82802ab,
14667 			}, {
14668 				.eraseblocks = { {256 * 1024, 1} },
14669 				.block_erase = NULL, /* Only in A/A mux mode */
14670 			}
14671 		},
14672 		.printlock	= printlock_regspace2_block_eraser_0,
14673 		.unlock		= unlock_regspace2_block_eraser_0,
14674 		.write		= write_82802ab,
14675 		.read		= read_memmapped,
14676 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14677 	},
14678 
14679 	{
14680 		.vendor		= "ST",
14681 		.name		= "M50FW016",
14682 		.bustype	= BUS_FWH, /* A/A Mux */
14683 		.manufacture_id	= ST_ID,
14684 		.model_id	= ST_M50FW016,
14685 		.total_size	= 2048,
14686 		.page_size	= 0,
14687 		.feature_bits	= FEATURE_REGISTERMAP,
14688 		.tested		= TEST_UNTESTED,
14689 		.probe		= probe_82802ab,
14690 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
14691 		.block_erasers	=
14692 		{
14693 			{
14694 				.eraseblocks = { {64 * 1024, 32} },
14695 				.block_erase = erase_block_82802ab,
14696 			}
14697 		},
14698 		.unlock		= unlock_regspace2_uniform_64k,
14699 		.write		= write_82802ab,
14700 		.read		= read_memmapped,
14701 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14702 	},
14703 
14704 	{
14705 		.vendor		= "ST",
14706 		.name		= "M50FW040",
14707 		.bustype	= BUS_FWH, /* A/A Mux */
14708 		.manufacture_id	= ST_ID,
14709 		.model_id	= ST_M50FW040,
14710 		.total_size	= 512,
14711 		.page_size	= 0,
14712 		.feature_bits	= FEATURE_REGISTERMAP,
14713 		.tested		= TEST_OK_PR,
14714 		.probe		= probe_82802ab,
14715 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
14716 		.block_erasers	=
14717 		{
14718 			{
14719 				.eraseblocks = { {64 * 1024, 8} },
14720 				.block_erase = erase_block_82802ab,
14721 			}
14722 		},
14723 		.unlock		= unlock_regspace2_uniform_64k,
14724 		.write		= write_82802ab,
14725 		.read		= read_memmapped,
14726 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14727 	},
14728 
14729 	{
14730 		.vendor		= "ST",
14731 		.name		= "M50FW080",
14732 		.bustype	= BUS_FWH, /* A/A Mux */
14733 		.manufacture_id	= ST_ID,
14734 		.model_id	= ST_M50FW080,
14735 		.total_size	= 1024,
14736 		.page_size	= 0,
14737 		.feature_bits	= FEATURE_REGISTERMAP,
14738 		.tested		= TEST_OK_PR,
14739 		.probe		= probe_82802ab,
14740 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
14741 		.block_erasers	=
14742 		{
14743 			{
14744 				.eraseblocks = { {64 * 1024, 16} },
14745 				.block_erase = erase_block_82802ab,
14746 			}
14747 		},
14748 		.unlock		= unlock_regspace2_uniform_64k,
14749 		.write		= write_82802ab,
14750 		.read		= read_memmapped,
14751 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14752 	},
14753 
14754 	{
14755 		.vendor		= "ST",
14756 		.name		= "M50LPW080",
14757 		.bustype	= BUS_LPC, /* A/A Mux */
14758 		.manufacture_id	= ST_ID,
14759 		.model_id	= ST_M50LPW080,
14760 		.total_size	= 1024,
14761 		.page_size	= 0,
14762 		.feature_bits	= FEATURE_REGISTERMAP,
14763 		.tested		= TEST_UNTESTED,
14764 		.probe		= probe_82802ab,
14765 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14766 		.block_erasers	=
14767 		{
14768 			{
14769 				.eraseblocks = { {64 * 1024, 16} },
14770 				.block_erase = erase_block_82802ab,
14771 			}
14772 		},
14773 		.unlock		= unlock_regspace2_uniform_64k,
14774 		.write		= write_82802ab,
14775 		.read		= read_memmapped,
14776 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14777 	},
14778 
14779 	{
14780 		.vendor		= "ST",
14781 		.name		= "M50LPW116",
14782 		.bustype	= BUS_LPC, /* A/A Mux */
14783 		.manufacture_id	= ST_ID,
14784 		.model_id	= ST_M50LPW116,
14785 		.total_size	= 2048,
14786 		.page_size	= 0,
14787 		.feature_bits	= FEATURE_REGISTERMAP,
14788 		.tested		= TEST_UNTESTED,
14789 		.probe		= probe_82802ab,
14790 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
14791 		.block_erasers	=
14792 		{
14793 			{
14794 				.eraseblocks = {
14795 					{4 * 1024, 16},
14796 					{64 * 1024, 30},
14797 					{32 * 1024, 1},
14798 					{8 * 1024, 2},
14799 					{16 * 1024, 1},
14800 				},
14801 				.block_erase = erase_block_82802ab,
14802 			}
14803 		},
14804 		.printlock	= printlock_regspace2_block_eraser_0,
14805 		.unlock		= unlock_regspace2_block_eraser_0,
14806 		.write		= write_82802ab,
14807 		.read		= read_memmapped,
14808 		.voltage	= {3000, 3600}, /* Also has 12V fast program & erase */
14809 	},
14810 
14811 	{
14812 		.vendor		= "ST",
14813 		.name		= "M95M02",
14814 		.bustype	= BUS_SPI,
14815 		.manufacture_id	= ST_ID,
14816 		.model_id	= ST_M95M02,
14817 		.total_size	= 256,
14818 		.page_size	= 256,
14819 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
14820 		.tested		= TEST_OK_PREW,
14821 		.probe		= probe_spi_st95,
14822 		.probe_timing	= TIMING_ZERO,
14823 		.block_erasers	=
14824 		{
14825 			{
14826 				.eraseblocks = { {256 * 1024, 1} },
14827 				.block_erase = spi_block_erase_emulation,
14828 			}
14829 		},
14830 
14831 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
14832 		.unlock		= spi_disable_blockprotect_bp1_srwd,
14833 		.write		= spi_chip_write_256,
14834 		.read		= spi_chip_read,
14835 		.voltage	= {2500, 5500},
14836 	},
14837 
14838 	{
14839 		.vendor		= "Sanyo",
14840 		.name		= "LE25FU106B",
14841 		.bustype	= BUS_SPI,
14842 		.manufacture_id	= SANYO_ID,
14843 		.model_id	= SANYO_LE25FU106B,
14844 		.total_size	= 128,
14845 		.page_size	= 256,
14846 		.feature_bits	= FEATURE_WRSR_WREN,
14847 		.tested		= TEST_UNTESTED,
14848 		.probe		= probe_spi_res2,
14849 		.probe_timing	= TIMING_ZERO,
14850 		.block_erasers	=
14851 		{
14852 			/* FIXME: Is this correct?
14853 			{
14854 				.eraseblocks = { {2 * 1024, 64} },
14855 				.block_erase = spi_block_erase_d7,
14856 			},*/
14857 			{
14858 				.eraseblocks = { {32 * 1024, 4} },
14859 				.block_erase = spi_block_erase_d8,
14860 			}, {
14861 				.eraseblocks = { {128 * 1024, 1} },
14862 				.block_erase = spi_block_erase_c7,
14863 			}
14864 		},
14865 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
14866 		.unlock		= spi_disable_blockprotect_bp1_srwd,
14867 		.write		= spi_chip_write_256,
14868 		.read		= spi_chip_read,
14869 		.voltage	= {2300, 3600},
14870 	},
14871 
14872 	{
14873 		.vendor		= "Sanyo",
14874 		.name		= "LE25FU206",
14875 		.bustype	= BUS_SPI,
14876 		.manufacture_id	= SANYO_ID,
14877 		.model_id	= SANYO_LE25FU206,
14878 		.total_size	= 256,
14879 		.page_size	= 256,
14880 		.feature_bits	= FEATURE_WRSR_WREN,
14881 		.tested		= TEST_UNTESTED,
14882 		.probe		= probe_spi_res2,
14883 		.probe_timing	= TIMING_ZERO,
14884 		.block_erasers	=
14885 		{
14886 			{
14887 				.eraseblocks = { {4 * 1024, 64} },
14888 				.block_erase = spi_block_erase_d7,
14889 			}, {
14890 				.eraseblocks = { {64 * 1024, 4} },
14891 				.block_erase = spi_block_erase_d8,
14892 			}, {
14893 				.eraseblocks = { {256 * 1024, 1} },
14894 				.block_erase = spi_block_erase_c7,
14895 			}
14896 		},
14897 		.printlock	= spi_prettyprint_status_register_bp1_srwd,
14898 		.unlock		= spi_disable_blockprotect_bp1_srwd,
14899 		.write		= spi_chip_write_256,
14900 		.read		= spi_chip_read,
14901 		.voltage	= {2300, 3600},
14902 	},
14903 
14904 	{
14905 		.vendor		= "Sanyo",
14906 		.name		= "LE25FU206A",
14907 		.bustype	= BUS_SPI,
14908 		.manufacture_id	= SANYO_ID,
14909 		.model_id	= SANYO_LE25FU206A,
14910 		.total_size	= 256,
14911 		.page_size	= 256,
14912 		.tested		= TEST_UNTESTED,
14913 		.probe		= probe_spi_rdid,
14914 		.probe_timing	= TIMING_ZERO,
14915 		.block_erasers	=
14916 		{
14917 			{
14918 				.eraseblocks = { {4 * 1024, 64} },
14919 				.block_erase = spi_block_erase_20,
14920 			}, {
14921 				.eraseblocks = { {4 * 1024, 64} },
14922 				.block_erase = spi_block_erase_d7,
14923 			}, {
14924 				.eraseblocks = { {64 * 1024, 4} },
14925 				.block_erase = spi_block_erase_d8,
14926 			}, {
14927 				.eraseblocks = { {256 * 1024, 1} },
14928 				.block_erase = spi_block_erase_60,
14929 			}, {
14930 				.eraseblocks = { {256 * 1024, 1} },
14931 				.block_erase = spi_block_erase_c7,
14932 			}
14933 		},
14934 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
14935 		.unlock		= spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
14936 		.write		= spi_chip_write_256,
14937 		.read		= spi_chip_read,
14938 		.voltage	= {2300, 3600},
14939 	},
14940 
14941 	{
14942 		.vendor		= "Sanyo",
14943 		.name		= "LE25FU406B",
14944 		.bustype	= BUS_SPI,
14945 		.manufacture_id	= SANYO_ID,
14946 		.model_id	= SANYO_LE25FU406B,
14947 		.total_size	= 512,
14948 		.page_size	= 256,
14949 		.feature_bits	= FEATURE_WRSR_WREN,
14950 		.tested		= TEST_OK_PREW,
14951 		.probe		= probe_spi_res2,
14952 		.probe_timing	= TIMING_ZERO,
14953 		.block_erasers	=
14954 		{
14955 			{
14956 				.eraseblocks = { {4 * 1024, 128} },
14957 				.block_erase = spi_block_erase_d7,
14958 			}, {
14959 				.eraseblocks = { {64 * 1024, 8} },
14960 				.block_erase = spi_block_erase_d8,
14961 			}, {
14962 				.eraseblocks = { {512 * 1024, 1} },
14963 				.block_erase = spi_block_erase_c7,
14964 				}
14965 		},
14966 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
14967 		.unlock		= spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
14968 		.write		= spi_chip_write_256,
14969 		.read		= spi_chip_read,
14970 		.voltage	= {2300, 3600},
14971 	},
14972 
14973 	{
14974 		.vendor		= "Sanyo",
14975 		.name		= "LE25FU406C/LE25U40CMC",
14976 		.bustype	= BUS_SPI,
14977 		.manufacture_id	= SANYO_ID,
14978 		.model_id	= SANYO_LE25FU406C,
14979 		.total_size	= 512,
14980 		.page_size	= 256,
14981 		.feature_bits	= FEATURE_WRSR_WREN,
14982 		.tested		= TEST_OK_PREW,
14983 		.probe		= probe_spi_rdid,
14984 		.probe_timing	= TIMING_ZERO,
14985 		.block_erasers	=
14986 		{
14987 			{
14988 				.eraseblocks = { {4 * 1024, 128} },
14989 				.block_erase = spi_block_erase_20,
14990 			}, {
14991 				.eraseblocks = { {4 * 1024, 128} },
14992 				.block_erase = spi_block_erase_d7,
14993 			}, {
14994 				.eraseblocks = { {64 * 1024, 8} },
14995 				.block_erase = spi_block_erase_d8,
14996 			}, {
14997 				.eraseblocks = { {512 * 1024, 1} },
14998 				.block_erase = spi_block_erase_60,
14999 			}, {
15000 				.eraseblocks = { {512 * 1024, 1} },
15001 				.block_erase = spi_block_erase_c7,
15002 				}
15003 		},
15004 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15005 		.unlock		= spi_disable_blockprotect_bp2_srwd,
15006 		.write		= spi_chip_write_256,
15007 		.read		= spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
15008 		.voltage	= {2300, 3600},
15009 	},
15010 
15011 	{
15012 		.vendor		= "Sanyo",
15013 		.name		= "LE25FW106",
15014 		.bustype	= BUS_SPI,
15015 		.manufacture_id	= SANYO_ID,
15016 		.model_id	= SANYO_LE25FW106,
15017 		.total_size	= 128,
15018 		.page_size	= 256,
15019 		.feature_bits	= FEATURE_WRSR_WREN,
15020 		.tested		= TEST_OK_PREW,
15021 		.probe		= probe_spi_res2,
15022 		.probe_timing	= TIMING_ZERO,
15023 		.block_erasers	=
15024 		{
15025 			{
15026 				.eraseblocks = { {2 * 1024, 64} },
15027 				.block_erase = spi_block_erase_d7,
15028 			}, {
15029 				.eraseblocks = { {32 * 1024, 4} },
15030 				.block_erase = spi_block_erase_d8,
15031 			}, {
15032 				.eraseblocks = { {128 * 1024, 1} },
15033 				.block_erase = spi_block_erase_c7,
15034 			}
15035 		},
15036 		.printlock	= spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
15037 		.unlock		= spi_disable_blockprotect_bp1_srwd,
15038 		.write		= spi_chip_write_256,
15039 		.read		= spi_chip_read,
15040 		.voltage	= {2700, 3600},
15041 	},
15042 
15043 	{
15044 		.vendor		= "Sanyo",
15045 		.name		= "LE25FW203A",
15046 		.bustype	= BUS_SPI,
15047 		.manufacture_id	= SANYO_ID,
15048 		.model_id	= SANYO_LE25FW203A,
15049 		.total_size	= 256,
15050 		.page_size	= 256,
15051 		.tested		= TEST_UNTESTED,
15052 		.probe		= probe_spi_rdid,
15053 		.probe_timing	= TIMING_ZERO,
15054 		.block_erasers	=
15055 		{
15056 			{
15057 				.eraseblocks = { {256, 1024} },
15058 				.block_erase = spi_block_erase_db,
15059 			}, {
15060 				.eraseblocks = { {64 * 1024, 4} },
15061 				.block_erase = spi_block_erase_d8,
15062 			}, {
15063 				.eraseblocks = { {256 * 1024, 1} },
15064 				.block_erase = spi_block_erase_c7,
15065 			}
15066 		},
15067 		.printlock	= spi_prettyprint_status_register_default_welwip,
15068 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
15069 		.write		= spi_chip_write_256,
15070 		.read		= spi_chip_read,
15071 		.voltage	= {2700, 3600},
15072 	},
15073 
15074 	{
15075 		.vendor		= "Sanyo",
15076 		.name		= "LE25FW403A",
15077 		.bustype	= BUS_SPI,
15078 		.manufacture_id	= SANYO_ID,
15079 		.model_id	= SANYO_LE25FW403A,
15080 		.total_size	= 512,
15081 		.page_size	= 256,
15082 		.tested		= TEST_UNTESTED,
15083 		.probe		= probe_spi_rdid,
15084 		.probe_timing	= TIMING_ZERO,
15085 		.block_erasers	=
15086 		{
15087 			{
15088 				.eraseblocks = { {256, 2 * 1024} },
15089 				.block_erase = spi_block_erase_db,
15090 			}, {
15091 				.eraseblocks = { {64 * 1024, 8} },
15092 				.block_erase = spi_block_erase_d8,
15093 			}, {
15094 				.eraseblocks = { {512 * 1024, 1} },
15095 				.block_erase = spi_block_erase_c7,
15096 			}
15097 		},
15098 		.printlock	= spi_prettyprint_status_register_default_welwip,
15099 		.unlock		= NULL, /* #WP pin write-protects lower 64kB. */
15100 		.write		= spi_chip_write_256,
15101 		.read		= spi_chip_read,
15102 		.voltage	= {2700, 3600},
15103 	},
15104 
15105 	{
15106 		.vendor		= "Sanyo",
15107 		.name		= "LE25FW406A",
15108 		.bustype	= BUS_SPI,
15109 		.manufacture_id	= SANYO_ID,
15110 		.model_id	= SANYO_LE25FW406A,
15111 		.total_size	= 512,
15112 		.page_size	= 256,
15113 		.feature_bits	= FEATURE_WRSR_WREN,
15114 		.tested		= TEST_OK_PREW,
15115 		.probe		= probe_spi_res2,
15116 		.probe_timing	= TIMING_ZERO,
15117 		.block_erasers	=
15118 		{
15119 			{
15120 				.eraseblocks = { {4 * 1024, 128} },
15121 				.block_erase = spi_block_erase_d7,
15122 			}, {
15123 				.eraseblocks = { {64 * 1024, 8} },
15124 				.block_erase = spi_block_erase_d8,
15125 			}, {
15126 				.eraseblocks = { {512 * 1024, 1} },
15127 				.block_erase = spi_block_erase_c7,
15128 			}
15129 		},
15130 		.printlock	= spi_prettyprint_status_register_plain,
15131 		.unlock		= spi_disable_blockprotect,
15132 		.write		= spi_chip_write_256,
15133 		.read		= spi_chip_read,
15134 		.voltage	= {2700, 3600},
15135 	},
15136 
15137 	{
15138 		.vendor		= "Sanyo",
15139 		.name		= "LE25FW418A",
15140 		.bustype	= BUS_SPI,
15141 		.manufacture_id	= SANYO_ID,
15142 		.model_id	= SANYO_LE25FW418A,
15143 		.total_size	= 512,
15144 		.page_size	= 256,
15145 		.feature_bits	= FEATURE_WRSR_WREN,
15146 		.tested		= TEST_UNTESTED,
15147 		.probe		= probe_spi_res2,
15148 		.probe_timing	= TIMING_ZERO,
15149 		.block_erasers	=
15150 		{
15151 			{
15152 				.eraseblocks = { {4 * 1024, 128} },
15153 				.block_erase = spi_block_erase_d7,
15154 			}, {
15155 				.eraseblocks = { {64 * 1024, 8} },
15156 				.block_erase = spi_block_erase_d8,
15157 			}, {
15158 				.eraseblocks = { {512 * 1024, 1} },
15159 				.block_erase = spi_block_erase_c7,
15160 			}
15161 		},
15162 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15163 		.unlock		= spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15164 		.write		= spi_chip_write_256,
15165 		.read		= spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15166 		.voltage	= {2700, 3600},
15167 	},
15168 
15169 	{
15170 		.vendor		= "Sanyo",
15171 		.name		= "LE25FW806",
15172 		.bustype	= BUS_SPI,
15173 		.manufacture_id	= SANYO_ID,
15174 		.model_id	= SANYO_LE25FW806,
15175 		.total_size	= 1024,
15176 		.page_size	= 256,
15177 		.feature_bits	= FEATURE_WRSR_WREN,
15178 		.tested		= TEST_UNTESTED,
15179 		.probe		= probe_spi_res2,
15180 		.probe_timing	= TIMING_ZERO,
15181 		.block_erasers	=
15182 		{
15183 			{
15184 				.eraseblocks = { {4 * 1024, 256} },
15185 				.block_erase = spi_block_erase_20,
15186 			}, {
15187 				.eraseblocks = { {4 * 1024, 256} },
15188 				.block_erase = spi_block_erase_d7,
15189 			}, {
15190 				.eraseblocks = { {64 * 1024, 16} },
15191 				.block_erase = spi_block_erase_d8,
15192 			}, {
15193 				.eraseblocks = { {1024 * 1024, 1} },
15194 				.block_erase = spi_block_erase_c7,
15195 			}
15196 		},
15197 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15198 		.unlock		= spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15199 		.write		= spi_chip_write_256,
15200 		.read		= spi_chip_read,
15201 		.voltage	= {2700, 3600},
15202 	},
15203 
15204 	{
15205 		.vendor		= "Sanyo",
15206 		.name		= "LE25FW808",
15207 		.bustype	= BUS_SPI,
15208 		.manufacture_id	= SANYO_ID,
15209 		.model_id	= SANYO_LE25FW808,
15210 		.total_size	= 1024,
15211 		.page_size	= 256,
15212 		.feature_bits	= FEATURE_WRSR_WREN,
15213 		.tested		= TEST_UNTESTED,
15214 		.probe		= probe_spi_res2,
15215 		.probe_timing	= TIMING_ZERO,
15216 		.block_erasers	=
15217 		{
15218 			{
15219 				.eraseblocks = { {8 * 1024, 128} },
15220 				.block_erase = spi_block_erase_d7,
15221 			}, {
15222 				.eraseblocks = { {64 * 1024, 16} },
15223 				.block_erase = spi_block_erase_d8,
15224 			}, {
15225 				.eraseblocks = { {1024 * 1024, 1} },
15226 				.block_erase = spi_block_erase_c7,
15227 			}
15228 		},
15229 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15230 		.unlock		= spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15231 		.write		= spi_chip_write_256,
15232 		.read		= spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15233 		.voltage	= {2700, 3600},
15234 	},
15235 
15236 	{
15237 		.vendor		= "Sharp",
15238 		.name		= "LH28F008BJT-BTLZ1",
15239 		.bustype	= BUS_PARALLEL,
15240 		.manufacture_id	= SHARP_ID,
15241 		.model_id	= SHARP_LH28F008BJ__PB,
15242 		.total_size	= 1024,
15243 		.page_size	= 64 * 1024,
15244 		.tested		= TEST_OK_PREW,
15245 		.probe		= probe_82802ab,
15246 		.probe_timing	= TIMING_ZERO,
15247 		.block_erasers	=
15248 		{
15249 			{
15250 				.eraseblocks = {
15251 					{8 * 1024, 8},
15252 					{64 * 1024, 15}
15253 				 },
15254 				.block_erase = erase_block_82802ab,
15255 			}, {
15256 				.eraseblocks = { {1024 * 1024, 1} },
15257 				.block_erase = erase_sector_49lfxxxc,
15258 			}
15259 		},
15260 		.unlock		= unlock_lh28f008bjt,
15261 		.write		= write_82802ab,
15262 		.read		= read_memmapped,
15263 		.voltage	= {2700, 3600},
15264 	},
15265 
15266 	{
15267 		.vendor		= "Sharp",
15268 		.name		= "LHF00L04",
15269 		.bustype	= BUS_FWH, /* A/A Mux */
15270 		.manufacture_id	= SHARP_ID,
15271 		.model_id	= SHARP_LHF00L04,
15272 		.total_size	= 1024,
15273 		.page_size	= 64 * 1024,
15274 		.feature_bits	= FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
15275 		.tested		= TEST_UNTESTED,
15276 		.probe		= probe_82802ab,
15277 		.probe_timing	= TIMING_ZERO,
15278 		.block_erasers	=
15279 		{
15280 			{
15281 				.eraseblocks = {
15282 					{64 * 1024, 15},
15283 					{8 * 1024, 8}
15284 				 },
15285 				.block_erase = erase_block_82802ab,
15286 			}, {
15287 				.eraseblocks = {
15288 					{1024 * 1024, 1}
15289 				},
15290 				.block_erase = NULL, /* 30 D0, only in A/A mux mode */
15291 			},
15292 		},
15293 		.unlock		= unlock_regspace2_uniform_64k,
15294 		.write		= write_82802ab,
15295 		.read		= read_memmapped,
15296 		.voltage	= {3000, 3600},
15297 	},
15298 
15299 	{
15300 		.vendor		= "Spansion",
15301 		.name		= "S25FL004A",
15302 		.bustype	= BUS_SPI,
15303 		.manufacture_id	= SPANSION_ID,
15304 		.model_id	= SPANSION_S25FL004A,
15305 		.total_size	= 512,
15306 		.page_size	= 256,
15307 		.feature_bits	= FEATURE_WRSR_WREN,
15308 		.tested		= TEST_UNTESTED,
15309 		.probe		= probe_spi_rdid,
15310 		.probe_timing	= TIMING_ZERO,
15311 		.block_erasers	=
15312 		{
15313 			{
15314 				.eraseblocks = { {64 * 1024, 8} },
15315 				.block_erase = spi_block_erase_d8,
15316 			}, {
15317 				.eraseblocks = { {512 * 1024, 1} },
15318 				.block_erase = spi_block_erase_c7,
15319 			}
15320 		},
15321 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
15322 		.unlock		= spi_disable_blockprotect,
15323 		.write		= spi_chip_write_256,
15324 		.read		= spi_chip_read,
15325 		.voltage	= {2700, 3600},
15326 	},
15327 
15328 	{
15329 		.vendor		= "Spansion",
15330 		.name		= "S25FL008A",
15331 		.bustype	= BUS_SPI,
15332 		.manufacture_id	= SPANSION_ID,
15333 		.model_id	= SPANSION_S25FL008A,
15334 		.total_size	= 1024,
15335 		.page_size	= 256,
15336 		.feature_bits	= FEATURE_WRSR_WREN,
15337 		.tested		= TEST_OK_PRE,
15338 		.probe		= probe_spi_rdid,
15339 		.probe_timing	= TIMING_ZERO,
15340 		.block_erasers	=
15341 		{
15342 			{
15343 				.eraseblocks = { {64 * 1024, 16} },
15344 				.block_erase = spi_block_erase_d8,
15345 			}, {
15346 				.eraseblocks = { {1024 * 1024, 1} },
15347 				.block_erase = spi_block_erase_c7,
15348 			}
15349 		},
15350 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
15351 		.unlock		= spi_disable_blockprotect,
15352 		.write		= spi_chip_write_256,
15353 		.read		= spi_chip_read,
15354 		.voltage	= {2700, 3600},
15355 	},
15356 
15357 	{
15358 		.vendor		= "Spansion",
15359 		.name		= "S25FL016A",
15360 		.bustype	= BUS_SPI,
15361 		.manufacture_id	= SPANSION_ID,
15362 		.model_id	= SPANSION_S25FL016A,
15363 		.total_size	= 2048,
15364 		.page_size	= 256,
15365 		.feature_bits	= FEATURE_WRSR_WREN,
15366 		.tested		= TEST_OK_PREW,
15367 		.probe		= probe_spi_rdid,
15368 		.probe_timing	= TIMING_ZERO,
15369 		.block_erasers	=
15370 		{
15371 			{
15372 				.eraseblocks = { {64 * 1024, 32} },
15373 				.block_erase = spi_block_erase_d8,
15374 			}, {
15375 				.eraseblocks = { {2 * 1024 * 1024, 1} },
15376 				.block_erase = spi_block_erase_c7,
15377 			}
15378 		},
15379 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
15380 		.unlock		= spi_disable_blockprotect,
15381 		.write		= spi_chip_write_256,
15382 		.read		= spi_chip_read,
15383 		.voltage	= {2700, 3600},
15384 	},
15385 
15386 	{
15387 		.vendor		= "Spansion",
15388 		.name		= "S25FL032A/P",
15389 		.bustype	= BUS_SPI,
15390 		.manufacture_id	= SPANSION_ID,
15391 		.model_id	= SPANSION_S25FL032A,
15392 		.total_size	= 4096,
15393 		.page_size	= 256,
15394 		.feature_bits	= FEATURE_WRSR_WREN,
15395 		.tested		= TEST_OK_PREW,
15396 		.probe		= probe_spi_rdid,
15397 		.probe_timing	= TIMING_ZERO,
15398 		.block_erasers	=
15399 		{
15400 			{
15401 				.eraseblocks = { {64 * 1024, 64} },
15402 				.block_erase = spi_block_erase_d8,
15403 			}, {
15404 				.eraseblocks = { {4 * 1024 * 1024, 1} },
15405 				.block_erase = spi_block_erase_c7,
15406 			}
15407 		},
15408 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
15409 		.unlock		= spi_disable_blockprotect,
15410 		.write		= spi_chip_write_256,
15411 		.read		= spi_chip_read,
15412 		.voltage	= {2700, 3600},
15413 	},
15414 
15415 	{
15416 		.vendor		= "Spansion",
15417 		.name		= "S25FL064A/P",
15418 		.bustype	= BUS_SPI,
15419 		.manufacture_id	= SPANSION_ID,
15420 		.model_id	= SPANSION_S25FL064A,
15421 		.total_size	= 8192,
15422 		.page_size	= 256,
15423 		.feature_bits	= FEATURE_WRSR_WREN,
15424 		.tested		= TEST_OK_PREW,
15425 		.probe		= probe_spi_rdid,
15426 		.probe_timing	= TIMING_ZERO,
15427 		.block_erasers	=
15428 		{
15429 			{
15430 				.eraseblocks = { {64 * 1024, 128} },
15431 				.block_erase = spi_block_erase_d8,
15432 			}, {
15433 				.eraseblocks = { {8 * 1024 * 1024, 1} },
15434 				.block_erase = spi_block_erase_c7,
15435 			}
15436 		},
15437 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
15438 		.unlock		= spi_disable_blockprotect,
15439 		.write		= spi_chip_write_256,
15440 		.read		= spi_chip_read,
15441 		.voltage	= {2700, 3600},
15442 	},
15443 
15444 	{
15445 		.vendor		= "Spansion",
15446 		.name		= "S25FL116K/S25FL216K", /* FIXME: separate them */
15447 		.bustype	= BUS_SPI,
15448 		.manufacture_id	= SPANSION_ID,
15449 		.model_id	= SPANSION_S25FL216,
15450 		.total_size	= 2048,
15451 		.page_size	= 256,
15452 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
15453 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15454 		.tested		= TEST_UNTESTED,
15455 		.probe		= probe_spi_rdid,
15456 		.probe_timing	= TIMING_ZERO,
15457 		.block_erasers	=
15458 		{
15459 			{
15460 				.eraseblocks = { {4 * 1024, 512} },
15461 				.block_erase = spi_block_erase_20,
15462 			}, {
15463 				.eraseblocks = { {64 * 1024, 32} },
15464 				.block_erase = spi_block_erase_d8,
15465 			}, {
15466 				.eraseblocks = { { 2048 * 1024, 1} },
15467 				.block_erase = spi_block_erase_60,
15468 			}, {
15469 				.eraseblocks = { { 2048 * 1024, 1} },
15470 				.block_erase = spi_block_erase_c7,
15471 			}
15472 		},
15473 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
15474 		.unlock		= spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
15475 		.write		= spi_chip_write_256,
15476 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
15477 		.voltage	= {2700, 3600},
15478 	},
15479 
15480 	{
15481 		.vendor		= "Spansion",
15482 		.name		= "S25FL127S-256kB", /* uniform 256kB sectors */
15483 		.bustype	= BUS_SPI,
15484 		.manufacture_id	= SPANSION_ID,
15485 		.model_id	= SPANSION_S25FL128,
15486 		.total_size	= 16384,
15487 		.page_size	= 512,
15488 		/* supports 4B addressing */
15489 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15490 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15491 		.tested		= TEST_UNTESTED,
15492 		.probe		= probe_spi_rdid,
15493 		.probe_timing	= TIMING_ZERO,
15494 		.block_erasers	=
15495 		{
15496 			{
15497 				.eraseblocks = { {256 * 1024, 64} },
15498 				.block_erase = spi_block_erase_d8,
15499 			}, {
15500 				.eraseblocks = { { 16384 * 1024, 1} },
15501 				.block_erase = spi_block_erase_60,
15502 			}, {
15503 				.eraseblocks = { { 16384 * 1024, 1} },
15504 				.block_erase = spi_block_erase_c7,
15505 			}
15506 		},
15507 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15508 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15509 		.write		= spi_chip_write_256, /* Multi I/O supported */
15510 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15511 		.voltage	= {2700, 3600},
15512 	},
15513 
15514 	{
15515 		.vendor		= "Spansion",
15516 		.name		= "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15517 		.bustype	= BUS_SPI,
15518 		.manufacture_id	= SPANSION_ID,
15519 		.model_id	= SPANSION_S25FL128,
15520 		.total_size	= 16384,
15521 		.page_size	= 256,
15522 		/* supports 4B addressing */
15523 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15524 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15525 		.tested		= TEST_OK_PREW,
15526 		/* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
15527 		.probe		= probe_spi_rdid,
15528 		.probe_timing	= TIMING_ZERO,
15529 		.block_erasers	=
15530 		{
15531 			{
15532 				/* This chip supports erasing of 32 so-called "parameter sectors" with
15533 				 * opcode 0x20 which may be configured to be on top or bottom of the address
15534 				 * space. Trying to access an address outside these 4kB blocks does have no
15535 				 * effect on the memory contents, e.g.
15536 				.eraseblocks = {
15537 					{4 * 1024, 32},
15538 					{64 * 1024, 254} // inaccessible
15539 				},
15540 				.block_erase = spi_block_erase_20,
15541 			}, { */
15542 				.eraseblocks = { { 64 * 1024, 256} },
15543 				.block_erase = spi_block_erase_d8,
15544 			}, {
15545 				.eraseblocks = { { 16384 * 1024, 1} },
15546 				.block_erase = spi_block_erase_60,
15547 			}, {
15548 				.eraseblocks = { { 16384 * 1024, 1} },
15549 				.block_erase = spi_block_erase_c7,
15550 			}
15551 		},
15552 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15553 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15554 		.write		= spi_chip_write_256, /* Multi I/O supported */
15555 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15556 		.voltage	= {2700, 3600},
15557 	},
15558 
15559 	{
15560 		.vendor		= "Spansion",
15561 		.name		= "S25FL128P......0", /* uniform 64 kB sectors */
15562 		.bustype	= BUS_SPI,
15563 		.manufacture_id	= SPANSION_ID,
15564 		.model_id	= SPANSION_S25FL128,
15565 		.total_size	= 16384,
15566 		.page_size	= 256,
15567 		.feature_bits	= FEATURE_WRSR_WREN,
15568 		.tested		= TEST_OK_PREW,
15569 		.probe		= probe_spi_rdid,
15570 		.probe_timing	= TIMING_ZERO,
15571 		.block_erasers	=
15572 		{
15573 			{
15574 				.eraseblocks = { {64 * 1024, 256} },
15575 				.block_erase = spi_block_erase_20,
15576 			}, {
15577 				.eraseblocks = { {64 * 1024, 256} },
15578 				.block_erase = spi_block_erase_d8,
15579 			}, {
15580 				.eraseblocks = { { 16384 * 1024, 1} },
15581 				.block_erase = spi_block_erase_60,
15582 			}, {
15583 				.eraseblocks = { { 16384 * 1024, 1} },
15584 				.block_erase = spi_block_erase_c7,
15585 			}
15586 		},
15587 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
15588 		.unlock		= spi_disable_blockprotect_bp3_srwd,
15589 		.write		= spi_chip_write_256,
15590 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
15591 		.voltage	= {2700, 3600},
15592 	},
15593 
15594 	{
15595 		.vendor		= "Spansion",
15596 		.name		= "S25FL128P......1", /* uniform 256kB sectors */
15597 		.bustype	= BUS_SPI,
15598 		.manufacture_id	= SPANSION_ID,
15599 		.model_id	= SPANSION_S25FL128,
15600 		.total_size	= 16384,
15601 		.page_size	= 256,
15602 		.feature_bits	= FEATURE_WRSR_WREN,
15603 		.tested		= TEST_UNTESTED,
15604 		.probe		= probe_spi_rdid,
15605 		.probe_timing	= TIMING_ZERO,
15606 		.block_erasers	=
15607 		{
15608 			{
15609 				.eraseblocks = { {256 * 1024, 64} },
15610 				.block_erase = spi_block_erase_d8,
15611 			}, {
15612 				.eraseblocks = { { 16384 * 1024, 1} },
15613 				.block_erase = spi_block_erase_c7,
15614 			}
15615 		},
15616 		.printlock	= spi_prettyprint_status_register_bp2_srwd,
15617 		.unlock		= spi_disable_blockprotect_bp2_srwd,
15618 		.write		= spi_chip_write_256,
15619 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
15620 		.voltage	= {2700, 3600},
15621 	},
15622 
15623 	{
15624 		.vendor		= "Spansion",
15625 		.name		= "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15626 		.bustype	= BUS_SPI,
15627 		.manufacture_id	= SPANSION_ID,
15628 		.model_id	= SPANSION_S25FL128,
15629 		.total_size	= 16384,
15630 		.page_size	= 256,
15631 		/* supports 4B addressing */
15632 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15633 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15634 		.tested		= TEST_OK_PREW,
15635 		.probe		= probe_spi_rdid,
15636 		.probe_timing	= TIMING_ZERO,
15637 		.block_erasers	=
15638 		{
15639 			{
15640 				/* This chip supports erasing of the 32 so-called "parameter sectors" with
15641 				 * opcode 0x20. Trying to access an address outside these 4kB blocks does
15642 				 * have no effect on the memory contents, but sets a flag in the SR.
15643 				.eraseblocks = {
15644 					{4 * 1024, 32},
15645 					{64 * 1024, 254} // inaccessible
15646 				},
15647 				.block_erase = spi_block_erase_20,
15648 			}, { */
15649 				.eraseblocks = { { 64 * 1024, 256} },
15650 				.block_erase = spi_block_erase_d8,
15651 			}, {
15652 				.eraseblocks = { { 16384 * 1024, 1} },
15653 				.block_erase = spi_block_erase_60,
15654 			}, {
15655 				.eraseblocks = { { 16384 * 1024, 1} },
15656 				.block_erase = spi_block_erase_c7,
15657 			}
15658 		},
15659 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
15660 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
15661 		.write		= spi_chip_write_256, /* Multi I/O supported */
15662 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15663 		.voltage	= {2700, 3600},
15664 	},
15665 
15666 	{
15667 		.vendor		= "Spansion",
15668 		.name		= "S25FL128S......1", /* uniform 256 kB sectors */
15669 		.bustype	= BUS_SPI,
15670 		.manufacture_id	= SPANSION_ID,
15671 		.model_id	= SPANSION_S25FL128,
15672 		.total_size	= 16384,
15673 		.page_size	= 512,
15674 		/* supports 4B addressing */
15675 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15676 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15677 		.tested		= TEST_UNTESTED,
15678 		.probe		= probe_spi_rdid,
15679 		.probe_timing	= TIMING_ZERO,
15680 		.block_erasers	=
15681 		{
15682 			{
15683 				.eraseblocks = { {256 * 1024, 64} },
15684 				.block_erase = spi_block_erase_d8,
15685 			}, {
15686 				.eraseblocks = { { 16384 * 1024, 1} },
15687 				.block_erase = spi_block_erase_60,
15688 			}, {
15689 				.eraseblocks = { { 16384 * 1024, 1} },
15690 				.block_erase = spi_block_erase_c7,
15691 			}
15692 		},
15693 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
15694 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
15695 		.write		= spi_chip_write_256, /* Multi I/O supported */
15696 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15697 		.voltage	= {2700, 3600},
15698 	},
15699 
15700 	{
15701 		.vendor		= "Spansion",
15702 		.name		= "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15703 		.bustype	= BUS_SPI,
15704 		.manufacture_id	= SPANSION_ID,
15705 		.model_id	= SPANSION_S25FL128,
15706 		.total_size	= 16384,
15707 		.page_size	= 256,
15708 		/* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
15709 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15710 		.tested		= TEST_OK_PREW,
15711 		.probe		= probe_spi_rdid,
15712 		.probe_timing	= TIMING_ZERO,
15713 		.block_erasers	=
15714 		{
15715 			{
15716 			/* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
15717 			 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
15718 			 * effect on the memory contents, but sets a flag in the SR.
15719 				.eraseblocks = {
15720 					{4 * 1024, 32},
15721 					{64 * 1024, 254} // inaccessible
15722 				},
15723 				.block_erase = spi_block_erase_20,
15724 			}, { */
15725 			/* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
15726 				.eraseblocks = {
15727 					{8 * 1024, 16},
15728 					{64 * 1024, 254} // inaccessible
15729 				},
15730 				.block_erase = spi_block_erase_40,
15731 			}, { */
15732 				.eraseblocks = { { 64 * 1024, 256} },
15733 				.block_erase = spi_block_erase_d8,
15734 			}, {
15735 				.eraseblocks = { { 16384 * 1024, 1} },
15736 				.block_erase = spi_block_erase_60,
15737 			}, {
15738 				.eraseblocks = { { 16384 * 1024, 1} },
15739 				.block_erase = spi_block_erase_c7,
15740 			}
15741 		},
15742 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
15743 		.unlock		= spi_disable_blockprotect_bp2_srwd,
15744 		.write		= spi_chip_write_256, /* Multi I/O supported */
15745 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15746 		.voltage	= {2700, 3600},
15747 	},
15748 
15749 	{
15750 		.vendor		= "Spansion",
15751 		.name		= "S25FL129P......1", /* uniform 256 kB sectors */
15752 		.bustype	= BUS_SPI,
15753 		.manufacture_id	= SPANSION_ID,
15754 		.model_id	= SPANSION_S25FL128,
15755 		.total_size	= 16384,
15756 		.page_size	= 256,
15757 		/* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
15758 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15759 		.tested		= TEST_UNTESTED,
15760 		.probe		= probe_spi_rdid,
15761 		.probe_timing	= TIMING_ZERO,
15762 		.block_erasers	=
15763 		{
15764 			{
15765 				.eraseblocks = { {256 * 1024, 64} },
15766 				.block_erase = spi_block_erase_d8,
15767 			}, {
15768 				.eraseblocks = { { 16384 * 1024, 1} },
15769 				.block_erase = spi_block_erase_60,
15770 			}, {
15771 				.eraseblocks = { { 16384 * 1024, 1} },
15772 				.block_erase = spi_block_erase_c7,
15773 			}
15774 		},
15775 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
15776 		.unlock		= spi_disable_blockprotect_bp2_srwd,
15777 		.write		= spi_chip_write_256, /* Multi I/O supported */
15778 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15779 		.voltage	= {2700, 3600},
15780 	},
15781 
15782 	{
15783 		.vendor		= "Spansion",
15784 		.name		= "S25FL132K",
15785 		.bustype	= BUS_SPI,
15786 		.manufacture_id	= SPANSION_ID,
15787 		.model_id	= SPANSION_S25FL132K,
15788 		.total_size	= 4096,
15789 		.page_size	= 256,
15790 		/* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
15791 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15792 		.tested		= TEST_UNTESTED,
15793 		.probe		= probe_spi_rdid,
15794 		.probe_timing	= TIMING_ZERO,
15795 		.block_erasers	=
15796 		{
15797 			{
15798 				.eraseblocks = { {4 * 1024, 1024} },
15799 				.block_erase = spi_block_erase_20,
15800 			}, {
15801 				.eraseblocks = { {64 * 1024, 64} },
15802 				.block_erase = spi_block_erase_d8,
15803 			}, {
15804 				.eraseblocks = { { 4096 * 1024, 1} },
15805 				.block_erase = spi_block_erase_60,
15806 			}, {
15807 				.eraseblocks = { { 4096 * 1024, 1} },
15808 				.block_erase = spi_block_erase_c7,
15809 			}
15810 		},
15811 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
15812 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15813 		.write		= spi_chip_write_256,
15814 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15815 		.voltage	= {2700, 3600},
15816 	},
15817 
15818 	{
15819 		.vendor		= "Spansion",
15820 		.name		= "S25FL164K",
15821 		.bustype	= BUS_SPI,
15822 		.manufacture_id	= SPANSION_ID,
15823 		.model_id	= SPANSION_S25FL164K,
15824 		.total_size	= 8192,
15825 		.page_size	= 256,
15826 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
15827 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
15828 		.tested		= TEST_OK_PREW,
15829 		.probe		= probe_spi_rdid,
15830 		.probe_timing	= TIMING_ZERO,
15831 		.block_erasers	=
15832 		{
15833 			{
15834 				.eraseblocks = { {4 * 1024, 2048} },
15835 				.block_erase = spi_block_erase_20,
15836 			}, {
15837 				.eraseblocks = { {64 * 1024, 128} },
15838 				.block_erase = spi_block_erase_d8,
15839 			}, {
15840 				.eraseblocks = { { 8192 * 1024, 1} },
15841 				.block_erase = spi_block_erase_60,
15842 			}, {
15843 				.eraseblocks = { { 8192 * 1024, 1} },
15844 				.block_erase = spi_block_erase_c7,
15845 			}
15846 		},
15847 		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
15848 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15849 		.write		= spi_chip_write_256,
15850 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15851 		.voltage	= {2700, 3600},
15852 	},
15853 
15854 	{
15855 		.vendor		= "Spansion",
15856 		.name		= "S25FL204K",
15857 		.bustype	= BUS_SPI,
15858 		.manufacture_id	= SPANSION_ID,
15859 		.model_id	= SPANSION_S25FL204,
15860 		.total_size	= 512,
15861 		.page_size	= 256,
15862 		.feature_bits	= FEATURE_WRSR_WREN,
15863 		.tested		= TEST_OK_PR,
15864 		.probe		= probe_spi_rdid,
15865 		.probe_timing	= TIMING_ZERO,
15866 		.block_erasers	=
15867 		{
15868 			{
15869 				.eraseblocks = { {4 * 1024, 128} },
15870 				.block_erase = spi_block_erase_20,
15871 			}, {
15872 				.eraseblocks = { {64 * 1024, 8} },
15873 				.block_erase = spi_block_erase_d8,
15874 			}, {
15875 				.eraseblocks = { { 512 * 1024, 1} },
15876 				.block_erase = spi_block_erase_60,
15877 			}, {
15878 				.eraseblocks = { { 512 * 1024, 1} },
15879 				.block_erase = spi_block_erase_c7,
15880 			}
15881 		},
15882 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
15883 		.unlock		= spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
15884 		.write		= spi_chip_write_256,
15885 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
15886 		.voltage	= {2700, 3600},
15887 	},
15888 
15889 	{
15890 		.vendor		= "Spansion",
15891 		.name		= "S25FL208K",
15892 		.bustype	= BUS_SPI,
15893 		.manufacture_id	= SPANSION_ID,
15894 		.model_id	= SPANSION_S25FL208,
15895 		.total_size	= 1024,
15896 		.page_size	= 256,
15897 		.feature_bits	= FEATURE_WRSR_WREN,
15898 		.tested		= TEST_OK_PREW,
15899 		.probe		= probe_spi_rdid,
15900 		.probe_timing	= TIMING_ZERO,
15901 		.block_erasers	=
15902 		{
15903 			{
15904 				.eraseblocks = { {4 * 1024, 256} },
15905 				.block_erase = spi_block_erase_20,
15906 			}, {
15907 				.eraseblocks = { {64 * 1024, 16} },
15908 				.block_erase = spi_block_erase_d8,
15909 			}, {
15910 				.eraseblocks = { { 1024 * 1024, 1} },
15911 				.block_erase = spi_block_erase_60,
15912 			}, {
15913 				.eraseblocks = { { 1024 * 1024, 1} },
15914 				.block_erase = spi_block_erase_c7,
15915 			}
15916 		},
15917 		.printlock	= spi_prettyprint_status_register_bp3_srwd,
15918 		.unlock		= spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
15919 		.write		= spi_chip_write_256,
15920 		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
15921 		.voltage	= {2700, 3600},
15922 	},
15923 
15924 	{
15925 		.vendor		= "Spansion",
15926 		.name		= "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15927 		.bustype	= BUS_SPI,
15928 		.manufacture_id	= SPANSION_ID,
15929 		.model_id	= SPANSION_S25FL256,
15930 		.total_size	= 32768,
15931 		.page_size	= 256,
15932 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15933 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
15934 		.tested		= TEST_OK_PREW,
15935 		.probe		= probe_spi_rdid,
15936 		.probe_timing	= TIMING_ZERO,
15937 		.block_erasers	=
15938 		{
15939 			{
15940 				/* This chip supports erasing of the 32 so-called "parameter sectors" with
15941 				 * opcode 0x20. Trying to access an address outside these 4kB blocks does
15942 				 * have no effect on the memory contents, but sets a flag in the SR.
15943 				.eraseblocks = {
15944 					{4 * 1024, 32},
15945 					{64 * 1024, 254} // inaccessible
15946 				},
15947 				.block_erase = spi_block_erase_20,
15948 			}, { */
15949 				.eraseblocks = { { 64 * 1024, 512} },
15950 				.block_erase = spi_block_erase_dc,
15951 			}, {
15952 				.eraseblocks = { { 64 * 1024, 512} },
15953 				.block_erase = spi_block_erase_d8,
15954 			}, {
15955 				.eraseblocks = { { 32768 * 1024, 1} },
15956 				.block_erase = spi_block_erase_60,
15957 			}, {
15958 				.eraseblocks = { { 32768 * 1024, 1} },
15959 				.block_erase = spi_block_erase_c7,
15960 			}
15961 		},
15962 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
15963 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
15964 		.write		= spi_chip_write_256, /* Multi I/O supported */
15965 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15966 		.voltage	= {2700, 3600},
15967 		.wrea_override	= 0x17,
15968 	},
15969 
15970 	{
15971 		.vendor		= "Spansion",
15972 		.name		= "S25FL512S",
15973 		.bustype	= BUS_SPI,
15974 		.manufacture_id	= SPANSION_ID,
15975 		.model_id	= SPANSION_S25FL512,
15976 		.total_size	= 65536, /* 512 Mb (=> 64 MB)) */
15977 		.page_size	= 256,
15978 		/* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15979 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE,
15980 		.tested		= TEST_OK_PREW,
15981 		.probe		= probe_spi_rdid,
15982 		.probe_timing	= TIMING_ZERO,
15983 		.block_erasers	=
15984 		{
15985 			{
15986 				.eraseblocks = { { 256 * 1024, 256} },
15987 				.block_erase = spi_block_erase_dc,
15988 			}, {
15989 				.eraseblocks = { { 65536 * 1024, 1} },
15990 				.block_erase = spi_block_erase_60,
15991 			}, {
15992 				.eraseblocks = { { 65536 * 1024, 1} },
15993 				.block_erase = spi_block_erase_c7,
15994 			}
15995 		},
15996 		.printlock	= spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
15997 		.unlock		= spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
15998 		.write		= spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
15999 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16000 		.voltage	= {2700, 3600},
16001 	},
16002 
16003 	{
16004 		.vendor		= "SyncMOS/MoselVitelic",
16005 		.name		= "{F,S,V}29C51001B",
16006 		.bustype	= BUS_PARALLEL,
16007 		.manufacture_id	= SYNCMOS_MVC_ID,
16008 		.model_id	= SM_MVC_29C51001B,
16009 		.total_size	= 128,
16010 		.page_size	= 512,
16011 		.feature_bits	= FEATURE_EITHER_RESET,
16012 		.tested		= TEST_UNTESTED,
16013 		.probe		= probe_jedec,
16014 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16015 		.block_erasers	=
16016 		{
16017 			{
16018 				.eraseblocks = { {512, 256} },
16019 				.block_erase = erase_sector_jedec,
16020 			}, {
16021 				.eraseblocks = { {128 * 1024, 1} },
16022 				.block_erase = erase_chip_block_jedec,
16023 			},
16024 		},
16025 		.write		= write_jedec_1,
16026 		.read		= read_memmapped,
16027 		.voltage	= {4500, 5500},
16028 	},
16029 
16030 	{
16031 		.vendor		= "SyncMOS/MoselVitelic",
16032 		.name		= "{F,S,V}29C51001T",
16033 		.bustype	= BUS_PARALLEL,
16034 		.manufacture_id	= SYNCMOS_MVC_ID,
16035 		.model_id	= SM_MVC_29C51001T,
16036 		.total_size	= 128,
16037 		.page_size	= 512,
16038 		.feature_bits	= FEATURE_EITHER_RESET,
16039 		.tested		= TEST_UNTESTED,
16040 		.probe		= probe_jedec,
16041 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16042 		.block_erasers	=
16043 		{
16044 			{
16045 				.eraseblocks = { {512, 256} },
16046 				.block_erase = erase_sector_jedec,
16047 			}, {
16048 				.eraseblocks = { {128 * 1024, 1} },
16049 				.block_erase = erase_chip_block_jedec,
16050 			},
16051 		},
16052 		.write		= write_jedec_1,
16053 		.read		= read_memmapped,
16054 		.voltage	= {4500, 5500},
16055 	},
16056 
16057 	{
16058 		.vendor		= "SyncMOS/MoselVitelic",
16059 		.name		= "{F,S,V}29C51002B",
16060 		.bustype	= BUS_PARALLEL,
16061 		.manufacture_id	= SYNCMOS_MVC_ID,
16062 		.model_id	= SM_MVC_29C51002B,
16063 		.total_size	= 256,
16064 		.page_size	= 512,
16065 		.feature_bits	= FEATURE_EITHER_RESET,
16066 		.tested		= TEST_UNTESTED,
16067 		.probe		= probe_jedec,
16068 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16069 		.block_erasers	=
16070 		{
16071 			{
16072 				.eraseblocks = { {512, 512} },
16073 				.block_erase = erase_sector_jedec,
16074 			}, {
16075 				.eraseblocks = { {256 * 1024, 1} },
16076 				.block_erase = erase_chip_block_jedec,
16077 			},
16078 		},
16079 		.write		= write_jedec_1,
16080 		.read		= read_memmapped,
16081 	},
16082 
16083 	{
16084 		.vendor		= "SyncMOS/MoselVitelic",
16085 		.name		= "{F,S,V}29C51002T",
16086 		.bustype	= BUS_PARALLEL,
16087 		.manufacture_id	= SYNCMOS_MVC_ID,
16088 		.model_id	= SM_MVC_29C51002T,
16089 		.total_size	= 256,
16090 		.page_size	= 512,
16091 		.feature_bits	= FEATURE_EITHER_RESET,
16092 		.tested		= TEST_OK_PREW,
16093 		.probe		= probe_jedec,
16094 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16095 		.block_erasers	=
16096 		{
16097 			{
16098 				.eraseblocks = { {512, 512} },
16099 				.block_erase = erase_sector_jedec,
16100 			}, {
16101 				.eraseblocks = { {256 * 1024, 1} },
16102 				.block_erase = erase_chip_block_jedec,
16103 			},
16104 		},
16105 		.write		= write_jedec_1,
16106 		.read		= read_memmapped,
16107 	},
16108 
16109 	{
16110 		.vendor		= "SyncMOS/MoselVitelic",
16111 		.name		= "{F,S,V}29C51004B",
16112 		.bustype	= BUS_PARALLEL,
16113 		.manufacture_id	= SYNCMOS_MVC_ID,
16114 		.model_id	= SM_MVC_29C51004B,
16115 		.total_size	= 512,
16116 		.page_size	= 1024,
16117 		.feature_bits	= FEATURE_EITHER_RESET,
16118 		.tested		= TEST_UNTESTED,
16119 		.probe		= probe_jedec,
16120 		.probe_timing	= TIMING_ZERO,
16121 		.block_erasers	=
16122 		{
16123 			{
16124 				.eraseblocks = { {1024, 512} },
16125 				.block_erase = erase_sector_jedec,
16126 			}, {
16127 				.eraseblocks = { {512 * 1024, 1} },
16128 				.block_erase = erase_chip_block_jedec,
16129 			},
16130 		},
16131 		.write		= write_jedec_1,
16132 		.read		= read_memmapped,
16133 		.voltage	= {4500, 5500},
16134 	},
16135 
16136 	{
16137 		.vendor		= "SyncMOS/MoselVitelic",
16138 		.name		= "{F,S,V}29C51004T",
16139 		.bustype	= BUS_PARALLEL,
16140 		.manufacture_id	= SYNCMOS_MVC_ID,
16141 		.model_id	= SM_MVC_29C51004T,
16142 		.total_size	= 512,
16143 		.page_size	= 1024,
16144 		.feature_bits	= FEATURE_EITHER_RESET,
16145 		.tested		= TEST_UNTESTED,
16146 		.probe		= probe_jedec,
16147 		.probe_timing	= TIMING_ZERO,
16148 		.block_erasers	=
16149 		{
16150 			{
16151 				.eraseblocks = { {1024, 512} },
16152 				.block_erase = erase_sector_jedec,
16153 			}, {
16154 				.eraseblocks = { {512 * 1024, 1} },
16155 				.block_erase = erase_chip_block_jedec,
16156 			},
16157 		},
16158 		.write		= write_jedec_1,
16159 		.read		= read_memmapped,
16160 		.voltage	= {4500, 5500},
16161 	},
16162 
16163 	{
16164 		.vendor		= "SyncMOS/MoselVitelic",
16165 		.name		= "{S,V}29C31004B",
16166 		.bustype	= BUS_PARALLEL,
16167 		.manufacture_id	= SYNCMOS_MVC_ID,
16168 		.model_id	= SM_MVC_29C31004B,
16169 		.total_size	= 512,
16170 		.page_size	= 1024,
16171 		.feature_bits	= FEATURE_EITHER_RESET,
16172 		.tested		= TEST_UNTESTED,
16173 		.probe		= probe_jedec,
16174 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16175 		.block_erasers	=
16176 		{
16177 			{
16178 				.eraseblocks = { {1024, 512} },
16179 				.block_erase = erase_sector_jedec,
16180 			}, {
16181 				.eraseblocks = { {512 * 1024, 1} },
16182 				.block_erase = erase_chip_block_jedec,
16183 			},
16184 		},
16185 		.write		= write_jedec_1,
16186 		.read		= read_memmapped,
16187 		.voltage	= {3000, 3600},
16188 	},
16189 
16190 	{
16191 		.vendor		= "SyncMOS/MoselVitelic",
16192 		.name		= "{S,V}29C31004T",
16193 		.bustype	= BUS_PARALLEL,
16194 		.manufacture_id	= SYNCMOS_MVC_ID,
16195 		.model_id	= SM_MVC_29C31004T,
16196 		.total_size	= 512,
16197 		.page_size	= 1024,
16198 		.feature_bits	= FEATURE_EITHER_RESET,
16199 		.tested		= TEST_UNTESTED,
16200 		.probe		= probe_jedec,
16201 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16202 		.block_erasers	=
16203 		{
16204 			{
16205 				.eraseblocks = { {1024, 512} },
16206 				.block_erase = erase_sector_jedec,
16207 			}, {
16208 				.eraseblocks = { {512 * 1024, 1} },
16209 				.block_erase = erase_chip_block_jedec,
16210 			},
16211 		},
16212 		.write		= write_jedec_1,
16213 		.read		= read_memmapped,
16214 		.voltage	= {3000, 3600},
16215 	},
16216 
16217 	{
16218 		.vendor		= "TI",
16219 		.name		= "TMS29F002RB",
16220 		.bustype	= BUS_PARALLEL,
16221 		.manufacture_id	= TI_OLD_ID,
16222 		.model_id	= TI_TMS29F002RB,
16223 		.total_size	= 256,
16224 		.page_size	= 16384, /* Non-uniform sectors */
16225 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
16226 		.tested		= TEST_UNTESTED,
16227 		.probe		= probe_jedec,
16228 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16229 		.block_erasers	=
16230 		{
16231 			{
16232 				.eraseblocks = {
16233 					{16 * 1024, 1},
16234 					{8 * 1024, 2},
16235 					{32 * 1024, 1},
16236 					{64 * 1024, 3},
16237 				},
16238 				.block_erase = erase_sector_jedec,
16239 			}, {
16240 				.eraseblocks = { {256 * 1024, 1} },
16241 				.block_erase = erase_chip_block_jedec,
16242 			},
16243 		},
16244 		.write		= write_jedec_1,
16245 		.read		= read_memmapped,
16246 		.voltage	= {4500, 5500},
16247 	},
16248 
16249 	{
16250 		.vendor		= "TI",
16251 		.name		= "TMS29F002RT",
16252 		.bustype	= BUS_PARALLEL,
16253 		.manufacture_id	= TI_OLD_ID,
16254 		.model_id	= TI_TMS29F002RT,
16255 		.total_size	= 256,
16256 		.page_size	= 16384, /* Non-uniform sectors */
16257 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
16258 		.tested		= TEST_UNTESTED,
16259 		.probe		= probe_jedec,
16260 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
16261 		.block_erasers	=
16262 		{
16263 			{
16264 				.eraseblocks = {
16265 					{64 * 1024, 3},
16266 					{32 * 1024, 1},
16267 					{8 * 1024, 2},
16268 					{16 * 1024, 1},
16269 				},
16270 				.block_erase = erase_sector_jedec,
16271 			}, {
16272 				.eraseblocks = { {256 * 1024, 1} },
16273 				.block_erase = erase_chip_block_jedec,
16274 			},
16275 		},
16276 		.write		= write_jedec_1,
16277 		.read		= read_memmapped,
16278 		.voltage	= {4500, 5500},
16279 	},
16280 
16281 	{
16282 		.vendor		= "Winbond",
16283 		.name		= "W25P16",
16284 		.bustype	= BUS_SPI,
16285 		.manufacture_id	= WINBOND_NEX_ID,
16286 		.model_id	= WINBOND_NEX_W25P16,
16287 		.total_size	= 2048,
16288 		.page_size	= 256,
16289 		.feature_bits	= FEATURE_WRSR_WREN,
16290 		.tested		= TEST_UNTESTED,
16291 		.probe		= probe_spi_rdid,
16292 		.probe_timing	= TIMING_ZERO,
16293 		.block_erasers	=
16294 		{
16295 			{
16296 				.eraseblocks = { {64 * 1024, 32} },
16297 				.block_erase = spi_block_erase_d8,
16298 			}, {
16299 				.eraseblocks = { {2048 * 1024, 1} },
16300 				.block_erase = spi_block_erase_c7,
16301 			}
16302 		},
16303 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16304 		.unlock		= spi_disable_blockprotect,
16305 		.write		= spi_chip_write_256,
16306 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
16307 		.voltage	= {2700, 3600},
16308 	},
16309 
16310 	{
16311 		.vendor		= "Winbond",
16312 		.name		= "W25P32",
16313 		.bustype	= BUS_SPI,
16314 		.manufacture_id	= WINBOND_NEX_ID,
16315 		.model_id	= WINBOND_NEX_W25P32,
16316 		.total_size	= 4096,
16317 		.page_size	= 256,
16318 		.feature_bits	= FEATURE_WRSR_WREN,
16319 		.tested		= TEST_UNTESTED,
16320 		.probe		= probe_spi_rdid,
16321 		.probe_timing	= TIMING_ZERO,
16322 		.block_erasers	=
16323 		{
16324 			{
16325 				.eraseblocks = { {64 * 1024, 64} },
16326 				.block_erase = spi_block_erase_d8,
16327 			}, {
16328 				.eraseblocks = { {4096 * 1024, 1} },
16329 				.block_erase = spi_block_erase_c7,
16330 			}
16331 		},
16332 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16333 		.unlock		= spi_disable_blockprotect,
16334 		.write		= spi_chip_write_256,
16335 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
16336 		.voltage	= {2700, 3600},
16337 	},
16338 
16339 	{
16340 		.vendor		= "Winbond",
16341 		.name		= "W25P80",
16342 		.bustype	= BUS_SPI,
16343 		.manufacture_id	= WINBOND_NEX_ID,
16344 		.model_id	= WINBOND_NEX_W25P80,
16345 		.total_size	= 1024,
16346 		.page_size	= 256,
16347 		.feature_bits	= FEATURE_WRSR_WREN,
16348 		.tested		= TEST_UNTESTED,
16349 		.probe		= probe_spi_rdid,
16350 		.probe_timing	= TIMING_ZERO,
16351 		.block_erasers	=
16352 		{
16353 			{
16354 				.eraseblocks = { {64 * 1024, 16} },
16355 				.block_erase = spi_block_erase_d8,
16356 			}, {
16357 				.eraseblocks = { {1024 * 1024, 1} },
16358 				.block_erase = spi_block_erase_c7,
16359 			}
16360 		},
16361 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16362 		.unlock		= spi_disable_blockprotect,
16363 		.write		= spi_chip_write_256,
16364 		.read		= spi_chip_read, /* Fast read (0x0B) supported */
16365 		.voltage	= {2700, 3600},
16366 	},
16367 
16368 	{
16369 		.vendor		= "Winbond",
16370 		.name		= "W25Q128.V",
16371 		.bustype	= BUS_SPI,
16372 		.manufacture_id	= WINBOND_NEX_ID,
16373 		.model_id	= WINBOND_NEX_W25Q128_V,
16374 		.total_size	= 16384,
16375 		.page_size	= 256,
16376 		/* supports SFDP */
16377 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16378 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16379 		.tested		= TEST_OK_PREW,
16380 		.probe		= probe_spi_rdid,
16381 		.probe_timing	= TIMING_ZERO,
16382 		.block_erasers	=
16383 		{
16384 			{
16385 				.eraseblocks = { {4 * 1024, 4096} },
16386 				.block_erase = spi_block_erase_20,
16387 			}, {
16388 				.eraseblocks = { {32 * 1024, 512} },
16389 				.block_erase = spi_block_erase_52,
16390 			}, {
16391 				.eraseblocks = { {64 * 1024, 256} },
16392 				.block_erase = spi_block_erase_d8,
16393 			}, {
16394 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16395 				.block_erase = spi_block_erase_60,
16396 			}, {
16397 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16398 				.block_erase = spi_block_erase_c7,
16399 			}
16400 		},
16401 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16402 		.unlock		= spi_disable_blockprotect,
16403 		.write		= spi_chip_write_256,
16404 		.read		= spi_chip_read,
16405 		.voltage	= {2700, 3600},
16406 	},
16407 
16408 	{
16409 		.vendor		= "Winbond",
16410 		.name		= "W25Q128.V..M",
16411 		.bustype	= BUS_SPI,
16412 		.manufacture_id	= WINBOND_NEX_ID,
16413 		.model_id	= WINBOND_NEX_W25Q128_V_M,
16414 		.total_size	= 16384,
16415 		.page_size	= 256,
16416 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16417 		.tested		= TEST_OK_PREW,
16418 		.probe		= probe_spi_rdid,
16419 		.probe_timing	= TIMING_ZERO,
16420 		.block_erasers	=
16421 		{
16422 			{
16423 				.eraseblocks = { {4 * 1024, 4096} },
16424 				.block_erase = spi_block_erase_20,
16425 			}, {
16426 				.eraseblocks = { {32 * 1024, 512} },
16427 				.block_erase = spi_block_erase_52,
16428 			}, {
16429 				.eraseblocks = { {64 * 1024, 256} },
16430 				.block_erase = spi_block_erase_d8,
16431 			}, {
16432 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16433 				.block_erase = spi_block_erase_60,
16434 			}, {
16435 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16436 				.block_erase = spi_block_erase_c7,
16437 			}
16438 		},
16439 		.printlock	= spi_prettyprint_status_register_plain,
16440 		.unlock		= spi_disable_blockprotect,
16441 		.write		= spi_chip_write_256,
16442 		.read		= spi_chip_read,
16443 		.voltage	= {2700, 3600},
16444 	},
16445 
16446 	{
16447 		.vendor		= "Winbond",
16448 		.name		= "W25Q128.W",
16449 		.bustype	= BUS_SPI,
16450 		.manufacture_id	= WINBOND_NEX_ID,
16451 		.model_id	= WINBOND_NEX_W25Q128_W,
16452 		.total_size	= 16384,
16453 		.page_size	= 256,
16454 		/* supports SFDP */
16455 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16456 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16457 		.tested		= TEST_OK_PREW,
16458 		.probe		= probe_spi_rdid,
16459 		.probe_timing	= TIMING_ZERO,
16460 		.block_erasers	=
16461 		{
16462 			{
16463 				.eraseblocks = { {4 * 1024, 4096} },
16464 				.block_erase = spi_block_erase_20,
16465 			}, {
16466 				.eraseblocks = { {32 * 1024, 512} },
16467 				.block_erase = spi_block_erase_52,
16468 			}, {
16469 				.eraseblocks = { {64 * 1024, 256} },
16470 				.block_erase = spi_block_erase_d8,
16471 			}, {
16472 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16473 				.block_erase = spi_block_erase_60,
16474 			}, {
16475 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16476 				.block_erase = spi_block_erase_c7,
16477 			}
16478 		},
16479 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16480 		.unlock		= spi_disable_blockprotect,
16481 		.write		= spi_chip_write_256,
16482 		.read		= spi_chip_read,
16483 		.voltage	= {1650, 1950},
16484 	},
16485 
16486 	{
16487 		.vendor		= "Winbond",
16488 		.name		= "W25Q128.JW.DTR",
16489 		.bustype	= BUS_SPI,
16490 		.manufacture_id	= WINBOND_NEX_ID,
16491 		.model_id	= WINBOND_NEX_W25Q128_DTR,
16492 		.total_size	= 16384,
16493 		.page_size	= 256,
16494 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16495 		.tested		= TEST_OK_PREW,
16496 		.probe		= probe_spi_rdid,
16497 		.probe_timing	= TIMING_ZERO,
16498 		.block_erasers	=
16499 		{
16500 			{
16501 				.eraseblocks = { {4 * 1024, 4096} },
16502 				.block_erase = spi_block_erase_20,
16503 			}, {
16504 				.eraseblocks = { {32 * 1024, 512} },
16505 				.block_erase = spi_block_erase_52,
16506 			}, {
16507 				.eraseblocks = { {64 * 1024, 256} },
16508 				.block_erase = spi_block_erase_d8,
16509 			}, {
16510 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16511 				.block_erase = spi_block_erase_60,
16512 			}, {
16513 				.eraseblocks = { {16 * 1024 * 1024, 1} },
16514 				.block_erase = spi_block_erase_c7,
16515 			}
16516 		},
16517 		.printlock      = spi_prettyprint_status_register_plain, /* TODO: improve */
16518 		.unlock		= spi_disable_blockprotect,
16519 		.write		= spi_chip_write_256,
16520 		.read		= spi_chip_read,
16521 		.voltage	= {1650, 1950},
16522 	},
16523 
16524 	{
16525 		.vendor		= "Winbond",
16526 		.name		= "W25Q16.V",
16527 		.bustype	= BUS_SPI,
16528 		.manufacture_id	= WINBOND_NEX_ID,
16529 		.model_id	= WINBOND_NEX_W25Q16_V,
16530 		.total_size	= 2048,
16531 		.page_size	= 256,
16532 		/* supports SFDP */
16533 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16534 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16535 		.tested		= TEST_OK_PREW,
16536 		.probe		= probe_spi_rdid,
16537 		.probe_timing	= TIMING_ZERO,
16538 		.block_erasers	=
16539 		{
16540 			{
16541 				.eraseblocks = { {4 * 1024, 512} },
16542 				.block_erase = spi_block_erase_20,
16543 			}, {
16544 				.eraseblocks = { {32 * 1024, 64} },
16545 				.block_erase = spi_block_erase_52,
16546 			}, {
16547 				.eraseblocks = { {64 * 1024, 32} },
16548 				.block_erase = spi_block_erase_d8,
16549 			}, {
16550 				.eraseblocks = { {2 * 1024 * 1024, 1} },
16551 				.block_erase = spi_block_erase_60,
16552 			}, {
16553 				.eraseblocks = { {2 * 1024 * 1024, 1} },
16554 				.block_erase = spi_block_erase_c7,
16555 			}
16556 		},
16557 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16558 		.unlock		= spi_disable_blockprotect,
16559 		.write		= spi_chip_write_256,
16560 		.read		= spi_chip_read,
16561 		.voltage	= {2700, 3600},
16562 	},
16563 
16564 	{
16565 		.vendor		= "Winbond",
16566 		.name		= "W25Q16.W",
16567 		.bustype	= BUS_SPI,
16568 		.manufacture_id	= WINBOND_NEX_ID,
16569 		.model_id	= WINBOND_NEX_W25Q16_W,
16570 		.total_size	= 2048,
16571 		.page_size	= 256,
16572 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16573 		/* QPI enable 0x38, disable 0xFF */
16574 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16575 		.tested		= TEST_UNTESTED,
16576 		.probe		= probe_spi_rdid,
16577 		.probe_timing	= TIMING_ZERO,
16578 		.block_erasers	=
16579 		{
16580 			{
16581 				.eraseblocks = { {4 * 1024, 512} },
16582 				.block_erase = spi_block_erase_20,
16583 			}, {
16584 				.eraseblocks = { {32 * 1024, 64} },
16585 				.block_erase = spi_block_erase_52,
16586 			}, {
16587 				.eraseblocks = { {64 * 1024, 32} },
16588 				.block_erase = spi_block_erase_d8,
16589 			}, {
16590 				.eraseblocks = { {2 * 1024 * 1024, 1} },
16591 				.block_erase = spi_block_erase_60,
16592 			}, {
16593 				.eraseblocks = { {2 * 1024 * 1024, 1} },
16594 				.block_erase = spi_block_erase_c7,
16595 			}
16596 		},
16597 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16598 		.unlock		= spi_disable_blockprotect,
16599 		.write		= spi_chip_write_256,
16600 		.read		= spi_chip_read,
16601 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16602 	},
16603 
16604 	{
16605 		.vendor		= "Winbond",
16606 		.name		= "W25Q20.W",
16607 		.bustype	= BUS_SPI,
16608 		.manufacture_id	= WINBOND_NEX_ID,
16609 		.model_id	= WINBOND_NEX_W25Q20_W,
16610 		.total_size	= 256,
16611 		.page_size	= 256,
16612 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16613 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16614 		.tested		= TEST_UNTESTED,
16615 		.probe		= probe_spi_rdid,
16616 		.probe_timing	= TIMING_ZERO,
16617 		.block_erasers	=
16618 		{
16619 			{
16620 				.eraseblocks = { {4 * 1024, 64} },
16621 				.block_erase = spi_block_erase_20,
16622 			}, {
16623 				.eraseblocks = { {32 * 1024, 8} },
16624 				.block_erase = spi_block_erase_52,
16625 			}, {
16626 				.eraseblocks = { {64 * 1024, 4} },
16627 				.block_erase = spi_block_erase_d8,
16628 			}, {
16629 				.eraseblocks = { {256 * 1024, 1} },
16630 				.block_erase = spi_block_erase_60,
16631 			}, {
16632 				.eraseblocks = { {256 * 1024, 1} },
16633 				.block_erase = spi_block_erase_c7,
16634 			}
16635 		},
16636 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16637 		.unlock		= spi_disable_blockprotect,
16638 		.write		= spi_chip_write_256,
16639 		.read		= spi_chip_read,
16640 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16641 	},
16642 
16643 	{
16644 		.vendor		= "Winbond",
16645 		.name		= "W25Q256.V",
16646 		.bustype	= BUS_SPI,
16647 		.manufacture_id	= WINBOND_NEX_ID,
16648 		.model_id	= WINBOND_NEX_W25Q256_V,
16649 		.total_size	= 32768,
16650 		.page_size	= 256,
16651 		/* supports SFDP */
16652 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16653 		/* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
16654 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
16655 			| FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
16656 		.tested		= TEST_OK_PREW,
16657 		.probe		= probe_spi_rdid,
16658 		.probe_timing	= TIMING_ZERO,
16659 		.block_erasers	=
16660 		{
16661 			{
16662 				.eraseblocks = { {4 * 1024, 8192} },
16663 				.block_erase = spi_block_erase_20,
16664 			}, {
16665 				.eraseblocks = { {32 * 1024, 1024} },
16666 				.block_erase = spi_block_erase_52,
16667 			}, {
16668 				.eraseblocks = { {64 * 1024, 512} },
16669 				.block_erase = spi_block_erase_d8,
16670 			}, {
16671 				.eraseblocks = { {32 * 1024 * 1024, 1} },
16672 				.block_erase = spi_block_erase_60,
16673 			}, {
16674 				.eraseblocks = { {32 * 1024 * 1024, 1} },
16675 				.block_erase = spi_block_erase_c7,
16676 			}
16677 		},
16678 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16679 		.unlock		= spi_disable_blockprotect,
16680 		.write		= spi_chip_write_256,
16681 		.read		= spi_chip_read,
16682 		.voltage	= {2700, 3600},
16683 	},
16684 
16685 	{
16686 		.vendor		= "Winbond",
16687 		.name		= "W25Q256JV_M",
16688 		.bustype	= BUS_SPI,
16689 		.manufacture_id	= WINBOND_NEX_ID,
16690 		.model_id	= WINBOND_NEX_W25Q256JV_M,
16691 		.total_size	= 32768,
16692 		.page_size	= 256,
16693 		/* supports SFDP */
16694 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16695 		/* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
16696 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
16697 		.tested		= TEST_OK_PREW,
16698 		.probe		= probe_spi_rdid,
16699 		.probe_timing	= TIMING_ZERO,
16700 		.block_erasers	=
16701 		{
16702 			{
16703 				.eraseblocks = { {4 * 1024, 8192} },
16704 				.block_erase = spi_block_erase_21,
16705 			}, {
16706 				.eraseblocks = { {4 * 1024, 8192} },
16707 				.block_erase = spi_block_erase_20,
16708 			}, {
16709 				.eraseblocks = { {32 * 1024, 1024} },
16710 				.block_erase = spi_block_erase_52,
16711 			}, {
16712 				.eraseblocks = { {64 * 1024, 512} },
16713 				.block_erase = spi_block_erase_dc,
16714 			}, {
16715 				.eraseblocks = { {64 * 1024, 512} },
16716 				.block_erase = spi_block_erase_d8,
16717 			}, {
16718 				.eraseblocks = { {32 * 1024 * 1024, 1} },
16719 				.block_erase = spi_block_erase_60,
16720 			}, {
16721 				.eraseblocks = { {32 * 1024 * 1024, 1} },
16722 				.block_erase = spi_block_erase_c7,
16723 			}
16724 		},
16725 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16726 		.unlock		= spi_disable_blockprotect,
16727 		.write		= spi_chip_write_256,
16728 		.read		= spi_chip_read,
16729 		.voltage	= {2700, 3600},
16730 	},
16731 
16732 	{
16733 		.vendor		= "Winbond",
16734 		.name		= "W25Q32.V",
16735 		.bustype	= BUS_SPI,
16736 		.manufacture_id	= WINBOND_NEX_ID,
16737 		.model_id	= WINBOND_NEX_W25Q32_V,
16738 		.total_size	= 4096,
16739 		.page_size	= 256,
16740 		/* supports SFDP */
16741 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16742 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16743 		.tested		= TEST_OK_PREW,
16744 		.probe		= probe_spi_rdid,
16745 		.probe_timing	= TIMING_ZERO,
16746 		.block_erasers	=
16747 		{
16748 			{
16749 				.eraseblocks = { {4 * 1024, 1024} },
16750 				.block_erase = spi_block_erase_20,
16751 			}, {
16752 				.eraseblocks = { {32 * 1024, 128} },
16753 				.block_erase = spi_block_erase_52,
16754 			}, {
16755 				.eraseblocks = { {64 * 1024, 64} },
16756 				.block_erase = spi_block_erase_d8,
16757 			}, {
16758 				.eraseblocks = { {4 * 1024 * 1024, 1} },
16759 				.block_erase = spi_block_erase_60,
16760 			}, {
16761 				.eraseblocks = { {4 * 1024 * 1024, 1} },
16762 				.block_erase = spi_block_erase_c7,
16763 			}
16764 		},
16765 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16766 		.unlock		= spi_disable_blockprotect,
16767 		.write		= spi_chip_write_256,
16768 		.read		= spi_chip_read,
16769 		.voltage	= {2700, 3600},
16770 	},
16771 
16772 	{
16773 		.vendor		= "Winbond",
16774 		.name		= "W25Q32.W",
16775 		.bustype	= BUS_SPI,
16776 		.manufacture_id	= WINBOND_NEX_ID,
16777 		.model_id	= WINBOND_NEX_W25Q32_W,
16778 		.total_size	= 4096,
16779 		.page_size	= 256,
16780 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16781 		/* QPI enable 0x38, disable 0xFF */
16782 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16783 		.tested		= TEST_OK_PREW,
16784 		.probe		= probe_spi_rdid,
16785 		.probe_timing	= TIMING_ZERO,
16786 		.block_erasers	=
16787 		{
16788 			{
16789 				.eraseblocks = { {4 * 1024, 1024} },
16790 				.block_erase = spi_block_erase_20,
16791 			}, {
16792 				.eraseblocks = { {32 * 1024, 128} },
16793 				.block_erase = spi_block_erase_52,
16794 			}, {
16795 				.eraseblocks = { {64 * 1024, 64} },
16796 				.block_erase = spi_block_erase_d8,
16797 			}, {
16798 				.eraseblocks = { {4 * 1024 * 1024, 1} },
16799 				.block_erase = spi_block_erase_60,
16800 			}, {
16801 				.eraseblocks = { {4 * 1024 * 1024, 1} },
16802 				.block_erase = spi_block_erase_c7,
16803 			}
16804 		},
16805 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16806 		.unlock		= spi_disable_blockprotect,
16807 		.write		= spi_chip_write_256,
16808 		.read		= spi_chip_read,
16809 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16810 	},
16811 
16812 	{
16813 		.vendor		= "Winbond",
16814 		.name		= "W25Q40.V",
16815 		.bustype	= BUS_SPI,
16816 		.manufacture_id	= WINBOND_NEX_ID,
16817 		.model_id	= WINBOND_NEX_W25Q40_V,
16818 		.total_size	= 512,
16819 		.page_size	= 256,
16820 		/* supports SFDP */
16821 		/* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16822 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16823 		.tested		= TEST_OK_PREW,
16824 		.probe		= probe_spi_rdid,
16825 		.probe_timing	= TIMING_ZERO,
16826 		.block_erasers	=
16827 		{
16828 			{
16829 				.eraseblocks = { {4 * 1024, 128} },
16830 				.block_erase = spi_block_erase_20,
16831 			}, {
16832 				.eraseblocks = { {32 * 1024, 16} },
16833 				.block_erase = spi_block_erase_52,
16834 			}, {
16835 				.eraseblocks = { {64 * 1024, 8} },
16836 				.block_erase = spi_block_erase_d8,
16837 			}, {
16838 				.eraseblocks = { {512 * 1024, 1} },
16839 				.block_erase = spi_block_erase_60,
16840 			}, {
16841 				.eraseblocks = { {512 * 1024, 1} },
16842 				.block_erase = spi_block_erase_c7,
16843 			}
16844 		},
16845 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16846 		.unlock		= spi_disable_blockprotect,
16847 		.write		= spi_chip_write_256, /* Multi I/O supported */
16848 		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16849 		.voltage	= {2700, 3600},
16850 	},
16851 
16852 	{
16853 		.vendor		= "Winbond",
16854 		.name		= "W25Q40BW",
16855 		.bustype	= BUS_SPI,
16856 		.manufacture_id	= WINBOND_NEX_ID,
16857 		.model_id	= WINBOND_NEX_W25Q40BW,
16858 		.total_size	= 512,
16859 		.page_size	= 256,
16860 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16861 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16862 		.tested		= TEST_OK_PREW,
16863 		.probe		= probe_spi_rdid,
16864 		.probe_timing	= TIMING_ZERO,
16865 		.block_erasers	=
16866 		{
16867 			{
16868 				.eraseblocks = { {4 * 1024, 128} },
16869 				.block_erase = spi_block_erase_20,
16870 			}, {
16871 				.eraseblocks = { {32 * 1024, 16} },
16872 				.block_erase = spi_block_erase_52,
16873 			}, {
16874 				.eraseblocks = { {64 * 1024, 8} },
16875 				.block_erase = spi_block_erase_d8,
16876 			}, {
16877 				.eraseblocks = { {512 * 1024, 1} },
16878 				.block_erase = spi_block_erase_60,
16879 			}, {
16880 				.eraseblocks = { {512 * 1024, 1} },
16881 				.block_erase = spi_block_erase_c7,
16882 			}
16883 		},
16884 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16885 		.unlock		= spi_disable_blockprotect,
16886 		.write		= spi_chip_write_256,
16887 		.read		= spi_chip_read,
16888 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
16889 	},
16890 
16891 	{
16892 		.vendor		= "Winbond",
16893 		.name		= "W25Q40EW",
16894 		.bustype	= BUS_SPI,
16895 		.manufacture_id	= WINBOND_NEX_ID,
16896 		.model_id	= WINBOND_NEX_W25Q40EW,
16897 		.total_size	= 512,
16898 		.page_size	= 256,
16899 		/* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16900 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16901 		.tested		= TEST_OK_PREW,
16902 		.probe		= probe_spi_rdid,
16903 		.probe_timing	= TIMING_ZERO,
16904 		.block_erasers	=
16905 		{
16906 			{
16907 				.eraseblocks = { {4 * 1024, 128} },
16908 				.block_erase = spi_block_erase_20,
16909 			}, {
16910 				.eraseblocks = { {32 * 1024, 16} },
16911 				.block_erase = spi_block_erase_52,
16912 			}, {
16913 				.eraseblocks = { {64 * 1024, 8} },
16914 				.block_erase = spi_block_erase_d8,
16915 			}, {
16916 				.eraseblocks = { {512 * 1024, 1} },
16917 				.block_erase = spi_block_erase_60,
16918 			}, {
16919 				.eraseblocks = { {512 * 1024, 1} },
16920 				.block_erase = spi_block_erase_c7,
16921 			}
16922 		},
16923 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16924 		.unlock		= spi_disable_blockprotect,
16925 		.write		= spi_chip_write_256,
16926 		.read		= spi_chip_read,
16927 		.voltage	= {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
16928 	},
16929 
16930 	{
16931 		.vendor		= "Winbond",
16932 		.name		= "W25Q64.V",
16933 		.bustype	= BUS_SPI,
16934 		.manufacture_id	= WINBOND_NEX_ID,
16935 		.model_id	= WINBOND_NEX_W25Q64_V,
16936 		.total_size	= 8192,
16937 		.page_size	= 256,
16938 		/* supports SFDP */
16939 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16940 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
16941 		.tested		= TEST_OK_PREW,
16942 		.probe		= probe_spi_rdid,
16943 		.probe_timing	= TIMING_ZERO,
16944 		.block_erasers	=
16945 		{
16946 			{
16947 				.eraseblocks = { {4 * 1024, 2048} },
16948 				.block_erase = spi_block_erase_20,
16949 			}, {
16950 				.eraseblocks = { {32 * 1024, 256} },
16951 				.block_erase = spi_block_erase_52,
16952 			}, {
16953 				.eraseblocks = { {64 * 1024, 128} },
16954 				.block_erase = spi_block_erase_d8,
16955 			}, {
16956 				.eraseblocks = { {8 * 1024 * 1024, 1} },
16957 				.block_erase = spi_block_erase_60,
16958 			}, {
16959 				.eraseblocks = { {8 * 1024 * 1024, 1} },
16960 				.block_erase = spi_block_erase_c7,
16961 			}
16962 		},
16963 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
16964 		.unlock		= spi_disable_blockprotect,
16965 		.write		= spi_chip_write_256,
16966 		.read		= spi_chip_read,
16967 		.voltage	= {2700, 3600},
16968 	},
16969 
16970 	{
16971 		.vendor		= "Winbond",
16972 		.name		= "W25Q64.W",
16973 		.bustype	= BUS_SPI,
16974 		.manufacture_id	= WINBOND_NEX_ID,
16975 		.model_id	= WINBOND_NEX_W25Q64_W,
16976 		.total_size	= 8192,
16977 		.page_size	= 256,
16978 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
16979 		/* QPI enable 0x38, disable 0xFF */
16980 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
16981 		.tested		= TEST_OK_PREW,
16982 		.probe		= probe_spi_rdid,
16983 		.probe_timing	= TIMING_ZERO,
16984 		.block_erasers	=
16985 		{
16986 			{
16987 				.eraseblocks = { {4 * 1024, 2048} },
16988 				.block_erase = spi_block_erase_20,
16989 			}, {
16990 				.eraseblocks = { {32 * 1024, 256} },
16991 				.block_erase = spi_block_erase_52,
16992 			}, {
16993 				.eraseblocks = { {64 * 1024, 128} },
16994 				.block_erase = spi_block_erase_d8,
16995 			}, {
16996 				.eraseblocks = { {8 * 1024 * 1024, 1} },
16997 				.block_erase = spi_block_erase_60,
16998 			}, {
16999 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17000 				.block_erase = spi_block_erase_c7,
17001 			}
17002 		},
17003 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17004 		.unlock		= spi_disable_blockprotect,
17005 		.write		= spi_chip_write_256,
17006 		.read		= spi_chip_read,
17007 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17008 	},
17009 
17010 	{
17011 		.vendor		= "Winbond",
17012 		.name		= "W25Q80.V",
17013 		.bustype	= BUS_SPI,
17014 		.manufacture_id	= WINBOND_NEX_ID,
17015 		.model_id	= WINBOND_NEX_W25Q80_V,
17016 		.total_size	= 1024,
17017 		.page_size	= 256,
17018 		/* supports SFDP */
17019 		/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17020 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
17021 		.tested		= TEST_OK_PREW,
17022 		.probe		= probe_spi_rdid,
17023 		.probe_timing	= TIMING_ZERO,
17024 		.block_erasers	=
17025 		{
17026 			{
17027 				.eraseblocks = { {4 * 1024, 256} },
17028 				.block_erase = spi_block_erase_20,
17029 			}, {
17030 				.eraseblocks = { {32 * 1024, 32} },
17031 				.block_erase = spi_block_erase_52,
17032 			}, {
17033 				.eraseblocks = { {64 * 1024, 16} },
17034 				.block_erase = spi_block_erase_d8,
17035 			}, {
17036 				.eraseblocks = { {1024 * 1024, 1} },
17037 				.block_erase = spi_block_erase_60,
17038 			}, {
17039 				.eraseblocks = { {1024 * 1024, 1} },
17040 				.block_erase = spi_block_erase_c7,
17041 			}
17042 		},
17043 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17044 		.unlock		= spi_disable_blockprotect,
17045 		.write		= spi_chip_write_256,
17046 		.read		= spi_chip_read,
17047 		.voltage	= {2700, 3600},
17048 	},
17049 
17050 	{
17051 		.vendor		= "Winbond",
17052 		.name		= "W25Q80BW",
17053 		.bustype	= BUS_SPI,
17054 		.manufacture_id	= WINBOND_NEX_ID,
17055 		.model_id	= WINBOND_NEX_W25Q80BW,
17056 		.total_size	= 1024,
17057 		.page_size	= 256,
17058 		/* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17059 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
17060 		.tested		= TEST_OK_PREW,
17061 		.probe		= probe_spi_rdid,
17062 		.probe_timing	= TIMING_ZERO,
17063 		.block_erasers	=
17064 		{
17065 			{
17066 				.eraseblocks = { {4 * 1024, 256} },
17067 				.block_erase = spi_block_erase_20,
17068 			}, {
17069 				.eraseblocks = { {32 * 1024, 32} },
17070 				.block_erase = spi_block_erase_52,
17071 			}, {
17072 				.eraseblocks = { {64 * 1024, 16} },
17073 				.block_erase = spi_block_erase_d8,
17074 			}, {
17075 				.eraseblocks = { {1 * 1024 * 1024, 1} },
17076 				.block_erase = spi_block_erase_60,
17077 			}, {
17078 				.eraseblocks = { {1 * 1024 * 1024, 1} },
17079 				.block_erase = spi_block_erase_c7,
17080 			}
17081 		},
17082 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17083 		.unlock		= spi_disable_blockprotect,
17084 		.write		= spi_chip_write_256,
17085 		.read		= spi_chip_read,
17086 		.voltage	= {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17087 	},
17088 
17089 	{
17090 		.vendor		= "Winbond",
17091 		.name		= "W25Q80EW",
17092 		.bustype	= BUS_SPI,
17093 		.manufacture_id	= WINBOND_NEX_ID,
17094 		.model_id	= WINBOND_NEX_W25Q80EW,
17095 		.total_size	= 1024,
17096 		.page_size	= 256,
17097 		/* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17098 		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
17099 		.tested		= TEST_OK_PREW,
17100 		.probe		= probe_spi_rdid,
17101 		.probe_timing	= TIMING_ZERO,
17102 		.block_erasers	=
17103 		{
17104 			{
17105 				.eraseblocks = { {4 * 1024, 256} },
17106 				.block_erase = spi_block_erase_20,
17107 			}, {
17108 				.eraseblocks = { {32 * 1024, 32} },
17109 				.block_erase = spi_block_erase_52,
17110 			}, {
17111 				.eraseblocks = { {64 * 1024, 16} },
17112 				.block_erase = spi_block_erase_d8,
17113 			}, {
17114 				.eraseblocks = { {1 * 1024 * 1024, 1} },
17115 				.block_erase = spi_block_erase_60,
17116 			}, {
17117 				.eraseblocks = { {1 * 1024 * 1024, 1} },
17118 				.block_erase = spi_block_erase_c7,
17119 			}
17120 		},
17121 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17122 		.unlock		= spi_disable_blockprotect,
17123 		.write		= spi_chip_write_256,
17124 		.read		= spi_chip_read,
17125 		.voltage	= {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
17126 	},
17127 
17128 	{
17129 		.vendor		= "Winbond",
17130 		.name		= "W25X10",
17131 		.bustype	= BUS_SPI,
17132 		.manufacture_id	= WINBOND_NEX_ID,
17133 		.model_id	= WINBOND_NEX_W25X10,
17134 		.total_size	= 128,
17135 		.page_size	= 256,
17136 		.feature_bits	= FEATURE_WRSR_WREN,
17137 		.tested		= TEST_OK_PREW,
17138 		.probe		= probe_spi_rdid,
17139 		.probe_timing	= TIMING_ZERO,
17140 		.block_erasers	=
17141 		{
17142 			{
17143 				.eraseblocks = { {4 * 1024, 32} },
17144 				.block_erase = spi_block_erase_20,
17145 			}, {
17146 				.eraseblocks = { {64 * 1024, 2} },
17147 				.block_erase = spi_block_erase_d8,
17148 			}, {
17149 				.eraseblocks = { {128 * 1024, 1} },
17150 				.block_erase = spi_block_erase_c7,
17151 			}
17152 		},
17153 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17154 		.unlock		= spi_disable_blockprotect,
17155 		.write		= spi_chip_write_256,
17156 		.read		= spi_chip_read,
17157 		.voltage	= {2700, 3600},
17158 	},
17159 
17160 	{
17161 		.vendor		= "Winbond",
17162 		.name		= "W25X16",
17163 		.bustype	= BUS_SPI,
17164 		.manufacture_id	= WINBOND_NEX_ID,
17165 		.model_id	= WINBOND_NEX_W25X16,
17166 		.total_size	= 2048,
17167 		.page_size	= 256,
17168 		.feature_bits	= FEATURE_WRSR_WREN,
17169 		.tested		= TEST_OK_PREW,
17170 		.probe		= probe_spi_rdid,
17171 		.probe_timing	= TIMING_ZERO,
17172 		.block_erasers	=
17173 		{
17174 			{
17175 				.eraseblocks = { {4 * 1024, 512} },
17176 				.block_erase = spi_block_erase_20,
17177 			}, {
17178 				.eraseblocks = { {32 * 1024, 64} },
17179 				.block_erase = spi_block_erase_52,
17180 			}, {
17181 				.eraseblocks = { {64 * 1024, 32} },
17182 				.block_erase = spi_block_erase_d8,
17183 			}, {
17184 				.eraseblocks = { {2 * 1024 * 1024, 1} },
17185 				.block_erase = spi_block_erase_60,
17186 			}, {
17187 				.eraseblocks = { {2 * 1024 * 1024, 1} },
17188 				.block_erase = spi_block_erase_c7,
17189 			}
17190 		},
17191 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17192 		.unlock		= spi_disable_blockprotect,
17193 		.write		= spi_chip_write_256,
17194 		.read		= spi_chip_read,
17195 		.voltage	= {2700, 3600},
17196 	},
17197 
17198 	{
17199 		.vendor		= "Winbond",
17200 		.name		= "W25X20",
17201 		.bustype	= BUS_SPI,
17202 		.manufacture_id	= WINBOND_NEX_ID,
17203 		.model_id	= WINBOND_NEX_W25X20,
17204 		.total_size	= 256,
17205 		.page_size	= 256,
17206 		.feature_bits	= FEATURE_WRSR_WREN,
17207 		.tested		= TEST_OK_PREW,
17208 		.probe		= probe_spi_rdid,
17209 		.probe_timing	= TIMING_ZERO,
17210 		.block_erasers	=
17211 		{
17212 			{
17213 				.eraseblocks = { {4 * 1024, 64} },
17214 				.block_erase = spi_block_erase_20,
17215 			}, {
17216 				.eraseblocks = { {64 * 1024, 4} },
17217 				.block_erase = spi_block_erase_d8,
17218 			}, {
17219 				.eraseblocks = { {256 * 1024, 1} },
17220 				.block_erase = spi_block_erase_c7,
17221 			}
17222 		},
17223 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17224 		.unlock		= spi_disable_blockprotect,
17225 		.write		= spi_chip_write_256,
17226 		.read		= spi_chip_read,
17227 		.voltage	= {2700, 3600},
17228 	},
17229 
17230 	{
17231 		.vendor		= "Winbond",
17232 		.name		= "W25X32",
17233 		.bustype	= BUS_SPI,
17234 		.manufacture_id	= WINBOND_NEX_ID,
17235 		.model_id	= WINBOND_NEX_W25X32,
17236 		.total_size	= 4096,
17237 		.page_size	= 256,
17238 		.feature_bits	= FEATURE_WRSR_WREN,
17239 		.tested		= TEST_OK_PREW,
17240 		.probe		= probe_spi_rdid,
17241 		.probe_timing	= TIMING_ZERO,
17242 		.block_erasers	=
17243 		{
17244 			{
17245 				.eraseblocks = { {4 * 1024, 1024} },
17246 				.block_erase = spi_block_erase_20,
17247 			}, {
17248 				.eraseblocks = { {32 * 1024, 128} },
17249 				.block_erase = spi_block_erase_52,
17250 			}, {
17251 				.eraseblocks = { {64 * 1024, 64} },
17252 				.block_erase = spi_block_erase_d8,
17253 			}, {
17254 				.eraseblocks = { {4 * 1024 * 1024, 1} },
17255 				.block_erase = spi_block_erase_60,
17256 			}, {
17257 				.eraseblocks = { {4 * 1024 * 1024, 1} },
17258 				.block_erase = spi_block_erase_c7,
17259 			}
17260 		},
17261 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17262 		.unlock		= spi_disable_blockprotect,
17263 		.write		= spi_chip_write_256,
17264 		.read		= spi_chip_read,
17265 		.voltage	= {2700, 3600},
17266 	},
17267 
17268 	{
17269 		.vendor		= "Winbond",
17270 		.name		= "W25X40",
17271 		.bustype	= BUS_SPI,
17272 		.manufacture_id	= WINBOND_NEX_ID,
17273 		.model_id	= WINBOND_NEX_W25X40,
17274 		.total_size	= 512,
17275 		.page_size	= 256,
17276 		.feature_bits	= FEATURE_WRSR_WREN,
17277 		.tested		= TEST_OK_PREW,
17278 		.probe		= probe_spi_rdid,
17279 		.probe_timing	= TIMING_ZERO,
17280 		.block_erasers	=
17281 		{
17282 			{
17283 				.eraseblocks = { {4 * 1024, 128} },
17284 				.block_erase = spi_block_erase_20,
17285 			}, {
17286 				.eraseblocks = { {64 * 1024, 8} },
17287 				.block_erase = spi_block_erase_d8,
17288 			}, {
17289 				.eraseblocks = { {512 * 1024, 1} },
17290 				.block_erase = spi_block_erase_c7,
17291 			}
17292 		},
17293 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17294 		.unlock		= spi_disable_blockprotect,
17295 		.write		= spi_chip_write_256,
17296 		.read		= spi_chip_read,
17297 		.voltage	= {2700, 3600},
17298 	},
17299 
17300 	{
17301 		.vendor		= "Winbond",
17302 		.name		= "W25X64",
17303 		.bustype	= BUS_SPI,
17304 		.manufacture_id	= WINBOND_NEX_ID,
17305 		.model_id	= WINBOND_NEX_W25X64,
17306 		.total_size	= 8192,
17307 		.page_size	= 256,
17308 		.feature_bits	= FEATURE_WRSR_WREN,
17309 		.tested		= TEST_OK_PREW,
17310 		.probe		= probe_spi_rdid,
17311 		.probe_timing	= TIMING_ZERO,
17312 		.block_erasers	=
17313 		{
17314 			{
17315 				.eraseblocks = { {4 * 1024, 2048} },
17316 				.block_erase = spi_block_erase_20,
17317 			}, {
17318 				.eraseblocks = { {32 * 1024, 256} },
17319 				.block_erase = spi_block_erase_52,
17320 			}, {
17321 				.eraseblocks = { {64 * 1024, 128} },
17322 				.block_erase = spi_block_erase_d8,
17323 			}, {
17324 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17325 				.block_erase = spi_block_erase_60,
17326 			}, {
17327 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17328 				.block_erase = spi_block_erase_c7,
17329 			}
17330 		},
17331 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17332 		.unlock		= spi_disable_blockprotect,
17333 		.write		= spi_chip_write_256,
17334 		.read		= spi_chip_read,
17335 		.voltage	= {2700, 3600},
17336 	},
17337 
17338 	{
17339 		.vendor		= "Winbond",
17340 		.name		= "W25X80",
17341 		.bustype	= BUS_SPI,
17342 		.manufacture_id	= WINBOND_NEX_ID,
17343 		.model_id	= WINBOND_NEX_W25X80,
17344 		.total_size	= 1024,
17345 		.page_size	= 256,
17346 		.feature_bits	= FEATURE_WRSR_WREN,
17347 		.tested		= TEST_OK_PREW,
17348 		.probe		= probe_spi_rdid,
17349 		.probe_timing	= TIMING_ZERO,
17350 		.block_erasers	=
17351 		{
17352 			{
17353 				.eraseblocks = { {4 * 1024, 256} },
17354 				.block_erase = spi_block_erase_20,
17355 			}, {
17356 				.eraseblocks = { {64 * 1024, 16} },
17357 				.block_erase = spi_block_erase_d8,
17358 			}, {
17359 				.eraseblocks = { {1024 * 1024, 1} },
17360 				.block_erase = spi_block_erase_c7,
17361 			}
17362 		},
17363 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
17364 		.unlock		= spi_disable_blockprotect,
17365 		.write		= spi_chip_write_256,
17366 		.read		= spi_chip_read,
17367 		.voltage	= {2700, 3600},
17368 	},
17369 
17370 	/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
17371 	{
17372 		.vendor		= "Winbond",
17373 		.name		= "W29C010(M)/W29C011A/W29EE011/W29EE012",
17374 		.bustype	= BUS_PARALLEL,
17375 		.manufacture_id	= WINBOND_ID,
17376 		.model_id	= WINBOND_W29C010,
17377 		.total_size	= 128,
17378 		.page_size	= 128,
17379 		.feature_bits	= FEATURE_LONG_RESET,
17380 		.tested		= TEST_OK_PREW,
17381 		.probe		= probe_jedec,
17382 		.probe_timing	= 10,		/* used datasheet for the W29C011A */
17383 		.block_erasers	=
17384 		{
17385 			{
17386 				.eraseblocks = { {128 * 1024, 1} },
17387 				.block_erase = erase_chip_block_jedec,
17388 			}
17389 		},
17390 		.write		= write_jedec,
17391 		.read		= read_memmapped,
17392 	},
17393 
17394 	{
17395 		.vendor		= "Winbond",
17396 		.name		= "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
17397 		.bustype	= BUS_PARALLEL,
17398 		.manufacture_id	= WINBOND_ID,
17399 		.model_id	= WINBOND_W29C010,
17400 		.total_size	= 128,
17401 		.page_size	= 128,
17402 		.feature_bits	= FEATURE_LONG_RESET,
17403 		.tested		= TEST_OK_PREW,
17404 		.probe		= probe_w29ee011,
17405 		.probe_timing	= TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
17406 		.block_erasers	=
17407 		{
17408 			{
17409 				.eraseblocks = { {128 * 1024, 1} },
17410 				.block_erase = erase_chip_block_jedec,
17411 			}
17412 		},
17413 		.write		= write_jedec,
17414 		.read		= read_memmapped,
17415 	},
17416 
17417 	{
17418 		.vendor		= "Winbond",
17419 		.name		= "W29C020(C)/W29C022",
17420 		.bustype	= BUS_PARALLEL,
17421 		.manufacture_id	= WINBOND_ID,
17422 		.model_id	= WINBOND_W29C020,
17423 		.total_size	= 256,
17424 		.page_size	= 128,
17425 		.feature_bits	= FEATURE_LONG_RESET,
17426 		.tested		= TEST_OK_PREW,
17427 		.probe		= probe_jedec,
17428 		.probe_timing	= 10,
17429 		.block_erasers	=
17430 		{
17431 			{
17432 				.eraseblocks = { {256 * 1024, 1} },
17433 				.block_erase = erase_chip_block_jedec,
17434 			}
17435 		},
17436 		.write		= write_jedec,
17437 		.read		= read_memmapped,
17438 		.voltage	= {4500, 5500},
17439 	},
17440 
17441 	{
17442 		.vendor		= "Winbond",
17443 		.name		= "W29C040/P",
17444 		.bustype	= BUS_PARALLEL,
17445 		.manufacture_id	= WINBOND_ID,
17446 		.model_id	= WINBOND_W29C040,
17447 		.total_size	= 512,
17448 		.page_size	= 256,
17449 		.feature_bits	= FEATURE_LONG_RESET,
17450 		.tested		= TEST_UNTESTED,
17451 		.probe		= probe_jedec,
17452 		.probe_timing	= 10,
17453 		.block_erasers	=
17454 		{
17455 			{
17456 				.eraseblocks = { {512 * 1024, 1} },
17457 				.block_erase = erase_chip_block_jedec,
17458 			}
17459 		},
17460 		.write		= write_jedec,
17461 		.read		= read_memmapped,
17462 		.voltage	= {4500, 5500},
17463 	},
17464 
17465 	{
17466 		.vendor		= "Winbond",
17467 		.name		= "W29C512A/W29EE512",
17468 		.bustype	= BUS_PARALLEL,
17469 		.manufacture_id	= WINBOND_ID,
17470 		.model_id	= WINBOND_W29C512A,
17471 		.total_size	= 64,
17472 		.page_size	= 128,
17473 		.feature_bits	= FEATURE_LONG_RESET,
17474 		.tested		= TEST_OK_PREW,
17475 		.probe		= probe_jedec,
17476 		.probe_timing	= 10,
17477 		.block_erasers	=
17478 		{
17479 			{
17480 				.eraseblocks = { {64 * 1024, 1} },
17481 				.block_erase = erase_chip_block_jedec,
17482 			}
17483 		},
17484 		.write		= write_jedec,
17485 		.read		= read_memmapped,
17486 		.voltage	= {4500, 5500},
17487 	},
17488 
17489 	{
17490 		.vendor		= "Winbond",
17491 		.name		= "W29GL032CB",
17492 		.bustype	= BUS_PARALLEL,
17493 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17494 		.model_id	= WINBOND_W29GL032CB,
17495 		.total_size	= 4096,
17496 		.page_size	= 128 * 1024, /* actual page size is 16 */
17497 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17498 		.tested		= TEST_UNTESTED,
17499 		.probe		= probe_jedec_29gl,
17500 		.probe_timing	= TIMING_ZERO,
17501 		.block_erasers	=
17502 		{
17503 			{
17504 				.eraseblocks = {
17505 					{8 * 1024, 8},
17506 					{64 * 1024, 63},
17507 				},
17508 				.block_erase = erase_sector_jedec,
17509 			}, {
17510 				.eraseblocks = { {4 * 1024 * 1024, 1} },
17511 				.block_erase = erase_chip_block_jedec,
17512 			},
17513 		},
17514 		.write		= write_jedec_1,
17515 		.read		= read_memmapped,
17516 		.voltage	= {2700, 3600},
17517 	},
17518 
17519 	{
17520 		.vendor		= "Winbond",
17521 		.name		= "W29GL032CH/L",
17522 		.bustype	= BUS_PARALLEL,
17523 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17524 		.model_id	= WINBOND_W29GL032CHL,
17525 		.total_size	= 4096,
17526 		.page_size	= 128 * 1024, /* actual page size is 16 */
17527 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17528 		.tested		= TEST_UNTESTED,
17529 		.probe		= probe_jedec_29gl,
17530 		.probe_timing	= TIMING_ZERO,
17531 		.block_erasers	=
17532 		{
17533 			{
17534 				.eraseblocks = { {64 * 1024, 64} },
17535 				.block_erase = erase_sector_jedec,
17536 			}, {
17537 				.eraseblocks = { {4 * 1024 * 1024, 1} },
17538 				.block_erase = erase_chip_block_jedec,
17539 			},
17540 		},
17541 		.write		= write_jedec_1,
17542 		.read		= read_memmapped,
17543 		.voltage	= {2700, 3600},
17544 	},
17545 
17546 	{
17547 		.vendor		= "Winbond",
17548 		.name		= "W29GL032CT",
17549 		.bustype	= BUS_PARALLEL,
17550 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17551 		.model_id	= WINBOND_W29GL032CT,
17552 		.total_size	= 4096,
17553 		.page_size	= 128 * 1024, /* actual page size is 16 */
17554 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17555 		.tested		= TEST_UNTESTED,
17556 		.probe		= probe_jedec_29gl,
17557 		.probe_timing	= TIMING_ZERO,
17558 		.block_erasers	=
17559 		{
17560 			{
17561 				.eraseblocks = {
17562 					{64 * 1024, 63},
17563 					{8 * 1024, 8},
17564 				},
17565 				.block_erase = erase_sector_jedec,
17566 			}, {
17567 				.eraseblocks = { {4 * 1024 * 1024, 1} },
17568 				.block_erase = erase_chip_block_jedec,
17569 			},
17570 		},
17571 		.write		= write_jedec_1,
17572 		.read		= read_memmapped,
17573 		.voltage	= {2700, 3600},
17574 	},
17575 
17576 	{
17577 		.vendor		= "Winbond",
17578 		.name		= "W29GL064CB",
17579 		.bustype	= BUS_PARALLEL,
17580 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17581 		.model_id	= WINBOND_W29GL064CB,
17582 		.total_size	= 8192,
17583 		.page_size	= 128 * 1024, /* actual page size is 16 */
17584 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17585 		.tested		= TEST_UNTESTED,
17586 		.probe		= probe_jedec_29gl,
17587 		.probe_timing	= TIMING_ZERO,
17588 		.block_erasers	=
17589 		{
17590 			{
17591 				.eraseblocks = {
17592 					{8 * 1024, 8},
17593 					{64 * 1024, 127},
17594 				},
17595 				.block_erase = erase_sector_jedec,
17596 			}, {
17597 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17598 				.block_erase = erase_chip_block_jedec,
17599 			},
17600 		},
17601 		.write		= write_jedec_1,
17602 		.read		= read_memmapped,
17603 		.voltage	= {2700, 3600},
17604 	},
17605 
17606 	{
17607 		.vendor		= "Winbond",
17608 		.name		= "W29GL064CH/L",
17609 		.bustype	= BUS_PARALLEL,
17610 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17611 		.model_id	= WINBOND_W29GL064CHL,
17612 		.total_size	= 8192,
17613 		.page_size	= 128 * 1024, /* actual page size is 16 */
17614 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17615 		.tested		= TEST_UNTESTED,
17616 		.probe		= probe_jedec_29gl,
17617 		.probe_timing	= TIMING_ZERO,
17618 		.block_erasers	=
17619 		{
17620 			{
17621 				.eraseblocks = { {64 * 1024, 128} },
17622 				.block_erase = erase_sector_jedec,
17623 			}, {
17624 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17625 				.block_erase = erase_chip_block_jedec,
17626 			},
17627 		},
17628 		.write		= write_jedec_1,
17629 		.read		= read_memmapped,
17630 		.voltage	= {2700, 3600},
17631 	},
17632 
17633 	{
17634 		.vendor		= "Winbond",
17635 		.name		= "W29GL064CT",
17636 		.bustype	= BUS_PARALLEL,
17637 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17638 		.model_id	= WINBOND_W29GL064CT,
17639 		.total_size	= 8192,
17640 		.page_size	= 128 * 1024, /* actual page size is 16 */
17641 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17642 		.tested		= TEST_UNTESTED,
17643 		.probe		= probe_jedec_29gl,
17644 		.probe_timing	= TIMING_ZERO,
17645 		.block_erasers	=
17646 		{
17647 			{
17648 				.eraseblocks = {
17649 					{64 * 1024, 127},
17650 					{8 * 1024, 8},
17651 				},
17652 				.block_erase = erase_sector_jedec,
17653 			}, {
17654 				.eraseblocks = { {8 * 1024 * 1024, 1} },
17655 				.block_erase = erase_chip_block_jedec,
17656 			},
17657 		},
17658 		.write		= write_jedec_1,
17659 		.read		= read_memmapped,
17660 		.voltage	= {2700, 3600},
17661 	},
17662 
17663 	{
17664 		.vendor		= "Winbond",
17665 		.name		= "W29GL128C",
17666 		.bustype	= BUS_PARALLEL,
17667 		.manufacture_id	= AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
17668 		.model_id	= WINBOND_W29GL128CHL,
17669 		.total_size	= 16384,
17670 		.page_size	= 128 * 1024, /* actual page size is 16 */
17671 		.feature_bits	= FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
17672 		.tested		= TEST_UNTESTED,
17673 		.probe		= probe_jedec_29gl,
17674 		.probe_timing	= TIMING_ZERO,
17675 		.block_erasers	=
17676 		{
17677 			{
17678 				.eraseblocks = { {128 * 1024, 128} },
17679 				.block_erase = erase_sector_jedec,
17680 			}, {
17681 				.eraseblocks = { {16 * 1024 * 1024, 1} },
17682 				.block_erase = erase_chip_block_jedec,
17683 			},
17684 		},
17685 		.write		= write_jedec_1,
17686 		.read		= read_memmapped,
17687 		.voltage	= {2700, 3600},
17688 	},
17689 
17690 	{
17691 		.vendor		= "Winbond",
17692 		.name		= "W39F010",
17693 		.bustype	= BUS_PARALLEL,
17694 		.manufacture_id	= WINBOND_ID,
17695 		.model_id	= WINBOND_W39F010,
17696 		.total_size	= 128,
17697 		.page_size	= 4 * 1024,
17698 		.feature_bits	= FEATURE_EITHER_RESET,
17699 		.tested		= TEST_OK_PREW,
17700 		.probe		= probe_jedec,
17701 		.probe_timing	= 10,
17702 		.block_erasers	=
17703 		{
17704 			{
17705 				.eraseblocks = { {4 * 1024, 32} },
17706 				.block_erase = erase_block_jedec,
17707 			}, {
17708 				.eraseblocks = { {128 * 1024, 1} },
17709 				.block_erase = erase_chip_block_jedec,
17710 			}
17711 		},
17712 		.printlock	= printlock_w39f010,
17713 		.write		= write_jedec_1,
17714 		.read		= read_memmapped,
17715 		.voltage	= {4500, 5500},
17716 	},
17717 
17718 	{
17719 		.vendor		= "Winbond",
17720 		.name		= "W39L010",
17721 		.bustype	= BUS_PARALLEL,
17722 		.manufacture_id	= WINBOND_ID,
17723 		.model_id	= WINBOND_W39L010,
17724 		.total_size	= 128,
17725 		.page_size	= 4 * 1024,
17726 		.feature_bits	= FEATURE_EITHER_RESET,
17727 		.tested		= TEST_UNTESTED,
17728 		.probe		= probe_jedec,
17729 		.probe_timing	= 10,
17730 		.block_erasers	=
17731 		{
17732 			{
17733 				.eraseblocks = { {4 * 1024, 32} },
17734 				.block_erase = erase_block_jedec,
17735 			}, {
17736 				.eraseblocks = { {128 * 1024, 1} },
17737 				.block_erase = erase_chip_block_jedec,
17738 			}
17739 		},
17740 		.printlock	= printlock_w39l010,
17741 		.write		= write_jedec_1,
17742 		.read		= read_memmapped,
17743 		.voltage	= {3000, 3600},
17744 	},
17745 
17746 	{
17747 		.vendor		= "Winbond",
17748 		.name		= "W39L020",
17749 		.bustype	= BUS_PARALLEL,
17750 		.manufacture_id	= WINBOND_ID,
17751 		.model_id	= WINBOND_W39L020,
17752 		.total_size	= 256,
17753 		.page_size	= 4 * 1024,
17754 		.feature_bits	= FEATURE_EITHER_RESET,
17755 		.tested		= TEST_UNTESTED,
17756 		.probe		= probe_jedec,
17757 		.probe_timing	= 10,
17758 		.block_erasers	=
17759 		{
17760 			{
17761 				.eraseblocks = { {4 * 1024, 64} },
17762 				.block_erase = erase_block_jedec,
17763 			}, {
17764 				.eraseblocks = { {64 * 1024, 4} },
17765 				.block_erase = erase_sector_jedec,
17766 			}, {
17767 				.eraseblocks = { {256 * 1024, 1} },
17768 				.block_erase = erase_chip_block_jedec,
17769 			}
17770 		},
17771 		.printlock	= printlock_w39l020,
17772 		.write		= write_jedec_1,
17773 		.read		= read_memmapped,
17774 		.voltage	= {3000, 3600},
17775 	},
17776 
17777 	{
17778 		.vendor		= "Winbond",
17779 		.name		= "W39L040",
17780 		.bustype	= BUS_PARALLEL,
17781 		.manufacture_id	= WINBOND_ID,
17782 		.model_id	= WINBOND_W39L040,
17783 		.total_size	= 512,
17784 		.page_size	= 64 * 1024,
17785 		.feature_bits	= FEATURE_EITHER_RESET,
17786 		.tested		= TEST_OK_PR,
17787 		.probe		= probe_jedec,
17788 		.probe_timing	= 10,
17789 		.block_erasers	=
17790 		{
17791 			{
17792 				.eraseblocks = { {4 * 1024, 128} },
17793 				.block_erase = erase_block_jedec,
17794 			}, {
17795 				.eraseblocks = { {64 * 1024, 8} },
17796 				.block_erase = erase_sector_jedec,
17797 			}, {
17798 				.eraseblocks = { {512 * 1024, 1} },
17799 				.block_erase = erase_chip_block_jedec,
17800 			}
17801 		},
17802 		.printlock	= printlock_w39l040,
17803 		.write		= write_jedec_1,
17804 		.read		= read_memmapped,
17805 		.voltage	= {3000, 3600},
17806 	},
17807 
17808 	{
17809 		.vendor		= "Winbond",
17810 		.name		= "W39V040A",
17811 		.bustype	= BUS_LPC,
17812 		.manufacture_id	= WINBOND_ID,
17813 		.model_id	= WINBOND_W39V040A,
17814 		.total_size	= 512,
17815 		.page_size	= 64 * 1024,
17816 		.feature_bits	= FEATURE_EITHER_RESET,
17817 		.tested		= TEST_OK_PREW,
17818 		.probe		= probe_jedec,
17819 		.probe_timing	= 10,
17820 		.block_erasers	=
17821 		{
17822 			{
17823 				.eraseblocks = { {64 * 1024, 8} },
17824 				.block_erase = erase_sector_jedec,
17825 			}, {
17826 				.eraseblocks = { {512 * 1024, 1} },
17827 				.block_erase = erase_chip_block_jedec,
17828 			}
17829 		},
17830 		.printlock	= printlock_w39v040a,
17831 		.write		= write_jedec_1,
17832 		.read		= read_memmapped,
17833 		.voltage	= {3000, 3600},
17834 	},
17835 
17836 	{
17837 		.vendor		= "Winbond",
17838 		.name		= "W39V040B",
17839 		.bustype	= BUS_LPC,
17840 		.manufacture_id	= WINBOND_ID,
17841 		.model_id	= WINBOND_W39V040B,
17842 		.total_size	= 512,
17843 		.page_size	= 64 * 1024,
17844 		.feature_bits	= FEATURE_EITHER_RESET,
17845 		.tested		= TEST_OK_PREW,
17846 		.probe		= probe_jedec,
17847 		.probe_timing	= 10,
17848 		.block_erasers	=
17849 		{
17850 			{
17851 				.eraseblocks = { {64 * 1024, 8} },
17852 				.block_erase = erase_sector_jedec,
17853 			}, {
17854 				.eraseblocks = { {512 * 1024, 1} },
17855 				.block_erase = erase_chip_block_jedec,
17856 			}
17857 		},
17858 		.printlock	= printlock_w39v040b,
17859 		.write		= write_jedec_1,
17860 		.read		= read_memmapped,
17861 		.voltage	= {3000, 3600},
17862 	},
17863 
17864 	{
17865 		.vendor		= "Winbond",
17866 		.name		= "W39V040C",
17867 		.bustype	= BUS_LPC,
17868 		.manufacture_id	= WINBOND_ID,
17869 		.model_id	= WINBOND_W39V040C,
17870 		.total_size	= 512,
17871 		.page_size	= 64 * 1024,
17872 		.feature_bits	= FEATURE_EITHER_RESET,
17873 		.tested		= TEST_OK_PREW,
17874 		.probe		= probe_jedec,
17875 		.probe_timing	= 10,
17876 		.block_erasers	=
17877 		{
17878 			{
17879 				.eraseblocks = { {64 * 1024, 8} },
17880 				.block_erase = erase_sector_jedec,
17881 			}, {
17882 				.eraseblocks = { {512 * 1024, 1} },
17883 				.block_erase = erase_chip_block_jedec,
17884 			}
17885 		},
17886 		.printlock	= printlock_w39v040c,
17887 		.write		= write_jedec_1,
17888 		.read		= read_memmapped,
17889 		.voltage	= {3000, 3600},
17890 	},
17891 
17892 	{
17893 		.vendor		= "Winbond",
17894 		.name		= "W39V040FA",
17895 		.bustype	= BUS_FWH,
17896 		.manufacture_id	= WINBOND_ID,
17897 		.model_id	= WINBOND_W39V040FA,
17898 		.total_size	= 512,
17899 		.page_size	= 64 * 1024,
17900 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
17901 		.tested		= TEST_OK_PREW,
17902 		.probe		= probe_jedec,
17903 		.probe_timing	= 10,
17904 		.block_erasers	=
17905 		{
17906 			{
17907 				.eraseblocks = { {4 * 1024, 128} },
17908 				.block_erase = erase_block_jedec,
17909 			}, {
17910 				.eraseblocks = { {64 * 1024, 8} },
17911 				.block_erase = erase_sector_jedec,
17912 			}, {
17913 				.eraseblocks = { {512 * 1024, 1} },
17914 				.block_erase = erase_chip_block_jedec,
17915 			}
17916 		},
17917 		.printlock	= printlock_w39v040fa,
17918 		.unlock		= unlock_regspace2_uniform_64k,
17919 		.write		= write_jedec_1,
17920 		.read		= read_memmapped,
17921 		.voltage	= {3000, 3600},
17922 	},
17923 
17924 	{
17925 		.vendor		= "Winbond",
17926 		.name		= "W39V040FB",
17927 		.bustype	= BUS_FWH,
17928 		.manufacture_id	= WINBOND_ID,
17929 		.model_id	= WINBOND_W39V040B,
17930 		.total_size	= 512,
17931 		.page_size	= 64 * 1024,
17932 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
17933 		.tested		= TEST_OK_PREW,
17934 		.probe		= probe_jedec,
17935 		.probe_timing	= 10,
17936 		.block_erasers	=
17937 		{
17938 			{
17939 				.eraseblocks = { {64 * 1024, 8} },
17940 				.block_erase = erase_sector_jedec,
17941 			}, {
17942 				.eraseblocks = { {512 * 1024, 1} },
17943 				.block_erase = erase_chip_block_jedec,
17944 			}
17945 		},
17946 		.printlock	= printlock_w39v040fb,
17947 		.unlock		= unlock_regspace2_uniform_64k,
17948 		.write		= write_jedec_1,
17949 		.read		= read_memmapped,
17950 		.voltage	= {3000, 3600}, /* Also has 12V fast program */
17951 	},
17952 
17953 	{
17954 		.vendor		= "Winbond",
17955 		.name		= "W39V040FC",
17956 		.bustype	= BUS_FWH,
17957 		.manufacture_id	= WINBOND_ID,
17958 		.model_id	= WINBOND_W39V040C,
17959 		.total_size	= 512,
17960 		.page_size	= 64 * 1024,
17961 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
17962 		.tested		= TEST_OK_PREW,
17963 		.probe		= probe_jedec,
17964 		.probe_timing	= 10,
17965 		.block_erasers	=
17966 		{
17967 			{
17968 				.eraseblocks = { {64 * 1024, 8} },
17969 				.block_erase = erase_sector_jedec,
17970 			}, {
17971 				.eraseblocks = { {512 * 1024, 1} },
17972 				.block_erase = erase_chip_block_jedec,
17973 			}
17974 		},
17975 		.printlock	= printlock_w39v040fc,
17976 		.write		= write_jedec_1,
17977 		.read		= read_memmapped,
17978 		.voltage	= {3000, 3600}, /* Also has 12V fast program */
17979 	},
17980 
17981 	{
17982 		.vendor		= "Winbond",
17983 		.name		= "W39V080A",
17984 		.bustype	= BUS_LPC,
17985 		.manufacture_id	= WINBOND_ID,
17986 		.model_id	= WINBOND_W39V080A,
17987 		.total_size	= 1024,
17988 		.page_size	= 64 * 1024,
17989 		.feature_bits	= FEATURE_EITHER_RESET,
17990 		.tested		= TEST_OK_PREW,
17991 		.probe		= probe_jedec,
17992 		.probe_timing	= 10,
17993 		.block_erasers	=
17994 		{
17995 			{
17996 				.eraseblocks = { {64 * 1024, 16} },
17997 				.block_erase = erase_sector_jedec,
17998 			}, {
17999 				.eraseblocks = { {1024 * 1024, 1} },
18000 				.block_erase = erase_chip_block_jedec,
18001 			}
18002 		},
18003 		.printlock	= printlock_w39v080a,
18004 		.write		= write_jedec_1,
18005 		.read		= read_memmapped,
18006 		.voltage	= {3000, 3600},
18007 	},
18008 
18009 	{
18010 		.vendor		= "Winbond",
18011 		.name		= "W39V080FA",
18012 		.bustype	= BUS_FWH,
18013 		.manufacture_id	= WINBOND_ID,
18014 		.model_id	= WINBOND_W39V080FA,
18015 		.total_size	= 1024,
18016 		.page_size	= 64 * 1024,
18017 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18018 		.tested		= TEST_OK_PREW,
18019 		.probe		= probe_jedec,
18020 		.probe_timing	= 10,
18021 		.block_erasers	=
18022 		{
18023 			{
18024 				.eraseblocks = { {64 * 1024, 16} },
18025 				.block_erase = erase_sector_jedec,
18026 			}, {
18027 				.eraseblocks = { {1024 * 1024, 1} },
18028 				.block_erase = erase_chip_block_jedec,
18029 			}
18030 		},
18031 		.printlock	= printlock_w39v080fa,
18032 		.unlock		= unlock_regspace2_uniform_64k,
18033 		.write		= write_jedec_1,
18034 		.read		= read_memmapped,
18035 		.voltage	= {3000, 3600}, /* Also has 12V fast program */
18036 	},
18037 
18038 	{
18039 		.vendor		= "Winbond",
18040 		.name		= "W39V080FA (dual mode)",
18041 		.bustype	= BUS_FWH,
18042 		.manufacture_id	= WINBOND_ID,
18043 		.model_id	= WINBOND_W39V080FA_DM,
18044 		.total_size	= 512,
18045 		.page_size	= 64 * 1024,
18046 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18047 		.tested		= TEST_UNTESTED,
18048 		.probe		= probe_jedec,
18049 		.probe_timing	= 10,
18050 		.block_erasers	=
18051 		{
18052 			{
18053 				.eraseblocks = { {64 * 1024, 8} },
18054 				.block_erase = erase_sector_jedec,
18055 			}, {
18056 				.eraseblocks = { {512 * 1024, 1} },
18057 				.block_erase = erase_chip_block_jedec,
18058 			}
18059 		},
18060 		.printlock	= printlock_w39v080fa_dual,
18061 		.write		= write_jedec_1,
18062 		.read		= read_memmapped,
18063 		.voltage	= {3000, 3600}, /* Also has 12V fast program */
18064 	},
18065 
18066 	{
18067 		.vendor		= "Winbond",
18068 		.name		= "W49F002U/N",
18069 		.bustype	= BUS_PARALLEL,
18070 		.manufacture_id	= WINBOND_ID,
18071 		.model_id	= WINBOND_W49F002U,
18072 		.total_size	= 256,
18073 		.page_size	= 128,
18074 		.feature_bits	= FEATURE_EITHER_RESET,
18075 		.tested		= TEST_OK_PREW,
18076 		.probe		= probe_jedec,
18077 		.probe_timing	= 10,
18078 		.block_erasers	=
18079 		{
18080 			{
18081 				.eraseblocks = {
18082 					{128 * 1024, 1},
18083 					{96 * 1024, 1},
18084 					{8 * 1024, 2},
18085 					{16 * 1024, 1},
18086 				},
18087 				.block_erase = erase_sector_jedec,
18088 			}, {
18089 				.eraseblocks = { {256 * 1024, 1} },
18090 				.block_erase = erase_chip_block_jedec,
18091 			}
18092 		},
18093 		.write		= write_jedec_1,
18094 		.read		= read_memmapped,
18095 		.voltage	= {4500, 5500},
18096 	},
18097 
18098 	{
18099 		.vendor		= "Winbond",
18100 		.name		= "W49F020",
18101 		.bustype	= BUS_PARALLEL,
18102 		.manufacture_id	= WINBOND_ID,
18103 		.model_id	= WINBOND_W49F020,
18104 		.total_size	= 256,
18105 		.page_size	= 128,
18106 		.feature_bits	= FEATURE_EITHER_RESET,
18107 		.tested		= TEST_OK_PROBE,
18108 		.probe		= probe_jedec,
18109 		.probe_timing	= 10,
18110 		.block_erasers	=
18111 		{
18112 			{
18113 				.eraseblocks = { {256 * 1024, 1} },
18114 				.block_erase = erase_chip_block_jedec,
18115 			}
18116 		},
18117 		.write		= write_jedec_1,
18118 		.read		= read_memmapped,
18119 		.voltage	= {4500, 5500},
18120 	},
18121 
18122 	{
18123 		.vendor		= "Winbond",
18124 		.name		= "W49V002A",
18125 		.bustype	= BUS_LPC,
18126 		.manufacture_id	= WINBOND_ID,
18127 		.model_id	= WINBOND_W49V002A,
18128 		.total_size	= 256,
18129 		.page_size	= 128,
18130 		.feature_bits	= FEATURE_EITHER_RESET,
18131 		.tested		= TEST_OK_PREW,
18132 		.probe		= probe_jedec,
18133 		.probe_timing	= 10,
18134 		.block_erasers	=
18135 		{
18136 			{
18137 				.eraseblocks = {
18138 					{64 * 1024, 3},
18139 					{32 * 1024, 1},
18140 					{8 * 1024, 2},
18141 					{16 * 1024, 1},
18142 				},
18143 				.block_erase = erase_sector_jedec,
18144 			}, {
18145 				.eraseblocks = { {256 * 1024, 1} },
18146 				.block_erase = erase_chip_block_jedec,
18147 			}
18148 		},
18149 		.write		= write_jedec_1,
18150 		.read		= read_memmapped,
18151 		.voltage	= {3000, 3600},
18152 	},
18153 
18154 	{
18155 		.vendor		= "Winbond",
18156 		.name		= "W49V002FA",
18157 		.bustype	= BUS_FWH,
18158 		.manufacture_id	= WINBOND_ID,
18159 		.model_id	= WINBOND_W49V002FA,
18160 		.total_size	= 256,
18161 		.page_size	= 128,
18162 		.feature_bits	= FEATURE_EITHER_RESET,
18163 		.tested		= TEST_OK_PREW,
18164 		.probe		= probe_jedec,
18165 		.probe_timing	= 10,
18166 		.block_erasers	=
18167 		{
18168 			{
18169 				.eraseblocks = {
18170 					{64 * 1024, 3},
18171 					{32 * 1024, 1},
18172 					{8 * 1024, 2},
18173 					{16 * 1024, 1},
18174 				},
18175 				.block_erase = erase_sector_jedec,
18176 			}, {
18177 				.eraseblocks = { {256 * 1024, 1} },
18178 				.block_erase = erase_chip_block_jedec,
18179 			}
18180 		},
18181 		.write		= write_jedec_1,
18182 		.read		= read_memmapped,
18183 		.voltage	= {3000, 3600},
18184 	},
18185 
18186 	{
18187 		.vendor		= "Zetta Device",
18188 		.name		= "ZD25D20",
18189 		.bustype	= BUS_SPI,
18190 		.manufacture_id	= ZETTADEVICE_ID,
18191 		.model_id	= ZETTADEVICE_ZD25D20,
18192 		.total_size	= 256,
18193 		.page_size	= 256,
18194 		.feature_bits	= FEATURE_WRSR_WREN,
18195 		.tested		= TEST_UNTESTED,
18196 		.probe		= probe_spi_rdid,
18197 		.probe_timing	= TIMING_ZERO,
18198 		.block_erasers	=
18199 		{
18200 			{
18201 				.eraseblocks = { {4 * 1024, 64} },
18202 				.block_erase = spi_block_erase_20,
18203 			}, {
18204 				.eraseblocks = { {32 * 1024, 8} },
18205 				.block_erase = spi_block_erase_52,
18206 			}, {
18207 				.eraseblocks = { {64 * 1024, 4} },
18208 				.block_erase = spi_block_erase_d8,
18209 			}, {
18210 				.eraseblocks = { {256 * 1024, 1} },
18211 				.block_erase = spi_block_erase_60,
18212 			}, {
18213 				.eraseblocks = { {256 * 1024, 1} },
18214 				.block_erase = spi_block_erase_c7,
18215 			}
18216 		},
18217 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
18218 		.unlock		= spi_disable_blockprotect,
18219 		.write		= spi_chip_write_256,
18220 		.read		= spi_chip_read,
18221 		.voltage	= {2700, 3600},
18222 	},
18223 
18224 	{
18225 		.vendor		= "Zetta Device",
18226 		.name		= "ZD25D40",
18227 		.bustype	= BUS_SPI,
18228 		.manufacture_id	= ZETTADEVICE_ID,
18229 		.model_id	= ZETTADEVICE_ZD25D40,
18230 		.total_size	= 512,
18231 		.page_size	= 256,
18232 		.feature_bits	= FEATURE_WRSR_WREN,
18233 		.tested		= TEST_UNTESTED,
18234 		.probe		= probe_spi_rdid,
18235 		.probe_timing	= TIMING_ZERO,
18236 		.block_erasers	=
18237 		{
18238 			{
18239 				.eraseblocks = { {4 * 1024, 128} },
18240 				.block_erase = spi_block_erase_20,
18241 			}, {
18242 				.eraseblocks = { {32 * 1024, 16} },
18243 				.block_erase = spi_block_erase_52,
18244 			}, {
18245 				.eraseblocks = { {64 * 1024, 8} },
18246 				.block_erase = spi_block_erase_d8,
18247 			}, {
18248 				.eraseblocks = { {512 * 1024, 1} },
18249 				.block_erase = spi_block_erase_60,
18250 			}, {
18251 				.eraseblocks = { {512 * 1024, 1} },
18252 				.block_erase = spi_block_erase_c7,
18253 			}
18254 		},
18255 		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
18256 		.unlock		= spi_disable_blockprotect,
18257 		.write		= spi_chip_write_256,
18258 		.read		= spi_chip_read,
18259 		.voltage	= {2700, 3600},
18260 	},
18261 
18262 	{
18263 		.vendor		= "Unknown",
18264 		.name		= "SFDP-capable chip",
18265 		.bustype	= BUS_SPI,
18266 		.manufacture_id	= GENERIC_MANUF_ID,
18267 		.model_id	= SFDP_DEVICE_ID,
18268 		.total_size	= 0, /* set by probing function */
18269 		.page_size	= 0, /* set by probing function */
18270 		.feature_bits	= 0, /* set by probing function */
18271 		/* We present our own "report this" text hence we do not */
18272 		/* want the default "This flash part has status UNTESTED..." */
18273 		/* text to be printed. */
18274 		.tested		= TEST_OK_PREW,
18275 		.probe		= probe_spi_sfdp,
18276 		.block_erasers	= {}, /* set by probing function */
18277 		.unlock		= spi_disable_blockprotect, /* is this safe? */
18278 		.write		= NULL, /* set by probing function */
18279 		.read		= spi_chip_read,
18280 		/* FIXME: some vendor extensions define this */
18281 		.voltage	= {0},
18282 	},
18283 
18284 	{
18285 		.vendor		= "Programmer",
18286 		.name		= "Opaque flash chip",
18287 		.bustype	= BUS_PROG,
18288 		.manufacture_id	= PROGMANUF_ID,
18289 		.model_id	= PROGDEV_ID,
18290 		.total_size	= 0,
18291 		.page_size	= 256,
18292 		/* probe is assumed to work, rest will be filled in by probe */
18293 		.tested		= TEST_OK_PROBE,
18294 		.probe		= probe_opaque,
18295 		/* eraseblock sizes will be set by the probing function */
18296 		.block_erasers	=
18297 		{
18298 			{
18299 				.block_erase = erase_opaque,
18300 			}
18301 		},
18302 		.write		= write_opaque,
18303 		.read		= read_opaque,
18304 	},
18305 
18306 	{
18307 		.vendor		= "AMIC",
18308 		.name		= "unknown AMIC SPI chip",
18309 		.bustype	= BUS_SPI,
18310 		.manufacture_id	= AMIC_ID,
18311 		.model_id	= GENERIC_DEVICE_ID,
18312 		.total_size	= 0,
18313 		.page_size	= 256,
18314 		.tested		= TEST_BAD_PREW,
18315 		.probe		= probe_spi_rdid4,
18316 		.probe_timing	= TIMING_ZERO,
18317 		.write		= NULL,
18318 		.read		= NULL,
18319 	},
18320 
18321 	{
18322 		.vendor		= "Atmel",
18323 		.name		= "unknown Atmel SPI chip",
18324 		.bustype	= BUS_SPI,
18325 		.manufacture_id	= ATMEL_ID,
18326 		.model_id	= GENERIC_DEVICE_ID,
18327 		.total_size	= 0,
18328 		.page_size	= 256,
18329 		.tested		= TEST_BAD_PREW,
18330 		.probe		= probe_spi_rdid,
18331 		.probe_timing	= TIMING_ZERO,
18332 		.write		= NULL,
18333 		.read		= NULL,
18334 	},
18335 
18336 	{
18337 		.vendor		= "Eon",
18338 		.name		= "unknown Eon SPI chip",
18339 		.bustype	= BUS_SPI,
18340 		.manufacture_id	= EON_ID_NOPREFIX,
18341 		.model_id	= GENERIC_DEVICE_ID,
18342 		.total_size	= 0,
18343 		.page_size	= 256,
18344 		.tested		= TEST_BAD_PREW,
18345 		.probe		= probe_spi_rdid,
18346 		.probe_timing	= TIMING_ZERO,
18347 		.write		= NULL,
18348 		.read		= NULL,
18349 	},
18350 
18351 	{
18352 		.vendor		= "Macronix",
18353 		.name		= "unknown Macronix SPI chip",
18354 		.bustype	= BUS_SPI,
18355 		.manufacture_id	= MACRONIX_ID,
18356 		.model_id	= GENERIC_DEVICE_ID,
18357 		.total_size	= 0,
18358 		.page_size	= 256,
18359 		.tested		= TEST_BAD_PREW,
18360 		.probe		= probe_spi_rdid,
18361 		.probe_timing	= TIMING_ZERO,
18362 		.write		= NULL,
18363 		.read		= NULL,
18364 	},
18365 
18366 	{
18367 		.vendor		= "PMC",
18368 		.name		= "unknown PMC SPI chip",
18369 		.bustype	= BUS_SPI,
18370 		.manufacture_id	= PMC_ID,
18371 		.model_id	= GENERIC_DEVICE_ID,
18372 		.total_size	= 0,
18373 		.page_size	= 256,
18374 		.tested		= TEST_BAD_PREW,
18375 		.probe		= probe_spi_rdid,
18376 		.probe_timing	= TIMING_ZERO,
18377 		.write		= NULL,
18378 		.read		= NULL,
18379 	},
18380 
18381 	{
18382 		.vendor		= "SST",
18383 		.name		= "unknown SST SPI chip",
18384 		.bustype	= BUS_SPI,
18385 		.manufacture_id	= SST_ID,
18386 		.model_id	= GENERIC_DEVICE_ID,
18387 		.total_size	= 0,
18388 		.page_size	= 256,
18389 		.tested		= TEST_BAD_PREW,
18390 		.probe		= probe_spi_rdid,
18391 		.probe_timing	= TIMING_ZERO,
18392 		.write		= NULL,
18393 		.read		= NULL,
18394 	},
18395 
18396 	{
18397 		.vendor		= "ST",
18398 		.name		= "unknown ST SPI chip",
18399 		.bustype	= BUS_SPI,
18400 		.manufacture_id	= ST_ID,
18401 		.model_id	= GENERIC_DEVICE_ID,
18402 		.total_size	= 0,
18403 		.page_size	= 256,
18404 		.tested		= TEST_BAD_PREW,
18405 		.probe		= probe_spi_rdid,
18406 		.probe_timing	= TIMING_ZERO,
18407 		.write		= NULL,
18408 		.read		= NULL,
18409 	},
18410 
18411 	{
18412 		.vendor		= "Sanyo",
18413 		.name		= "unknown Sanyo SPI chip",
18414 		.bustype	= BUS_SPI,
18415 		.manufacture_id	= SANYO_ID,
18416 		.model_id	= GENERIC_DEVICE_ID,
18417 		.total_size	= 0,
18418 		.page_size	= 256,
18419 		.tested		= TEST_BAD_PREW,
18420 		.probe		= probe_spi_rdid,
18421 		.probe_timing	= TIMING_ZERO,
18422 		.write		= NULL,
18423 		.read		= NULL,
18424 	},
18425 
18426 	{
18427 		.vendor		= "Winbond",
18428 		.name		= "unknown Winbond (ex Nexcom) SPI chip",
18429 		.bustype	= BUS_SPI,
18430 		.manufacture_id	= WINBOND_NEX_ID,
18431 		.model_id	= GENERIC_DEVICE_ID,
18432 		.total_size	= 0,
18433 		.page_size	= 256,
18434 		.tested		= TEST_BAD_PREW,
18435 		.probe		= probe_spi_rdid,
18436 		.probe_timing	= TIMING_ZERO,
18437 		.write		= NULL,
18438 		.read		= NULL,
18439 	},
18440 
18441 	{
18442 		.vendor		= "Generic",
18443 		.name		= "unknown SPI chip (RDID)",
18444 		.bustype	= BUS_SPI,
18445 		.manufacture_id	= GENERIC_MANUF_ID,
18446 		.model_id	= GENERIC_DEVICE_ID,
18447 		.total_size	= 0,
18448 		.page_size	= 256,
18449 		.tested		= TEST_BAD_PREW,
18450 		.probe		= probe_spi_rdid,
18451 		.write		= NULL,
18452 	},
18453 
18454 	{
18455 		.vendor		= "Generic",
18456 		.name		= "unknown SPI chip (REMS)",
18457 		.bustype	= BUS_SPI,
18458 		.manufacture_id	= GENERIC_MANUF_ID,
18459 		.model_id	= GENERIC_DEVICE_ID,
18460 		.total_size	= 0,
18461 		.page_size	= 256,
18462 		.tested		= TEST_BAD_PREW,
18463 		.probe		= probe_spi_rems,
18464 		.write		= NULL,
18465 	},
18466 
18467 	{0}
18468 };
18469 
18470 const unsigned int flashchips_size = ARRAY_SIZE(flashchips);
18471