2 * This file is part of the flashrom project.
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>
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.
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.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "flashchips.h"
27 #include "chipdrivers.h"
30 * List of supported flash chips.
32 * Please keep the list sorted by vendor name and chip name, so that
33 * the output of 'flashrom -L' is alphabetically sorted.
35 const struct flashchip flashchips[] = {
38 * .vendor = Vendor name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
48 * .block_erasers[] = Array of erase layouts and erase functions
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
53 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
55 * .write = Chip write function
56 * .read = Chip read function
57 * .voltage = Voltage range in millivolt
62 .name = "Am29F010A/B",
63 .bustype = BUS_PARALLEL,
64 .manufacture_id = AMD_ID,
65 .model_id = AMD_AM29F010B, /* Same as Am29F010A */
67 .page_size = 16 * 1024,
68 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
69 .tested = TEST_OK_PRE,
71 .probe_timing = TIMING_ZERO,
75 .eraseblocks = { {16 * 1024, 8} },
76 .block_erase = erase_sector_jedec,
78 .eraseblocks = { {128 * 1024, 1} },
79 .block_erase = erase_chip_block_jedec,
82 .write = write_jedec_1,
83 .read = read_memmapped,
84 .voltage = {4500, 5500},
89 .name = "Am29F002(N)BB",
90 .bustype = BUS_PARALLEL,
91 .manufacture_id = AMD_ID,
92 .model_id = AMD_AM29F002BB,
95 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
96 .tested = TEST_UNTESTED,
98 .probe_timing = TIMING_ZERO,
108 .block_erase = erase_sector_jedec,
110 .eraseblocks = { {256 * 1024, 1} },
111 .block_erase = erase_chip_block_jedec,
114 .write = write_jedec_1,
115 .read = read_memmapped,
116 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
121 .name = "Am29F002(N)BT",
122 .bustype = BUS_PARALLEL,
123 .manufacture_id = AMD_ID,
124 .model_id = AMD_AM29F002BT,
127 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128 .tested = TEST_UNTESTED,
129 .probe = probe_jedec,
130 .probe_timing = TIMING_ZERO,
140 .block_erase = erase_sector_jedec,
142 .eraseblocks = { {256 * 1024, 1} },
143 .block_erase = erase_chip_block_jedec,
146 .write = write_jedec_1,
147 .read = read_memmapped,
148 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
154 .bustype = BUS_PARALLEL,
155 .manufacture_id = AMD_ID,
156 .model_id = AMD_AM29F016D,
157 .total_size = 2 * 1024,
158 .page_size = 64 * 1024,
159 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
160 .tested = TEST_UNTESTED,
161 .probe = probe_jedec,
162 .probe_timing = TIMING_ZERO,
166 .eraseblocks = { {64 * 1024, 32} },
167 .block_erase = erase_sector_jedec,
169 .eraseblocks = { {2048 * 1024, 1} },
170 .block_erase = erase_chip_block_jedec,
173 .write = write_jedec_1,
174 .read = read_memmapped,
175 .voltage = {4500, 5500},
181 .bustype = BUS_PARALLEL,
182 .manufacture_id = AMD_ID,
183 .model_id = AMD_AM29F040B,
185 .page_size = 64 * 1024,
186 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
187 .tested = TEST_UNTESTED,
188 .probe = probe_jedec,
189 .probe_timing = TIMING_ZERO,
193 .eraseblocks = { {64 * 1024, 8} },
194 .block_erase = erase_sector_jedec,
196 .eraseblocks = { {512 * 1024, 1} },
197 .block_erase = erase_chip_block_jedec,
200 .write = write_jedec_1,
201 .read = read_memmapped,
202 .voltage = {4500, 5500},
208 .bustype = BUS_PARALLEL,
209 .manufacture_id = AMD_ID,
210 .model_id = AMD_AM29F080B,
212 .page_size = 64 * 1024,
213 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
214 .tested = TEST_UNTESTED,
215 .probe = probe_jedec,
216 .probe_timing = TIMING_ZERO,
220 .eraseblocks = { {64 * 1024, 16} },
221 .block_erase = erase_sector_jedec,
223 .eraseblocks = { {1024 * 1024, 1} },
224 .block_erase = erase_chip_block_jedec,
227 .write = write_jedec_1,
228 .read = read_memmapped,
229 .voltage = {4500, 5500},
234 .name = "Am29LV001BB",
235 .bustype = BUS_PARALLEL,
236 .manufacture_id = AMD_ID,
237 .model_id = AMD_AM29LV001BB,
239 .page_size = 64 * 1024, /* unused */
240 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
241 .tested = TEST_OK_PREW,
242 .probe = probe_jedec,
243 .probe_timing = TIMING_ZERO,
252 .block_erase = erase_sector_jedec,
254 .eraseblocks = { {128 * 1024, 1} },
255 .block_erase = erase_chip_block_jedec,
258 .write = write_jedec_1,
259 .read = read_memmapped,
260 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
265 .name = "Am29LV001BT",
266 .bustype = BUS_PARALLEL,
267 .manufacture_id = AMD_ID,
268 .model_id = AMD_AM29LV001BT,
270 .page_size = 64 * 1024, /* unused */
271 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
272 .tested = TEST_UNTESTED,
273 .probe = probe_jedec,
274 .probe_timing = TIMING_ZERO,
283 .block_erase = erase_sector_jedec,
285 .eraseblocks = { {128 * 1024, 1} },
286 .block_erase = erase_chip_block_jedec,
289 .write = write_jedec_1,
290 .read = read_memmapped,
291 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
296 .name = "Am29LV002BB",
297 .bustype = BUS_PARALLEL,
298 .manufacture_id = AMD_ID,
299 .model_id = AMD_AM29LV002BB,
301 .page_size = 64 * 1024, /* unused */
302 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
303 .tested = TEST_UNTESTED,
304 .probe = probe_jedec,
305 .probe_timing = TIMING_ZERO,
315 .block_erase = erase_sector_jedec,
317 .eraseblocks = { {256 * 1024, 1} },
318 .block_erase = erase_chip_block_jedec,
321 .write = write_jedec_1,
322 .read = read_memmapped,
323 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
328 .name = "Am29LV002BT",
329 .bustype = BUS_PARALLEL,
330 .manufacture_id = AMD_ID,
331 .model_id = AMD_AM29LV002BT,
333 .page_size = 64 * 1024, /* unused */
334 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
335 .tested = TEST_UNTESTED,
336 .probe = probe_jedec,
337 .probe_timing = TIMING_ZERO,
347 .block_erase = erase_sector_jedec,
349 .eraseblocks = { {256 * 1024, 1} },
350 .block_erase = erase_chip_block_jedec,
353 .write = write_jedec_1,
354 .read = read_memmapped,
355 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
360 .name = "Am29LV004BB",
361 .bustype = BUS_PARALLEL,
362 .manufacture_id = AMD_ID,
363 .model_id = AMD_AM29LV004BB,
365 .page_size = 64 * 1024, /* unused */
366 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
367 .tested = TEST_UNTESTED,
368 .probe = probe_jedec,
369 .probe_timing = TIMING_ZERO,
379 .block_erase = erase_sector_jedec,
381 .eraseblocks = { {512 * 1024, 1} },
382 .block_erase = erase_chip_block_jedec,
385 .write = write_jedec_1,
386 .read = read_memmapped,
387 .voltage = {2700, 3600},
392 .name = "Am29LV004BT",
393 .bustype = BUS_PARALLEL,
394 .manufacture_id = AMD_ID,
395 .model_id = AMD_AM29LV004BT,
397 .page_size = 64 * 1024, /* unused */
398 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
399 .tested = TEST_UNTESTED,
400 .probe = probe_jedec,
401 .probe_timing = TIMING_ZERO,
411 .block_erase = erase_sector_jedec,
413 .eraseblocks = { {512 * 1024, 1} },
414 .block_erase = erase_chip_block_jedec,
417 .write = write_jedec_1,
418 .read = read_memmapped,
419 .voltage = {2700, 3600},
424 .name = "Am29LV008BB",
425 .bustype = BUS_PARALLEL,
426 .manufacture_id = AMD_ID,
427 .model_id = AMD_AM29LV008BB,
429 .page_size = 64 * 1024, /* unused */
430 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
431 .tested = TEST_OK_PREW,
432 .probe = probe_jedec,
433 .probe_timing = TIMING_ZERO,
443 .block_erase = erase_sector_jedec,
445 .eraseblocks = { {1024 * 1024, 1} },
446 .block_erase = erase_chip_block_jedec,
449 .write = write_jedec_1,
450 .read = read_memmapped,
451 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
456 .name = "Am29LV008BT",
457 .bustype = BUS_PARALLEL,
458 .manufacture_id = AMD_ID,
459 .model_id = AMD_AM29LV008BT,
461 .page_size = 64 * 1024, /* unused */
462 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
463 .tested = TEST_UNTESTED,
464 .probe = probe_jedec,
465 .probe_timing = TIMING_ZERO,
475 .block_erase = erase_sector_jedec,
477 .eraseblocks = { {1024 * 1024, 1} },
478 .block_erase = erase_chip_block_jedec,
481 .write = write_jedec_1,
482 .read = read_memmapped,
483 .voltage = {3000, 3600} /* 3.0-3.6V for type -70R, others 2.7-3.6V */
488 .name = "Am29LV040B",
489 .bustype = BUS_PARALLEL,
490 .manufacture_id = AMD_ID,
491 .model_id = AMD_AM29LV040B,
493 .page_size = 64 * 1024,
494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
495 .tested = TEST_OK_PRE,
496 .probe = probe_jedec,
497 .probe_timing = TIMING_ZERO,
501 .eraseblocks = { {64 * 1024, 8} },
502 .block_erase = erase_sector_jedec,
504 .eraseblocks = { {512 * 1024, 1} },
505 .block_erase = erase_chip_block_jedec,
508 .write = write_jedec_1,
509 .read = read_memmapped,
510 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
515 .name = "Am29LV081B",
516 .bustype = BUS_PARALLEL,
517 .manufacture_id = AMD_ID,
518 .model_id = AMD_AM29LV080B,
520 .page_size = 64 * 1024,
521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
522 .tested = TEST_UNTESTED,
523 .probe = probe_jedec,
524 .probe_timing = TIMING_ZERO,
528 .eraseblocks = { {64 * 1024, 16} },
529 .block_erase = erase_sector_jedec,
531 .eraseblocks = { {1024 * 1024, 1} },
532 .block_erase = erase_chip_block_jedec,
535 .write = write_jedec_1,
536 .read = read_memmapped,
537 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
544 .manufacture_id = AMIC_ID,
545 .model_id = AMIC_A25L05PT,
548 .feature_bits = FEATURE_WRSR_WREN,
549 .tested = TEST_UNTESTED,
550 .probe = probe_spi_rdid4,
551 .probe_timing = TIMING_ZERO,
561 .block_erase = spi_block_erase_d8,
563 .eraseblocks = { {64 * 1024, 1} },
564 .block_erase = spi_block_erase_c7,
567 .printlock = spi_prettyprint_status_register_amic_a25l05p,
568 .unlock = spi_disable_blockprotect,
569 .write = spi_chip_write_256,
570 .read = spi_chip_read,
571 .voltage = {2700, 3600},
578 .manufacture_id = AMIC_ID,
579 .model_id = AMIC_A25L05PU,
582 .feature_bits = FEATURE_WRSR_WREN,
583 .tested = TEST_UNTESTED,
584 .probe = probe_spi_rdid4,
585 .probe_timing = TIMING_ZERO,
595 .block_erase = spi_block_erase_d8,
597 .eraseblocks = { {64 * 1024, 1} },
598 .block_erase = spi_block_erase_c7,
601 .printlock = spi_prettyprint_status_register_amic_a25l05p,
602 .unlock = spi_disable_blockprotect,
603 .write = spi_chip_write_256,
604 .read = spi_chip_read,
605 .voltage = {2700, 3600},
612 .manufacture_id = AMIC_ID,
613 .model_id = AMIC_A25L10PT,
616 .feature_bits = FEATURE_WRSR_WREN,
617 .tested = TEST_UNTESTED,
618 .probe = probe_spi_rdid4,
619 .probe_timing = TIMING_ZERO,
630 .block_erase = spi_block_erase_d8,
632 .eraseblocks = { {128 * 1024, 1} },
633 .block_erase = spi_block_erase_c7,
636 .printlock = spi_prettyprint_status_register_amic_a25l05p,
637 .unlock = spi_disable_blockprotect,
638 .write = spi_chip_write_256,
639 .read = spi_chip_read,
640 .voltage = {2700, 3600},
647 .manufacture_id = AMIC_ID,
648 .model_id = AMIC_A25L10PU,
651 .feature_bits = FEATURE_WRSR_WREN,
652 .tested = TEST_UNTESTED,
653 .probe = probe_spi_rdid4,
654 .probe_timing = TIMING_ZERO,
665 .block_erase = spi_block_erase_d8,
667 .eraseblocks = { {128 * 1024, 1} },
668 .block_erase = spi_block_erase_c7,
671 .printlock = spi_prettyprint_status_register_amic_a25l05p,
672 .unlock = spi_disable_blockprotect,
673 .write = spi_chip_write_256,
674 .read = spi_chip_read,
675 .voltage = {2700, 3600},
682 .manufacture_id = AMIC_ID,
683 .model_id = AMIC_A25L20PT,
686 .feature_bits = FEATURE_WRSR_WREN,
687 .tested = TEST_UNTESTED,
688 .probe = probe_spi_rdid4,
689 .probe_timing = TIMING_ZERO,
700 .block_erase = spi_block_erase_d8,
702 .eraseblocks = { {256 * 1024, 1} },
703 .block_erase = spi_block_erase_c7,
706 .printlock = spi_prettyprint_status_register_amic_a25l05p,
707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
710 .voltage = {2700, 3600},
717 .manufacture_id = AMIC_ID,
718 .model_id = AMIC_A25L20PU,
721 .feature_bits = FEATURE_WRSR_WREN,
722 .tested = TEST_UNTESTED,
723 .probe = probe_spi_rdid4,
724 .probe_timing = TIMING_ZERO,
735 .block_erase = spi_block_erase_d8,
737 .eraseblocks = { {256 * 1024, 1} },
738 .block_erase = spi_block_erase_c7,
741 .printlock = spi_prettyprint_status_register_amic_a25l05p,
742 .unlock = spi_disable_blockprotect,
743 .write = spi_chip_write_256,
744 .read = spi_chip_read,
745 .voltage = {2700, 3600},
748 /* The A25L40P{T,U} chips are distinguished by their
749 * erase block layouts, but without any distinction in RDID.
750 * This inexplicable quirk was verified by Rudolf Marek
751 * and discussed on the flashrom mailing list on 2010-07-12.
757 .manufacture_id = AMIC_ID,
758 .model_id = AMIC_A25L40PT,
761 .feature_bits = FEATURE_WRSR_WREN,
762 .tested = TEST_OK_PR,
763 .probe = probe_spi_rdid4,
764 .probe_timing = TIMING_ZERO,
775 .block_erase = spi_block_erase_d8,
777 .eraseblocks = { {512 * 1024, 1} },
778 .block_erase = spi_block_erase_c7,
781 .printlock = spi_prettyprint_status_register_amic_a25l40p,
782 .unlock = spi_disable_blockprotect,
783 .write = spi_chip_write_256,
784 .read = spi_chip_read,
785 .voltage = {2700, 3600},
792 .manufacture_id = AMIC_ID,
793 .model_id = AMIC_A25L40PU,
796 .feature_bits = FEATURE_WRSR_WREN,
797 .tested = TEST_OK_PR,
798 .probe = probe_spi_rdid4,
799 .probe_timing = TIMING_ZERO,
810 .block_erase = spi_block_erase_d8,
812 .eraseblocks = { {512 * 1024, 1} },
813 .block_erase = spi_block_erase_c7,
816 .printlock = spi_prettyprint_status_register_amic_a25l40p,
817 .unlock = spi_disable_blockprotect,
818 .write = spi_chip_write_256,
819 .read = spi_chip_read,
820 .voltage = {2700, 3600},
827 .manufacture_id = AMIC_ID,
828 .model_id = AMIC_A25L80P,
831 .feature_bits = FEATURE_WRSR_WREN,
832 .tested = TEST_OK_PRE,
833 .probe = probe_spi_rdid4,
834 .probe_timing = TIMING_ZERO,
845 .block_erase = spi_block_erase_d8,
847 .eraseblocks = { {1024 * 1024, 1} },
848 .block_erase = spi_block_erase_c7,
851 .printlock = spi_prettyprint_status_register_amic_a25l40p,
852 .unlock = spi_disable_blockprotect,
853 .write = spi_chip_write_256,
854 .read = spi_chip_read,
855 .voltage = {2700, 3600},
862 .manufacture_id = AMIC_ID,
863 .model_id = AMIC_A25L16PT,
866 .feature_bits = FEATURE_WRSR_WREN,
867 .tested = TEST_UNTESTED,
868 .probe = probe_spi_rdid4,
869 .probe_timing = TIMING_ZERO,
880 .block_erase = spi_block_erase_d8,
882 .eraseblocks = { {2048 * 1024, 1} },
883 .block_erase = spi_block_erase_60,
885 .eraseblocks = { {2048 * 1024, 1} },
886 .block_erase = spi_block_erase_c7,
889 .printlock = spi_prettyprint_status_register_amic_a25l40p,
890 .unlock = spi_disable_blockprotect,
891 .write = spi_chip_write_256,
892 .read = spi_chip_read,
893 .voltage = {2700, 3600},
900 .manufacture_id = AMIC_ID,
901 .model_id = AMIC_A25L16PU,
904 .feature_bits = FEATURE_WRSR_WREN,
905 .tested = TEST_OK_PR,
906 .probe = probe_spi_rdid4,
907 .probe_timing = TIMING_ZERO,
918 .block_erase = spi_block_erase_d8,
920 .eraseblocks = { {2048 * 1024, 1} },
921 .block_erase = spi_block_erase_60,
923 .eraseblocks = { {2048 * 1024, 1} },
924 .block_erase = spi_block_erase_c7,
927 .printlock = spi_prettyprint_status_register_amic_a25l40p,
928 .unlock = spi_disable_blockprotect,
929 .write = spi_chip_write_256,
930 .read = spi_chip_read,
931 .voltage = {2700, 3600},
938 .manufacture_id = AMIC_ID_NOPREFIX,
939 .model_id = AMIC_A25L512,
942 .feature_bits = FEATURE_WRSR_WREN,
943 .tested = TEST_UNTESTED,
944 .probe = probe_spi_rdid,
945 .probe_timing = TIMING_ZERO,
949 .eraseblocks = { { 4 * 1024, 16 } },
950 .block_erase = spi_block_erase_20,
952 .eraseblocks = { { 64 * 1024, 1 } },
953 .block_erase = spi_block_erase_d8,
955 .eraseblocks = { { 64 * 1024, 1 } },
956 .block_erase = spi_block_erase_c7,
959 .printlock = spi_prettyprint_status_register_amic_a25l40p,
960 .unlock = spi_disable_blockprotect,
961 .write = spi_chip_write_256,
962 .read = spi_chip_read,
963 .voltage = {2700, 3600},
970 .manufacture_id = AMIC_ID_NOPREFIX,
971 .model_id = AMIC_A25L010,
974 .feature_bits = FEATURE_WRSR_WREN,
975 .tested = TEST_UNTESTED,
976 .probe = probe_spi_rdid,
977 .probe_timing = TIMING_ZERO,
981 .eraseblocks = { { 4 * 1024, 32 } },
982 .block_erase = spi_block_erase_20,
984 .eraseblocks = { { 64 * 1024, 2 } },
985 .block_erase = spi_block_erase_d8,
987 .eraseblocks = { { 128 * 1024, 1 } },
988 .block_erase = spi_block_erase_c7,
991 .printlock = spi_prettyprint_status_register_amic_a25l40p,
992 .unlock = spi_disable_blockprotect,
993 .write = spi_chip_write_256,
994 .read = spi_chip_read,
995 .voltage = {2700, 3600},
1002 .manufacture_id = AMIC_ID_NOPREFIX,
1003 .model_id = AMIC_A25L020,
1006 .feature_bits = FEATURE_WRSR_WREN,
1007 .tested = TEST_UNTESTED,
1008 .probe = probe_spi_rdid,
1009 .probe_timing = TIMING_ZERO,
1013 .eraseblocks = { { 4 * 1024, 64 } },
1014 .block_erase = spi_block_erase_20,
1016 .eraseblocks = { { 64 * 1024, 4 } },
1017 .block_erase = spi_block_erase_d8,
1019 .eraseblocks = { { 256 * 1024, 1 } },
1020 .block_erase = spi_block_erase_c7,
1023 .printlock = spi_prettyprint_status_register_amic_a25l40p,
1024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
1027 .voltage = {2700, 3600},
1034 .manufacture_id = AMIC_ID_NOPREFIX,
1035 .model_id = AMIC_A25L040,
1038 .feature_bits = FEATURE_WRSR_WREN,
1039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid,
1041 .probe_timing = TIMING_ZERO,
1045 .eraseblocks = { { 4 * 1024, 128 } },
1046 .block_erase = spi_block_erase_20,
1048 .eraseblocks = { { 64 * 1024, 8 } },
1049 .block_erase = spi_block_erase_d8,
1051 .eraseblocks = { { 512 * 1024, 1 } },
1052 .block_erase = spi_block_erase_c7,
1055 .printlock = spi_prettyprint_status_register_amic_a25l40p,
1056 .unlock = spi_disable_blockprotect,
1057 .write = spi_chip_write_256,
1058 .read = spi_chip_read,
1059 .voltage = {2700, 3600},
1066 .manufacture_id = AMIC_ID_NOPREFIX,
1067 .model_id = AMIC_A25L080,
1070 .feature_bits = FEATURE_WRSR_WREN,
1071 .tested = TEST_UNTESTED,
1072 .probe = probe_spi_rdid,
1073 .probe_timing = TIMING_ZERO,
1077 .eraseblocks = { { 4 * 1024, 256 } },
1078 .block_erase = spi_block_erase_20,
1080 .eraseblocks = { { 64 * 1024, 16 } },
1081 .block_erase = spi_block_erase_d8,
1083 .eraseblocks = { { 1024 * 1024, 1 } },
1084 .block_erase = spi_block_erase_c7,
1087 .printlock = spi_prettyprint_status_register_amic_a25l40p,
1088 .unlock = spi_disable_blockprotect,
1089 .write = spi_chip_write_256,
1090 .read = spi_chip_read,
1091 .voltage = {2700, 3600},
1098 .manufacture_id = AMIC_ID_NOPREFIX,
1099 .model_id = AMIC_A25L016,
1102 .feature_bits = FEATURE_WRSR_WREN,
1103 .tested = TEST_UNTESTED,
1104 .probe = probe_spi_rdid,
1105 .probe_timing = TIMING_ZERO,
1109 .eraseblocks = { { 4 * 1024, 512 } },
1110 .block_erase = spi_block_erase_20,
1112 .eraseblocks = { { 64 * 1024, 32 } },
1113 .block_erase = spi_block_erase_d8,
1115 .eraseblocks = { { 2048 * 1024, 1 } },
1116 .block_erase = spi_block_erase_c7,
1119 .printlock = spi_prettyprint_status_register_amic_a25l40p,
1120 .unlock = spi_disable_blockprotect,
1121 .write = spi_chip_write_256,
1122 .read = spi_chip_read,
1123 .voltage = {2700, 3600},
1130 .manufacture_id = AMIC_ID_NOPREFIX,
1131 .model_id = AMIC_A25L032,
1134 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1136 .tested = TEST_OK_PREW,
1137 .probe = probe_spi_rdid,
1138 .probe_timing = TIMING_ZERO,
1142 .eraseblocks = { { 4 * 1024, 1024 } },
1143 .block_erase = spi_block_erase_20,
1145 .eraseblocks = { { 64 * 1024, 64 } },
1146 .block_erase = spi_block_erase_52,
1148 .eraseblocks = { { 64 * 1024, 64 } },
1149 .block_erase = spi_block_erase_d8,
1151 .eraseblocks = { { 4096 * 1024, 1 } },
1152 .block_erase = spi_block_erase_60,
1154 .eraseblocks = { { 4096 * 1024, 1 } },
1155 .block_erase = spi_block_erase_c7,
1158 .printlock = spi_prettyprint_status_register_amic_a25l032,
1159 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1160 .write = spi_chip_write_256,
1161 .read = spi_chip_read,
1162 .voltage = {2700, 3600},
1169 .manufacture_id = AMIC_ID_NOPREFIX,
1170 .model_id = AMIC_A25LQ032,
1173 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1174 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1175 .tested = TEST_UNTESTED,
1176 .probe = probe_spi_rdid,
1177 .probe_timing = TIMING_ZERO,
1181 .eraseblocks = { { 4 * 1024, 1024 } },
1182 .block_erase = spi_block_erase_20,
1184 .eraseblocks = { { 64 * 1024, 64 } },
1185 .block_erase = spi_block_erase_52,
1187 .eraseblocks = { { 64 * 1024, 64 } },
1188 .block_erase = spi_block_erase_d8,
1190 .eraseblocks = { { 4096 * 1024, 1 } },
1191 .block_erase = spi_block_erase_60,
1193 .eraseblocks = { { 4096 * 1024, 1 } },
1194 .block_erase = spi_block_erase_c7,
1197 .printlock = spi_prettyprint_status_register_amic_a25lq032,
1198 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1199 .write = spi_chip_write_256,
1200 .read = spi_chip_read,
1201 .voltage = {2700, 3600},
1207 .bustype = BUS_PARALLEL,
1208 .manufacture_id = AMIC_ID_NOPREFIX,
1209 .model_id = AMIC_A29002B,
1211 .page_size = 64 * 1024,
1212 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1213 .tested = TEST_UNTESTED,
1214 .probe = probe_jedec,
1215 .probe_timing = TIMING_ZERO,
1225 .block_erase = erase_sector_jedec,
1227 .eraseblocks = { {256 * 1024, 1} },
1228 .block_erase = erase_chip_block_jedec,
1231 .write = write_jedec_1,
1232 .read = read_memmapped,
1233 .voltage = {4500, 5500},
1239 .bustype = BUS_PARALLEL,
1240 .manufacture_id = AMIC_ID_NOPREFIX,
1241 .model_id = AMIC_A29002T,
1243 .page_size = 64 * 1024,
1244 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1245 .tested = TEST_OK_PREW,
1246 .probe = probe_jedec,
1247 .probe_timing = TIMING_ZERO,
1257 .block_erase = erase_sector_jedec,
1259 .eraseblocks = { {256 * 1024, 1} },
1260 .block_erase = erase_chip_block_jedec,
1263 .write = write_jedec_1,
1264 .read = read_memmapped,
1265 .voltage = {4500, 5500},
1271 .bustype = BUS_PARALLEL,
1272 .manufacture_id = AMIC_ID_NOPREFIX,
1273 .model_id = AMIC_A29040B,
1275 .page_size = 64 * 1024,
1276 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1277 .tested = TEST_UNTESTED,
1278 .probe = probe_jedec,
1279 .probe_timing = TIMING_ZERO,
1283 .eraseblocks = { {64 * 1024, 8} },
1284 .block_erase = erase_sector_jedec,
1286 .eraseblocks = { {512 * 1024, 1} },
1287 .block_erase = erase_chip_block_jedec,
1290 .write = write_jedec_1,
1291 .read = read_memmapped,
1292 .voltage = {4500, 5500},
1297 .name = "A49LF040A",
1299 .manufacture_id = AMIC_ID_NOPREFIX,
1300 .model_id = AMIC_A49LF040A,
1302 .page_size = 64 * 1024,
1303 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
1304 .tested = TEST_OK_PREW,
1305 .probe = probe_jedec,
1306 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1310 .eraseblocks = { {64 * 1024, 8} },
1311 .block_erase = erase_block_jedec,
1313 .eraseblocks = { {512 * 1024, 1} },
1314 .block_erase = erase_chip_block_jedec,
1317 .unlock = unlock_49fl00x,
1318 .write = write_jedec_1,
1319 .read = read_memmapped,
1320 .voltage = {3000, 3600},
1325 .name = "AT25DF021",
1327 .manufacture_id = ATMEL_ID,
1328 .model_id = ATMEL_AT25DF021,
1331 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1332 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1333 .tested = TEST_UNTESTED,
1334 .probe = probe_spi_rdid,
1335 .probe_timing = TIMING_ZERO,
1339 .eraseblocks = { {4 * 1024, 64} },
1340 .block_erase = spi_block_erase_20,
1342 .eraseblocks = { {32 * 1024, 8} },
1343 .block_erase = spi_block_erase_52,
1345 .eraseblocks = { {64 * 1024, 4} },
1346 .block_erase = spi_block_erase_d8,
1348 .eraseblocks = { {256 * 1024, 1} },
1349 .block_erase = spi_block_erase_60,
1351 .eraseblocks = { {256 * 1024, 1} },
1352 .block_erase = spi_block_erase_c7,
1355 .printlock = spi_prettyprint_status_register_at25df,
1356 .unlock = spi_disable_blockprotect_at25df,
1357 .write = spi_chip_write_256,
1358 .read = spi_chip_read,
1359 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1364 .name = "AT25DF041A",
1366 .manufacture_id = ATMEL_ID,
1367 .model_id = ATMEL_AT25DF041A,
1370 .feature_bits = FEATURE_WRSR_WREN,
1371 .tested = TEST_UNTESTED,
1372 .probe = probe_spi_rdid,
1373 .probe_timing = TIMING_ZERO,
1377 .eraseblocks = { {4 * 1024, 128} },
1378 .block_erase = spi_block_erase_20,
1380 .eraseblocks = { {32 * 1024, 16} },
1381 .block_erase = spi_block_erase_52,
1383 .eraseblocks = { {64 * 1024, 8} },
1384 .block_erase = spi_block_erase_d8,
1386 .eraseblocks = { {512 * 1024, 1} },
1387 .block_erase = spi_block_erase_60,
1389 .eraseblocks = { {512 * 1024, 1} },
1390 .block_erase = spi_block_erase_c7,
1393 .printlock = spi_prettyprint_status_register_at25df,
1394 .unlock = spi_disable_blockprotect_at25df,
1395 .write = spi_chip_write_256,
1396 .read = spi_chip_read,
1397 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
1402 .name = "AT25DF081",
1404 .manufacture_id = ATMEL_ID,
1405 .model_id = ATMEL_AT25DF081,
1408 .feature_bits = FEATURE_WRSR_WREN,
1409 .tested = TEST_UNTESTED,
1410 .probe = probe_spi_rdid,
1411 .probe_timing = TIMING_ZERO,
1415 .eraseblocks = { {4 * 1024, 256} },
1416 .block_erase = spi_block_erase_20,
1418 .eraseblocks = { {32 * 1024, 32} },
1419 .block_erase = spi_block_erase_52,
1421 .eraseblocks = { {64 * 1024, 16} },
1422 .block_erase = spi_block_erase_d8,
1424 .eraseblocks = { {1024 * 1024, 1} },
1425 .block_erase = spi_block_erase_60,
1427 .eraseblocks = { {1024 * 1024, 1} },
1428 .block_erase = spi_block_erase_c7,
1431 .printlock = spi_prettyprint_status_register_at25df,
1432 .unlock = spi_disable_blockprotect_at25df,
1433 .write = spi_chip_write_256,
1434 .read = spi_chip_read,
1435 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
1440 .name = "AT25DF081A",
1442 .manufacture_id = ATMEL_ID,
1443 .model_id = ATMEL_AT25DF081A,
1446 .feature_bits = FEATURE_WRSR_WREN,
1447 .tested = TEST_UNTESTED,
1448 .probe = probe_spi_rdid,
1449 .probe_timing = TIMING_ZERO,
1453 .eraseblocks = { {4 * 1024, 256} },
1454 .block_erase = spi_block_erase_20,
1456 .eraseblocks = { {32 * 1024, 32} },
1457 .block_erase = spi_block_erase_52,
1459 .eraseblocks = { {64 * 1024, 16} },
1460 .block_erase = spi_block_erase_d8,
1462 .eraseblocks = { {1024 * 1024, 1} },
1463 .block_erase = spi_block_erase_60,
1465 .eraseblocks = { {1024 * 1024, 1} },
1466 .block_erase = spi_block_erase_c7,
1469 .printlock = spi_prettyprint_status_register_at25df_sec,
1470 .unlock = spi_disable_blockprotect_at25df_sec,
1471 .write = spi_chip_write_256,
1472 .read = spi_chip_read,
1473 .voltage = {2700, 3600},
1478 .name = "AT25DF161",
1480 .manufacture_id = ATMEL_ID,
1481 .model_id = ATMEL_AT25DF161,
1484 .feature_bits = FEATURE_WRSR_WREN,
1485 .tested = TEST_OK_PROBE,
1486 .probe = probe_spi_rdid,
1487 .probe_timing = TIMING_ZERO,
1491 .eraseblocks = { {4 * 1024, 512} },
1492 .block_erase = spi_block_erase_20,
1494 .eraseblocks = { {32 * 1024, 64} },
1495 .block_erase = spi_block_erase_52,
1497 .eraseblocks = { {64 * 1024, 32} },
1498 .block_erase = spi_block_erase_d8,
1500 .eraseblocks = { {2 * 1024 * 1024, 1} },
1501 .block_erase = spi_block_erase_60,
1503 .eraseblocks = { {2 * 1024 * 1024, 1} },
1504 .block_erase = spi_block_erase_c7,
1507 .printlock = spi_prettyprint_status_register_at25df_sec,
1508 .unlock = spi_disable_blockprotect_at25df_sec,
1509 .write = spi_chip_write_256,
1510 .read = spi_chip_read,
1511 .voltage = {2700, 3600},
1516 .name = "AT25DF321",
1518 .manufacture_id = ATMEL_ID,
1519 .model_id = ATMEL_AT25DF321,
1522 .feature_bits = FEATURE_WRSR_WREN,
1523 .tested = TEST_OK_PREW,
1524 .probe = probe_spi_rdid,
1525 .probe_timing = TIMING_ZERO,
1529 .eraseblocks = { {4 * 1024, 1024} },
1530 .block_erase = spi_block_erase_20,
1532 .eraseblocks = { {32 * 1024, 128} },
1533 .block_erase = spi_block_erase_52,
1535 .eraseblocks = { {64 * 1024, 64} },
1536 .block_erase = spi_block_erase_d8,
1538 .eraseblocks = { {4 * 1024 * 1024, 1} },
1539 .block_erase = spi_block_erase_60,
1541 .eraseblocks = { {4 * 1024 * 1024, 1} },
1542 .block_erase = spi_block_erase_c7,
1545 .printlock = spi_prettyprint_status_register_at25df,
1546 .unlock = spi_disable_blockprotect_at25df,
1547 .write = spi_chip_write_256,
1548 .read = spi_chip_read,
1549 .voltage = {2700, 3600},
1554 .name = "AT25DF321A",
1556 .manufacture_id = ATMEL_ID,
1557 .model_id = ATMEL_AT25DF321A,
1560 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1561 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1562 .tested = TEST_OK_PREW,
1563 .probe = probe_spi_rdid,
1564 .probe_timing = TIMING_ZERO,
1568 .eraseblocks = { {4 * 1024, 1024} },
1569 .block_erase = spi_block_erase_20,
1571 .eraseblocks = { {32 * 1024, 128} },
1572 .block_erase = spi_block_erase_52,
1574 .eraseblocks = { {64 * 1024, 64} },
1575 .block_erase = spi_block_erase_d8,
1577 .eraseblocks = { {4 * 1024 * 1024, 1} },
1578 .block_erase = spi_block_erase_60,
1580 .eraseblocks = { {4 * 1024 * 1024, 1} },
1581 .block_erase = spi_block_erase_c7,
1584 .printlock = spi_prettyprint_status_register_at25df_sec,
1585 .unlock = spi_disable_blockprotect_at25df_sec,
1586 .write = spi_chip_write_256,
1587 .read = spi_chip_read,
1588 .voltage = {2700, 3600},
1593 .name = "AT25DF641(A)",
1595 .manufacture_id = ATMEL_ID,
1596 .model_id = ATMEL_AT25DF641,
1599 .feature_bits = FEATURE_WRSR_WREN,
1600 .tested = TEST_UNTESTED,
1601 .probe = probe_spi_rdid,
1602 .probe_timing = TIMING_ZERO,
1606 .eraseblocks = { {4 * 1024, 2048} },
1607 .block_erase = spi_block_erase_20,
1609 .eraseblocks = { {32 * 1024, 256} },
1610 .block_erase = spi_block_erase_52,
1612 .eraseblocks = { {64 * 1024, 128} },
1613 .block_erase = spi_block_erase_d8,
1615 .eraseblocks = { {8 * 1024 * 1024, 1} },
1616 .block_erase = spi_block_erase_60,
1618 .eraseblocks = { {8 * 1024 * 1024, 1} },
1619 .block_erase = spi_block_erase_c7,
1622 .printlock = spi_prettyprint_status_register_at25df_sec,
1623 .unlock = spi_disable_blockprotect_at25df_sec,
1624 .write = spi_chip_write_256,
1625 .read = spi_chip_read,
1626 .voltage = {2700, 3600},
1631 .name = "AT25DQ161",
1633 .manufacture_id = ATMEL_ID,
1634 .model_id = ATMEL_AT25DQ161,
1637 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1638 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1639 .tested = TEST_UNTESTED,
1640 .probe = probe_spi_rdid,
1641 .probe_timing = TIMING_ZERO,
1645 .eraseblocks = { {4 * 1024, 512} },
1646 .block_erase = spi_block_erase_20,
1648 .eraseblocks = { {32 * 1024, 64} },
1649 .block_erase = spi_block_erase_52,
1651 .eraseblocks = { {64 * 1024, 32} },
1652 .block_erase = spi_block_erase_d8,
1654 .eraseblocks = { {2 * 1024 * 1024, 1} },
1655 .block_erase = spi_block_erase_60,
1657 .eraseblocks = { {2 * 1024 * 1024, 1} },
1658 .block_erase = spi_block_erase_c7,
1661 .printlock = spi_prettyprint_status_register_at25df_sec,
1662 .unlock = spi_disable_blockprotect_at25df_sec,
1663 .write = spi_chip_write_256,
1664 .read = spi_chip_read,
1665 .voltage = {2700, 3600},
1670 .name = "AT25F512B",
1672 .manufacture_id = ATMEL_ID,
1673 .model_id = ATMEL_AT25F512B,
1676 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1677 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1678 .tested = TEST_UNTESTED,
1679 .probe = probe_spi_rdid,
1680 .probe_timing = TIMING_ZERO,
1684 .eraseblocks = { {4 * 1024, 16} },
1685 .block_erase = spi_block_erase_20,
1687 .eraseblocks = { {32 * 1024, 2} },
1688 .block_erase = spi_block_erase_52,
1690 .eraseblocks = { {32 * 1024, 2} },
1691 .block_erase = spi_block_erase_d8,
1693 .eraseblocks = { {64 * 1024, 1} },
1694 .block_erase = spi_block_erase_60,
1696 .eraseblocks = { {64 * 1024, 1} },
1697 .block_erase = spi_block_erase_c7,
1700 .printlock = spi_prettyprint_status_register_at25f,
1701 .unlock = spi_disable_blockprotect_at25f,
1702 .write = spi_chip_write_256,
1703 .read = spi_chip_read,
1704 .voltage = {2700, 3600},
1709 .name = "AT25FS010",
1711 .manufacture_id = ATMEL_ID,
1712 .model_id = ATMEL_AT25FS010,
1715 .feature_bits = FEATURE_WRSR_WREN,
1716 .tested = TEST_UNTESTED,
1717 .probe = probe_spi_rdid,
1718 .probe_timing = TIMING_ZERO,
1722 .eraseblocks = { {4 * 1024, 32} },
1723 .block_erase = spi_block_erase_20,
1725 .eraseblocks = { {4 * 1024, 32} },
1726 .block_erase = spi_block_erase_d7,
1728 .eraseblocks = { {32 * 1024, 4} },
1729 .block_erase = spi_block_erase_52,
1731 .eraseblocks = { {32 * 1024, 4} },
1732 .block_erase = spi_block_erase_d8,
1734 .eraseblocks = { {128 * 1024, 1} },
1735 .block_erase = spi_block_erase_60,
1737 .eraseblocks = { {128 * 1024, 1} },
1738 .block_erase = spi_block_erase_c7,
1741 .printlock = spi_prettyprint_status_register_at25fs010,
1742 .unlock = spi_disable_blockprotect_at25fs010,
1743 .write = spi_chip_write_256,
1744 .read = spi_chip_read,
1745 .voltage = {2700, 3600},
1750 .name = "AT25FS040",
1752 .manufacture_id = ATMEL_ID,
1753 .model_id = ATMEL_AT25FS040,
1756 .feature_bits = FEATURE_WRSR_WREN,
1757 .tested = TEST_UNTESTED,
1758 .probe = probe_spi_rdid,
1759 .probe_timing = TIMING_ZERO,
1763 .eraseblocks = { {4 * 1024, 128} },
1764 .block_erase = spi_block_erase_20,
1766 .eraseblocks = { {64 * 1024, 8} },
1767 .block_erase = spi_block_erase_52,
1769 .eraseblocks = { {64 * 1024, 8} },
1770 .block_erase = spi_block_erase_d8,
1772 .eraseblocks = { {512 * 1024, 1} },
1773 .block_erase = spi_block_erase_60,
1775 .eraseblocks = { {512 * 1024, 1} },
1776 .block_erase = spi_block_erase_c7,
1779 .printlock = spi_prettyprint_status_register_at25fs040,
1780 .unlock = spi_disable_blockprotect_at25fs040,
1781 .write = spi_chip_write_256,
1782 .read = spi_chip_read,
1783 .voltage = {2700, 3600},
1788 .name = "AT26DF041",
1790 .manufacture_id = ATMEL_ID,
1791 .model_id = ATMEL_AT26DF041,
1794 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
1795 .tested = TEST_UNTESTED,
1796 .probe = probe_spi_rdid,
1797 .probe_timing = TIMING_ZERO,
1801 .eraseblocks = { {4 * 1024, 128} },
1802 .block_erase = spi_block_erase_20,
1805 .write = NULL /* Incompatible Page write */,
1806 .read = spi_chip_read,
1807 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
1812 .name = "AT26DF081A",
1814 .manufacture_id = ATMEL_ID,
1815 .model_id = ATMEL_AT26DF081A,
1818 .feature_bits = FEATURE_WRSR_WREN,
1819 .tested = TEST_OK_PREW,
1820 .probe = probe_spi_rdid,
1821 .probe_timing = TIMING_ZERO,
1825 .eraseblocks = { {4 * 1024, 256} },
1826 .block_erase = spi_block_erase_20,
1828 .eraseblocks = { {32 * 1024, 32} },
1829 .block_erase = spi_block_erase_52,
1831 .eraseblocks = { {64 * 1024, 16} },
1832 .block_erase = spi_block_erase_d8,
1834 .eraseblocks = { {1024 * 1024, 1} },
1835 .block_erase = spi_block_erase_60,
1837 .eraseblocks = { {1024 * 1024, 1} },
1838 .block_erase = spi_block_erase_c7,
1841 .printlock = spi_prettyprint_status_register_atmel_at26df081a,
1842 .unlock = spi_disable_blockprotect_at25df,
1843 .write = spi_chip_write_256,
1844 .read = spi_chip_read,
1845 .voltage = {2700, 3600},
1850 .name = "AT26DF161",
1852 .manufacture_id = ATMEL_ID,
1853 .model_id = ATMEL_AT26DF161,
1856 .feature_bits = FEATURE_WRSR_WREN,
1857 .tested = TEST_OK_PR,
1858 .probe = probe_spi_rdid,
1859 .probe_timing = TIMING_ZERO,
1863 .eraseblocks = { {4 * 1024, 512} },
1864 .block_erase = spi_block_erase_20,
1866 .eraseblocks = { {32 * 1024, 64} },
1867 .block_erase = spi_block_erase_52,
1869 .eraseblocks = { {64 * 1024, 32} },
1870 .block_erase = spi_block_erase_d8,
1872 .eraseblocks = { {2 * 1024 * 1024, 1} },
1873 .block_erase = spi_block_erase_60,
1875 .eraseblocks = { {2 * 1024 * 1024, 1} },
1876 .block_erase = spi_block_erase_c7,
1879 .printlock = spi_prettyprint_status_register_at25df,
1880 .unlock = spi_disable_blockprotect,
1881 .write = spi_chip_write_256,
1882 .read = spi_chip_read,
1883 .voltage = {2700, 3600},
1888 .name = "AT26DF161A",
1890 .manufacture_id = ATMEL_ID,
1891 .model_id = ATMEL_AT26DF161A,
1894 .feature_bits = FEATURE_WRSR_WREN,
1895 .tested = TEST_UNTESTED,
1896 .probe = probe_spi_rdid,
1897 .probe_timing = TIMING_ZERO,
1901 .eraseblocks = { {4 * 1024, 512} },
1902 .block_erase = spi_block_erase_20,
1904 .eraseblocks = { {32 * 1024, 64} },
1905 .block_erase = spi_block_erase_52,
1907 .eraseblocks = { {64 * 1024, 32} },
1908 .block_erase = spi_block_erase_d8,
1910 .eraseblocks = { {2 * 1024 * 1024, 1} },
1911 .block_erase = spi_block_erase_60,
1913 .eraseblocks = { {2 * 1024 * 1024, 1} },
1914 .block_erase = spi_block_erase_c7,
1917 .printlock = spi_prettyprint_status_register_atmel_at26df081a,
1918 .unlock = spi_disable_blockprotect,
1919 .write = spi_chip_write_256,
1920 .read = spi_chip_read,
1921 .voltage = {2700, 3600},
1924 /*The AT26DF321 has the same ID as the AT25DF321. */
1927 .name = "AT26DF321",
1929 .manufacture_id = ATMEL_ID,
1930 .model_id = ATMEL_AT26DF321,
1933 .feature_bits = FEATURE_WRSR_WREN,
1934 .tested = TEST_UNTESTED,
1935 .probe = probe_spi_rdid,
1936 .probe_timing = TIMING_ZERO,
1937 .printlock = spi_prettyprint_status_register_atmel_at26df081a,
1938 .unlock = spi_disable_blockprotect,
1939 .write = spi_chip_write_256,
1940 .read = spi_chip_read,
1947 .manufacture_id = ATMEL_ID,
1948 .model_id = ATMEL_AT26F004,
1951 .tested = TEST_UNTESTED,
1952 .feature_bits = FEATURE_WRSR_WREN,
1953 .probe = probe_spi_rdid,
1954 .probe_timing = TIMING_ZERO,
1958 .eraseblocks = { {4 * 1024, 128} },
1959 .block_erase = spi_block_erase_20,
1961 .eraseblocks = { {32 * 1024, 16} },
1962 .block_erase = spi_block_erase_52,
1964 .eraseblocks = { {64 * 1024, 8} },
1965 .block_erase = spi_block_erase_d8,
1967 .eraseblocks = { {512 * 1024, 1} },
1968 .block_erase = spi_block_erase_60,
1970 .eraseblocks = { {512 * 1024, 1} },
1971 .block_erase = spi_block_erase_c7,
1974 .write = NULL /* Incompatible Page write */,
1975 .read = spi_chip_read,
1976 .voltage = {2700, 3600},
1982 .bustype = BUS_PARALLEL,
1983 .manufacture_id = ATMEL_ID,
1984 .model_id = ATMEL_AT29C512,
1987 .feature_bits = FEATURE_LONG_RESET,
1988 .tested = TEST_OK_PREW,
1989 .probe = probe_jedec,
1990 .probe_timing = 10000, /* 10mS, Enter=Exec */
1994 .eraseblocks = { {64 * 1024, 1} },
1995 .block_erase = erase_chip_block_jedec,
1998 .write = write_jedec,
1999 .read = read_memmapped,
2000 .voltage = {4500, 5500},
2005 .name = "AT29C010A",
2006 .bustype = BUS_PARALLEL,
2007 .manufacture_id = ATMEL_ID,
2008 .model_id = ATMEL_AT29C010A,
2011 .feature_bits = FEATURE_LONG_RESET,
2012 .tested = TEST_OK_PRE,
2013 .probe = probe_jedec,
2014 .probe_timing = 10000, /* 10mS, Enter=Exec */
2018 .eraseblocks = { {128 * 1024, 1} },
2019 .block_erase = erase_chip_block_jedec,
2022 .write = write_jedec, /* FIXME */
2023 .read = read_memmapped,
2024 .voltage = {4500, 5500},
2030 .bustype = BUS_PARALLEL,
2031 .manufacture_id = ATMEL_ID,
2032 .model_id = ATMEL_AT29C020,
2035 .feature_bits = FEATURE_LONG_RESET,
2036 .tested = TEST_UNTESTED,
2037 .probe = probe_jedec,
2038 .probe_timing = 10000, /* 10ms */
2042 .eraseblocks = { {256 * 1024, 1} },
2043 .block_erase = erase_chip_block_jedec,
2046 .write = write_jedec,
2047 .read = read_memmapped,
2048 .voltage = {4500, 5500},
2053 .name = "AT29C040A",
2054 .bustype = BUS_PARALLEL,
2055 .manufacture_id = ATMEL_ID,
2056 .model_id = ATMEL_AT29C040A,
2059 .feature_bits = FEATURE_LONG_RESET,
2060 .tested = TEST_UNTESTED,
2061 .probe = probe_jedec,
2062 .probe_timing = 10000, /* 10 ms */
2066 .eraseblocks = { {512 * 1024, 1} },
2067 .block_erase = erase_chip_block_jedec,
2070 .write = write_jedec,
2071 .read = read_memmapped,
2072 .voltage = {4500, 5500},
2077 .name = "AT45CS1282",
2079 .manufacture_id = ATMEL_ID,
2080 .model_id = ATMEL_AT45CS1282,
2081 .total_size = 16896 /* No power of two sizes */,
2082 .page_size = 1056 /* No power of two sizes */,
2083 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2084 .tested = TEST_BAD_READ,
2085 .probe = probe_spi_rdid,
2086 .probe_timing = TIMING_ZERO,
2087 .write = NULL /* Incompatible Page write */,
2088 .read = NULL /* Incompatible read */,
2089 .voltage = {2700, 3600},
2094 .name = "AT45DB011D",
2096 .manufacture_id = ATMEL_ID,
2097 .model_id = ATMEL_AT45DB011D,
2098 .total_size = 128 /* Size can only be determined from status register */,
2099 .page_size = 256 /* Size can only be determined from status register */,
2100 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2101 .tested = TEST_BAD_READ,
2102 .probe = probe_spi_rdid,
2103 .probe_timing = TIMING_ZERO,
2106 .voltage = {2700, 3600},
2111 .name = "AT45DB021D",
2113 .manufacture_id = ATMEL_ID,
2114 .model_id = ATMEL_AT45DB021D,
2115 .total_size = 256 /* Size can only be determined from status register */,
2116 .page_size = 256 /* Size can only be determined from status register */,
2117 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2118 .tested = TEST_BAD_READ,
2119 .probe = probe_spi_rdid,
2120 .probe_timing = TIMING_ZERO,
2123 .voltage = {2700, 3600},
2128 .name = "AT45DB041D",
2130 .manufacture_id = ATMEL_ID,
2131 .model_id = ATMEL_AT45DB041D,
2132 .total_size = 512 /* Size can only be determined from status register */,
2133 .page_size = 256 /* Size can only be determined from status register */,
2134 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2135 .tested = TEST_BAD_READ,
2136 .probe = probe_spi_rdid,
2137 .probe_timing = TIMING_ZERO,
2140 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2145 .name = "AT45DB081D",
2147 .manufacture_id = ATMEL_ID,
2148 .model_id = ATMEL_AT45DB081D,
2149 .total_size = 1024 /* Size can only be determined from status register */,
2150 .page_size = 256 /* Size can only be determined from status register */,
2151 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2152 .tested = TEST_BAD_READ,
2153 .probe = probe_spi_rdid,
2154 .probe_timing = TIMING_ZERO,
2157 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2162 .name = "AT45DB161D",
2164 .manufacture_id = ATMEL_ID,
2165 .model_id = ATMEL_AT45DB161D,
2166 .total_size = 2048 /* Size can only be determined from status register */,
2167 .page_size = 512 /* Size can only be determined from status register */,
2168 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2169 .tested = TEST_BAD_READ,
2170 .probe = probe_spi_rdid,
2171 .probe_timing = TIMING_ZERO,
2174 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2179 .name = "AT45DB321C",
2181 .manufacture_id = ATMEL_ID,
2182 .model_id = ATMEL_AT45DB321C,
2183 .total_size = 4224 /* No power of two sizes */,
2184 .page_size = 528 /* No power of two sizes */,
2185 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2186 .tested = TEST_BAD_READ,
2187 .probe = probe_spi_rdid,
2188 .probe_timing = TIMING_ZERO,
2190 .read = NULL /* Incompatible read */,
2191 .voltage = {2700, 3600},
2196 .name = "AT45DB321D",
2198 .manufacture_id = ATMEL_ID,
2199 .model_id = ATMEL_AT45DB321D,
2200 .total_size = 4096 /* Size can only be determined from status register */,
2201 .page_size = 512 /* Size can only be determined from status register */,
2202 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2203 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2204 .feature_bits = FEATURE_OTP,
2205 .tested = TEST_BAD_READ,
2206 .probe = probe_spi_rdid,
2207 .probe_timing = TIMING_ZERO,
2210 .voltage = {2700, 3600},
2215 .name = "AT45DB642D",
2217 .manufacture_id = ATMEL_ID,
2218 .model_id = ATMEL_AT45DB642D,
2219 .total_size = 8192 /* Size can only be determined from status register */,
2220 .page_size = 1024 /* Size can only be determined from status register */,
2221 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2222 .tested = TEST_BAD_READ,
2223 .probe = probe_spi_rdid,
2224 .probe_timing = TIMING_ZERO,
2227 .voltage = {2700, 3600},
2232 .name = "AT49BV512",
2233 .bustype = BUS_PARALLEL,
2234 .manufacture_id = ATMEL_ID,
2235 .model_id = ATMEL_AT49BV512,
2238 .feature_bits = FEATURE_EITHER_RESET,
2239 .tested = TEST_OK_PREW,
2240 .probe = probe_jedec,
2241 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2245 .eraseblocks = { {64 * 1024, 1} },
2246 .block_erase = erase_chip_block_jedec,
2249 .write = write_jedec_1,
2250 .read = read_memmapped,
2251 .voltage = {2700, 3600},
2256 .name = "AT49F002(N)",
2257 .bustype = BUS_PARALLEL,
2258 .manufacture_id = ATMEL_ID,
2259 .model_id = ATMEL_AT49F002N,
2262 .feature_bits = FEATURE_EITHER_RESET,
2263 .tested = TEST_UNTESTED,
2264 .probe = probe_jedec,
2265 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2275 .block_erase = erase_sector_jedec,
2277 .eraseblocks = { {256 * 1024, 1} },
2278 .block_erase = erase_chip_block_jedec,
2281 .write = write_jedec_1,
2282 .read = read_memmapped,
2283 .voltage = {4500, 5500},
2288 .name = "AT49F002(N)T",
2289 .bustype = BUS_PARALLEL,
2290 .manufacture_id = ATMEL_ID,
2291 .model_id = ATMEL_AT49F002NT,
2294 .feature_bits = FEATURE_EITHER_RESET,
2295 .tested = TEST_OK_PR,
2296 .probe = probe_jedec,
2297 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2307 .block_erase = erase_sector_jedec,
2309 .eraseblocks = { {256 * 1024, 1} },
2310 .block_erase = erase_chip_block_jedec,
2313 .write = write_jedec_1,
2314 .read = read_memmapped,
2315 .voltage = {4500, 5500},
2321 .bustype = BUS_PARALLEL,
2322 .manufacture_id = ATMEL_ID,
2323 .model_id = ATMEL_AT49F020,
2326 .feature_bits = FEATURE_EITHER_RESET,
2327 .tested = TEST_OK_PRE,
2328 .probe = probe_jedec,
2329 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2333 .eraseblocks = { {256 * 1024, 1} },
2334 .block_erase = erase_chip_block_jedec,
2336 /* Chip features an optional permanent write protection
2337 * of the first 8 kB. The erase function is the same as
2338 * above, but 00000H to 01FFFH will not be erased.
2339 * FIXME: add another eraser when partial erasers are
2343 .printlock = printlock_at49f,
2344 .write = write_jedec_1,
2345 .read = read_memmapped,
2346 .voltage = {4500, 5500},
2352 .bustype = BUS_PARALLEL,
2353 .manufacture_id = ATMEL_ID,
2354 .model_id = ATMEL_AT49F040,
2357 .feature_bits = FEATURE_EITHER_RESET,
2358 .tested = TEST_UNTESTED,
2359 .probe = probe_jedec,
2360 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2364 .eraseblocks = { {512 * 1024, 1} },
2365 .block_erase = erase_chip_block_jedec,
2367 /* Chip features an optional permanent write protection
2368 * of the first 16 kB. The erase function is the same as
2369 * above, but 00000H to 03FFFH will not be erased.
2370 * FIXME: add another eraser when partial erasers are
2374 .printlock = printlock_at49f,
2375 .write = write_jedec_1,
2376 .read = read_memmapped,
2377 .voltage = {4500, 5500},
2382 .name = "AT49LH002",
2383 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2384 .manufacture_id = ATMEL_ID,
2385 .model_id = ATMEL_AT49LH002,
2387 .page_size = 0, /* unused */
2388 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2389 .tested = TEST_UNTESTED,
2390 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2391 .probe_timing = TIMING_FIXME,
2401 .block_erase = erase_block_82802ab,
2406 .block_erase = NULL, /* TODO: Implement. */
2409 .printlock = NULL, /* TODO */
2410 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2411 .write = write_82802ab,
2412 .read = read_memmapped,
2413 .voltage = {3000, 3600},
2417 .vendor = "Catalyst",
2418 .name = "CAT28F512",
2419 .bustype = BUS_PARALLEL,
2420 .manufacture_id = CATALYST_ID,
2421 .model_id = CATALYST_CAT28F512,
2423 .page_size = 0, /* unused */
2425 .tested = TEST_OK_PR,
2426 .probe = probe_jedec, /* FIXME! */
2427 .probe_timing = TIMING_ZERO,
2431 .eraseblocks = { {64 * 1024, 1} },
2432 .block_erase = NULL, /* TODO */
2435 .write = NULL, /* TODO */
2436 .read = read_memmapped,
2437 .voltage = {4500, 5500},
2443 .bustype = BUS_PARALLEL,
2444 .manufacture_id = BRIGHT_ID,
2445 .model_id = BRIGHT_BM29F040,
2447 .page_size = 64 * 1024,
2448 .feature_bits = FEATURE_EITHER_RESET,
2449 .tested = TEST_OK_PR,
2450 .probe = probe_jedec,
2451 .probe_timing = TIMING_ZERO,
2455 .eraseblocks = { {64 * 1024, 8} },
2456 .block_erase = erase_sector_jedec,
2458 .eraseblocks = { {512 * 1024, 1} },
2459 .block_erase = erase_chip_block_jedec,
2462 .write = write_jedec_1,
2463 .read = read_memmapped,
2464 .voltage = {4500, 5500},
2469 .name = "F49B002UA",
2470 .bustype = BUS_PARALLEL,
2471 .manufacture_id = EMST_ID,
2472 .model_id = EMST_F49B002UA,
2475 .feature_bits = FEATURE_EITHER_RESET,
2476 .tested = TEST_UNTESTED,
2477 .probe = probe_jedec,
2478 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2488 .block_erase = erase_sector_jedec,
2490 .eraseblocks = { {256 * 1024, 1} },
2491 .block_erase = erase_chip_block_jedec,
2494 .write = write_jedec_1,
2495 .read = read_memmapped,
2496 .voltage = {4500, 5500},
2503 .manufacture_id = EMST_ID,
2504 .model_id = EMST_F25L008A,
2507 .feature_bits = FEATURE_WRSR_EITHER,
2508 .tested = TEST_UNTESTED,
2509 .probe = probe_spi_rdid,
2510 .probe_timing = TIMING_ZERO,
2514 .eraseblocks = { {4 * 1024, 256} },
2515 .block_erase = spi_block_erase_20,
2517 .eraseblocks = { {64 * 1024, 16} },
2518 .block_erase = spi_block_erase_d8,
2520 .eraseblocks = { {1024 * 1024, 1} },
2521 .block_erase = spi_block_erase_60,
2523 .eraseblocks = { {1024 * 1024, 1} },
2524 .block_erase = spi_block_erase_c7,
2527 .unlock = spi_disable_blockprotect,
2528 .write = spi_chip_write_1,
2529 .read = spi_chip_read,
2530 .voltage = {2700, 3600},
2537 .manufacture_id = EON_ID_NOPREFIX,
2538 .model_id = EON_EN25B05,
2541 .feature_bits = FEATURE_WRSR_WREN,
2542 .tested = TEST_UNTESTED,
2543 .probe = probe_spi_rdid,
2544 .probe_timing = TIMING_ZERO,
2554 .block_erase = spi_block_erase_d8,
2556 .eraseblocks = { {64 * 1024, 1} },
2557 .block_erase = spi_block_erase_c7,
2560 .unlock = spi_disable_blockprotect,
2561 .write = spi_chip_write_256,
2562 .read = spi_chip_read,
2563 .voltage = {2700, 3600},
2570 .manufacture_id = EON_ID_NOPREFIX,
2571 .model_id = EON_EN25B05,
2574 .feature_bits = FEATURE_WRSR_WREN,
2575 .tested = TEST_UNTESTED,
2576 .probe = probe_spi_rdid,
2577 .probe_timing = TIMING_ZERO,
2587 .block_erase = spi_block_erase_d8,
2589 .eraseblocks = { {64 * 1024, 1} },
2590 .block_erase = spi_block_erase_c7,
2593 .unlock = spi_disable_blockprotect,
2594 .write = spi_chip_write_256,
2595 .read = spi_chip_read,
2596 .voltage = {2700, 3600},
2603 .manufacture_id = EON_ID_NOPREFIX,
2604 .model_id = EON_EN25B10,
2607 .feature_bits = FEATURE_WRSR_WREN,
2608 .tested = TEST_UNTESTED,
2609 .probe = probe_spi_rdid,
2610 .probe_timing = TIMING_ZERO,
2620 .block_erase = spi_block_erase_d8,
2622 .eraseblocks = { {128 * 1024, 1} },
2623 .block_erase = spi_block_erase_c7,
2626 .unlock = spi_disable_blockprotect,
2627 .write = spi_chip_write_256,
2628 .read = spi_chip_read,
2629 .voltage = {2700, 3600},
2636 .manufacture_id = EON_ID_NOPREFIX,
2637 .model_id = EON_EN25B10,
2640 .feature_bits = FEATURE_WRSR_WREN,
2641 .tested = TEST_UNTESTED,
2642 .probe = probe_spi_rdid,
2643 .probe_timing = TIMING_ZERO,
2653 .block_erase = spi_block_erase_d8,
2655 .eraseblocks = { {128 * 1024, 1} },
2656 .block_erase = spi_block_erase_c7,
2659 .unlock = spi_disable_blockprotect,
2660 .write = spi_chip_write_256,
2661 .read = spi_chip_read,
2662 .voltage = {2700, 3600},
2669 .manufacture_id = EON_ID_NOPREFIX,
2670 .model_id = EON_EN25B20,
2673 .feature_bits = FEATURE_WRSR_WREN,
2674 .tested = TEST_UNTESTED,
2675 .probe = probe_spi_rdid,
2676 .probe_timing = TIMING_ZERO,
2687 .block_erase = spi_block_erase_d8,
2689 .eraseblocks = { {256 * 1024, 1} },
2690 .block_erase = spi_block_erase_c7,
2693 .unlock = spi_disable_blockprotect,
2694 .write = spi_chip_write_256,
2695 .read = spi_chip_read,
2696 .voltage = {2700, 3600},
2703 .manufacture_id = EON_ID_NOPREFIX,
2704 .model_id = EON_EN25B20,
2707 .feature_bits = FEATURE_WRSR_WREN,
2708 .tested = TEST_UNTESTED,
2709 .probe = probe_spi_rdid,
2710 .probe_timing = TIMING_ZERO,
2721 .block_erase = spi_block_erase_d8,
2723 .eraseblocks = { {256 * 1024, 1} },
2724 .block_erase = spi_block_erase_c7,
2727 .unlock = spi_disable_blockprotect,
2728 .write = spi_chip_write_256,
2729 .read = spi_chip_read,
2730 .voltage = {2700, 3600},
2737 .manufacture_id = EON_ID_NOPREFIX,
2738 .model_id = EON_EN25B40,
2741 .feature_bits = FEATURE_WRSR_WREN,
2742 .tested = TEST_UNTESTED,
2743 .probe = probe_spi_rdid,
2744 .probe_timing = TIMING_ZERO,
2755 .block_erase = spi_block_erase_d8,
2757 .eraseblocks = { {512 * 1024, 1} },
2758 .block_erase = spi_block_erase_c7,
2761 .unlock = spi_disable_blockprotect,
2762 .write = spi_chip_write_256,
2763 .read = spi_chip_read,
2764 .voltage = {2700, 3600},
2771 .manufacture_id = EON_ID_NOPREFIX,
2772 .model_id = EON_EN25B40,
2775 .feature_bits = FEATURE_WRSR_WREN,
2776 .tested = TEST_UNTESTED,
2777 .probe = probe_spi_rdid,
2778 .probe_timing = TIMING_ZERO,
2789 .block_erase = spi_block_erase_d8,
2791 .eraseblocks = { {512 * 1024, 1} },
2792 .block_erase = spi_block_erase_c7,
2795 .unlock = spi_disable_blockprotect,
2796 .write = spi_chip_write_256,
2797 .read = spi_chip_read,
2798 .voltage = {2700, 3600},
2805 .manufacture_id = EON_ID_NOPREFIX,
2806 .model_id = EON_EN25B80,
2809 .feature_bits = FEATURE_WRSR_WREN,
2810 .tested = TEST_UNTESTED,
2811 .probe = probe_spi_rdid,
2812 .probe_timing = TIMING_ZERO,
2823 .block_erase = spi_block_erase_d8,
2825 .eraseblocks = { {1024 * 1024, 1} },
2826 .block_erase = spi_block_erase_c7,
2829 .unlock = spi_disable_blockprotect,
2830 .write = spi_chip_write_256,
2831 .read = spi_chip_read,
2832 .voltage = {2700, 3600},
2839 .manufacture_id = EON_ID_NOPREFIX,
2840 .model_id = EON_EN25B80,
2843 .feature_bits = FEATURE_WRSR_WREN,
2844 .tested = TEST_UNTESTED,
2845 .probe = probe_spi_rdid,
2846 .probe_timing = TIMING_ZERO,
2857 .block_erase = spi_block_erase_d8,
2859 .eraseblocks = { {1024 * 1024, 1} },
2860 .block_erase = spi_block_erase_c7,
2863 .unlock = spi_disable_blockprotect,
2864 .write = spi_chip_write_256,
2865 .read = spi_chip_read,
2866 .voltage = {2700, 3600},
2873 .manufacture_id = EON_ID_NOPREFIX,
2874 .model_id = EON_EN25B16,
2877 .feature_bits = FEATURE_WRSR_WREN,
2878 .tested = TEST_UNTESTED,
2879 .probe = probe_spi_rdid,
2880 .probe_timing = TIMING_ZERO,
2891 .block_erase = spi_block_erase_d8,
2893 .eraseblocks = { {2 * 1024 * 1024, 1} },
2894 .block_erase = spi_block_erase_c7,
2897 .unlock = spi_disable_blockprotect,
2898 .write = spi_chip_write_256,
2899 .read = spi_chip_read,
2900 .voltage = {2700, 3600},
2907 .manufacture_id = EON_ID_NOPREFIX,
2908 .model_id = EON_EN25B16,
2911 .feature_bits = FEATURE_WRSR_WREN,
2912 .tested = TEST_UNTESTED,
2913 .probe = probe_spi_rdid,
2914 .probe_timing = TIMING_ZERO,
2925 .block_erase = spi_block_erase_d8,
2927 .eraseblocks = { {2 * 1024 * 1024, 1} },
2928 .block_erase = spi_block_erase_c7,
2931 .unlock = spi_disable_blockprotect,
2932 .write = spi_chip_write_256,
2933 .read = spi_chip_read,
2934 .voltage = {2700, 3600},
2941 .manufacture_id = EON_ID_NOPREFIX,
2942 .model_id = EON_EN25B32,
2945 .feature_bits = FEATURE_WRSR_WREN,
2946 .tested = TEST_UNTESTED,
2947 .probe = probe_spi_rdid,
2948 .probe_timing = TIMING_ZERO,
2959 .block_erase = spi_block_erase_d8,
2961 .eraseblocks = { {4 * 1024 * 1024, 1} },
2962 .block_erase = spi_block_erase_c7,
2965 .unlock = spi_disable_blockprotect,
2966 .write = spi_chip_write_256,
2967 .read = spi_chip_read,
2968 .voltage = {2700, 3600},
2975 .manufacture_id = EON_ID_NOPREFIX,
2976 .model_id = EON_EN25B32,
2979 .feature_bits = FEATURE_WRSR_WREN,
2980 .tested = TEST_UNTESTED,
2981 .probe = probe_spi_rdid,
2982 .probe_timing = TIMING_ZERO,
2993 .block_erase = spi_block_erase_d8,
2995 .eraseblocks = { {4 * 1024 * 1024, 1} },
2996 .block_erase = spi_block_erase_c7,
2999 .unlock = spi_disable_blockprotect,
3000 .write = spi_chip_write_256,
3001 .read = spi_chip_read,
3002 .voltage = {2700, 3600},
3009 .manufacture_id = EON_ID_NOPREFIX,
3010 .model_id = EON_EN25B64,
3013 .feature_bits = FEATURE_WRSR_WREN,
3014 .tested = TEST_UNTESTED,
3015 .probe = probe_spi_rdid,
3016 .probe_timing = TIMING_ZERO,
3027 .block_erase = spi_block_erase_d8,
3029 .eraseblocks = { {8 * 1024 * 1024, 1} },
3030 .block_erase = spi_block_erase_c7,
3033 .unlock = spi_disable_blockprotect,
3034 .write = spi_chip_write_256,
3035 .read = spi_chip_read,
3036 .voltage = {2700, 3600},
3043 .manufacture_id = EON_ID_NOPREFIX,
3044 .model_id = EON_EN25B64,
3047 .feature_bits = FEATURE_WRSR_WREN,
3048 .tested = TEST_UNTESTED,
3049 .probe = probe_spi_rdid,
3050 .probe_timing = TIMING_ZERO,
3061 .block_erase = spi_block_erase_d8,
3063 .eraseblocks = { {8 * 1024 * 1024, 1} },
3064 .block_erase = spi_block_erase_c7,
3067 .unlock = spi_disable_blockprotect,
3068 .write = spi_chip_write_256,
3069 .read = spi_chip_read,
3070 .voltage = {2700, 3600},
3077 .manufacture_id = EON_ID_NOPREFIX,
3078 .model_id = EON_EN25F05,
3081 .feature_bits = FEATURE_WRSR_WREN,
3082 .tested = TEST_UNTESTED,
3083 .probe = probe_spi_rdid,
3084 .probe_timing = TIMING_ZERO,
3088 .eraseblocks = { {4 * 1024, 16} },
3089 .block_erase = spi_block_erase_20,
3091 .eraseblocks = { {32 * 1024, 2} },
3092 .block_erase = spi_block_erase_d8,
3094 .eraseblocks = { {32 * 1024, 2} },
3095 .block_erase = spi_block_erase_52,
3097 .eraseblocks = { {64 * 1024, 1} },
3098 .block_erase = spi_block_erase_60,
3100 .eraseblocks = { {64 * 1024, 1} },
3101 .block_erase = spi_block_erase_c7,
3104 .unlock = spi_disable_blockprotect,
3105 .write = spi_chip_write_256,
3106 .read = spi_chip_read,
3107 .voltage = {2700, 3600},
3114 .manufacture_id = EON_ID_NOPREFIX,
3115 .model_id = EON_EN25F10,
3118 .feature_bits = FEATURE_WRSR_WREN,
3119 .tested = TEST_UNTESTED,
3120 .probe = probe_spi_rdid,
3121 .probe_timing = TIMING_ZERO,
3125 .eraseblocks = { {4 * 1024, 32} },
3126 .block_erase = spi_block_erase_20,
3128 .eraseblocks = { {32 * 1024, 4} },
3129 .block_erase = spi_block_erase_d8,
3131 .eraseblocks = { {32 * 1024, 4} },
3132 .block_erase = spi_block_erase_52,
3134 .eraseblocks = { {128 * 1024, 1} },
3135 .block_erase = spi_block_erase_60,
3137 .eraseblocks = { {128 * 1024, 1} },
3138 .block_erase = spi_block_erase_c7,
3141 .unlock = spi_disable_blockprotect,
3142 .write = spi_chip_write_256,
3143 .read = spi_chip_read,
3144 .voltage = {2700, 3600},
3151 .manufacture_id = EON_ID_NOPREFIX,
3152 .model_id = EON_EN25F20,
3155 .feature_bits = FEATURE_WRSR_WREN,
3156 .tested = TEST_UNTESTED,
3157 .probe = probe_spi_rdid,
3158 .probe_timing = TIMING_ZERO,
3162 .eraseblocks = { {4 * 1024, 64} },
3163 .block_erase = spi_block_erase_20,
3165 .eraseblocks = { {64 * 1024, 4} },
3166 .block_erase = spi_block_erase_d8,
3168 .eraseblocks = { {64 * 1024, 4} },
3169 .block_erase = spi_block_erase_52,
3171 .eraseblocks = { {256 * 1024, 1} },
3172 .block_erase = spi_block_erase_60,
3174 .eraseblocks = { {256 * 1024, 1} },
3175 .block_erase = spi_block_erase_c7,
3178 .unlock = spi_disable_blockprotect,
3179 .write = spi_chip_write_256,
3180 .read = spi_chip_read,
3181 .voltage = {2700, 3600},
3188 .manufacture_id = EON_ID_NOPREFIX,
3189 .model_id = EON_EN25F40,
3192 .feature_bits = FEATURE_WRSR_WREN,
3193 .tested = TEST_OK_PROBE,
3194 .probe = probe_spi_rdid,
3195 .probe_timing = TIMING_ZERO,
3199 .eraseblocks = { {4 * 1024, 128} },
3200 .block_erase = spi_block_erase_20,
3202 .eraseblocks = { {64 * 1024, 8} },
3203 .block_erase = spi_block_erase_d8,
3205 .eraseblocks = { {512 * 1024, 1} },
3206 .block_erase = spi_block_erase_60,
3208 .eraseblocks = { {512 * 1024, 1} },
3209 .block_erase = spi_block_erase_c7,
3212 .unlock = spi_disable_blockprotect,
3213 .write = spi_chip_write_256,
3214 .read = spi_chip_read,
3215 .voltage = {2700, 3600},
3222 .manufacture_id = EON_ID_NOPREFIX,
3223 .model_id = EON_EN25F80,
3226 .feature_bits = FEATURE_WRSR_WREN,
3227 .tested = TEST_OK_PREW,
3228 .probe = probe_spi_rdid,
3229 .probe_timing = TIMING_ZERO,
3233 .eraseblocks = { {4 * 1024, 256} },
3234 .block_erase = spi_block_erase_20,
3236 .eraseblocks = { {64 * 1024, 16} },
3237 .block_erase = spi_block_erase_d8,
3239 .eraseblocks = { {1024 * 1024, 1} },
3240 .block_erase = spi_block_erase_60,
3242 .eraseblocks = { {1024 * 1024, 1} },
3243 .block_erase = spi_block_erase_c7,
3246 .unlock = spi_disable_blockprotect,
3247 .write = spi_chip_write_256,
3248 .read = spi_chip_read,
3249 .voltage = {2700, 3600},
3256 .manufacture_id = EON_ID_NOPREFIX,
3257 .model_id = EON_EN25F16,
3260 .feature_bits = FEATURE_WRSR_WREN,
3261 .tested = TEST_OK_PREW,
3262 .probe = probe_spi_rdid,
3263 .probe_timing = TIMING_ZERO,
3267 .eraseblocks = { {4 * 1024, 512} },
3268 .block_erase = spi_block_erase_20,
3270 .eraseblocks = { {64 * 1024, 32} },
3271 .block_erase = spi_block_erase_d8,
3273 .eraseblocks = { {2 * 1024 * 1024, 1} },
3274 .block_erase = spi_block_erase_60,
3276 .eraseblocks = { {2 * 1024 * 1024, 1} },
3277 .block_erase = spi_block_erase_c7,
3280 .unlock = spi_disable_blockprotect,
3281 .write = spi_chip_write_256,
3282 .read = spi_chip_read,
3283 .voltage = {2700, 3600},
3290 .manufacture_id = EON_ID_NOPREFIX,
3291 .model_id = EON_EN25F32,
3294 .feature_bits = FEATURE_WRSR_WREN,
3295 .tested = TEST_UNTESTED,
3296 .probe = probe_spi_rdid,
3297 .probe_timing = TIMING_ZERO,
3301 .eraseblocks = { {4 * 1024, 1024} },
3302 .block_erase = spi_block_erase_20,
3304 .eraseblocks = { {64 * 1024, 64} },
3305 .block_erase = spi_block_erase_d8,
3307 .eraseblocks = { {4 * 1024 * 1024, 1} },
3308 .block_erase = spi_block_erase_60,
3310 .eraseblocks = { {4 * 1024 * 1024, 1} },
3311 .block_erase = spi_block_erase_c7,
3314 .unlock = spi_disable_blockprotect,
3315 .write = spi_chip_write_256,
3316 .read = spi_chip_read,
3317 .voltage = {2700, 3600},
3324 .manufacture_id = EON_ID_NOPREFIX,
3325 .model_id = EON_EN25Q40,
3328 /* OTP: 256B total; enter 0x3A */
3329 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3330 .tested = TEST_UNTESTED,
3331 .probe = probe_spi_rdid,
3332 .probe_timing = TIMING_ZERO,
3336 .eraseblocks = { {4 * 1024, 128} },
3337 .block_erase = spi_block_erase_20,
3339 .eraseblocks = { {64 * 1024, 8} },
3340 .block_erase = spi_block_erase_d8,
3342 .eraseblocks = { {512 * 1024, 1} },
3343 .block_erase = spi_block_erase_60,
3345 .eraseblocks = { {512 * 1024, 1} },
3346 .block_erase = spi_block_erase_c7,
3349 .unlock = spi_disable_blockprotect,
3350 .write = spi_chip_write_256,
3351 .read = spi_chip_read,
3352 .voltage = {2700, 3600},
3357 .name = "EN25Q80(A)",
3359 .manufacture_id = EON_ID_NOPREFIX,
3360 .model_id = EON_EN25Q80,
3363 /* OTP: 256B total; enter 0x3A */
3364 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3365 .tested = TEST_UNTESTED,
3366 .probe = probe_spi_rdid,
3367 .probe_timing = TIMING_ZERO,
3371 .eraseblocks = { {4 * 1024, 256} },
3372 .block_erase = spi_block_erase_20,
3374 .eraseblocks = { {64 * 1024, 16} },
3375 .block_erase = spi_block_erase_d8,
3377 .eraseblocks = { {1024 * 1024, 1} },
3378 .block_erase = spi_block_erase_60,
3380 .eraseblocks = { {1024 * 1024, 1} },
3381 .block_erase = spi_block_erase_c7,
3384 .unlock = spi_disable_blockprotect,
3385 .write = spi_chip_write_256,
3386 .read = spi_chip_read,
3387 .voltage = {2700, 3600},
3391 /* Note: EN25D16 is an evil twin which shares the model ID
3392 but has different write protection capabilities */
3396 .manufacture_id = EON_ID_NOPREFIX,
3397 .model_id = EON_EN25Q16,
3400 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3401 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3402 .tested = TEST_UNTESTED,
3403 .probe = probe_spi_rdid,
3404 .probe_timing = TIMING_ZERO,
3408 .eraseblocks = { {4 * 1024, 512} },
3409 .block_erase = spi_block_erase_20,
3411 .eraseblocks = { {64 * 1024, 32} },
3412 .block_erase = spi_block_erase_d8,
3414 /* not supported by Q16 version */
3415 .eraseblocks = { {64 * 1024, 32} },
3416 .block_erase = spi_block_erase_52,
3418 .eraseblocks = { {2 * 1024 * 1024, 1} },
3419 .block_erase = spi_block_erase_60,
3421 .eraseblocks = { {2 * 1024 * 1024, 1} },
3422 .block_erase = spi_block_erase_c7,
3425 .unlock = spi_disable_blockprotect,
3426 .write = spi_chip_write_256,
3427 .read = spi_chip_read,
3428 .voltage = {2700, 3600},
3433 .name = "EN25Q32(A/B)",
3435 .manufacture_id = EON_ID_NOPREFIX,
3436 .model_id = EON_EN25Q32,
3439 /* OTP: 512B total; enter 0x3A */
3440 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3441 .tested = TEST_OK_PROBE,
3442 .probe = probe_spi_rdid,
3443 .probe_timing = TIMING_ZERO,
3447 .eraseblocks = { {4 * 1024, 1024} },
3448 .block_erase = spi_block_erase_20,
3450 .eraseblocks = { {64 * 1024, 64} },
3451 .block_erase = spi_block_erase_d8,
3453 .eraseblocks = { {4 * 1024 * 1024, 1} },
3454 .block_erase = spi_block_erase_60,
3456 .eraseblocks = { {4 * 1024 * 1024, 1} },
3457 .block_erase = spi_block_erase_c7,
3460 .unlock = spi_disable_blockprotect,
3461 .write = spi_chip_write_256,
3462 .read = spi_chip_read,
3463 .voltage = {2700, 3600},
3470 .manufacture_id = EON_ID_NOPREFIX,
3471 .model_id = EON_EN25Q64,
3474 /* OTP: 512B total; enter 0x3A */
3475 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3476 .tested = TEST_UNTESTED,
3477 .probe = probe_spi_rdid,
3478 .probe_timing = TIMING_ZERO,
3482 .eraseblocks = { {4 * 1024, 2048} },
3483 .block_erase = spi_block_erase_20,
3485 .eraseblocks = { {64 * 1024, 128} },
3486 .block_erase = spi_block_erase_d8,
3488 .eraseblocks = { {8 * 1024 * 1024, 1} },
3489 .block_erase = spi_block_erase_60,
3491 .eraseblocks = { {8 * 1024 * 1024, 1} },
3492 .block_erase = spi_block_erase_c7,
3495 .unlock = spi_disable_blockprotect,
3496 .write = spi_chip_write_256,
3497 .read = spi_chip_read,
3498 .voltage = {2700, 3600},
3505 .manufacture_id = EON_ID_NOPREFIX,
3506 .model_id = EON_EN25Q128,
3507 .total_size = 16384,
3509 /* OTP: 512B total; enter 0x3A */
3510 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3511 .tested = TEST_UNTESTED,
3512 .probe = probe_spi_rdid,
3513 .probe_timing = TIMING_ZERO,
3517 .eraseblocks = { {4 * 1024, 4096} },
3518 .block_erase = spi_block_erase_20,
3520 .eraseblocks = { {64 * 1024, 256} },
3521 .block_erase = spi_block_erase_d8,
3523 .eraseblocks = { {16 * 1024 * 1024, 1} },
3524 .block_erase = spi_block_erase_60,
3526 .eraseblocks = { {16 * 1024 * 1024, 1} },
3527 .block_erase = spi_block_erase_c7,
3530 .unlock = spi_disable_blockprotect,
3531 .write = spi_chip_write_256,
3532 .read = spi_chip_read,
3539 .manufacture_id = EON_ID_NOPREFIX,
3540 .model_id = EON_EN25QH16,
3544 /* OTP: 512B total; enter 0x3A */
3545 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3546 .tested = TEST_OK_PR,
3547 .probe = probe_spi_rdid,
3548 .probe_timing = TIMING_ZERO,
3552 .eraseblocks = { {4 * 1024, 512} },
3553 .block_erase = spi_block_erase_20,
3555 .eraseblocks = { {64 * 1024, 32} },
3556 .block_erase = spi_block_erase_d8,
3558 .eraseblocks = { {1024 * 2048, 1} },
3559 .block_erase = spi_block_erase_60,
3561 .eraseblocks = { {1024 * 2048, 1} },
3562 .block_erase = spi_block_erase_c7,
3565 .unlock = spi_disable_blockprotect,
3566 .write = spi_chip_write_256,
3567 .read = spi_chip_read,
3568 .voltage = {2700, 3600},
3575 .manufacture_id = EON_ID_NOPREFIX,
3576 .model_id = EON_EN25QH32,
3580 /* OTP: 512B total; enter 0x3A */
3581 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3582 .tested = TEST_UNTESTED,
3583 .probe = probe_spi_rdid,
3584 .probe_timing = TIMING_ZERO,
3588 .eraseblocks = { {4 * 1024, 1024} },
3589 .block_erase = spi_block_erase_20,
3591 .eraseblocks = { {64 * 1024, 64} },
3592 .block_erase = spi_block_erase_d8,
3594 .eraseblocks = { {1024 * 4096, 1} },
3595 .block_erase = spi_block_erase_60,
3597 .eraseblocks = { {1024 * 4096, 1} },
3598 .block_erase = spi_block_erase_c7,
3601 .unlock = spi_disable_blockprotect,
3602 .write = spi_chip_write_256,
3603 .read = spi_chip_read,
3604 .voltage = {2700, 3600},
3610 .bustype = BUS_PARALLEL,
3611 .manufacture_id = EON_ID,
3612 .model_id = EON_EN29F010,
3615 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3616 .tested = TEST_OK_PRE,
3617 .probe = probe_jedec,
3618 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3622 .eraseblocks = { {16 * 1024, 8} },
3623 .block_erase = erase_sector_jedec,
3626 .eraseblocks = { {128 * 1024, 1} },
3627 .block_erase = erase_chip_block_jedec,
3630 .write = write_jedec_1,
3631 .read = read_memmapped,
3632 .voltage = {4500, 5500},
3637 .name = "EN29F002(A)(N)B",
3638 .bustype = BUS_PARALLEL,
3639 .manufacture_id = EON_ID,
3640 .model_id = EON_EN29F002B,
3643 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
3644 .tested = TEST_OK_PR,
3645 .probe = probe_jedec,
3646 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3656 .block_erase = erase_sector_jedec,
3658 .eraseblocks = { {256 * 1024, 1} },
3659 .block_erase = erase_chip_block_jedec,
3662 .write = write_jedec_1,
3663 .read = read_memmapped,
3664 .voltage = {4500, 5500},
3669 .name = "EN29F002(A)(N)T",
3670 .bustype = BUS_PARALLEL,
3671 .manufacture_id = EON_ID,
3672 .model_id = EON_EN29F002T,
3675 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
3676 .tested = TEST_OK_PREW,
3677 .probe = probe_jedec,
3678 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3688 .block_erase = erase_sector_jedec,
3690 .eraseblocks = { {256 * 1024, 1} },
3691 .block_erase = erase_chip_block_jedec,
3694 .write = write_jedec_1,
3695 .read = read_memmapped,
3696 .voltage = {4500, 5500},
3701 .name = "EN29LV640B",
3702 .bustype = BUS_PARALLEL,
3703 .manufacture_id = EON_ID,
3704 .model_id = EON_EN29LV640B,
3708 .tested = TEST_OK_PREW,
3709 .probe = probe_en29lv640b,
3710 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3718 .block_erase = block_erase_en29lv640b,
3720 .eraseblocks = { {8 * 1024 * 1024, 1} },
3721 .block_erase = block_erase_chip_en29lv640b,
3724 .write = write_en29lv640b,
3725 .read = read_memmapped,
3726 .voltage = {2700, 3600},
3730 .vendor = "Fujitsu",
3731 .name = "MBM29F004BC",
3732 .bustype = BUS_PARALLEL,
3733 .manufacture_id = FUJITSU_ID,
3734 .model_id = FUJITSU_MBM29F004BC,
3736 .page_size = 64 * 1024,
3737 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3738 .tested = TEST_UNTESTED,
3739 .probe = probe_jedec,
3740 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3750 .block_erase = erase_sector_jedec,
3752 .eraseblocks = { {512 * 1024, 1} },
3753 .block_erase = erase_chip_block_jedec,
3757 .read = read_memmapped,
3758 .voltage = {4500, 5500},
3762 .vendor = "Fujitsu",
3763 .name = "MBM29F004TC",
3764 .bustype = BUS_PARALLEL,
3765 .manufacture_id = FUJITSU_ID,
3766 .model_id = FUJITSU_MBM29F004TC,
3768 .page_size = 64 * 1024,
3769 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3770 .tested = TEST_UNTESTED,
3771 .probe = probe_jedec,
3772 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3782 .block_erase = erase_sector_jedec,
3784 .eraseblocks = { {512 * 1024, 1} },
3785 .block_erase = erase_chip_block_jedec,
3789 .read = read_memmapped,
3790 .voltage = {4500, 5500},
3794 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
3795 .vendor = "Fujitsu",
3796 .name = "MBM29F400BC",
3797 .bustype = BUS_PARALLEL,
3798 .manufacture_id = FUJITSU_ID,
3799 .model_id = FUJITSU_MBM29F400BC,
3801 .page_size = 64 * 1024,
3802 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
3803 .tested = TEST_UNTESTED,
3804 .probe = probe_m29f400bt,
3805 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
3815 .block_erase = block_erase_m29f400bt,
3817 .eraseblocks = { {512 * 1024, 1} },
3818 .block_erase = block_erase_chip_m29f400bt,
3821 .write = write_m29f400bt,
3822 .read = read_memmapped,
3823 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3827 .vendor = "Fujitsu",
3828 .name = "MBM29F400TC",
3829 .bustype = BUS_PARALLEL,
3830 .manufacture_id = FUJITSU_ID,
3831 .model_id = FUJITSU_MBM29F400TC,
3833 .page_size = 64 * 1024,
3834 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
3835 .tested = TEST_UNTESTED,
3836 .probe = probe_m29f400bt,
3837 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
3847 .block_erase = block_erase_m29f400bt,
3849 .eraseblocks = { {512 * 1024, 1} },
3850 .block_erase = block_erase_chip_m29f400bt,
3853 .write = write_m29f400bt,
3854 .read = read_memmapped,
3855 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3859 .vendor = "GigaDevice",
3862 .manufacture_id = GIGADEVICE_ID,
3863 .model_id = GIGADEVICE_GD25Q20,
3866 .feature_bits = FEATURE_WRSR_WREN,
3867 .tested = TEST_UNTESTED,
3868 .probe = probe_spi_rdid,
3869 .probe_timing = TIMING_ZERO,
3873 .eraseblocks = { {4 * 1024, 64} },
3874 .block_erase = spi_block_erase_20,
3876 .eraseblocks = { {32 * 1024, 8} },
3877 .block_erase = spi_block_erase_52,
3879 .eraseblocks = { {64 * 1024, 4} },
3880 .block_erase = spi_block_erase_d8,
3882 .eraseblocks = { {256 * 1024, 1} },
3883 .block_erase = spi_block_erase_60,
3885 .eraseblocks = { {256 * 1024, 1} },
3886 .block_erase = spi_block_erase_c7,
3889 .unlock = spi_disable_blockprotect,
3890 .write = spi_chip_write_256,
3891 .read = spi_chip_read,
3892 .voltage = {2700, 3600},
3896 .vendor = "GigaDevice",
3899 .manufacture_id = GIGADEVICE_ID,
3900 .model_id = GIGADEVICE_GD25Q40,
3903 .feature_bits = FEATURE_WRSR_WREN,
3904 .tested = TEST_UNTESTED,
3905 .probe = probe_spi_rdid,
3906 .probe_timing = TIMING_ZERO,
3910 .eraseblocks = { {4 * 1024, 128} },
3911 .block_erase = spi_block_erase_20,
3913 .eraseblocks = { {32 * 1024, 16} },
3914 .block_erase = spi_block_erase_52,
3916 .eraseblocks = { {64 * 1024, 8} },
3917 .block_erase = spi_block_erase_d8,
3919 .eraseblocks = { {512 * 1024, 1} },
3920 .block_erase = spi_block_erase_60,
3922 .eraseblocks = { {512 * 1024, 1} },
3923 .block_erase = spi_block_erase_c7,
3926 .unlock = spi_disable_blockprotect,
3927 .write = spi_chip_write_256,
3928 .read = spi_chip_read,
3929 .voltage = {2700, 3600},
3933 .vendor = "GigaDevice",
3936 .manufacture_id = GIGADEVICE_ID,
3937 .model_id = GIGADEVICE_GD25Q80,
3940 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
3941 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3942 .tested = TEST_OK_PREW,
3943 .probe = probe_spi_rdid,
3944 .probe_timing = TIMING_ZERO,
3948 .eraseblocks = { {4 * 1024, 256} },
3949 .block_erase = spi_block_erase_20,
3951 .eraseblocks = { {32 * 1024, 32} },
3952 .block_erase = spi_block_erase_52,
3954 .eraseblocks = { {64 * 1024, 16} },
3955 .block_erase = spi_block_erase_d8,
3957 .eraseblocks = { {1024 * 1024, 1} },
3958 .block_erase = spi_block_erase_60,
3960 .eraseblocks = { {1024 * 1024, 1} },
3961 .block_erase = spi_block_erase_c7,
3964 .unlock = spi_disable_blockprotect,
3965 .write = spi_chip_write_256,
3966 .read = spi_chip_read,
3967 .voltage = {2700, 3600},
3971 .vendor = "GigaDevice",
3974 .manufacture_id = GIGADEVICE_ID,
3975 .model_id = GIGADEVICE_GD25Q16,
3978 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
3979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
3980 .tested = TEST_UNTESTED,
3981 .probe = probe_spi_rdid,
3982 .probe_timing = TIMING_ZERO,
3986 .eraseblocks = { {4 * 1024, 512} },
3987 .block_erase = spi_block_erase_20,
3989 .eraseblocks = { {32 * 1024, 64} },
3990 .block_erase = spi_block_erase_52,
3992 .eraseblocks = { {64 * 1024, 32} },
3993 .block_erase = spi_block_erase_d8,
3995 .eraseblocks = { {2 * 1024 * 1024, 1} },
3996 .block_erase = spi_block_erase_60,
3998 .eraseblocks = { {2 * 1024 * 1024, 1} },
3999 .block_erase = spi_block_erase_c7,
4002 .unlock = spi_disable_blockprotect,
4003 .write = spi_chip_write_256,
4004 .read = spi_chip_read,
4005 .voltage = {2700, 3600},
4009 .vendor = "GigaDevice",
4012 .manufacture_id = GIGADEVICE_ID,
4013 .model_id = GIGADEVICE_GD25Q32,
4016 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4018 .tested = TEST_UNTESTED,
4019 .probe = probe_spi_rdid,
4020 .probe_timing = TIMING_ZERO,
4024 .eraseblocks = { {4 * 1024, 1024} },
4025 .block_erase = spi_block_erase_20,
4027 .eraseblocks = { {32 * 1024, 128} },
4028 .block_erase = spi_block_erase_52,
4030 .eraseblocks = { {64 * 1024, 64} },
4031 .block_erase = spi_block_erase_d8,
4033 .eraseblocks = { {4 * 1024 * 1024, 1} },
4034 .block_erase = spi_block_erase_60,
4036 .eraseblocks = { {4 * 1024 * 1024, 1} },
4037 .block_erase = spi_block_erase_c7,
4040 .unlock = spi_disable_blockprotect,
4041 .write = spi_chip_write_256,
4042 .read = spi_chip_read,
4043 .voltage = {2700, 3600},
4047 .vendor = "GigaDevice",
4050 .manufacture_id = GIGADEVICE_ID,
4051 .model_id = GIGADEVICE_GD25Q64,
4054 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4055 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4056 .tested = TEST_UNTESTED,
4057 .probe = probe_spi_rdid,
4058 .probe_timing = TIMING_ZERO,
4062 .eraseblocks = { {4 * 1024, 2048} },
4063 .block_erase = spi_block_erase_20,
4065 .eraseblocks = { {32 * 1024, 256} },
4066 .block_erase = spi_block_erase_52,
4068 .eraseblocks = { {64 * 1024, 128} },
4069 .block_erase = spi_block_erase_d8,
4071 .eraseblocks = { {8 * 1024 * 1024, 1} },
4072 .block_erase = spi_block_erase_60,
4074 .eraseblocks = { {8 * 1024 * 1024, 1} },
4075 .block_erase = spi_block_erase_c7,
4078 .unlock = spi_disable_blockprotect,
4079 .write = spi_chip_write_256,
4080 .read = spi_chip_read,
4084 .vendor = "GigaDevice",
4087 .manufacture_id = GIGADEVICE_ID,
4088 .model_id = GIGADEVICE_GD25Q128,
4089 .total_size = 16384,
4091 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4092 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4093 .tested = TEST_UNTESTED,
4094 .probe = probe_spi_rdid,
4095 .probe_timing = TIMING_ZERO,
4099 .eraseblocks = { {4 * 1024, 4096} },
4100 .block_erase = spi_block_erase_20,
4102 .eraseblocks = { {32 * 1024, 512} },
4103 .block_erase = spi_block_erase_52,
4105 .eraseblocks = { {64 * 1024, 256} },
4106 .block_erase = spi_block_erase_d8,
4108 .eraseblocks = { {16 * 1024 * 1024, 1} },
4109 .block_erase = spi_block_erase_60,
4111 .eraseblocks = { {16 * 1024 * 1024, 1} },
4112 .block_erase = spi_block_erase_c7,
4115 .unlock = spi_disable_blockprotect,
4116 .write = spi_chip_write_256,
4117 .read = spi_chip_read,
4121 .vendor = "Hyundai",
4122 .name = "HY29F002T",
4123 .bustype = BUS_PARALLEL,
4124 .manufacture_id = HYUNDAI_ID,
4125 .model_id = HYUNDAI_HY29F002T,
4127 .page_size = 256 * 1024,
4128 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4129 .tested = TEST_OK_PRE,
4130 .probe = probe_jedec,
4131 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4141 .block_erase = erase_sector_jedec,
4143 .eraseblocks = { {256 * 1024, 1} },
4144 .block_erase = erase_chip_block_jedec,
4147 .write = write_jedec_1,
4148 .read = read_memmapped,
4149 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
4153 .vendor = "Hyundai",
4154 .name = "HY29F002B",
4155 .bustype = BUS_PARALLEL,
4156 .manufacture_id = HYUNDAI_ID,
4157 .model_id = HYUNDAI_HY29F002B,
4159 .page_size = 256 * 1024,
4160 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4161 .tested = TEST_UNTESTED,
4162 .probe = probe_jedec,
4163 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4173 .block_erase = erase_sector_jedec,
4175 .eraseblocks = { {256 * 1024, 1} },
4176 .block_erase = erase_chip_block_jedec,
4179 .write = write_jedec_1,
4180 .read = read_memmapped,
4181 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
4185 .vendor = "Hyundai",
4186 .name = "HY29F040A",
4187 .bustype = BUS_PARALLEL,
4188 .manufacture_id = HYUNDAI_ID,
4189 .model_id = HYUNDAI_HY29F040A,
4191 .page_size = 64 * 1024,
4192 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4193 .tested = TEST_UNTESTED,
4194 .probe = probe_jedec,
4195 .probe_timing = TIMING_ZERO,
4199 .eraseblocks = { {64 * 1024, 8} },
4200 .block_erase = erase_sector_jedec,
4202 .eraseblocks = { {512 * 1024, 1} },
4203 .block_erase = erase_chip_block_jedec,
4206 .write = write_jedec_1,
4207 .read = read_memmapped,
4208 .voltage = {4500, 5500},
4213 .name = "28F001BN/BX-B",
4214 .bustype = BUS_PARALLEL,
4215 .manufacture_id = INTEL_ID,
4216 .model_id = INTEL_28F001B,
4218 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
4219 .tested = TEST_UNTESTED,
4220 .probe = probe_jedec,
4221 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4230 .block_erase = erase_block_82802ab,
4233 .write = write_82802ab,
4234 .read = read_memmapped,
4235 .voltage = {4500, 5500},
4240 .name = "28F001BN/BX-T",
4241 .bustype = BUS_PARALLEL,
4242 .manufacture_id = INTEL_ID,
4243 .model_id = INTEL_28F001T,
4245 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
4246 .tested = TEST_OK_PR,
4247 .probe = probe_jedec,
4248 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4257 .block_erase = erase_block_82802ab,
4260 .write = write_82802ab,
4261 .read = read_memmapped,
4262 .voltage = {4500, 5500},
4267 .name = "28F002BC/BL/BV/BX-T",
4268 .bustype = BUS_PARALLEL,
4269 .manufacture_id = INTEL_ID,
4270 .model_id = INTEL_28F002T,
4272 .page_size = 256 * 1024,
4273 .tested = TEST_OK_PRE,
4274 .probe = probe_82802ab,
4275 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4285 .block_erase = erase_block_82802ab,
4288 .write = write_82802ab,
4289 .read = read_memmapped,
4294 .name = "28F008S3/S5/SC",
4295 .bustype = BUS_PARALLEL,
4296 .manufacture_id = INTEL_ID,
4297 .model_id = INTEL_28F004S3,
4300 .tested = TEST_UNTESTED,
4301 .probe = probe_82802ab,
4302 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4306 .eraseblocks = { {64 * 1024, 8} },
4307 .block_erase = erase_block_82802ab,
4310 .unlock = unlock_28f004s5,
4311 .write = write_82802ab,
4312 .read = read_memmapped,
4317 .name = "28F004B5/BE/BV/BX-B",
4318 .bustype = BUS_PARALLEL,
4319 .manufacture_id = INTEL_ID,
4320 .model_id = INTEL_28F004B,
4322 .page_size = 128 * 1024, /* maximal block size */
4323 .tested = TEST_UNTESTED,
4324 .probe = probe_82802ab,
4325 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4335 .block_erase = erase_block_82802ab,
4338 .write = write_82802ab,
4339 .read = read_memmapped,
4344 .name = "28F004B5/BE/BV/BX-T",
4345 .bustype = BUS_PARALLEL,
4346 .manufacture_id = INTEL_ID,
4347 .model_id = INTEL_28F004T,
4349 .page_size = 128 * 1024, /* maximal block size */
4350 .tested = TEST_UNTESTED,
4351 .probe = probe_82802ab,
4352 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4362 .block_erase = erase_block_82802ab,
4365 .write = write_82802ab,
4366 .read = read_memmapped,
4371 .name = "28F400BV/BX/CE/CV-B",
4372 .bustype = BUS_PARALLEL,
4373 .manufacture_id = INTEL_ID,
4374 .model_id = INTEL_28F400B,
4376 .page_size = 128 * 1024, /* maximal block size */
4377 .feature_bits = FEATURE_ADDR_SHIFTED,
4378 .tested = TEST_UNTESTED,
4379 .probe = probe_82802ab,
4380 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4390 .block_erase = erase_block_82802ab,
4393 .write = write_82802ab,
4394 .read = read_memmapped,
4399 .name = "28F400BV/BX/CE/CV-T",
4400 .bustype = BUS_PARALLEL,
4401 .manufacture_id = INTEL_ID,
4402 .model_id = INTEL_28F400T,
4404 .page_size = 128 * 1024, /* maximal block size */
4405 .feature_bits = FEATURE_ADDR_SHIFTED,
4406 .tested = TEST_UNTESTED,
4407 .probe = probe_82802ab,
4408 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4418 .block_erase = erase_block_82802ab,
4421 .write = write_82802ab,
4422 .read = read_memmapped,
4429 .manufacture_id = INTEL_ID,
4430 .model_id = INTEL_82802AB,
4432 .page_size = 64 * 1024,
4433 .feature_bits = FEATURE_REGISTERMAP,
4434 .tested = TEST_OK_PREW,
4435 .probe = probe_82802ab,
4436 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
4440 .eraseblocks = { {64 * 1024, 8} },
4441 .block_erase = erase_block_82802ab,
4444 .unlock = unlock_82802ab,
4445 .write = write_82802ab,
4446 .read = read_memmapped,
4447 .voltage = {3000, 3600},
4454 .manufacture_id = INTEL_ID,
4455 .model_id = INTEL_82802AC,
4457 .page_size = 64 * 1024,
4458 .feature_bits = FEATURE_REGISTERMAP,
4459 .tested = TEST_OK_PR,
4460 .probe = probe_82802ab,
4461 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
4465 .eraseblocks = { {64 * 1024, 16} },
4466 .block_erase = erase_block_82802ab,
4469 .unlock = unlock_82802ab,
4470 .write = write_82802ab,
4471 .read = read_memmapped,
4472 .voltage = {3000, 3600},
4476 .vendor = "Macronix",
4479 .manufacture_id = MACRONIX_ID,
4480 .model_id = MACRONIX_MX25L512,
4483 .feature_bits = FEATURE_WRSR_WREN,
4484 .tested = TEST_UNTESTED,
4485 .probe = probe_spi_rdid,
4486 .probe_timing = TIMING_ZERO,
4490 .eraseblocks = { {4 * 1024, 16} },
4491 .block_erase = spi_block_erase_20,
4493 .eraseblocks = { {64 * 1024, 1} },
4494 .block_erase = spi_block_erase_52,
4496 .eraseblocks = { {64 * 1024, 1} },
4497 .block_erase = spi_block_erase_d8,
4499 .eraseblocks = { {64 * 1024, 1} },
4500 .block_erase = spi_block_erase_60,
4502 .eraseblocks = { {64 * 1024, 1} },
4503 .block_erase = spi_block_erase_c7,
4506 .unlock = spi_disable_blockprotect,
4507 .write = spi_chip_write_256,
4508 .read = spi_chip_read,
4509 .voltage = {2700, 3600},
4513 .vendor = "Macronix",
4514 .name = "MX25L1005",
4516 .manufacture_id = MACRONIX_ID,
4517 .model_id = MACRONIX_MX25L1005,
4520 .feature_bits = FEATURE_WRSR_WREN,
4521 .tested = TEST_UNTESTED,
4522 .probe = probe_spi_rdid,
4523 .probe_timing = TIMING_ZERO,
4527 .eraseblocks = { {4 * 1024, 32} },
4528 .block_erase = spi_block_erase_20,
4530 .eraseblocks = { {64 * 1024, 2} },
4531 .block_erase = spi_block_erase_d8,
4533 .eraseblocks = { {128 * 1024, 1} },
4534 .block_erase = spi_block_erase_60,
4536 .eraseblocks = { {128 * 1024, 1} },
4537 .block_erase = spi_block_erase_c7,
4540 .unlock = spi_disable_blockprotect,
4541 .write = spi_chip_write_256,
4542 .read = spi_chip_read,
4543 .voltage = {2700, 3600},
4547 .vendor = "Macronix",
4548 .name = "MX25L2005",
4550 .manufacture_id = MACRONIX_ID,
4551 .model_id = MACRONIX_MX25L2005,
4554 .feature_bits = FEATURE_WRSR_WREN,
4555 .tested = TEST_UNTESTED,
4556 .probe = probe_spi_rdid,
4557 .probe_timing = TIMING_ZERO,
4561 .eraseblocks = { {4 * 1024, 64} },
4562 .block_erase = spi_block_erase_20,
4564 .eraseblocks = { {64 * 1024, 4} },
4565 .block_erase = spi_block_erase_52,
4567 .eraseblocks = { {64 * 1024, 4} },
4568 .block_erase = spi_block_erase_d8,
4570 .eraseblocks = { {256 * 1024, 1} },
4571 .block_erase = spi_block_erase_60,
4573 .eraseblocks = { {256 * 1024, 1} },
4574 .block_erase = spi_block_erase_c7,
4577 .unlock = spi_disable_blockprotect,
4578 .write = spi_chip_write_256,
4579 .read = spi_chip_read,
4580 .voltage = {2700, 3600},
4584 .vendor = "Macronix",
4585 .name = "MX25L4005",
4587 .manufacture_id = MACRONIX_ID,
4588 .model_id = MACRONIX_MX25L4005,
4591 .feature_bits = FEATURE_WRSR_WREN,
4592 .tested = TEST_OK_PREW,
4593 .probe = probe_spi_rdid,
4594 .probe_timing = TIMING_ZERO,
4598 .eraseblocks = { {4 * 1024, 128} },
4599 .block_erase = spi_block_erase_20,
4601 .eraseblocks = { {64 * 1024, 8} },
4602 .block_erase = spi_block_erase_52,
4604 .eraseblocks = { {64 * 1024, 8} },
4605 .block_erase = spi_block_erase_d8,
4607 .eraseblocks = { {512 * 1024, 1} },
4608 .block_erase = spi_block_erase_60,
4610 .eraseblocks = { {512 * 1024, 1} },
4611 .block_erase = spi_block_erase_c7,
4614 .unlock = spi_disable_blockprotect,
4615 .write = spi_chip_write_256,
4616 .read = spi_chip_read,
4617 .voltage = {2700, 3600},
4621 .vendor = "Macronix",
4622 .name = "MX25L8005",
4624 .manufacture_id = MACRONIX_ID,
4625 .model_id = MACRONIX_MX25L8005,
4628 .feature_bits = FEATURE_WRSR_WREN,
4629 .tested = TEST_OK_PREW,
4630 .probe = probe_spi_rdid,
4631 .probe_timing = TIMING_ZERO,
4635 .eraseblocks = { {4 * 1024, 256} },
4636 .block_erase = spi_block_erase_20,
4638 .eraseblocks = { {64 * 1024, 16} },
4639 .block_erase = spi_block_erase_52,
4641 .eraseblocks = { {64 * 1024, 16} },
4642 .block_erase = spi_block_erase_d8,
4644 .eraseblocks = { {1024 * 1024, 1} },
4645 .block_erase = spi_block_erase_60,
4647 .eraseblocks = { {1024 * 1024, 1} },
4648 .block_erase = spi_block_erase_c7,
4651 .unlock = spi_disable_blockprotect,
4652 .write = spi_chip_write_256,
4653 .read = spi_chip_read,
4654 .voltage = {2700, 3600},
4658 .vendor = "Macronix",
4659 .name = "MX25L1605",
4661 .manufacture_id = MACRONIX_ID,
4662 .model_id = MACRONIX_MX25L1605,
4665 .feature_bits = FEATURE_WRSR_WREN,
4666 .tested = TEST_OK_PREW,
4667 .probe = probe_spi_rdid,
4668 .probe_timing = TIMING_ZERO,
4672 .eraseblocks = { {4 * 1024, 512} },
4673 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
4675 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
4676 .block_erase = spi_block_erase_52,
4678 .eraseblocks = { {64 * 1024, 32} },
4679 .block_erase = spi_block_erase_d8,
4681 .eraseblocks = { {2 * 1024 * 1024, 1} },
4682 .block_erase = spi_block_erase_60,
4684 .eraseblocks = { {2 * 1024 * 1024, 1} },
4685 .block_erase = spi_block_erase_c7,
4688 .unlock = spi_disable_blockprotect,
4689 .write = spi_chip_write_256,
4690 .read = spi_chip_read,
4691 .voltage = {2700, 3600},
4695 .vendor = "Macronix",
4696 .name = "MX25L1635D",
4698 .manufacture_id = MACRONIX_ID,
4699 .model_id = MACRONIX_MX25L1635D,
4702 .feature_bits = FEATURE_WRSR_WREN,
4703 .tested = TEST_UNTESTED,
4704 .probe = probe_spi_rdid,
4705 .probe_timing = TIMING_ZERO,
4709 .eraseblocks = { {4 * 1024, 512} },
4710 .block_erase = spi_block_erase_20,
4712 .eraseblocks = { {64 * 1024, 32} },
4713 .block_erase = spi_block_erase_d8,
4715 .eraseblocks = { {2 * 1024 * 1024, 1} },
4716 .block_erase = spi_block_erase_60,
4718 .eraseblocks = { {2 * 1024 * 1024, 1} },
4719 .block_erase = spi_block_erase_c7,
4722 .unlock = spi_disable_blockprotect,
4723 .write = spi_chip_write_256,
4724 .read = spi_chip_read,
4725 .voltage = {2700, 3600},
4729 .vendor = "Macronix",
4730 .name = "MX25L1635E",
4732 .manufacture_id = MACRONIX_ID,
4733 .model_id = MACRONIX_MX25L1635E,
4736 .feature_bits = FEATURE_WRSR_WREN,
4737 .tested = TEST_UNTESTED,
4738 .probe = probe_spi_rdid,
4739 .probe_timing = TIMING_ZERO,
4743 .eraseblocks = { {4 * 1024, 512} },
4744 .block_erase = spi_block_erase_20,
4746 .eraseblocks = { {64 * 1024, 32} },
4747 .block_erase = spi_block_erase_d8,
4749 .eraseblocks = { {2 * 1024 * 1024, 1} },
4750 .block_erase = spi_block_erase_60,
4752 .eraseblocks = { {2 * 1024 * 1024, 1} },
4753 .block_erase = spi_block_erase_c7,
4756 .unlock = spi_disable_blockprotect,
4757 .write = spi_chip_write_256,
4758 .read = spi_chip_read,
4759 .voltage = {2700, 3600},
4763 .vendor = "Macronix",
4764 .name = "MX25L3205",
4766 .manufacture_id = MACRONIX_ID,
4767 .model_id = MACRONIX_MX25L3205,
4770 .feature_bits = FEATURE_WRSR_WREN,
4771 .tested = TEST_OK_PREW,
4772 .probe = probe_spi_rdid,
4773 .probe_timing = TIMING_ZERO,
4777 .eraseblocks = { {4 * 1024, 1024} },
4778 .block_erase = spi_block_erase_20,
4780 .eraseblocks = { {4 * 1024, 1024} },
4781 .block_erase = spi_block_erase_d8,
4783 .eraseblocks = { {4 * 1024 * 1024, 1} },
4784 .block_erase = spi_block_erase_60,
4786 .eraseblocks = { {4 * 1024 * 1024, 1} },
4787 .block_erase = spi_block_erase_c7,
4790 .unlock = spi_disable_blockprotect,
4791 .write = spi_chip_write_256,
4792 .read = spi_chip_read,
4793 .voltage = {2700, 3600},
4797 .vendor = "Macronix",
4798 .name = "MX25L3235D",
4800 .manufacture_id = MACRONIX_ID,
4801 .model_id = MACRONIX_MX25L3235D,
4804 .feature_bits = FEATURE_WRSR_WREN,
4805 .tested = TEST_UNTESTED,
4806 .probe = probe_spi_rdid,
4807 .probe_timing = TIMING_ZERO,
4811 .eraseblocks = { {4 * 1024, 1024} },
4812 .block_erase = spi_block_erase_20,
4814 .eraseblocks = { {64 * 1024, 64} },
4815 .block_erase = spi_block_erase_d8,
4817 .eraseblocks = { {4 * 1024 * 1024, 1} },
4818 .block_erase = spi_block_erase_60,
4820 .eraseblocks = { {4 * 1024 * 1024, 1} },
4821 .block_erase = spi_block_erase_c7,
4824 .unlock = spi_disable_blockprotect,
4825 .write = spi_chip_write_256,
4826 .read = spi_chip_read,
4827 .voltage = {2700, 3600},
4831 .vendor = "Macronix",
4832 .name = "MX25L6405",
4834 .manufacture_id = MACRONIX_ID,
4835 .model_id = MACRONIX_MX25L6405,
4838 .feature_bits = FEATURE_WRSR_WREN,
4839 .tested = TEST_OK_PREW,
4840 .probe = probe_spi_rdid,
4841 .probe_timing = TIMING_ZERO,
4845 .eraseblocks = { {64 * 1024, 128} },
4846 .block_erase = spi_block_erase_20,
4848 .eraseblocks = { {64 * 1024, 128} },
4849 .block_erase = spi_block_erase_d8,
4851 .eraseblocks = { {8 * 1024 * 1024, 1} },
4852 .block_erase = spi_block_erase_60,
4854 .eraseblocks = { {8 * 1024 * 1024, 1} },
4855 .block_erase = spi_block_erase_c7,
4858 .unlock = spi_disable_blockprotect,
4859 .write = spi_chip_write_256,
4860 .read = spi_chip_read,
4861 .voltage = {2700, 3600},
4865 .vendor = "Macronix",
4866 .name = "MX25L12805",
4868 .manufacture_id = MACRONIX_ID,
4869 .model_id = MACRONIX_MX25L12805,
4870 .total_size = 16384,
4872 .feature_bits = FEATURE_WRSR_WREN,
4873 .tested = TEST_UNTESTED,
4874 .probe = probe_spi_rdid,
4875 .probe_timing = TIMING_ZERO,
4879 .eraseblocks = { {4 * 1024, 4096} },
4880 .block_erase = spi_block_erase_20,
4882 .eraseblocks = { {64 * 1024, 256} },
4883 .block_erase = spi_block_erase_d8,
4885 .eraseblocks = { {16 * 1024 * 1024, 1} },
4886 .block_erase = spi_block_erase_60,
4888 .eraseblocks = { {16 * 1024 * 1024, 1} },
4889 .block_erase = spi_block_erase_c7,
4892 .unlock = spi_disable_blockprotect,
4893 .write = spi_chip_write_256,
4894 .read = spi_chip_read,
4895 .voltage = {2700, 3600},
4899 .vendor = "Macronix",
4900 .name = "MX29F001B",
4901 .bustype = BUS_PARALLEL,
4902 .manufacture_id = MACRONIX_ID,
4903 .model_id = MACRONIX_MX29F001B,
4905 .page_size = 32 * 1024,
4906 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4907 .tested = TEST_UNTESTED,
4908 .probe = probe_jedec,
4909 .probe_timing = TIMING_ZERO,
4920 .block_erase = erase_sector_jedec,
4922 .eraseblocks = { {128 * 1024, 1} },
4923 .block_erase = erase_chip_block_jedec,
4926 .write = write_jedec_1,
4927 .read = read_memmapped,
4928 .voltage = {4500, 5500},
4932 .vendor = "Macronix",
4933 .name = "MX29F001T",
4934 .bustype = BUS_PARALLEL,
4935 .manufacture_id = MACRONIX_ID,
4936 .model_id = MACRONIX_MX29F001T,
4938 .page_size = 32 * 1024,
4939 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4940 .tested = TEST_OK_PREW,
4941 .probe = probe_jedec,
4942 .probe_timing = TIMING_ZERO,
4953 .block_erase = erase_sector_jedec,
4955 .eraseblocks = { {128 * 1024, 1} },
4956 .block_erase = erase_chip_block_jedec,
4959 .write = write_jedec_1,
4960 .read = read_memmapped,
4961 .voltage = {4500, 5500},
4965 .vendor = "Macronix",
4966 .name = "MX29F002(N)B",
4967 .bustype = BUS_PARALLEL,
4968 .manufacture_id = MACRONIX_ID,
4969 .model_id = MACRONIX_MX29F002B,
4971 .page_size = 64 * 1024,
4972 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
4973 .tested = TEST_UNTESTED,
4974 .probe = probe_jedec,
4975 .probe_timing = TIMING_ZERO,
4985 .block_erase = erase_sector_jedec,
4987 .eraseblocks = { {256 * 1024, 1} },
4988 .block_erase = erase_chip_block_jedec,
4991 .write = write_jedec_1,
4992 .read = read_memmapped,
4993 .voltage = {4500, 5500},
4997 .vendor = "Macronix",
4998 .name = "MX29F002(N)T",
4999 .bustype = BUS_PARALLEL,
5000 .manufacture_id = MACRONIX_ID,
5001 .model_id = MACRONIX_MX29F002T,
5003 .page_size = 64 * 1024,
5004 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5005 .tested = TEST_OK_PREW,
5006 .probe = probe_jedec,
5007 .probe_timing = TIMING_ZERO,
5017 .block_erase = erase_sector_jedec,
5019 .eraseblocks = { {256 * 1024, 1} },
5020 .block_erase = erase_chip_block_jedec,
5023 .write = write_jedec_1,
5024 .read = read_memmapped,
5025 .voltage = {4500, 5500},
5029 .vendor = "Macronix",
5031 .bustype = BUS_PARALLEL,
5032 .manufacture_id = MACRONIX_ID,
5033 .model_id = MACRONIX_MX29F040,
5035 .page_size = 64 * 1024,
5036 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5037 .tested = TEST_UNTESTED,
5038 .probe = probe_jedec,
5039 .probe_timing = TIMING_ZERO,
5043 .eraseblocks = { {64 * 1024, 8} },
5044 .block_erase = erase_sector_jedec,
5046 .eraseblocks = { {512 * 1024, 1} },
5047 .block_erase = erase_chip_block_jedec,
5050 .write = write_jedec_1,
5051 .read = read_memmapped,
5052 .voltage = {4500, 5500},
5056 .vendor = "Macronix",
5057 .name = "MX29LV040",
5058 .bustype = BUS_PARALLEL,
5059 .manufacture_id = MACRONIX_ID,
5060 .model_id = MACRONIX_MX29LV040,
5062 .page_size = 64 * 1024,
5063 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5064 .tested = TEST_UNTESTED,
5065 .probe = probe_jedec,
5066 .probe_timing = TIMING_ZERO,
5070 .eraseblocks = { {64 * 1024, 8}, },
5071 .block_erase = erase_sector_jedec,
5073 .eraseblocks = { {512 * 1024, 1} },
5074 .block_erase = erase_chip_block_jedec,
5077 .write = write_jedec_1,
5078 .read = read_memmapped,
5079 .voltage = {2700, 3600},
5083 .vendor = "MoselVitelic",
5084 .name = "V29C51000B",
5085 .bustype = BUS_PARALLEL,
5086 .manufacture_id = SYNCMOS_MVC_ID,
5087 .model_id = MVC_V29C51000B,
5090 .feature_bits = FEATURE_EITHER_RESET,
5091 .tested = TEST_UNTESTED,
5092 .probe = probe_jedec,
5093 .probe_timing = TIMING_ZERO,
5097 .eraseblocks = { {512, 128} },
5098 .block_erase = erase_sector_jedec,
5100 .eraseblocks = { {64 * 1024, 1} },
5101 .block_erase = erase_chip_block_jedec,
5104 .write = write_jedec_1,
5105 .read = read_memmapped,
5106 .voltage = {4500, 5500},
5110 .vendor = "MoselVitelic",
5111 .name = "V29C51000T",
5112 .bustype = BUS_PARALLEL,
5113 .manufacture_id = SYNCMOS_MVC_ID,
5114 .model_id = MVC_V29C51000T,
5117 .feature_bits = FEATURE_EITHER_RESET,
5118 .tested = TEST_UNTESTED,
5119 .probe = probe_jedec,
5120 .probe_timing = TIMING_ZERO,
5124 .eraseblocks = { {512, 128} },
5125 .block_erase = erase_sector_jedec,
5127 .eraseblocks = { {64 * 1024, 1} },
5128 .block_erase = erase_chip_block_jedec,
5131 .write = write_jedec_1,
5132 .read = read_memmapped,
5133 .voltage = {4500, 5500},
5137 .vendor = "MoselVitelic",
5138 .name = "V29C51400B",
5139 .bustype = BUS_PARALLEL,
5140 .manufacture_id = SYNCMOS_MVC_ID,
5141 .model_id = MVC_V29C51400B,
5144 .feature_bits = FEATURE_EITHER_RESET,
5145 .tested = TEST_UNTESTED,
5146 .probe = probe_jedec,
5147 .probe_timing = TIMING_ZERO,
5151 .eraseblocks = { {1024, 512} },
5152 .block_erase = erase_sector_jedec,
5154 .eraseblocks = { {512 * 1024, 1} },
5155 .block_erase = erase_chip_block_jedec,
5158 .write = write_jedec_1,
5159 .read = read_memmapped,
5160 .voltage = {4500, 5500},
5164 .vendor = "MoselVitelic",
5165 .name = "V29C51400T",
5166 .bustype = BUS_PARALLEL,
5167 .manufacture_id = SYNCMOS_MVC_ID,
5168 .model_id = MVC_V29C51400T,
5171 .feature_bits = FEATURE_EITHER_RESET,
5172 .tested = TEST_UNTESTED,
5173 .probe = probe_jedec,
5174 .probe_timing = TIMING_ZERO,
5178 .eraseblocks = { {1024, 512} },
5179 .block_erase = erase_sector_jedec,
5181 .eraseblocks = { {512 * 1024, 1} },
5182 .block_erase = erase_chip_block_jedec,
5185 .write = write_jedec_1,
5186 .read = read_memmapped,
5187 .voltage = {4500, 5500},
5191 .vendor = "MoselVitelic",
5192 .name = "V29LC51000",
5193 .bustype = BUS_PARALLEL,
5194 .manufacture_id = SYNCMOS_MVC_ID,
5195 .model_id = MVC_V29LC51000,
5198 .feature_bits = FEATURE_EITHER_RESET,
5199 .tested = TEST_UNTESTED,
5200 .probe = probe_jedec,
5201 .probe_timing = TIMING_ZERO,
5205 .eraseblocks = { {512, 128} },
5206 .block_erase = erase_sector_jedec,
5208 .eraseblocks = { {64 * 1024, 1} },
5209 .block_erase = erase_chip_block_jedec,
5212 .write = write_jedec_1,
5213 .read = read_memmapped,
5214 .voltage = {4500, 5500},
5218 .vendor = "MoselVitelic",
5219 .name = "V29LC51001",
5220 .bustype = BUS_PARALLEL,
5221 .manufacture_id = SYNCMOS_MVC_ID,
5222 .model_id = MVC_V29LC51001,
5225 .feature_bits = FEATURE_EITHER_RESET,
5226 .tested = TEST_UNTESTED,
5227 .probe = probe_jedec,
5228 .probe_timing = TIMING_ZERO,
5232 .eraseblocks = { {512, 256} },
5233 .block_erase = erase_sector_jedec,
5235 .eraseblocks = { {128 * 1024, 1} },
5236 .block_erase = erase_chip_block_jedec,
5239 .write = write_jedec_1,
5240 .read = read_memmapped,
5241 .voltage = {4500, 5500},
5245 .vendor = "MoselVitelic",
5246 .name = "V29LC51002",
5247 .bustype = BUS_PARALLEL,
5248 .manufacture_id = SYNCMOS_MVC_ID,
5249 .model_id = MVC_V29LC51002,
5252 .feature_bits = FEATURE_EITHER_RESET,
5253 .tested = TEST_UNTESTED,
5254 .probe = probe_jedec,
5255 .probe_timing = TIMING_ZERO,
5259 .eraseblocks = { {512, 512} },
5260 .block_erase = erase_sector_jedec,
5262 .eraseblocks = { {256 * 1024, 1} },
5263 .block_erase = erase_chip_block_jedec,
5266 .write = write_jedec_1,
5267 .read = read_memmapped,
5268 .voltage = {4500, 5500},
5272 .vendor = "Numonyx",
5275 .manufacture_id = ST_ID,
5276 .model_id = ST_M25PE10,
5279 .feature_bits = FEATURE_WRSR_WREN,
5280 .tested = TEST_UNTESTED,
5281 .probe = probe_spi_rdid,
5282 .probe_timing = TIMING_ZERO,
5286 .eraseblocks = { {4 * 1024, 32} },
5287 .block_erase = spi_block_erase_20,
5289 .eraseblocks = { {64 * 1024, 2} },
5290 .block_erase = spi_block_erase_d8,
5292 .eraseblocks = { {128 * 1024, 1} },
5293 .block_erase = spi_block_erase_c7,
5296 .unlock = spi_disable_blockprotect,
5297 .write = spi_chip_write_256,
5298 .read = spi_chip_read,
5299 .voltage = {2700, 3600},
5303 .vendor = "Numonyx",
5306 .manufacture_id = ST_ID,
5307 .model_id = ST_M25PE20,
5310 .feature_bits = FEATURE_WRSR_WREN,
5311 .tested = TEST_UNTESTED,
5312 .probe = probe_spi_rdid,
5313 .probe_timing = TIMING_ZERO,
5317 .eraseblocks = { {4 * 1024, 64} },
5318 .block_erase = spi_block_erase_20,
5320 .eraseblocks = { {64 * 1024, 4} },
5321 .block_erase = spi_block_erase_d8,
5323 .eraseblocks = { {256 * 1024, 1} },
5324 .block_erase = spi_block_erase_c7,
5327 .unlock = spi_disable_blockprotect,
5328 .write = spi_chip_write_256,
5329 .read = spi_chip_read,
5330 .voltage = {2700, 3600},
5334 .vendor = "Numonyx",
5337 .manufacture_id = ST_ID,
5338 .model_id = ST_M25PE40,
5341 .feature_bits = FEATURE_WRSR_WREN,
5342 .tested = TEST_UNTESTED,
5343 .probe = probe_spi_rdid,
5344 .probe_timing = TIMING_ZERO,
5348 .eraseblocks = { {4 * 1024, 128} },
5349 .block_erase = spi_block_erase_20,
5351 .eraseblocks = { {64 * 1024, 8} },
5352 .block_erase = spi_block_erase_d8,
5354 .eraseblocks = { {512 * 1024, 1} },
5355 .block_erase = spi_block_erase_c7,
5358 .unlock = spi_disable_blockprotect,
5359 .write = spi_chip_write_256,
5360 .read = spi_chip_read,
5361 .voltage = {2700, 3600},
5365 .vendor = "Numonyx",
5368 .manufacture_id = ST_ID,
5369 .model_id = ST_M25PE80,
5372 .feature_bits = FEATURE_WRSR_WREN,
5373 .tested = TEST_OK_PREW,
5374 .probe = probe_spi_rdid,
5375 .probe_timing = TIMING_ZERO,
5379 .eraseblocks = { {4 * 1024, 256} },
5380 .block_erase = spi_block_erase_20,
5382 .eraseblocks = { {64 * 1024, 16} },
5383 .block_erase = spi_block_erase_d8,
5385 .eraseblocks = { {1024 * 1024, 1} },
5386 .block_erase = spi_block_erase_c7,
5389 .unlock = spi_disable_blockprotect,
5390 .write = spi_chip_write_256,
5391 .read = spi_chip_read,
5392 .voltage = {2700, 3600},
5396 .vendor = "Numonyx",
5399 .manufacture_id = ST_ID,
5400 .model_id = ST_M25PE16,
5403 .feature_bits = FEATURE_WRSR_WREN,
5404 .tested = TEST_UNTESTED,
5405 .probe = probe_spi_rdid,
5406 .probe_timing = TIMING_ZERO,
5410 .eraseblocks = { {4 * 1024, 512} },
5411 .block_erase = spi_block_erase_20,
5413 .eraseblocks = { {64 * 1024, 32} },
5414 .block_erase = spi_block_erase_d8,
5416 .eraseblocks = { {2 * 1024 * 1024, 1} },
5417 .block_erase = spi_block_erase_c7,
5420 .unlock = spi_disable_blockprotect,
5421 .write = spi_chip_write_256,
5422 .read = spi_chip_read,
5423 .voltage = {2700, 3600},
5427 .vendor = "Numonyx",
5430 .manufacture_id = ST_ID,
5431 .model_id = ST_N25Q064,
5434 .tested = TEST_OK_PREW,
5435 .probe = probe_spi_rdid,
5436 .probe_timing = TIMING_ZERO,
5440 .eraseblocks = { {4 * 1024, 2048 } },
5441 .block_erase = spi_block_erase_20,
5443 .eraseblocks = { {64 * 1024, 128} },
5444 .block_erase = spi_block_erase_d8,
5446 .eraseblocks = { {8 * 1024 * 1024, 1} },
5447 .block_erase = spi_block_erase_c7,
5450 .unlock = spi_disable_blockprotect,
5451 .write = spi_chip_write_256,
5452 .read = spi_chip_read,
5457 .name = "Pm25LV010",
5459 .manufacture_id = PMC_ID,
5460 .model_id = PMC_PM25LV010,
5463 .feature_bits = FEATURE_WRSR_WREN,
5464 .tested = TEST_UNTESTED,
5465 .probe = probe_spi_rdid,
5466 .probe_timing = TIMING_ZERO,
5470 .eraseblocks = { {4 * 1024, 32} },
5471 .block_erase = spi_block_erase_d7,
5473 .eraseblocks = { {32 * 1024, 4} },
5474 .block_erase = spi_block_erase_d8,
5476 .eraseblocks = { {128 * 1024, 1} },
5477 .block_erase = spi_block_erase_c7,
5480 .unlock = spi_disable_blockprotect,
5481 .write = spi_chip_write_256,
5482 .read = spi_chip_read,
5483 .voltage = {2700, 3600},
5488 .name = "Pm25LV016B",
5490 .manufacture_id = PMC_ID,
5491 .model_id = PMC_PM25LV016B,
5494 .feature_bits = FEATURE_WRSR_WREN,
5495 .tested = TEST_UNTESTED,
5496 .probe = probe_spi_rdid,
5497 .probe_timing = TIMING_ZERO,
5501 .eraseblocks = { {4 * 1024, 512} },
5502 .block_erase = spi_block_erase_d7,
5504 .eraseblocks = { {4 * 1024, 512} },
5505 .block_erase = spi_block_erase_20,
5507 .eraseblocks = { {64 * 1024, 32} },
5508 .block_erase = spi_block_erase_d8,
5510 .eraseblocks = { {2 * 1024 * 1024, 1} },
5511 .block_erase = spi_block_erase_60,
5513 .eraseblocks = { {2 * 1024 * 1024, 1} },
5514 .block_erase = spi_block_erase_c7,
5517 .unlock = spi_disable_blockprotect,
5518 .write = spi_chip_write_256,
5519 .read = spi_chip_read,
5520 .voltage = {2700, 3600},
5525 .name = "Pm25LV020",
5527 .manufacture_id = PMC_ID,
5528 .model_id = PMC_PM25LV020,
5531 .feature_bits = FEATURE_WRSR_WREN,
5532 .tested = TEST_UNTESTED,
5533 .probe = probe_spi_rdid,
5534 .probe_timing = TIMING_ZERO,
5538 .eraseblocks = { {4 * 1024, 64} },
5539 .block_erase = spi_block_erase_d7,
5541 .eraseblocks = { {64 * 1024, 4} },
5542 .block_erase = spi_block_erase_d8,
5544 .eraseblocks = { {256 * 1024, 1} },
5545 .block_erase = spi_block_erase_c7,
5548 .unlock = spi_disable_blockprotect,
5549 .write = spi_chip_write_256,
5550 .read = spi_chip_read,
5551 .voltage = {2700, 3600},
5556 .name = "Pm25LV040",
5558 .manufacture_id = PMC_ID,
5559 .model_id = PMC_PM25LV040,
5562 .feature_bits = FEATURE_WRSR_WREN,
5563 .tested = TEST_OK_PREW,
5564 .probe = probe_spi_rdid,
5565 .probe_timing = TIMING_ZERO,
5569 .eraseblocks = { {4 * 1024, 128} },
5570 .block_erase = spi_block_erase_d7,
5572 .eraseblocks = { {64 * 1024, 8} },
5573 .block_erase = spi_block_erase_d8,
5575 .eraseblocks = { {512 * 1024, 1} },
5576 .block_erase = spi_block_erase_c7,
5579 .unlock = spi_disable_blockprotect,
5580 .write = spi_chip_write_256,
5581 .read = spi_chip_read,
5582 .voltage = {2700, 3600},
5587 .name = "Pm25LV080B",
5589 .manufacture_id = PMC_ID,
5590 .model_id = PMC_PM25LV080B,
5593 .feature_bits = FEATURE_WRSR_WREN,
5594 .tested = TEST_UNTESTED,
5595 .probe = probe_spi_rdid,
5596 .probe_timing = TIMING_ZERO,
5600 .eraseblocks = { {4 * 1024, 256} },
5601 .block_erase = spi_block_erase_d7,
5603 .eraseblocks = { {4 * 1024, 256} },
5604 .block_erase = spi_block_erase_20,
5606 .eraseblocks = { {64 * 1024, 16} },
5607 .block_erase = spi_block_erase_d8,
5609 .eraseblocks = { {1024 * 1024, 1} },
5610 .block_erase = spi_block_erase_60,
5612 .eraseblocks = { {1024 * 1024, 1} },
5613 .block_erase = spi_block_erase_c7,
5616 .unlock = spi_disable_blockprotect,
5617 .write = spi_chip_write_256,
5618 .read = spi_chip_read,
5619 .voltage = {2700, 3600},
5624 .name = "Pm25LV512",
5626 .manufacture_id = PMC_ID,
5627 .model_id = PMC_PM25LV512,
5630 .feature_bits = FEATURE_WRSR_WREN,
5631 .tested = TEST_UNTESTED,
5632 .probe = probe_spi_rdid,
5633 .probe_timing = TIMING_ZERO,
5637 .eraseblocks = { {4 * 1024, 16} },
5638 .block_erase = spi_block_erase_d7,
5640 .eraseblocks = { {32 * 1024, 2} },
5641 .block_erase = spi_block_erase_d8,
5643 .eraseblocks = { {64 * 1024, 1} },
5644 .block_erase = spi_block_erase_c7,
5647 .unlock = spi_disable_blockprotect,
5648 .write = spi_chip_write_256,
5649 .read = spi_chip_read,
5650 .voltage = {2700, 3600},
5655 .name = "Pm29F002T",
5656 .bustype = BUS_PARALLEL,
5657 .manufacture_id = PMC_ID_NOPREFIX,
5658 .model_id = PMC_PM29F002T,
5660 .page_size = 8 * 1024,
5661 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5662 .tested = TEST_OK_PREW,
5663 .probe = probe_jedec,
5664 .probe_timing = TIMING_FIXME,
5674 .block_erase = erase_sector_jedec,
5676 .eraseblocks = { {256 * 1024, 1} },
5677 .block_erase = erase_chip_block_jedec,
5680 .write = write_jedec_1,
5681 .read = read_memmapped,
5682 .voltage = {4500, 5500},
5687 .name = "Pm29F002B",
5688 .bustype = BUS_PARALLEL,
5689 .manufacture_id = PMC_ID_NOPREFIX,
5690 .model_id = PMC_PM29F002B,
5692 .page_size = 8 * 1024,
5693 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5694 .tested = TEST_UNTESTED,
5695 .probe = probe_jedec,
5696 .probe_timing = TIMING_FIXME,
5706 .block_erase = erase_sector_jedec,
5708 .eraseblocks = { {256 * 1024, 1} },
5709 .block_erase = erase_chip_block_jedec,
5712 .write = write_jedec_1,
5713 .read = read_memmapped,
5714 .voltage = {4500, 5500},
5719 .name = "Pm39LV010",
5720 .bustype = BUS_PARALLEL,
5721 .manufacture_id = PMC_ID_NOPREFIX,
5722 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
5725 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5726 .tested = TEST_OK_PREW,
5727 .probe = probe_jedec,
5728 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5732 .eraseblocks = { {4 * 1024, 32} },
5733 .block_erase = erase_sector_jedec,
5735 .eraseblocks = { {64 * 1024, 2} },
5736 .block_erase = erase_block_jedec,
5738 .eraseblocks = { {128 * 1024, 1} },
5739 .block_erase = erase_chip_block_jedec,
5742 .write = write_jedec_1,
5743 .read = read_memmapped,
5744 .voltage = {2700, 3600},
5749 .name = "Pm39LV020",
5750 .bustype = BUS_PARALLEL,
5751 .manufacture_id = PMC_ID_NOPREFIX,
5752 .model_id = PMC_PM39LV020,
5755 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5756 .tested = TEST_UNTESTED,
5757 .probe = probe_jedec,
5758 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5762 .eraseblocks = { {4 * 1024, 64} },
5763 .block_erase = erase_sector_jedec,
5765 .eraseblocks = { {64 * 1024, 4} },
5766 .block_erase = erase_block_jedec,
5768 .eraseblocks = { {256 * 1024, 1} },
5769 .block_erase = erase_chip_block_jedec,
5772 .write = write_jedec_1,
5773 .read = read_memmapped,
5774 .voltage = {2700, 3600},
5779 .name = "Pm39LV040",
5780 .bustype = BUS_PARALLEL,
5781 .manufacture_id = PMC_ID_NOPREFIX,
5782 .model_id = PMC_PM39LV040,
5785 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5786 .tested = TEST_OK_PR,
5787 .probe = probe_jedec,
5788 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5792 .eraseblocks = { {4 * 1024, 128} },
5793 .block_erase = erase_sector_jedec,
5795 .eraseblocks = { {64 * 1024, 8} },
5796 .block_erase = erase_block_jedec,
5798 .eraseblocks = { {512 * 1024, 1} },
5799 .block_erase = erase_chip_block_jedec,
5802 .write = write_jedec_1,
5803 .read = read_memmapped,
5804 .voltage = {2700, 3600},
5809 .name = "Pm39LV512",
5810 .bustype = BUS_PARALLEL,
5811 .manufacture_id = PMC_ID_NOPREFIX,
5812 .model_id = PMC_PM39LV512,
5815 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5816 .tested = TEST_OK_PREW,
5817 .probe = probe_jedec,
5818 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5822 .eraseblocks = { {4 * 1024, 16} },
5823 .block_erase = erase_sector_jedec,
5825 .eraseblocks = { {64 * 1024, 1} },
5826 .block_erase = erase_block_jedec,
5828 .eraseblocks = { {64 * 1024, 1} },
5829 .block_erase = erase_chip_block_jedec,
5832 .write = write_jedec_1,
5833 .read = read_memmapped,
5834 .voltage = {2700, 3600},
5839 .name = "Pm49FL002",
5840 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
5841 .manufacture_id = PMC_ID_NOPREFIX,
5842 .model_id = PMC_PM49FL002,
5844 .page_size = 16 * 1024,
5845 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5846 .tested = TEST_OK_PREW,
5847 .probe = probe_jedec,
5848 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
5852 .eraseblocks = { {4 * 1024, 64} },
5853 .block_erase = erase_sector_jedec,
5855 .eraseblocks = { {16 * 1024, 16} },
5856 .block_erase = erase_block_jedec,
5858 .eraseblocks = { {256 * 1024, 1} },
5859 .block_erase = erase_chip_block_jedec,
5862 .unlock = unlock_49fl00x,
5863 .write = write_jedec_1,
5864 .read = read_memmapped,
5865 .voltage = {3000, 3600},
5870 .name = "Pm49FL004",
5871 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
5872 .manufacture_id = PMC_ID_NOPREFIX,
5873 .model_id = PMC_PM49FL004,
5875 .page_size = 64 * 1024,
5876 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5877 .tested = TEST_OK_PREW,
5878 .probe = probe_jedec,
5879 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
5883 .eraseblocks = { {4 * 1024, 128} },
5884 .block_erase = erase_sector_jedec,
5886 .eraseblocks = { {64 * 1024, 8} },
5887 .block_erase = erase_block_jedec,
5889 .eraseblocks = { {512 * 1024, 1} },
5890 .block_erase = erase_chip_block_jedec,
5893 .unlock = unlock_49fl00x,
5894 .write = write_jedec_1,
5895 .read = read_memmapped,
5896 .voltage = {3000, 3600},
5901 .name = "LF25FW203A",
5903 .manufacture_id = SANYO_ID,
5904 .model_id = SANYO_LE25FW203A,
5907 .tested = TEST_UNTESTED,
5908 .probe = probe_spi_rdid,
5909 .probe_timing = TIMING_ZERO,
5913 .eraseblocks = { {64 * 1024, 32} },
5914 .block_erase = spi_block_erase_d8,
5916 .eraseblocks = { {2 * 1024 * 1024, 1} },
5917 .block_erase = spi_block_erase_c7,
5920 .unlock = spi_disable_blockprotect,
5921 .write = spi_chip_write_256,
5922 .read = spi_chip_read,
5927 .name = "LH28F008BJT-BTLZ1",
5928 .bustype = BUS_PARALLEL,
5929 .manufacture_id = SHARP_ID,
5930 .model_id = SHARP_LH28F008BJxxPB,
5932 .page_size = 64 * 1024,
5933 .tested = TEST_OK_PREW,
5934 .probe = probe_82802ab,
5935 .probe_timing = TIMING_ZERO,
5943 .block_erase = erase_block_82802ab,
5945 .eraseblocks = { {1024 * 1024, 1} },
5946 .block_erase = erase_sector_49lfxxxc,
5949 .unlock = unlock_lh28f008bjt,
5950 .write = write_82802ab,
5951 .read = read_memmapped,
5952 .voltage = {2700, 3600},
5958 .bustype = BUS_FWH, /* A/A Mux */
5959 .manufacture_id = SHARP_ID,
5960 .model_id = SHARP_LHF00L04,
5962 .page_size = 64 * 1024,
5963 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
5964 .tested = TEST_UNTESTED,
5965 .probe = probe_82802ab,
5966 .probe_timing = TIMING_ZERO,
5974 .block_erase = erase_block_82802ab,
5979 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
5982 .unlock = unlock_82802ab,
5983 .write = write_82802ab,
5984 .read = read_memmapped,
5985 .voltage = {3000, 3600},
5989 .vendor = "Spansion",
5990 .name = "S25FL004A",
5992 .manufacture_id = SPANSION_ID,
5993 .model_id = SPANSION_S25FL004A,
5996 .feature_bits = FEATURE_WRSR_WREN,
5997 .tested = TEST_UNTESTED,
5998 .probe = probe_spi_rdid,
5999 .probe_timing = TIMING_ZERO,
6003 .eraseblocks = { {64 * 1024, 8} },
6004 .block_erase = spi_block_erase_d8,
6006 .eraseblocks = { {512 * 1024, 1} },
6007 .block_erase = spi_block_erase_c7,
6010 .unlock = spi_disable_blockprotect,
6011 .write = spi_chip_write_256,
6012 .read = spi_chip_read,
6013 .voltage = {2700, 3600},
6017 .vendor = "Spansion",
6018 .name = "S25FL008A",
6020 .manufacture_id = SPANSION_ID,
6021 .model_id = SPANSION_S25FL008A,
6024 .feature_bits = FEATURE_WRSR_WREN,
6025 .tested = TEST_OK_PRE,
6026 .probe = probe_spi_rdid,
6027 .probe_timing = TIMING_ZERO,
6031 .eraseblocks = { {64 * 1024, 16} },
6032 .block_erase = spi_block_erase_d8,
6034 .eraseblocks = { {1024 * 1024, 1} },
6035 .block_erase = spi_block_erase_c7,
6038 .unlock = spi_disable_blockprotect,
6039 .write = spi_chip_write_256,
6040 .read = spi_chip_read,
6041 .voltage = {2700, 3600},
6045 .vendor = "Spansion",
6046 .name = "S25FL016A",
6048 .manufacture_id = SPANSION_ID,
6049 .model_id = SPANSION_S25FL016A,
6052 .feature_bits = FEATURE_WRSR_WREN,
6053 .tested = TEST_OK_PR,
6054 .probe = probe_spi_rdid,
6055 .probe_timing = TIMING_ZERO,
6059 .eraseblocks = { {64 * 1024, 32} },
6060 .block_erase = spi_block_erase_d8,
6062 .eraseblocks = { {2 * 1024 * 1024, 1} },
6063 .block_erase = spi_block_erase_c7,
6066 .unlock = spi_disable_blockprotect,
6067 .write = spi_chip_write_256,
6068 .read = spi_chip_read,
6069 .voltage = {2700, 3600},
6073 .vendor = "Spansion",
6074 .name = "S25FL032A",
6076 .manufacture_id = SPANSION_ID,
6077 .model_id = SPANSION_S25FL032A,
6080 .feature_bits = FEATURE_WRSR_WREN,
6081 .tested = TEST_OK_PR,
6082 .probe = probe_spi_rdid,
6083 .probe_timing = TIMING_ZERO,
6087 .eraseblocks = { {64 * 1024, 64} },
6088 .block_erase = spi_block_erase_d8,
6090 .eraseblocks = { {4 * 1024 * 1024, 1} },
6091 .block_erase = spi_block_erase_c7,
6094 .unlock = spi_disable_blockprotect,
6095 .write = spi_chip_write_256,
6096 .read = spi_chip_read,
6097 .voltage = {2700, 3600},
6101 .vendor = "Spansion",
6102 .name = "S25FL064A",
6104 .manufacture_id = SPANSION_ID,
6105 .model_id = SPANSION_S25FL064A,
6108 .feature_bits = FEATURE_WRSR_WREN,
6109 .tested = TEST_OK_PREW,
6110 .probe = probe_spi_rdid,
6111 .probe_timing = TIMING_ZERO,
6115 .eraseblocks = { {64 * 1024, 128} },
6116 .block_erase = spi_block_erase_d8,
6118 .eraseblocks = { {8 * 1024 * 1024, 1} },
6119 .block_erase = spi_block_erase_c7,
6122 .unlock = spi_disable_blockprotect,
6123 .write = spi_chip_write_256,
6124 .read = spi_chip_read,
6125 .voltage = {2700, 3600},
6130 .name = "SST25LF040A",
6132 .manufacture_id = SST_ID,
6133 .model_id = SST_SST25VF040_REMS,
6136 .feature_bits = FEATURE_WRSR_EWSR,
6137 .tested = TEST_OK_PREW,
6138 .probe = probe_spi_res2,
6139 .probe_timing = TIMING_ZERO,
6143 .eraseblocks = { {4 * 1024, 128} },
6144 .block_erase = spi_block_erase_20,
6146 .eraseblocks = { {32 * 1024, 16} },
6147 .block_erase = spi_block_erase_52,
6149 .eraseblocks = { {512 * 1024, 1} },
6150 .block_erase = spi_block_erase_60,
6153 .unlock = spi_disable_blockprotect,
6154 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6155 .read = spi_chip_read,
6156 .voltage = {3000, 3600},
6161 .name = "SST25LF080A",
6163 .manufacture_id = SST_ID,
6164 .model_id = SST_SST25VF080_REMS,
6167 .feature_bits = FEATURE_WRSR_EWSR,
6168 .tested = TEST_UNTESTED,
6169 .probe = probe_spi_res2,
6170 .probe_timing = TIMING_ZERO,
6174 .eraseblocks = { {4 * 1024, 256} },
6175 .block_erase = spi_block_erase_20,
6177 .eraseblocks = { {32 * 1024, 32} },
6178 .block_erase = spi_block_erase_52,
6180 .eraseblocks = { {1024 * 1024, 1} },
6181 .block_erase = spi_block_erase_60,
6184 .unlock = spi_disable_blockprotect,
6185 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6186 .read = spi_chip_read,
6187 .voltage = {3000, 3600},
6192 .name = "SST25VF010",
6194 .manufacture_id = SST_ID,
6195 .model_id = SST_SST25VF010_REMS,
6198 .feature_bits = FEATURE_WRSR_EWSR,
6199 .tested = TEST_OK_PREW,
6200 .probe = probe_spi_rems,
6201 .probe_timing = TIMING_ZERO,
6205 .eraseblocks = { {4 * 1024, 32} },
6206 .block_erase = spi_block_erase_20,
6208 .eraseblocks = { {32 * 1024, 4} },
6209 .block_erase = spi_block_erase_52,
6211 .eraseblocks = { {128 * 1024, 1} },
6212 .block_erase = spi_block_erase_60,
6215 .unlock = spi_disable_blockprotect,
6216 .write = spi_chip_write_1,
6217 .read = spi_chip_read,
6218 .voltage = {2700, 3600},
6223 .name = "SST25VF016B",
6225 .manufacture_id = SST_ID,
6226 .model_id = SST_SST25VF016B,
6229 .feature_bits = FEATURE_WRSR_EWSR,
6230 .tested = TEST_OK_PREW,
6231 .probe = probe_spi_rdid,
6232 .probe_timing = TIMING_ZERO,
6236 .eraseblocks = { {4 * 1024, 512} },
6237 .block_erase = spi_block_erase_20,
6239 .eraseblocks = { {32 * 1024, 64} },
6240 .block_erase = spi_block_erase_52,
6242 .eraseblocks = { {64 * 1024, 32} },
6243 .block_erase = spi_block_erase_d8,
6245 .eraseblocks = { {2 * 1024 * 1024, 1} },
6246 .block_erase = spi_block_erase_60,
6248 .eraseblocks = { {2 * 1024 * 1024, 1} },
6249 .block_erase = spi_block_erase_c7,
6252 .unlock = spi_disable_blockprotect,
6253 .write = spi_aai_write,
6254 .read = spi_chip_read,
6255 .voltage = {2700, 3600},
6260 .name = "SST25VF032B",
6262 .manufacture_id = SST_ID,
6263 .model_id = SST_SST25VF032B,
6266 .feature_bits = FEATURE_WRSR_EWSR,
6267 .tested = TEST_OK_PREW,
6268 .probe = probe_spi_rdid,
6269 .probe_timing = TIMING_ZERO,
6273 .eraseblocks = { {4 * 1024, 1024} },
6274 .block_erase = spi_block_erase_20,
6276 .eraseblocks = { {32 * 1024, 128} },
6277 .block_erase = spi_block_erase_52,
6279 .eraseblocks = { {64 * 1024, 64} },
6280 .block_erase = spi_block_erase_d8,
6282 .eraseblocks = { {4 * 1024 * 1024, 1} },
6283 .block_erase = spi_block_erase_60,
6285 .eraseblocks = { {4 * 1024 * 1024, 1} },
6286 .block_erase = spi_block_erase_c7,
6289 .unlock = spi_disable_blockprotect,
6290 .write = spi_aai_write,
6291 .read = spi_chip_read,
6292 .voltage = {2700, 3600},
6297 .name = "SST25VF064C",
6299 .manufacture_id = SST_ID,
6300 .model_id = SST_SST25VF064C,
6303 .feature_bits = FEATURE_WRSR_EWSR,
6304 .tested = TEST_OK_PREW,
6305 .probe = probe_spi_rdid,
6306 .probe_timing = TIMING_ZERO,
6310 .eraseblocks = { {4 * 1024, 2048} },
6311 .block_erase = spi_block_erase_20,
6313 .eraseblocks = { {32 * 1024, 256} },
6314 .block_erase = spi_block_erase_52,
6316 .eraseblocks = { {64 * 1024, 128} },
6317 .block_erase = spi_block_erase_d8,
6319 .eraseblocks = { {8 * 1024 * 1024, 1} },
6320 .block_erase = spi_block_erase_60,
6322 .eraseblocks = { {8 * 1024 * 1024, 1} },
6323 .block_erase = spi_block_erase_c7,
6326 .unlock = spi_disable_blockprotect,
6327 .write = spi_chip_write_256,
6328 .read = spi_chip_read,
6329 .voltage = {2700, 3600},
6334 .name = "SST25VF040",
6336 .manufacture_id = SST_ID,
6337 .model_id = SST_SST25VF040_REMS,
6340 .feature_bits = FEATURE_WRSR_EWSR,
6341 .tested = TEST_OK_PR,
6342 .probe = probe_spi_rems,
6343 .probe_timing = TIMING_ZERO,
6347 .eraseblocks = { {4 * 1024, 128} },
6348 .block_erase = spi_block_erase_20,
6350 .eraseblocks = { {32 * 1024, 16} },
6351 .block_erase = spi_block_erase_52,
6353 .eraseblocks = { {512 * 1024, 1} },
6354 .block_erase = spi_block_erase_60,
6357 .unlock = spi_disable_blockprotect,
6358 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6359 .read = spi_chip_read,
6360 .voltage = {2700, 3600},
6365 .name = "SST25VF040B",
6367 .manufacture_id = SST_ID,
6368 .model_id = SST_SST25VF040B,
6371 .feature_bits = FEATURE_WRSR_EWSR,
6372 .tested = TEST_UNTESTED,
6373 .probe = probe_spi_rdid,
6374 .probe_timing = TIMING_ZERO,
6378 .eraseblocks = { {4 * 1024, 128} },
6379 .block_erase = spi_block_erase_20,
6381 .eraseblocks = { {32 * 1024, 16} },
6382 .block_erase = spi_block_erase_52,
6384 .eraseblocks = { {64 * 1024, 8} },
6385 .block_erase = spi_block_erase_d8,
6387 .eraseblocks = { {512 * 1024, 1} },
6388 .block_erase = spi_block_erase_60,
6390 .eraseblocks = { {512 * 1024, 1} },
6391 .block_erase = spi_block_erase_c7,
6394 .unlock = spi_disable_blockprotect,
6395 .write = spi_aai_write,
6396 .read = spi_chip_read,
6397 .voltage = {2700, 3600},
6402 .name = "SST25VF040B.REMS",
6404 .manufacture_id = SST_ID,
6405 .model_id = SST_SST25VF040B_REMS,
6408 .feature_bits = FEATURE_WRSR_EWSR,
6409 .tested = TEST_OK_PR,
6410 .probe = probe_spi_rems,
6411 .probe_timing = TIMING_ZERO,
6415 .eraseblocks = { {4 * 1024, 128} },
6416 .block_erase = spi_block_erase_20,
6418 .eraseblocks = { {32 * 1024, 16} },
6419 .block_erase = spi_block_erase_52,
6421 .eraseblocks = { {64 * 1024, 8} },
6422 .block_erase = spi_block_erase_d8,
6424 .eraseblocks = { {512 * 1024, 1} },
6425 .block_erase = spi_block_erase_60,
6427 .eraseblocks = { {512 * 1024, 1} },
6428 .block_erase = spi_block_erase_c7,
6431 .unlock = spi_disable_blockprotect,
6432 .write = spi_aai_write,
6433 .read = spi_chip_read,
6434 .voltage = {2700, 3600},
6439 .name = "SST25VF080B",
6441 .manufacture_id = SST_ID,
6442 .model_id = SST_SST25VF080B,
6445 .feature_bits = FEATURE_WRSR_EWSR,
6446 .tested = TEST_OK_PREW,
6447 .probe = probe_spi_rdid,
6448 .probe_timing = TIMING_ZERO,
6452 .eraseblocks = { {4 * 1024, 256} },
6453 .block_erase = spi_block_erase_20,
6455 .eraseblocks = { {32 * 1024, 32} },
6456 .block_erase = spi_block_erase_52,
6458 .eraseblocks = { {64 * 1024, 16} },
6459 .block_erase = spi_block_erase_d8,
6461 .eraseblocks = { {1024 * 1024, 1} },
6462 .block_erase = spi_block_erase_60,
6464 .eraseblocks = { {1024 * 1024, 1} },
6465 .block_erase = spi_block_erase_c7,
6468 .unlock = spi_disable_blockprotect,
6469 .write = spi_aai_write,
6470 .read = spi_chip_read,
6471 .voltage = {2700, 3600},
6476 .name = "SST28SF040A",
6477 .bustype = BUS_PARALLEL,
6478 .manufacture_id = SST_ID,
6479 .model_id = SST_SST28SF040,
6483 .tested = TEST_UNTESTED,
6484 .probe = probe_82802ab,
6485 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
6489 .eraseblocks = { {128, 4096} },
6490 .block_erase = erase_sector_28sf040,
6492 .eraseblocks = { {512 * 1024, 1} },
6493 .block_erase = erase_chip_28sf040,
6496 .unlock = unprotect_28sf040,
6497 .write = write_28sf040,
6498 .read = read_memmapped,
6499 .voltage = {4500, 5500},
6504 .name = "SST29EE010",
6505 .bustype = BUS_PARALLEL,
6506 .manufacture_id = SST_ID,
6507 .model_id = SST_SST29EE010,
6510 .feature_bits = FEATURE_LONG_RESET,
6511 .tested = TEST_OK_PR,
6512 .probe = probe_jedec,
6517 .eraseblocks = { {128 * 1024, 1} },
6518 .block_erase = erase_chip_block_jedec,
6521 .write = write_jedec,
6522 .read = read_memmapped,
6523 .voltage = {4500, 5500},
6528 .name = "SST29LE010",
6529 .bustype = BUS_PARALLEL,
6530 .manufacture_id = SST_ID,
6531 .model_id = SST_SST29LE010,
6534 .feature_bits = FEATURE_LONG_RESET,
6535 .tested = TEST_UNTESTED,
6536 .probe = probe_jedec,
6541 .eraseblocks = { {128 * 1024, 1} },
6542 .block_erase = erase_chip_block_jedec,
6545 .write = write_jedec,
6546 .read = read_memmapped,
6547 .voltage = {3000, 3600},
6552 .name = "SST29EE020A",
6553 .bustype = BUS_PARALLEL,
6554 .manufacture_id = SST_ID,
6555 .model_id = SST_SST29EE020A,
6558 .feature_bits = FEATURE_LONG_RESET,
6559 .tested = TEST_OK_PRE,
6560 .probe = probe_jedec,
6565 .eraseblocks = { {256 * 1024, 1} },
6566 .block_erase = erase_chip_block_jedec,
6569 .write = write_jedec,
6570 .read = read_memmapped,
6571 .voltage = {4500, 5500},
6576 .name = "SST29LE020",
6577 .bustype = BUS_PARALLEL,
6578 .manufacture_id = SST_ID,
6579 .model_id = SST_SST29LE020,
6582 .feature_bits = FEATURE_LONG_RESET,
6583 .tested = TEST_OK_PRE,
6584 .probe = probe_jedec,
6589 .eraseblocks = { {256 * 1024, 1} },
6590 .block_erase = erase_chip_block_jedec,
6593 .write = write_jedec,
6594 .read = read_memmapped,
6595 .voltage = {3000, 3600},
6600 .name = "SST39SF512",
6601 .bustype = BUS_PARALLEL,
6602 .manufacture_id = SST_ID,
6603 .model_id = SST_SST39SF512,
6606 .feature_bits = FEATURE_EITHER_RESET,
6607 .tested = TEST_OK_PREW,
6608 .probe = probe_jedec,
6609 .probe_timing = 1, /* 150 ns */
6613 .eraseblocks = { {4 * 1024, 16} },
6614 .block_erase = erase_sector_jedec,
6616 .eraseblocks = { {64 * 1024, 1} },
6617 .block_erase = erase_chip_block_jedec,
6620 .write = write_jedec_1,
6621 .read = read_memmapped,
6622 .voltage = {4500, 5500},
6627 .name = "SST39SF010A",
6628 .bustype = BUS_PARALLEL,
6629 .manufacture_id = SST_ID,
6630 .model_id = SST_SST39SF010,
6633 .feature_bits = FEATURE_EITHER_RESET,
6634 .tested = TEST_OK_PREW,
6635 .probe = probe_jedec,
6636 .probe_timing = 1, /* 150 ns */
6640 .eraseblocks = { {4 * 1024, 32} },
6641 .block_erase = erase_sector_jedec,
6643 .eraseblocks = { {128 * 1024, 1} },
6644 .block_erase = erase_chip_block_jedec,
6647 .write = write_jedec_1,
6648 .read = read_memmapped,
6649 .voltage = {4500, 5500},
6654 .name = "SST39SF020A",
6655 .bustype = BUS_PARALLEL,
6656 .manufacture_id = SST_ID,
6657 .model_id = SST_SST39SF020,
6660 .feature_bits = FEATURE_EITHER_RESET,
6661 .tested = TEST_OK_PREW,
6662 .probe = probe_jedec,
6663 .probe_timing = 1, /* 150 ns */
6667 .eraseblocks = { {4 * 1024, 64} },
6668 .block_erase = erase_sector_jedec,
6670 .eraseblocks = { {256 * 1024, 1} },
6671 .block_erase = erase_chip_block_jedec,
6674 .write = write_jedec_1,
6675 .read = read_memmapped,
6676 .voltage = {4500, 5500},
6681 .name = "SST39SF040",
6682 .bustype = BUS_PARALLEL,
6683 .manufacture_id = SST_ID,
6684 .model_id = SST_SST39SF040,
6687 .feature_bits = FEATURE_EITHER_RESET,
6688 .tested = TEST_OK_PREW,
6689 .probe = probe_jedec,
6690 .probe_timing = 1, /* 150 ns */
6694 .eraseblocks = { {4 * 1024, 128} },
6695 .block_erase = erase_sector_jedec,
6697 .eraseblocks = { {512 * 1024, 1} },
6698 .block_erase = erase_chip_block_jedec,
6701 .write = write_jedec_1,
6702 .read = read_memmapped,
6703 .voltage = {4500, 5500},
6708 .name = "SST39VF512",
6709 .bustype = BUS_PARALLEL,
6710 .manufacture_id = SST_ID,
6711 .model_id = SST_SST39VF512,
6714 .feature_bits = FEATURE_EITHER_RESET,
6715 .tested = TEST_OK_PRE,
6716 .probe = probe_jedec,
6717 .probe_timing = 1, /* 150 ns */
6721 .eraseblocks = { {4 * 1024, 16} },
6722 .block_erase = erase_sector_jedec,
6724 .eraseblocks = { {64 * 1024, 1} },
6725 .block_erase = erase_chip_block_jedec,
6728 .write = write_jedec_1,
6729 .read = read_memmapped,
6730 .voltage = {2700, 3600},
6735 .name = "SST39VF010",
6736 .bustype = BUS_PARALLEL,
6737 .manufacture_id = SST_ID,
6738 .model_id = SST_SST39VF010,
6741 .feature_bits = FEATURE_EITHER_RESET,
6742 .tested = TEST_OK_PREW,
6743 .probe = probe_jedec,
6744 .probe_timing = 1, /* 150 ns */
6748 .eraseblocks = { {4 * 1024, 32} },
6749 .block_erase = erase_sector_jedec,
6751 .eraseblocks = { {128 * 1024, 1} },
6752 .block_erase = erase_chip_block_jedec,
6755 .write = write_jedec_1,
6756 .read = read_memmapped,
6757 .voltage = {2700, 3600},
6762 .name = "SST39VF020",
6763 .bustype = BUS_PARALLEL,
6764 .manufacture_id = SST_ID,
6765 .model_id = SST_SST39VF020,
6768 .feature_bits = FEATURE_EITHER_RESET,
6769 .tested = TEST_UNTESTED,
6770 .probe = probe_jedec,
6771 .probe_timing = 1, /* 150 ns */
6775 .eraseblocks = { {4 * 1024, 64} },
6776 .block_erase = erase_sector_jedec,
6778 .eraseblocks = { {256 * 1024, 1} },
6779 .block_erase = erase_chip_block_jedec,
6782 .write = write_jedec_1,
6783 .read = read_memmapped,
6784 .voltage = {2700, 3600},
6789 .name = "SST39VF040",
6790 .bustype = BUS_PARALLEL,
6791 .manufacture_id = SST_ID,
6792 .model_id = SST_SST39VF040,
6795 .feature_bits = FEATURE_EITHER_RESET,
6796 .tested = TEST_UNTESTED,
6797 .probe = probe_jedec,
6798 .probe_timing = 1, /* 150 ns */
6802 .eraseblocks = { {4 * 1024, 128} },
6803 .block_erase = erase_sector_jedec,
6805 .eraseblocks = { {512 * 1024, 1} },
6806 .block_erase = erase_chip_block_jedec,
6809 .write = write_jedec_1,
6810 .read = read_memmapped,
6811 .voltage = {2700, 3600},
6816 .name = "SST39VF080",
6817 .bustype = BUS_PARALLEL,
6818 .manufacture_id = SST_ID,
6819 .model_id = SST_SST39VF080,
6822 .feature_bits = FEATURE_EITHER_RESET,
6823 .tested = TEST_UNTESTED,
6824 .probe = probe_jedec,
6825 .probe_timing = 1, /* 150 ns */
6829 .eraseblocks = { {4 * 1024, 256} },
6830 .block_erase = erase_sector_jedec,
6832 .eraseblocks = { {64 * 1024, 16} },
6833 .block_erase = erase_block_jedec,
6835 .eraseblocks = { {1024 * 1024, 1} },
6836 .block_erase = erase_chip_block_jedec,
6839 .write = write_jedec_1,
6840 .read = read_memmapped,
6841 .voltage = {2700, 3600},
6846 .name = "SST49LF002A/B",
6847 .bustype = BUS_FWH, /* A/A Mux */
6848 .manufacture_id = SST_ID,
6849 .model_id = SST_SST49LF002A,
6851 .page_size = 16 * 1024,
6852 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6853 .tested = TEST_OK_PREW,
6854 .probe = probe_jedec,
6855 .probe_timing = 1, /* 150 ns */
6859 .eraseblocks = { {4 * 1024, 64} },
6860 .block_erase = erase_sector_jedec,
6862 .eraseblocks = { {16 * 1024, 16} },
6863 .block_erase = erase_block_jedec,
6865 .eraseblocks = { {256 * 1024, 1} },
6866 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6869 .printlock = printlock_sst_fwhub,
6870 .unlock = unlock_sst_fwhub,
6871 .write = write_jedec_1,
6872 .read = read_memmapped,
6873 .voltage = {3000, 3600},
6878 .name = "SST49LF003A/B",
6879 .bustype = BUS_FWH, /* A/A Mux */
6880 .manufacture_id = SST_ID,
6881 .model_id = SST_SST49LF003A,
6883 .page_size = 64 * 1024,
6884 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6885 .tested = TEST_OK_PR,
6886 .probe = probe_jedec,
6887 .probe_timing = 1, /* 150 ns */
6891 .eraseblocks = { {4 * 1024, 96} },
6892 .block_erase = erase_sector_jedec,
6894 .eraseblocks = { {64 * 1024, 6} },
6895 .block_erase = erase_block_jedec,
6897 .eraseblocks = { {384 * 1024, 1} },
6898 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6901 .printlock = printlock_sst_fwhub,
6902 .unlock = unlock_sst_fwhub,
6903 .write = write_jedec_1,
6904 .read = read_memmapped,
6905 .voltage = {3000, 3600},
6909 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
6910 * and is only honored for 64k block erase, but not 4k sector erase.
6913 .name = "SST49LF004A/B",
6914 .bustype = BUS_FWH, /* A/A Mux */
6915 .manufacture_id = SST_ID,
6916 .model_id = SST_SST49LF004A,
6918 .page_size = 64 * 1024,
6919 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6920 .tested = TEST_OK_PREW,
6921 .probe = probe_jedec,
6922 .probe_timing = 1, /* 150 ns */
6926 .eraseblocks = { {4 * 1024, 128} },
6927 .block_erase = erase_sector_jedec,
6929 .eraseblocks = { {64 * 1024, 8} },
6930 .block_erase = erase_block_jedec,
6932 .eraseblocks = { {512 * 1024, 1} },
6933 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6936 .printlock = printlock_sst_fwhub,
6937 .unlock = unlock_sst_fwhub,
6938 .write = write_jedec_1,
6939 .read = read_memmapped,
6940 .voltage = {3000, 3600},
6945 .name = "SST49LF004C",
6947 .manufacture_id = SST_ID,
6948 .model_id = SST_SST49LF004C,
6950 .page_size = 4 * 1024,
6951 .feature_bits = FEATURE_REGISTERMAP,
6952 .tested = TEST_UNTESTED,
6953 .probe = probe_82802ab,
6954 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6958 .eraseblocks = { {4 * 1024, 128} },
6959 .block_erase = erase_sector_49lfxxxc,
6967 .block_erase = erase_block_82802ab,
6970 .unlock = unlock_49lfxxxc,
6971 .write = write_82802ab,
6972 .read = read_memmapped,
6973 .voltage = {3000, 3600},
6978 .name = "SST49LF008A",
6979 .bustype = BUS_FWH, /* A/A Mux */
6980 .manufacture_id = SST_ID,
6981 .model_id = SST_SST49LF008A,
6983 .page_size = 64 * 1024,
6984 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6985 .tested = TEST_OK_PREW,
6986 .probe = probe_jedec,
6987 .probe_timing = 1, /* 150 ns */
6991 .eraseblocks = { {4 * 1024, 256} },
6992 .block_erase = erase_sector_jedec,
6994 .eraseblocks = { {64 * 1024, 16} },
6995 .block_erase = erase_block_jedec,
6997 .eraseblocks = { {1024 * 1024, 1} },
6998 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7001 .printlock = printlock_sst_fwhub,
7002 .unlock = unlock_sst_fwhub,
7003 .write = write_jedec_1,
7004 .read = read_memmapped,
7005 .voltage = {3000, 3600},
7010 .name = "SST49LF008C",
7012 .manufacture_id = SST_ID,
7013 .model_id = SST_SST49LF008C,
7015 .page_size = 4 * 1024,
7016 .feature_bits = FEATURE_REGISTERMAP,
7017 .tested = TEST_UNTESTED,
7018 .probe = probe_82802ab,
7019 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7023 .eraseblocks = { {4 * 1024, 256} },
7024 .block_erase = erase_sector_49lfxxxc,
7032 .block_erase = erase_block_82802ab,
7035 .unlock = unlock_49lfxxxc,
7036 .write = write_82802ab,
7037 .read = read_memmapped,
7038 .voltage = {3000, 3600},
7043 .name = "SST49LF016C",
7045 .manufacture_id = SST_ID,
7046 .model_id = SST_SST49LF016C,
7048 .page_size = 4 * 1024,
7049 .feature_bits = FEATURE_REGISTERMAP,
7050 .tested = TEST_OK_PREW,
7051 .probe = probe_82802ab,
7052 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7056 .eraseblocks = { {4 * 1024, 512} },
7057 .block_erase = erase_sector_49lfxxxc,
7065 .block_erase = erase_block_82802ab,
7068 .unlock = unlock_49lfxxxc,
7069 .write = write_82802ab,
7070 .read = read_memmapped,
7071 .voltage = {3000, 3600},
7076 .name = "SST49LF020",
7078 .manufacture_id = SST_ID,
7079 .model_id = SST_SST49LF020,
7081 .page_size = 16 * 1024,
7082 .feature_bits = FEATURE_EITHER_RESET,
7083 .tested = TEST_OK_PREW,
7084 .probe = probe_jedec,
7085 .probe_timing = 1, /* 150 ns */
7089 .eraseblocks = { {4 * 1024, 64} },
7090 .block_erase = erase_sector_jedec,
7092 .eraseblocks = { {16 * 1024, 16} },
7093 .block_erase = erase_block_jedec,
7095 .eraseblocks = { {256 * 1024, 1} },
7096 .block_erase = NULL,
7099 .write = write_jedec_1,
7100 .read = read_memmapped,
7101 .voltage = {3000, 3600},
7106 .name = "SST49LF020A",
7108 .manufacture_id = SST_ID,
7109 .model_id = SST_SST49LF020A,
7111 .page_size = 4 * 1024,
7112 .feature_bits = FEATURE_EITHER_RESET,
7113 .tested = TEST_OK_PRE,
7114 .probe = probe_jedec,
7115 .probe_timing = 1, /* 150 ns */
7119 .eraseblocks = { {4 * 1024, 64} },
7120 .block_erase = erase_sector_jedec,
7122 .eraseblocks = { {16 * 1024, 16} },
7123 .block_erase = erase_block_jedec,
7125 .eraseblocks = { {256 * 1024, 1} },
7126 .block_erase = NULL,
7129 .write = write_jedec_1,
7130 .read = read_memmapped,
7131 .voltage = {3000, 3600},
7136 .name = "SST49LF040",
7138 .manufacture_id = SST_ID,
7139 .model_id = SST_SST49LF040,
7142 .feature_bits = FEATURE_EITHER_RESET,
7143 .tested = TEST_OK_PRE,
7144 .probe = probe_jedec,
7145 .probe_timing = 1, /* 150 ns */
7149 .eraseblocks = { {4 * 1024, 128} },
7150 .block_erase = erase_sector_jedec,
7152 .eraseblocks = { {64 * 1024, 8} },
7153 .block_erase = erase_block_jedec,
7155 .eraseblocks = { {512 * 1024, 1} },
7156 .block_erase = NULL,
7159 .write = write_jedec_1,
7160 .read = read_memmapped,
7161 .voltage = {3000, 3600},
7166 .name = "SST49LF040B",
7167 .bustype = BUS_LPC, /* A/A Mux */
7168 .manufacture_id = SST_ID,
7169 .model_id = SST_SST49LF040B,
7171 .page_size = 64 * 1024,
7172 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
7173 .tested = TEST_OK_PREW,
7174 .probe = probe_jedec,
7175 .probe_timing = 1, /* 150ns */
7179 .eraseblocks = { {4 * 1024, 128} },
7180 .block_erase = erase_sector_jedec,
7182 .eraseblocks = { {64 * 1024, 8} },
7183 .block_erase = erase_block_jedec,
7185 .eraseblocks = { {512 * 1024, 1} },
7186 .block_erase = NULL,
7189 .unlock = unlock_82802ab,
7190 .write = write_jedec_1,
7191 .read = read_memmapped,
7192 .voltage = {3000, 3600},
7197 .name = "SST49LF080A",
7198 .bustype = BUS_LPC, /* A/A Mux */
7199 .manufacture_id = SST_ID,
7200 .model_id = SST_SST49LF080A,
7203 .feature_bits = FEATURE_EITHER_RESET,
7204 .tested = TEST_OK_PREW,
7205 .probe = probe_jedec,
7206 .probe_timing = TIMING_FIXME,
7210 .eraseblocks = { {4 * 1024, 256} },
7211 .block_erase = erase_sector_jedec,
7213 .eraseblocks = { {64 * 1024, 16} },
7214 .block_erase = erase_block_jedec,
7216 .eraseblocks = { {1024 * 1024, 1} },
7217 .block_erase = NULL,
7220 .write = write_jedec_1,
7221 .read = read_memmapped,
7222 .voltage = {3000, 3600},
7227 .name = "SST49LF160C",
7229 .manufacture_id = SST_ID,
7230 .model_id = SST_SST49LF160C,
7232 .page_size = 4 * 1024,
7233 .feature_bits = FEATURE_REGISTERMAP,
7234 .tested = TEST_OK_PRE,
7235 .probe = probe_82802ab,
7236 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7240 .eraseblocks = { {4 * 1024, 512} },
7241 .block_erase = erase_sector_49lfxxxc,
7249 .block_erase = erase_block_82802ab,
7252 .unlock = unlock_49lfxxxc,
7253 .write = write_82802ab,
7254 .read = read_memmapped,
7255 .voltage = {3000, 3600},
7262 .manufacture_id = ST_ID,
7263 .model_id = ST_M25P05A,
7266 .feature_bits = FEATURE_WRSR_WREN,
7267 .tested = TEST_UNTESTED,
7268 .probe = probe_spi_rdid,
7269 .probe_timing = TIMING_ZERO,
7273 .eraseblocks = { {32 * 1024, 2} },
7274 .block_erase = spi_block_erase_d8,
7276 .eraseblocks = { {64 * 1024, 1} },
7277 .block_erase = spi_block_erase_c7,
7280 .unlock = spi_disable_blockprotect,
7281 .write = spi_chip_write_256,
7282 .read = spi_chip_read,
7283 .voltage = {2700, 3600},
7286 /* The ST M25P05 is a bit of a problem. It has the same ID as the
7287 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
7288 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
7289 * only is successful if RDID does not work.
7295 .manufacture_id = 0, /* Not used. */
7296 .model_id = ST_M25P05_RES,
7299 .feature_bits = FEATURE_WRSR_WREN,
7300 .tested = TEST_UNTESTED,
7301 .probe = probe_spi_res1,
7302 .probe_timing = TIMING_ZERO,
7306 .eraseblocks = { {32 * 1024, 2} },
7307 .block_erase = spi_block_erase_d8,
7309 .eraseblocks = { {64 * 1024, 1} },
7310 .block_erase = spi_block_erase_c7,
7313 .unlock = spi_disable_blockprotect,
7314 .write = spi_chip_write_1, /* 128 */
7315 .read = spi_chip_read,
7316 .voltage = {2700, 3600},
7323 .manufacture_id = ST_ID,
7324 .model_id = ST_M25P10A,
7327 .feature_bits = FEATURE_WRSR_WREN,
7328 .tested = TEST_OK_PRE,
7329 .probe = probe_spi_rdid,
7330 .probe_timing = TIMING_ZERO,
7334 .eraseblocks = { {32 * 1024, 4} },
7335 .block_erase = spi_block_erase_d8,
7337 .eraseblocks = { {128 * 1024, 1} },
7338 .block_erase = spi_block_erase_c7,
7341 .unlock = spi_disable_blockprotect,
7342 .write = spi_chip_write_256,
7343 .read = spi_chip_read,
7344 .voltage = {2700, 3600},
7347 /* The ST M25P10 has the same problem as the M25P05. */
7352 .manufacture_id = 0, /* Not used. */
7353 .model_id = ST_M25P10_RES,
7356 .feature_bits = FEATURE_WRSR_WREN,
7357 .tested = TEST_UNTESTED,
7358 .probe = probe_spi_res1,
7359 .probe_timing = TIMING_ZERO,
7363 .eraseblocks = { {32 * 1024, 4} },
7364 .block_erase = spi_block_erase_d8,
7366 .eraseblocks = { {128 * 1024, 1} },
7367 .block_erase = spi_block_erase_c7,
7370 .unlock = spi_disable_blockprotect,
7371 .write = spi_chip_write_1, /* 128 */
7372 .read = spi_chip_read,
7373 .voltage = {2700, 3600},
7380 .manufacture_id = ST_ID,
7381 .model_id = ST_M25P20,
7384 .feature_bits = FEATURE_WRSR_WREN,
7385 .tested = TEST_UNTESTED,
7386 .probe = probe_spi_rdid,
7387 .probe_timing = TIMING_ZERO,
7391 .eraseblocks = { {64 * 1024, 4} },
7392 .block_erase = spi_block_erase_d8,
7394 .eraseblocks = { {256 * 1024, 1} },
7395 .block_erase = spi_block_erase_c7,
7398 .unlock = spi_disable_blockprotect,
7399 .write = spi_chip_write_256,
7400 .read = spi_chip_read,
7401 .voltage = {2700, 3600},
7405 .vendor = "ST", /* Numonyx */
7408 .manufacture_id = ST_ID,
7409 .model_id = ST_M25P40,
7412 .feature_bits = FEATURE_WRSR_WREN,
7413 .tested = TEST_OK_PREW,
7414 .probe = probe_spi_rdid,
7415 .probe_timing = TIMING_ZERO,
7419 .eraseblocks = { {64 * 1024, 8} },
7420 .block_erase = spi_block_erase_d8,
7422 .eraseblocks = { {512 * 1024, 1} },
7423 .block_erase = spi_block_erase_c7,
7426 .unlock = spi_disable_blockprotect,
7427 .write = spi_chip_write_256,
7428 .read = spi_chip_read,
7429 .voltage = {2700, 3600},
7434 .name = "M25P40-old",
7436 .manufacture_id = 0, /* Not used. */
7437 .model_id = ST_M25P40_RES,
7440 .feature_bits = FEATURE_WRSR_WREN,
7441 .tested = TEST_UNTESTED,
7442 .probe = probe_spi_res1,
7443 .probe_timing = TIMING_ZERO,
7447 .eraseblocks = { {64 * 1024, 8} },
7448 .block_erase = spi_block_erase_d8,
7450 .eraseblocks = { {512 * 1024, 1} },
7451 .block_erase = spi_block_erase_c7,
7454 .unlock = spi_disable_blockprotect,
7455 .write = spi_chip_write_256,
7456 .read = spi_chip_read,
7463 .manufacture_id = ST_ID,
7464 .model_id = ST_M25P80,
7467 .feature_bits = FEATURE_WRSR_WREN,
7468 .tested = TEST_OK_PREW,
7469 .probe = probe_spi_rdid,
7470 .probe_timing = TIMING_ZERO,
7474 .eraseblocks = { {64 * 1024, 16} },
7475 .block_erase = spi_block_erase_d8,
7477 .eraseblocks = { {1024 * 1024, 1} },
7478 .block_erase = spi_block_erase_c7,
7481 .unlock = spi_disable_blockprotect,
7482 .write = spi_chip_write_256,
7483 .read = spi_chip_read,
7484 .voltage = {2700, 3600},
7491 .manufacture_id = ST_ID,
7492 .model_id = ST_M25P16,
7495 .feature_bits = FEATURE_WRSR_WREN,
7496 .tested = TEST_OK_PR,
7497 .probe = probe_spi_rdid,
7498 .probe_timing = TIMING_ZERO,
7502 .eraseblocks = { {64 * 1024, 32} },
7503 .block_erase = spi_block_erase_d8,
7505 .eraseblocks = { {2 * 1024 * 1024, 1} },
7506 .block_erase = spi_block_erase_c7,
7509 .unlock = spi_disable_blockprotect,
7510 .write = spi_chip_write_256,
7511 .read = spi_chip_read,
7512 .voltage = {2700, 3600},
7519 .manufacture_id = ST_ID,
7520 .model_id = ST_M25P32,
7523 .feature_bits = FEATURE_WRSR_WREN,
7524 .tested = TEST_OK_PREW,
7525 .probe = probe_spi_rdid,
7526 .probe_timing = TIMING_ZERO,
7530 .eraseblocks = { {64 * 1024, 64} },
7531 .block_erase = spi_block_erase_d8,
7533 .eraseblocks = { {4 * 1024 * 1024, 1} },
7534 .block_erase = spi_block_erase_c7,
7537 .unlock = spi_disable_blockprotect,
7538 .write = spi_chip_write_256,
7539 .read = spi_chip_read,
7540 .voltage = {2700, 3600},
7547 .manufacture_id = ST_ID,
7548 .model_id = ST_M25P64,
7551 .feature_bits = FEATURE_WRSR_WREN,
7552 .tested = TEST_OK_PREW,
7553 .probe = probe_spi_rdid,
7554 .probe_timing = TIMING_ZERO,
7558 .eraseblocks = { {64 * 1024, 128} },
7559 .block_erase = spi_block_erase_d8,
7561 .eraseblocks = { {8 * 1024 * 1024, 1} },
7562 .block_erase = spi_block_erase_c7,
7565 .unlock = spi_disable_blockprotect,
7566 .write = spi_chip_write_256,
7567 .read = spi_chip_read,
7568 .voltage = {2700, 3600},
7575 .manufacture_id = ST_ID,
7576 .model_id = ST_M25P128,
7577 .total_size = 16384,
7579 .feature_bits = FEATURE_WRSR_WREN,
7580 .tested = TEST_OK_PREW,
7581 .probe = probe_spi_rdid,
7582 .probe_timing = TIMING_ZERO,
7586 .eraseblocks = { {256 * 1024, 64} },
7587 .block_erase = spi_block_erase_d8,
7589 .eraseblocks = { {16 * 1024 * 1024, 1} },
7590 .block_erase = spi_block_erase_c7,
7593 .unlock = spi_disable_blockprotect,
7594 .write = spi_chip_write_256,
7595 .read = spi_chip_read,
7596 .voltage = {2700, 3600},
7603 .manufacture_id = ST_ID,
7604 .model_id = ST_M25PX16,
7607 /* OTP: 64B total; read 0x4B; write 0x42 */
7608 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7609 .tested = TEST_OK_PREW,
7610 .probe = probe_spi_rdid,
7611 .probe_timing = TIMING_ZERO,
7615 .eraseblocks = { { 4 * 1024, 512 } },
7616 .block_erase = spi_block_erase_20,
7618 .eraseblocks = { {64 * 1024, 32} },
7619 .block_erase = spi_block_erase_d8,
7621 .eraseblocks = { {2 * 1024 * 1024, 1} },
7622 .block_erase = spi_block_erase_c7,
7625 .unlock = spi_disable_blockprotect,
7626 .write = spi_chip_write_256,
7627 .read = spi_chip_read,
7634 .manufacture_id = ST_ID,
7635 .model_id = ST_M25PX32,
7638 .feature_bits = FEATURE_WRSR_WREN,
7639 .tested = TEST_OK_PRE,
7640 .probe = probe_spi_rdid,
7641 .probe_timing = TIMING_ZERO,
7645 .eraseblocks = { { 4 * 1024, 1024 } },
7646 .block_erase = spi_block_erase_20,
7648 .eraseblocks = { {64 * 1024, 64} },
7649 .block_erase = spi_block_erase_d8,
7651 .eraseblocks = { {4 * 1024 * 1024, 1} },
7652 .block_erase = spi_block_erase_c7,
7655 .unlock = spi_disable_blockprotect,
7656 .write = spi_chip_write_256,
7657 .read = spi_chip_read,
7658 .voltage = {2700, 3600},
7665 .manufacture_id = ST_ID,
7666 .model_id = ST_M25PX64,
7669 .feature_bits = FEATURE_WRSR_WREN,
7670 .tested = TEST_OK_PRE,
7671 .probe = probe_spi_rdid,
7672 .probe_timing = TIMING_ZERO,
7676 .eraseblocks = { { 4 * 1024, 2048 } },
7677 .block_erase = spi_block_erase_20,
7679 .eraseblocks = { {64 * 1024, 128} },
7680 .block_erase = spi_block_erase_d8,
7682 .eraseblocks = { {8 * 1024 * 1024, 1} },
7683 .block_erase = spi_block_erase_c7,
7686 .unlock = spi_disable_blockprotect,
7687 .write = spi_chip_write_256,
7688 .read = spi_chip_read,
7694 .bustype = BUS_PARALLEL,
7695 .manufacture_id = ST_ID,
7696 .model_id = ST_M29F002B,
7698 .page_size = 64 * 1024,
7699 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7700 .tested = TEST_UNTESTED,
7701 .probe = probe_jedec,
7702 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7712 .block_erase = erase_sector_jedec,
7714 .eraseblocks = { {256 * 1024, 1} },
7715 .block_erase = erase_chip_block_jedec,
7718 .write = write_jedec_1,
7719 .read = read_memmapped,
7720 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7725 .name = "M29F002T/NT",
7726 .bustype = BUS_PARALLEL,
7727 .manufacture_id = ST_ID,
7728 .model_id = ST_M29F002T,
7730 .page_size = 64 * 1024,
7731 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7732 .tested = TEST_UNTESTED,
7733 .probe = probe_jedec,
7734 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7744 .block_erase = erase_sector_jedec,
7746 .eraseblocks = { {256 * 1024, 1} },
7747 .block_erase = erase_chip_block_jedec,
7750 .write = write_jedec_1,
7751 .read = read_memmapped,
7752 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7758 .bustype = BUS_PARALLEL,
7759 .manufacture_id = ST_ID,
7760 .model_id = ST_M29F040B,
7762 .page_size = 64 * 1024,
7763 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7764 .tested = TEST_UNTESTED,
7765 .probe = probe_jedec,
7766 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
7770 .eraseblocks = { {64 * 1024, 8}, },
7771 .block_erase = erase_sector_jedec,
7773 .eraseblocks = { {512 * 1024, 1} },
7774 .block_erase = erase_chip_block_jedec,
7777 .write = write_jedec_1,
7778 .read = read_memmapped,
7779 .voltage = {4500, 5500},
7783 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7785 .name = "M29F400BB",
7786 .bustype = BUS_PARALLEL,
7787 .manufacture_id = ST_ID,
7788 .model_id = ST_M29F400BB,
7790 .page_size = 64 * 1024,
7791 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7792 .tested = TEST_UNTESTED,
7793 .probe = probe_m29f400bt,
7794 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7804 .block_erase = block_erase_m29f400bt,
7806 .eraseblocks = { {512 * 1024, 1} },
7807 .block_erase = block_erase_chip_m29f400bt,
7810 .write = write_m29f400bt,
7811 .read = read_memmapped,
7812 .voltage = {4500, 5500},
7815 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7817 .name = "M29F400BT",
7818 .bustype = BUS_PARALLEL,
7819 .manufacture_id = ST_ID,
7820 .model_id = ST_M29F400BT,
7822 .page_size = 64 * 1024,
7823 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7824 .tested = TEST_UNTESTED,
7825 .probe = probe_m29f400bt,
7826 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7836 .block_erase = block_erase_m29f400bt,
7838 .eraseblocks = { {512 * 1024, 1} },
7839 .block_erase = block_erase_chip_m29f400bt,
7842 .write = write_m29f400bt,
7843 .read = read_memmapped,
7844 .voltage = {4500, 5500},
7850 .bustype = BUS_PARALLEL,
7851 .manufacture_id = ST_ID,
7852 .model_id = ST_M29W010B,
7854 .page_size = 16 * 1024,
7855 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7856 .tested = TEST_UNTESTED,
7857 .probe = probe_jedec,
7858 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7862 .eraseblocks = { {16 * 1024, 8}, },
7863 .block_erase = erase_sector_jedec,
7865 .eraseblocks = { {128 * 1024, 1} },
7866 .block_erase = erase_chip_block_jedec,
7869 .write = write_jedec_1,
7870 .read = read_memmapped,
7871 .voltage = {2700, 3600},
7877 .bustype = BUS_PARALLEL,
7878 .manufacture_id = ST_ID,
7879 .model_id = ST_M29W040B,
7881 .page_size = 64 * 1024,
7882 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7883 .tested = TEST_UNTESTED,
7884 .probe = probe_jedec,
7885 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7889 .eraseblocks = { {64 * 1024, 8}, },
7890 .block_erase = erase_sector_jedec,
7892 .eraseblocks = { {512 * 1024, 1} },
7893 .block_erase = erase_chip_block_jedec,
7896 .write = write_jedec_1,
7897 .read = read_memmapped,
7898 .voltage = {2700, 3600},
7904 .bustype = BUS_PARALLEL,
7905 .manufacture_id = ST_ID,
7906 .model_id = ST_M29W512B,
7908 .page_size = 64 * 1024,
7909 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7910 .tested = TEST_OK_PRE,
7911 .probe = probe_jedec,
7912 .probe_timing = TIMING_ZERO,
7916 .eraseblocks = { {64 * 1024, 1} },
7917 .block_erase = erase_chip_block_jedec,
7920 .write = write_jedec_1,
7921 .read = read_memmapped,
7922 .voltage = {2700, 3600},
7927 .name = "M50FLW040A",
7928 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
7929 .manufacture_id = ST_ID,
7930 .model_id = ST_M50FLW040A,
7932 .page_size = 64 * 1024,
7933 .feature_bits = FEATURE_REGISTERMAP,
7934 .tested = TEST_UNTESTED,
7935 .probe = probe_82802ab,
7936 .probe_timing = TIMING_FIXME,
7941 {4 * 1024, 16}, /* sector */
7942 {64 * 1024, 5}, /* block */
7943 {4 * 1024, 16}, /* sector */
7944 {4 * 1024, 16}, /* sector */
7946 .block_erase = NULL,
7948 .eraseblocks = { {64 * 1024, 8}, },
7949 .block_erase = erase_block_82802ab,
7952 .unlock = unlock_stm50flw0x0x,
7953 .write = write_82802ab,
7954 .read = read_memmapped,
7955 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
7960 .name = "M50FLW040B",
7961 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
7962 .manufacture_id = ST_ID,
7963 .model_id = ST_M50FLW040B,
7965 .page_size = 64 * 1024,
7966 .feature_bits = FEATURE_REGISTERMAP,
7967 .tested = TEST_UNTESTED,
7968 .probe = probe_82802ab,
7969 .probe_timing = TIMING_FIXME,
7974 {4 * 1024, 16}, /* sector */
7975 {4 * 1024, 16}, /* sector */
7976 {64 * 1024, 5}, /* block */
7977 {4 * 1024, 16}, /* sector */
7979 .block_erase = NULL,
7981 .eraseblocks = { {64 * 1024, 8}, },
7982 .block_erase = erase_block_82802ab,
7985 .unlock = unlock_stm50flw0x0x,
7986 .write = write_82802ab,
7987 .read = read_memmapped,
7988 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
7993 .name = "M50FLW080A",
7994 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
7995 .manufacture_id = ST_ID,
7996 .model_id = ST_M50FLW080A,
7998 .page_size = 64 * 1024,
7999 .feature_bits = FEATURE_REGISTERMAP,
8000 .tested = TEST_OK_PRE,
8001 .probe = probe_82802ab,
8002 .probe_timing = TIMING_FIXME,
8007 {4 * 1024, 16}, /* sector */
8008 {64 * 1024, 13}, /* block */
8009 {4 * 1024, 16}, /* sector */
8010 {4 * 1024, 16}, /* sector */
8012 .block_erase = NULL,
8014 .eraseblocks = { {64 * 1024, 16}, },
8015 .block_erase = erase_block_82802ab,
8018 .unlock = unlock_stm50flw0x0x,
8019 .write = write_82802ab,
8020 .read = read_memmapped,
8021 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8026 .name = "M50FLW080B",
8027 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
8028 .manufacture_id = ST_ID,
8029 .model_id = ST_M50FLW080B,
8031 .page_size = 64 * 1024,
8032 .feature_bits = FEATURE_REGISTERMAP,
8033 .tested = TEST_UNTESTED,
8034 .probe = probe_82802ab,
8035 .probe_timing = TIMING_FIXME,
8040 {4 * 1024, 16}, /* sector */
8041 {4 * 1024, 16}, /* sector */
8042 {64 * 1024, 13}, /* block */
8043 {4 * 1024, 16}, /* sector */
8045 .block_erase = NULL,
8047 .eraseblocks = { {64 * 1024, 16}, },
8048 .block_erase = erase_block_82802ab,
8051 .unlock = unlock_stm50flw0x0x,
8052 .write = write_82802ab,
8053 .read = read_memmapped,
8054 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8060 .bustype = BUS_FWH, /* A/A Mux */
8061 .manufacture_id = ST_ID,
8062 .model_id = ST_M50FW002,
8064 .page_size = 64 * 1024,
8065 .feature_bits = FEATURE_REGISTERMAP,
8066 .tested = TEST_UNTESTED,
8067 .probe = probe_82802ab,
8068 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
8078 .block_erase = erase_block_82802ab,
8081 .unlock = unlock_stm50flw0x0x,
8082 .write = write_82802ab,
8083 .read = read_memmapped,
8084 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8090 .bustype = BUS_FWH, /* A/A Mux */
8091 .manufacture_id = ST_ID,
8092 .model_id = ST_M50FW016,
8094 .page_size = 64 * 1024,
8095 .feature_bits = FEATURE_REGISTERMAP,
8096 .tested = TEST_UNTESTED,
8097 .probe = probe_82802ab,
8098 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
8102 .eraseblocks = { {64 * 1024, 32}, },
8103 .block_erase = erase_block_82802ab,
8106 .unlock = unlock_stm50flw0x0x,
8107 .write = write_82802ab,
8108 .read = read_memmapped,
8109 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8115 .bustype = BUS_FWH, /* A/A Mux */
8116 .manufacture_id = ST_ID,
8117 .model_id = ST_M50FW040,
8119 .page_size = 64 * 1024,
8120 .feature_bits = FEATURE_REGISTERMAP,
8121 .tested = TEST_OK_PR,
8122 .probe = probe_82802ab,
8123 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
8127 .eraseblocks = { {64 * 1024, 8}, },
8128 .block_erase = erase_block_82802ab,
8131 .unlock = unlock_stm50flw0x0x,
8132 .write = write_82802ab,
8133 .read = read_memmapped,
8134 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8140 .bustype = BUS_FWH, /* A/A Mux */
8141 .manufacture_id = ST_ID,
8142 .model_id = ST_M50FW080,
8144 .page_size = 64 * 1024,
8145 .feature_bits = FEATURE_REGISTERMAP,
8146 .tested = TEST_OK_PREW,
8147 .probe = probe_82802ab,
8148 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
8152 .eraseblocks = { {64 * 1024, 16}, },
8153 .block_erase = erase_block_82802ab,
8156 .unlock = unlock_stm50flw0x0x,
8157 .write = write_82802ab,
8158 .read = read_memmapped,
8159 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8164 .name = "M50LPW116",
8165 .bustype = BUS_LPC, /* A/A Mux */
8166 .manufacture_id = ST_ID,
8167 .model_id = ST_M50LPW116,
8169 .page_size = 64 * 1024,
8170 .feature_bits = FEATURE_REGISTERMAP,
8171 .tested = TEST_UNTESTED,
8172 .probe = probe_82802ab,
8173 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8184 .block_erase = erase_block_82802ab,
8187 .unlock = unlock_stm50flw0x0x,
8188 .write = write_82802ab,
8189 .read = read_memmapped,
8190 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
8194 .vendor = "SyncMOS/MoselVitelic",
8195 .name = "{F,S,V}29C51001B",
8196 .bustype = BUS_PARALLEL,
8197 .manufacture_id = SYNCMOS_MVC_ID,
8198 .model_id = SM_MVC_29C51001B,
8201 .feature_bits = FEATURE_EITHER_RESET,
8202 .tested = TEST_UNTESTED,
8203 .probe = probe_jedec,
8204 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8208 .eraseblocks = { {512, 256} },
8209 .block_erase = erase_sector_jedec,
8211 .eraseblocks = { {128 * 1024, 1} },
8212 .block_erase = erase_chip_block_jedec,
8215 .write = write_jedec_1,
8216 .read = read_memmapped,
8217 .voltage = {4500, 5500},
8221 .vendor = "SyncMOS/MoselVitelic",
8222 .name = "{F,S,V}29C51001T",
8223 .bustype = BUS_PARALLEL,
8224 .manufacture_id = SYNCMOS_MVC_ID,
8225 .model_id = SM_MVC_29C51001T,
8228 .feature_bits = FEATURE_EITHER_RESET,
8229 .tested = TEST_UNTESTED,
8230 .probe = probe_jedec,
8231 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8235 .eraseblocks = { {512, 256} },
8236 .block_erase = erase_sector_jedec,
8238 .eraseblocks = { {128 * 1024, 1} },
8239 .block_erase = erase_chip_block_jedec,
8242 .write = write_jedec_1,
8243 .read = read_memmapped,
8244 .voltage = {4500, 5500},
8248 .vendor = "SyncMOS/MoselVitelic",
8249 .name = "{F,S,V}29C51002B",
8250 .bustype = BUS_PARALLEL,
8251 .manufacture_id = SYNCMOS_MVC_ID,
8252 .model_id = SM_MVC_29C51002B,
8255 .feature_bits = FEATURE_EITHER_RESET,
8256 .tested = TEST_UNTESTED,
8257 .probe = probe_jedec,
8258 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8262 .eraseblocks = { {512, 512} },
8263 .block_erase = erase_sector_jedec,
8265 .eraseblocks = { {256 * 1024, 1} },
8266 .block_erase = erase_chip_block_jedec,
8269 .write = write_jedec_1,
8270 .read = read_memmapped,
8274 .vendor = "SyncMOS/MoselVitelic",
8275 .name = "{F,S,V}29C51002T",
8276 .bustype = BUS_PARALLEL,
8277 .manufacture_id = SYNCMOS_MVC_ID,
8278 .model_id = SM_MVC_29C51002T,
8281 .feature_bits = FEATURE_EITHER_RESET,
8282 .tested = TEST_OK_PREW,
8283 .probe = probe_jedec,
8284 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8288 .eraseblocks = { {512, 512} },
8289 .block_erase = erase_sector_jedec,
8291 .eraseblocks = { {256 * 1024, 1} },
8292 .block_erase = erase_chip_block_jedec,
8295 .write = write_jedec_1,
8296 .read = read_memmapped,
8300 .vendor = "SyncMOS/MoselVitelic",
8301 .name = "{F,S,V}29C51004B",
8302 .bustype = BUS_PARALLEL,
8303 .manufacture_id = SYNCMOS_MVC_ID,
8304 .model_id = SM_MVC_29C51004B,
8307 .feature_bits = FEATURE_EITHER_RESET,
8308 .tested = TEST_UNTESTED,
8309 .probe = probe_jedec,
8310 .probe_timing = TIMING_ZERO,
8314 .eraseblocks = { {1024, 512} },
8315 .block_erase = erase_sector_jedec,
8317 .eraseblocks = { {512 * 1024, 1} },
8318 .block_erase = erase_chip_block_jedec,
8321 .write = write_jedec_1,
8322 .read = read_memmapped,
8323 .voltage = {4500, 5500},
8327 .vendor = "SyncMOS/MoselVitelic",
8328 .name = "{F,S,V}29C51004T",
8329 .bustype = BUS_PARALLEL,
8330 .manufacture_id = SYNCMOS_MVC_ID,
8331 .model_id = SM_MVC_29C51004T,
8334 .feature_bits = FEATURE_EITHER_RESET,
8335 .tested = TEST_UNTESTED,
8336 .probe = probe_jedec,
8337 .probe_timing = TIMING_ZERO,
8341 .eraseblocks = { {1024, 512} },
8342 .block_erase = erase_sector_jedec,
8344 .eraseblocks = { {512 * 1024, 1} },
8345 .block_erase = erase_chip_block_jedec,
8348 .write = write_jedec_1,
8349 .read = read_memmapped,
8350 .voltage = {4500, 5500},
8354 .vendor = "SyncMOS/MoselVitelic",
8355 .name = "{S,V}29C31004B",
8356 .bustype = BUS_PARALLEL,
8357 .manufacture_id = SYNCMOS_MVC_ID,
8358 .model_id = SM_MVC_29C31004B,
8361 .feature_bits = FEATURE_EITHER_RESET,
8362 .tested = TEST_UNTESTED,
8363 .probe = probe_jedec,
8364 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8368 .eraseblocks = { {1024, 512} },
8369 .block_erase = erase_sector_jedec,
8371 .eraseblocks = { {512 * 1024, 1} },
8372 .block_erase = erase_chip_block_jedec,
8375 .write = write_jedec_1,
8376 .read = read_memmapped,
8377 .voltage = {3000, 3600},
8381 .vendor = "SyncMOS/MoselVitelic",
8382 .name = "{S,V}29C31004T",
8383 .bustype = BUS_PARALLEL,
8384 .manufacture_id = SYNCMOS_MVC_ID,
8385 .model_id = SM_MVC_29C31004T,
8388 .feature_bits = FEATURE_EITHER_RESET,
8389 .tested = TEST_UNTESTED,
8390 .probe = probe_jedec,
8391 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8395 .eraseblocks = { {1024, 512} },
8396 .block_erase = erase_sector_jedec,
8398 .eraseblocks = { {512 * 1024, 1} },
8399 .block_erase = erase_chip_block_jedec,
8402 .write = write_jedec_1,
8403 .read = read_memmapped,
8404 .voltage = {3000, 3600},
8409 .name = "TMS29F002RB",
8410 .bustype = BUS_PARALLEL,
8411 .manufacture_id = TI_OLD_ID,
8412 .model_id = TI_TMS29F002RB,
8414 .page_size = 16384, /* Non-uniform sectors */
8415 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8416 .tested = TEST_UNTESTED,
8417 .probe = probe_jedec,
8418 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8428 .block_erase = erase_sector_jedec,
8430 .eraseblocks = { {256 * 1024, 1} },
8431 .block_erase = erase_chip_block_jedec,
8434 .write = write_jedec_1,
8435 .read = read_memmapped,
8436 .voltage = {4500, 5500},
8441 .name = "TMS29F002RT",
8442 .bustype = BUS_PARALLEL,
8443 .manufacture_id = TI_OLD_ID,
8444 .model_id = TI_TMS29F002RT,
8446 .page_size = 16384, /* Non-uniform sectors */
8447 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8448 .tested = TEST_UNTESTED,
8449 .probe = probe_jedec,
8450 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8460 .block_erase = erase_sector_jedec,
8462 .eraseblocks = { {256 * 1024, 1} },
8463 .block_erase = erase_chip_block_jedec,
8466 .write = write_jedec_1,
8467 .read = read_memmapped,
8468 .voltage = {4500, 5500},
8472 .vendor = "Winbond",
8475 .manufacture_id = WINBOND_NEX_ID,
8476 .model_id = WINBOND_NEX_W25Q80,
8479 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8481 .tested = TEST_OK_PREW,
8482 .probe = probe_spi_rdid,
8483 .probe_timing = TIMING_ZERO,
8487 .eraseblocks = { {4 * 1024, 256} },
8488 .block_erase = spi_block_erase_20,
8490 .eraseblocks = { {32 * 1024, 32} },
8491 .block_erase = spi_block_erase_52,
8493 .eraseblocks = { {64 * 1024, 16} },
8494 .block_erase = spi_block_erase_d8,
8496 .eraseblocks = { {1024 * 1024, 1} },
8497 .block_erase = spi_block_erase_60,
8499 .eraseblocks = { {1024 * 1024, 1} },
8500 .block_erase = spi_block_erase_c7,
8503 .unlock = spi_disable_blockprotect,
8504 .write = spi_chip_write_256,
8505 .read = spi_chip_read,
8506 .voltage = {2700, 3600},
8510 .vendor = "Winbond",
8513 .manufacture_id = WINBOND_NEX_ID,
8514 .model_id = WINBOND_NEX_W25Q16,
8517 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8518 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8519 .tested = TEST_OK_PREW,
8520 .probe = probe_spi_rdid,
8521 .probe_timing = TIMING_ZERO,
8525 .eraseblocks = { {4 * 1024, 512} },
8526 .block_erase = spi_block_erase_20,
8528 .eraseblocks = { {32 * 1024, 64} },
8529 .block_erase = spi_block_erase_52,
8531 .eraseblocks = { {64 * 1024, 32} },
8532 .block_erase = spi_block_erase_d8,
8534 .eraseblocks = { {2 * 1024 * 1024, 1} },
8535 .block_erase = spi_block_erase_60,
8537 .eraseblocks = { {2 * 1024 * 1024, 1} },
8538 .block_erase = spi_block_erase_c7,
8541 .unlock = spi_disable_blockprotect,
8542 .write = spi_chip_write_256,
8543 .read = spi_chip_read,
8544 .voltage = {2700, 3600},
8548 .vendor = "Winbond",
8551 .manufacture_id = WINBOND_NEX_ID,
8552 .model_id = WINBOND_NEX_W25Q32,
8555 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8556 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8557 .tested = TEST_OK_PREW,
8558 .probe = probe_spi_rdid,
8559 .probe_timing = TIMING_ZERO,
8563 .eraseblocks = { {4 * 1024, 1024} },
8564 .block_erase = spi_block_erase_20,
8566 .eraseblocks = { {32 * 1024, 128} },
8567 .block_erase = spi_block_erase_52,
8569 .eraseblocks = { {64 * 1024, 64} },
8570 .block_erase = spi_block_erase_d8,
8572 .eraseblocks = { {4 * 1024 * 1024, 1} },
8573 .block_erase = spi_block_erase_60,
8575 .eraseblocks = { {4 * 1024 * 1024, 1} },
8576 .block_erase = spi_block_erase_c7,
8579 .unlock = spi_disable_blockprotect,
8580 .write = spi_chip_write_256,
8581 .read = spi_chip_read,
8582 .voltage = {2700, 3600},
8586 .vendor = "Winbond",
8589 .manufacture_id = WINBOND_NEX_ID,
8590 .model_id = WINBOND_NEX_W25Q64,
8593 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8594 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8595 .tested = TEST_OK_PREW,
8596 .probe = probe_spi_rdid,
8597 .probe_timing = TIMING_ZERO,
8601 .eraseblocks = { {4 * 1024, 2048} },
8602 .block_erase = spi_block_erase_20,
8604 .eraseblocks = { {32 * 1024, 256} },
8605 .block_erase = spi_block_erase_52,
8607 .eraseblocks = { {64 * 1024, 128} },
8608 .block_erase = spi_block_erase_d8,
8610 .eraseblocks = { {8 * 1024 * 1024, 1} },
8611 .block_erase = spi_block_erase_60,
8613 .eraseblocks = { {8 * 1024 * 1024, 1} },
8614 .block_erase = spi_block_erase_c7,
8617 .unlock = spi_disable_blockprotect,
8618 .write = spi_chip_write_256,
8619 .read = spi_chip_read,
8623 .vendor = "Winbond",
8626 .manufacture_id = WINBOND_NEX_ID,
8627 .model_id = WINBOND_NEX_W25Q128,
8628 .total_size = 16384,
8630 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8631 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8632 .tested = TEST_OK_PROBE,
8633 .probe = probe_spi_rdid,
8634 .probe_timing = TIMING_ZERO,
8638 .eraseblocks = { {4 * 1024, 4096} },
8639 .block_erase = spi_block_erase_20,
8641 .eraseblocks = { {32 * 1024, 512} },
8642 .block_erase = spi_block_erase_52,
8644 .eraseblocks = { {64 * 1024, 256} },
8645 .block_erase = spi_block_erase_d8,
8647 .eraseblocks = { {16 * 1024 * 1024, 1} },
8648 .block_erase = spi_block_erase_60,
8650 .eraseblocks = { {16 * 1024 * 1024, 1} },
8651 .block_erase = spi_block_erase_c7,
8654 .unlock = spi_disable_blockprotect,
8655 .write = spi_chip_write_256,
8656 .read = spi_chip_read,
8660 .vendor = "Winbond",
8663 .manufacture_id = WINBOND_NEX_ID,
8664 .model_id = WINBOND_NEX_W25X10,
8667 .feature_bits = FEATURE_WRSR_WREN,
8668 .tested = TEST_UNTESTED,
8669 .probe = probe_spi_rdid,
8670 .probe_timing = TIMING_ZERO,
8674 .eraseblocks = { {4 * 1024, 32} },
8675 .block_erase = spi_block_erase_20,
8677 .eraseblocks = { {64 * 1024, 2} },
8678 .block_erase = spi_block_erase_d8,
8680 .eraseblocks = { {128 * 1024, 1} },
8681 .block_erase = spi_block_erase_c7,
8684 .unlock = spi_disable_blockprotect,
8685 .write = spi_chip_write_256,
8686 .read = spi_chip_read,
8687 .voltage = {2700, 3600},
8691 .vendor = "Winbond",
8694 .manufacture_id = WINBOND_NEX_ID,
8695 .model_id = WINBOND_NEX_W25X20,
8698 .feature_bits = FEATURE_WRSR_WREN,
8699 .tested = TEST_UNTESTED,
8700 .probe = probe_spi_rdid,
8701 .probe_timing = TIMING_ZERO,
8705 .eraseblocks = { {4 * 1024, 64} },
8706 .block_erase = spi_block_erase_20,
8708 .eraseblocks = { {64 * 1024, 4} },
8709 .block_erase = spi_block_erase_d8,
8711 .eraseblocks = { {256 * 1024, 1} },
8712 .block_erase = spi_block_erase_c7,
8715 .unlock = spi_disable_blockprotect,
8716 .write = spi_chip_write_256,
8717 .read = spi_chip_read,
8718 .voltage = {2700, 3600},
8722 .vendor = "Winbond",
8725 .manufacture_id = WINBOND_NEX_ID,
8726 .model_id = WINBOND_NEX_W25X40,
8729 .feature_bits = FEATURE_WRSR_WREN,
8730 .tested = TEST_OK_PREW,
8731 .probe = probe_spi_rdid,
8732 .probe_timing = TIMING_ZERO,
8736 .eraseblocks = { {4 * 1024, 128} },
8737 .block_erase = spi_block_erase_20,
8739 .eraseblocks = { {64 * 1024, 8} },
8740 .block_erase = spi_block_erase_d8,
8742 .eraseblocks = { {512 * 1024, 1} },
8743 .block_erase = spi_block_erase_c7,
8746 .unlock = spi_disable_blockprotect,
8747 .write = spi_chip_write_256,
8748 .read = spi_chip_read,
8749 .voltage = {2700, 3600},
8753 .vendor = "Winbond",
8756 .manufacture_id = WINBOND_NEX_ID,
8757 .model_id = WINBOND_NEX_W25X80,
8760 .feature_bits = FEATURE_WRSR_WREN,
8761 .tested = TEST_OK_PREW,
8762 .probe = probe_spi_rdid,
8763 .probe_timing = TIMING_ZERO,
8767 .eraseblocks = { {4 * 1024, 256} },
8768 .block_erase = spi_block_erase_20,
8770 .eraseblocks = { {64 * 1024, 16} },
8771 .block_erase = spi_block_erase_d8,
8773 .eraseblocks = { {1024 * 1024, 1} },
8774 .block_erase = spi_block_erase_c7,
8777 .unlock = spi_disable_blockprotect,
8778 .write = spi_chip_write_256,
8779 .read = spi_chip_read,
8780 .voltage = {2700, 3600},
8784 .vendor = "Winbond",
8787 .manufacture_id = WINBOND_NEX_ID,
8788 .model_id = WINBOND_NEX_W25X16,
8791 .feature_bits = FEATURE_WRSR_WREN,
8792 .tested = TEST_OK_PREW,
8793 .probe = probe_spi_rdid,
8794 .probe_timing = TIMING_ZERO,
8798 .eraseblocks = { {4 * 1024, 512} },
8799 .block_erase = spi_block_erase_20,
8801 .eraseblocks = { {32 * 1024, 64} },
8802 .block_erase = spi_block_erase_52,
8804 .eraseblocks = { {64 * 1024, 32} },
8805 .block_erase = spi_block_erase_d8,
8807 .eraseblocks = { {2 * 1024 * 1024, 1} },
8808 .block_erase = spi_block_erase_60,
8810 .eraseblocks = { {2 * 1024 * 1024, 1} },
8811 .block_erase = spi_block_erase_c7,
8814 .unlock = spi_disable_blockprotect,
8815 .write = spi_chip_write_256,
8816 .read = spi_chip_read,
8817 .voltage = {2700, 3600},
8821 .vendor = "Winbond",
8824 .manufacture_id = WINBOND_NEX_ID,
8825 .model_id = WINBOND_NEX_W25X32,
8828 .feature_bits = FEATURE_WRSR_WREN,
8829 .tested = TEST_OK_PROBE,
8830 .probe = probe_spi_rdid,
8831 .probe_timing = TIMING_ZERO,
8835 .eraseblocks = { {4 * 1024, 1024} },
8836 .block_erase = spi_block_erase_20,
8838 .eraseblocks = { {32 * 1024, 128} },
8839 .block_erase = spi_block_erase_52,
8841 .eraseblocks = { {64 * 1024, 64} },
8842 .block_erase = spi_block_erase_d8,
8844 .eraseblocks = { {4 * 1024 * 1024, 1} },
8845 .block_erase = spi_block_erase_60,
8847 .eraseblocks = { {4 * 1024 * 1024, 1} },
8848 .block_erase = spi_block_erase_c7,
8851 .unlock = spi_disable_blockprotect,
8852 .write = spi_chip_write_256,
8853 .read = spi_chip_read,
8854 .voltage = {2700, 3600},
8858 .vendor = "Winbond",
8861 .manufacture_id = WINBOND_NEX_ID,
8862 .model_id = WINBOND_NEX_W25X64,
8865 .feature_bits = FEATURE_WRSR_WREN,
8866 .tested = TEST_OK_PROBE,
8867 .probe = probe_spi_rdid,
8868 .probe_timing = TIMING_ZERO,
8872 .eraseblocks = { {4 * 1024, 2048} },
8873 .block_erase = spi_block_erase_20,
8875 .eraseblocks = { {32 * 1024, 256} },
8876 .block_erase = spi_block_erase_52,
8878 .eraseblocks = { {64 * 1024, 128} },
8879 .block_erase = spi_block_erase_d8,
8881 .eraseblocks = { {8 * 1024 * 1024, 1} },
8882 .block_erase = spi_block_erase_60,
8884 .eraseblocks = { {8 * 1024 * 1024, 1} },
8885 .block_erase = spi_block_erase_c7,
8888 .unlock = spi_disable_blockprotect,
8889 .write = spi_chip_write_256,
8890 .read = spi_chip_read,
8891 .voltage = {2700, 3600},
8895 .vendor = "Winbond",
8896 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
8897 .bustype = BUS_PARALLEL,
8898 .manufacture_id = WINBOND_ID,
8899 .model_id = WINBOND_W29C010,
8902 .feature_bits = FEATURE_LONG_RESET,
8903 .tested = TEST_OK_PRE,
8904 .probe = probe_w29ee011,
8905 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
8909 .eraseblocks = { {128 * 1024, 1} },
8910 .block_erase = erase_chip_block_jedec,
8913 .write = write_jedec,
8914 .read = read_memmapped,
8917 {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
8918 .vendor = "Winbond",
8919 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
8920 .bustype = BUS_PARALLEL,
8921 .manufacture_id = WINBOND_ID,
8922 .model_id = WINBOND_W29C010,
8925 .feature_bits = FEATURE_LONG_RESET,
8926 .tested = TEST_OK_PREW,
8927 .probe = probe_jedec,
8928 .probe_timing = 10, /* used datasheet for the W29C011A */
8932 .eraseblocks = { {128 * 1024, 1} },
8933 .block_erase = erase_chip_block_jedec,
8936 .write = write_jedec,
8937 .read = read_memmapped,
8941 .vendor = "Winbond",
8942 .name = "W29C020(C)/W29C022",
8943 .bustype = BUS_PARALLEL,
8944 .manufacture_id = WINBOND_ID,
8945 .model_id = WINBOND_W29C020,
8948 .feature_bits = FEATURE_LONG_RESET,
8949 .tested = TEST_OK_PREW,
8950 .probe = probe_jedec,
8955 .eraseblocks = { {256 * 1024, 1} },
8956 .block_erase = erase_chip_block_jedec,
8959 .write = write_jedec,
8960 .read = read_memmapped,
8961 .voltage = {4500, 5500},
8965 .vendor = "Winbond",
8966 .name = "W29C040/P",
8967 .bustype = BUS_PARALLEL,
8968 .manufacture_id = WINBOND_ID,
8969 .model_id = WINBOND_W29C040,
8972 .feature_bits = FEATURE_LONG_RESET,
8973 .tested = TEST_UNTESTED,
8974 .probe = probe_jedec,
8979 .eraseblocks = { {512 * 1024, 1} },
8980 .block_erase = erase_chip_block_jedec,
8983 .write = write_jedec,
8984 .read = read_memmapped,
8985 .voltage = {4500, 5500},
8989 .vendor = "Winbond",
8991 .bustype = BUS_PARALLEL,
8992 .manufacture_id = WINBOND_ID,
8993 .model_id = WINBOND_W39L040,
8995 .page_size = 64 * 1024,
8996 .feature_bits = FEATURE_EITHER_RESET,
8997 .tested = TEST_OK_PR,
8998 .probe = probe_jedec,
9003 .eraseblocks = { {4 * 1024, 128} },
9004 .block_erase = erase_block_jedec,
9006 .eraseblocks = { {64 * 1024, 8} },
9007 .block_erase = erase_sector_jedec,
9009 .eraseblocks = { {512 * 1024, 1} },
9010 .block_erase = erase_chip_block_jedec,
9013 .printlock = printlock_w39l040,
9014 .write = write_jedec_1,
9015 .read = read_memmapped,
9016 .voltage = {3000, 3600},
9020 .vendor = "Winbond",
9023 .manufacture_id = WINBOND_ID,
9024 .model_id = WINBOND_W39V040A,
9026 .page_size = 64 * 1024,
9027 .feature_bits = FEATURE_EITHER_RESET,
9028 .tested = TEST_OK_PREW,
9029 .probe = probe_jedec,
9034 .eraseblocks = { {64 * 1024, 8} },
9035 .block_erase = erase_sector_jedec,
9037 .eraseblocks = { {512 * 1024, 1} },
9038 .block_erase = erase_chip_block_jedec,
9041 .printlock = printlock_w39v040a,
9042 .write = write_jedec_1,
9043 .read = read_memmapped,
9044 .voltage = {3000, 3600},
9048 .vendor = "Winbond",
9051 .manufacture_id = WINBOND_ID,
9052 .model_id = WINBOND_W39V040B,
9054 .page_size = 64 * 1024,
9055 .feature_bits = FEATURE_EITHER_RESET,
9056 .tested = TEST_OK_PREW,
9057 .probe = probe_jedec,
9062 .eraseblocks = { {64 * 1024, 8} },
9063 .block_erase = erase_sector_jedec,
9065 .eraseblocks = { {512 * 1024, 1} },
9066 .block_erase = erase_chip_block_jedec,
9069 .printlock = printlock_w39v040b,
9070 .write = write_jedec_1,
9071 .read = read_memmapped,
9072 .voltage = {3000, 3600},
9076 .vendor = "Winbond",
9079 .manufacture_id = WINBOND_ID,
9080 .model_id = WINBOND_W39V040C,
9082 .page_size = 64 * 1024,
9083 .feature_bits = FEATURE_EITHER_RESET,
9084 .tested = TEST_OK_PREW,
9085 .probe = probe_jedec,
9090 .eraseblocks = { {64 * 1024, 8} },
9091 .block_erase = erase_sector_jedec,
9093 .eraseblocks = { {512 * 1024, 1} },
9094 .block_erase = erase_chip_block_jedec,
9097 .printlock = printlock_w39v040c,
9098 .write = write_jedec_1,
9099 .read = read_memmapped,
9100 .voltage = {3000, 3600},
9104 .vendor = "Winbond",
9105 .name = "W39V040FA",
9107 .manufacture_id = WINBOND_ID,
9108 .model_id = WINBOND_W39V040FA,
9110 .page_size = 64 * 1024,
9111 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9112 .tested = TEST_OK_PREW,
9113 .probe = probe_jedec,
9118 .eraseblocks = { {4 * 1024, 128} },
9119 .block_erase = erase_block_jedec,
9121 .eraseblocks = { {64 * 1024, 8} },
9122 .block_erase = erase_sector_jedec,
9124 .eraseblocks = { {512 * 1024, 1} },
9125 .block_erase = erase_chip_block_jedec,
9128 .printlock = printlock_w39v040fa,
9129 .unlock = unlock_sst_fwhub,
9130 .write = write_jedec_1,
9131 .read = read_memmapped,
9132 .voltage = {3000, 3600},
9136 .vendor = "Winbond",
9137 .name = "W39V040FB",
9139 .manufacture_id = WINBOND_ID,
9140 .model_id = WINBOND_W39V040B,
9142 .page_size = 64 * 1024,
9143 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9144 .tested = TEST_OK_PREW,
9145 .probe = probe_jedec,
9150 .eraseblocks = { {64 * 1024, 8} },
9151 .block_erase = erase_sector_jedec,
9153 .eraseblocks = { {512 * 1024, 1} },
9154 .block_erase = erase_chip_block_jedec,
9157 .printlock = printlock_w39v040fb,
9158 .unlock = unlock_w39v040fb,
9159 .write = write_jedec_1,
9160 .read = read_memmapped,
9161 .voltage = {3000, 3600}, /* Also has 12V fast program */
9165 .vendor = "Winbond",
9166 .name = "W39V040FC",
9168 .manufacture_id = WINBOND_ID,
9169 .model_id = WINBOND_W39V040C,
9171 .page_size = 64 * 1024,
9172 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9173 .tested = TEST_OK_PREW,
9174 .probe = probe_jedec,
9179 .eraseblocks = { {64 * 1024, 8} },
9180 .block_erase = erase_sector_jedec,
9182 .eraseblocks = { {512 * 1024, 1} },
9183 .block_erase = erase_chip_block_jedec,
9186 .printlock = printlock_w39v040fc,
9187 .write = write_jedec_1,
9188 .read = read_memmapped,
9189 .voltage = {3000, 3600}, /* Also has 12V fast program */
9193 .vendor = "Winbond",
9196 .manufacture_id = WINBOND_ID,
9197 .model_id = WINBOND_W39V080A,
9199 .page_size = 64 * 1024,
9200 .feature_bits = FEATURE_EITHER_RESET,
9201 .tested = TEST_OK_PREW,
9202 .probe = probe_jedec,
9207 .eraseblocks = { {64 * 1024, 16} },
9208 .block_erase = erase_sector_jedec,
9210 .eraseblocks = { {1024 * 1024, 1} },
9211 .block_erase = erase_chip_block_jedec,
9214 .printlock = printlock_w39v080a,
9215 .write = write_jedec_1,
9216 .read = read_memmapped,
9217 .voltage = {3000, 3600},
9221 .vendor = "Winbond",
9222 .name = "W49F002U/N",
9223 .bustype = BUS_PARALLEL,
9224 .manufacture_id = WINBOND_ID,
9225 .model_id = WINBOND_W49F002U,
9228 .feature_bits = FEATURE_EITHER_RESET,
9229 .tested = TEST_OK_PREW,
9230 .probe = probe_jedec,
9241 .block_erase = erase_sector_jedec,
9243 .eraseblocks = { {256 * 1024, 1} },
9244 .block_erase = erase_chip_block_jedec,
9247 .write = write_jedec_1,
9248 .read = read_memmapped,
9249 .voltage = {4500, 5500},
9253 .vendor = "Winbond",
9255 .bustype = BUS_PARALLEL,
9256 .manufacture_id = WINBOND_ID,
9257 .model_id = WINBOND_W49F020,
9260 .feature_bits = FEATURE_EITHER_RESET,
9261 .tested = TEST_OK_PROBE,
9262 .probe = probe_jedec,
9267 .eraseblocks = { {256 * 1024, 1} },
9268 .block_erase = erase_chip_block_jedec,
9271 .write = write_jedec_1,
9272 .read = read_memmapped,
9273 .voltage = {4500, 5500},
9277 .vendor = "Winbond",
9280 .manufacture_id = WINBOND_ID,
9281 .model_id = WINBOND_W49V002A,
9284 .feature_bits = FEATURE_EITHER_RESET,
9285 .tested = TEST_OK_PREW,
9286 .probe = probe_jedec,
9297 .block_erase = erase_sector_jedec,
9299 .eraseblocks = { {256 * 1024, 1} },
9300 .block_erase = erase_chip_block_jedec,
9303 .write = write_jedec_1,
9304 .read = read_memmapped,
9305 .voltage = {3000, 3600},
9309 .vendor = "Winbond",
9310 .name = "W49V002FA",
9312 .manufacture_id = WINBOND_ID,
9313 .model_id = WINBOND_W49V002FA,
9316 .feature_bits = FEATURE_EITHER_RESET,
9317 .tested = TEST_OK_PR,
9318 .probe = probe_jedec,
9329 .block_erase = erase_sector_jedec,
9331 .eraseblocks = { {256 * 1024, 1} },
9332 .block_erase = erase_chip_block_jedec,
9335 .write = write_jedec_1,
9336 .read = read_memmapped,
9337 .voltage = {3000, 3600},
9341 .vendor = "Winbond",
9342 .name = "W39V080FA",
9344 .manufacture_id = WINBOND_ID,
9345 .model_id = WINBOND_W39V080FA,
9347 .page_size = 64 * 1024,
9348 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9349 .tested = TEST_OK_PREW,
9350 .probe = probe_jedec,
9355 .eraseblocks = { {64 * 1024, 16}, },
9356 .block_erase = erase_sector_jedec,
9358 .eraseblocks = { {1024 * 1024, 1} },
9359 .block_erase = erase_chip_block_jedec,
9362 .printlock = printlock_w39v080fa,
9363 .unlock = unlock_w39v080fa,
9364 .write = write_jedec_1,
9365 .read = read_memmapped,
9366 .voltage = {3000, 3600}, /* Also has 12V fast program */
9370 .vendor = "Winbond",
9371 .name = "W39V080FA (dual mode)",
9373 .manufacture_id = WINBOND_ID,
9374 .model_id = WINBOND_W39V080FA_DM,
9376 .page_size = 64 * 1024,
9377 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9378 .tested = TEST_UNTESTED,
9379 .probe = probe_jedec,
9384 .eraseblocks = { {64 * 1024, 8}, },
9385 .block_erase = erase_sector_jedec,
9387 .eraseblocks = { {512 * 1024, 1} },
9388 .block_erase = erase_chip_block_jedec,
9391 .printlock = printlock_w39v080fa_dual,
9392 .write = write_jedec_1,
9393 .read = read_memmapped,
9394 .voltage = {3000, 3600}, /* Also has 12V fast program */
9398 .vendor = "Unknown",
9399 .name = "SFDP-capable chip",
9401 .manufacture_id = GENERIC_MANUF_ID,
9402 .model_id = SFDP_DEVICE_ID,
9403 /* We present our own "report this" text hence we do not
9404 * want the default "This flash part has status UNTESTED..."
9405 * text to be printed. */
9406 .tested = TEST_OK_PREW,
9407 .probe = probe_spi_sfdp,
9408 .unlock = spi_disable_blockprotect, /* is this safe? */
9409 .read = spi_chip_read,
9410 /* FIXME: some vendor extensions define this */
9412 /* Everything below will be set by the probing function. */
9417 .block_erasers = {},
9421 .vendor = "Programmer",
9422 .name = "Opaque flash chip",
9423 .bustype = BUS_PROG,
9424 .manufacture_id = PROGMANUF_ID,
9425 .model_id = PROGDEV_ID,
9428 /* probe is assumed to work, rest will be filled in by probe */
9429 .tested = TEST_OK_PROBE,
9430 .probe = probe_opaque,
9431 /* eraseblock sizes will be set by the probing function */
9435 .block_erase = erase_opaque,
9438 .write = write_opaque,
9439 .read = read_opaque,
9444 .name = "unknown AMIC SPI chip",
9446 .manufacture_id = AMIC_ID,
9447 .model_id = GENERIC_DEVICE_ID,
9450 .tested = TEST_BAD_PREW,
9451 .probe = probe_spi_rdid4,
9452 .probe_timing = TIMING_ZERO,
9459 .name = "unknown Atmel SPI chip",
9461 .manufacture_id = ATMEL_ID,
9462 .model_id = GENERIC_DEVICE_ID,
9465 .tested = TEST_BAD_PREW,
9466 .probe = probe_spi_rdid,
9467 .probe_timing = TIMING_ZERO,
9474 .name = "unknown Eon SPI chip",
9476 .manufacture_id = EON_ID_NOPREFIX,
9477 .model_id = GENERIC_DEVICE_ID,
9480 .tested = TEST_BAD_PREW,
9481 .probe = probe_spi_rdid,
9482 .probe_timing = TIMING_ZERO,
9488 .vendor = "Macronix",
9489 .name = "unknown Macronix SPI chip",
9491 .manufacture_id = MACRONIX_ID,
9492 .model_id = GENERIC_DEVICE_ID,
9495 .tested = TEST_BAD_PREW,
9496 .probe = probe_spi_rdid,
9497 .probe_timing = TIMING_ZERO,
9504 .name = "unknown PMC SPI chip",
9506 .manufacture_id = PMC_ID,
9507 .model_id = GENERIC_DEVICE_ID,
9510 .tested = TEST_BAD_PREW,
9511 .probe = probe_spi_rdid,
9512 .probe_timing = TIMING_ZERO,
9519 .name = "unknown SST SPI chip",
9521 .manufacture_id = SST_ID,
9522 .model_id = GENERIC_DEVICE_ID,
9525 .tested = TEST_BAD_PREW,
9526 .probe = probe_spi_rdid,
9527 .probe_timing = TIMING_ZERO,
9534 .name = "unknown ST SPI chip",
9536 .manufacture_id = ST_ID,
9537 .model_id = GENERIC_DEVICE_ID,
9540 .tested = TEST_BAD_PREW,
9541 .probe = probe_spi_rdid,
9542 .probe_timing = TIMING_ZERO,
9549 .name = "unknown Sanyo SPI chip",
9551 .manufacture_id = SANYO_ID,
9552 .model_id = GENERIC_DEVICE_ID,
9555 .tested = TEST_BAD_PREW,
9556 .probe = probe_spi_rdid,
9557 .probe_timing = TIMING_ZERO,
9563 .vendor = "Generic",
9564 .name = "unknown SPI chip (RDID)",
9566 .manufacture_id = GENERIC_MANUF_ID,
9567 .model_id = GENERIC_DEVICE_ID,
9570 .tested = TEST_BAD_PREW,
9571 .probe = probe_spi_rdid,
9576 .vendor = "Generic",
9577 .name = "unknown SPI chip (REMS)",
9579 .manufacture_id = GENERIC_MANUF_ID,
9580 .model_id = GENERIC_DEVICE_ID,
9583 .tested = TEST_BAD_PREW,
9584 .probe = probe_spi_rems,