source: trunk/flashchips.c @ 1535

Revision 1535, 222.9 KB checked in by stefanct, 4 days ago (diff)

Add support for Eon EN25QH32.

Its ID was spotted in an descriptor region update by Jetway:
 http://paste.flashrom.org/view.php?id=1217

Signed-off-by: Stefan Tauner <stefan.tauner@…>
Acked-by: Stefan Tauner <stefan.tauner@…>

Line 
1/*
2 * This file is part of the flashrom project.
3 *
4 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
6 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
7 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
8 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * 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
23 */
24
25#include "flash.h"
26#include "flashchips.h"
27#include "chipdrivers.h"
28
29/**
30 * List of supported flash chips.
31 *
32 * Please keep the list sorted by vendor name and chip name, so that
33 * the output of 'flashrom -L' is alphabetically sorted.
34 */
35const struct flashchip flashchips[] = {
36
37        /*
38         * .vendor              = Vendor name
39         * .name                = Chip 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
49         * {
50         *      .eraseblocks[]  = Array of { blocksize, blockcount }
51         *      .block_erase    = Block erase function
52         * }
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
58         */
59
60        {
61                .vendor         = "AMD",
62                .name           = "Am29F010A/B",
63                .bustype        = BUS_PARALLEL,
64                .manufacture_id = AMD_ID,
65                .model_id       = AMD_AM29F010B,        /* Same as Am29F010A */
66                .total_size     = 128,
67                .page_size      = 16 * 1024,
68                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
69                .tested         = TEST_OK_PRE,
70                .probe          = probe_jedec,
71                .probe_timing   = TIMING_ZERO,
72                .block_erasers  =
73                {
74                        {
75                                .eraseblocks = { {16 * 1024, 8} },
76                                .block_erase = erase_sector_jedec,
77                        }, {
78                                .eraseblocks = { {128 * 1024, 1} },
79                                .block_erase = erase_chip_block_jedec,
80                        },
81                },
82                .write          = write_jedec_1,
83                .read           = read_memmapped,
84                .voltage        = {4500, 5500},
85        },
86
87        {
88                .vendor         = "AMD",
89                .name           = "Am29F002(N)BB",
90                .bustype        = BUS_PARALLEL,
91                .manufacture_id = AMD_ID,
92                .model_id       = AMD_AM29F002BB,
93                .total_size     = 256,
94                .page_size      = 256,
95                .feature_bits   = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
96                .tested         = TEST_UNTESTED,
97                .probe          = probe_jedec,
98                .probe_timing   = TIMING_ZERO,
99                .block_erasers  =
100                {
101                        {
102                                .eraseblocks = {
103                                        {16 * 1024, 1},
104                                        {8 * 1024, 2},
105                                        {32 * 1024, 1},
106                                        {64 * 1024, 3},
107                                },
108                                .block_erase = erase_sector_jedec,
109                        }, {
110                                .eraseblocks = { {256 * 1024, 1} },
111                                .block_erase = erase_chip_block_jedec,
112                        },
113                },
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 */
117        },
118
119        {
120                .vendor         = "AMD",
121                .name           = "Am29F002(N)BT",
122                .bustype        = BUS_PARALLEL,
123                .manufacture_id = AMD_ID,
124                .model_id       = AMD_AM29F002BT,
125                .total_size     = 256,
126                .page_size      = 256,
127                .feature_bits   = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
128                .tested         = TEST_UNTESTED,
129                .probe          = probe_jedec,
130                .probe_timing   = TIMING_ZERO,
131                .block_erasers  =
132                {
133                        {
134                                .eraseblocks = {
135                                        {64 * 1024, 3},
136                                        {32 * 1024, 1},
137                                        {8 * 1024, 2},
138                                        {16 * 1024, 1},
139                                },
140                                .block_erase = erase_sector_jedec,
141                        }, {
142                                .eraseblocks = { {256 * 1024, 1} },
143                                .block_erase = erase_chip_block_jedec,
144                        },
145                },
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 */
149        },
150
151        {
152                .vendor         = "AMD",
153                .name           = "Am29F016D",
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,
163                .block_erasers  =
164                {
165                        {
166                                .eraseblocks = { {64 * 1024, 32} },
167                                .block_erase = erase_sector_jedec,
168                        }, {
169                                .eraseblocks = { {2048 * 1024, 1} },
170                                .block_erase = erase_chip_block_jedec,
171                        },
172                },
173                .write          = write_jedec_1,
174                .read           = read_memmapped,
175                .voltage        = {4500, 5500},
176        },
177
178        {
179                .vendor         = "AMD",
180                .name           = "Am29F040B",
181                .bustype        = BUS_PARALLEL,
182                .manufacture_id = AMD_ID,
183                .model_id       = AMD_AM29F040B,
184                .total_size     = 512,
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,
190                .block_erasers  =
191                {
192                        {
193                                .eraseblocks = { {64 * 1024, 8} },
194                                .block_erase = erase_sector_jedec,
195                        }, {
196                                .eraseblocks = { {512 * 1024, 1} },
197                                .block_erase = erase_chip_block_jedec,
198                        },
199                },
200                .write          = write_jedec_1,
201                .read           = read_memmapped,
202                .voltage        = {4500, 5500},
203        },
204
205        {
206                .vendor         = "AMD",
207                .name           = "Am29F080B",
208                .bustype        = BUS_PARALLEL,
209                .manufacture_id = AMD_ID,
210                .model_id       = AMD_AM29F080B,
211                .total_size     = 1024,
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,
217                .block_erasers  =
218                {
219                        {
220                                .eraseblocks = { {64 * 1024, 16} },
221                                .block_erase = erase_sector_jedec,
222                        }, {
223                                .eraseblocks = { {1024 * 1024, 1} },
224                                .block_erase = erase_chip_block_jedec,
225                        },
226                },
227                .write          = write_jedec_1,
228                .read           = read_memmapped,
229                .voltage        = {4500, 5500},
230        },
231
232        {
233                .vendor         = "AMD",
234                .name           = "Am29LV001BB",
235                .bustype        = BUS_PARALLEL,
236                .manufacture_id = AMD_ID,
237                .model_id       = AMD_AM29LV001BB,
238                .total_size     = 128,
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,
244                .block_erasers  =
245                {
246                        {
247                                .eraseblocks = {
248                                        {8 * 1024, 1},
249                                        {4 * 1024, 2},
250                                        {16 * 1024, 7},
251                                },
252                                .block_erase = erase_sector_jedec,
253                        }, {
254                                .eraseblocks = { {128 * 1024, 1} },
255                                .block_erase = erase_chip_block_jedec,
256                        },
257                },
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 */
261        },
262
263        {
264                .vendor         = "AMD",
265                .name           = "Am29LV001BT",
266                .bustype        = BUS_PARALLEL,
267                .manufacture_id = AMD_ID,
268                .model_id       = AMD_AM29LV001BT,
269                .total_size     = 128,
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,
275                .block_erasers  =
276                {
277                        {
278                                .eraseblocks = {
279                                        {16 * 1024, 7},
280                                        {4 * 1024, 2},
281                                        {8 * 1024, 1},
282                                },
283                                .block_erase = erase_sector_jedec,
284                        }, {
285                                .eraseblocks = { {128 * 1024, 1} },
286                                .block_erase = erase_chip_block_jedec,
287                        },
288                },
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 */
292        },
293
294        {
295                .vendor         = "AMD",
296                .name           = "Am29LV002BB",
297                .bustype        = BUS_PARALLEL,
298                .manufacture_id = AMD_ID,
299                .model_id       = AMD_AM29LV002BB,
300                .total_size     = 256,
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,
306                .block_erasers  =
307                {
308                        {
309                                .eraseblocks = {
310                                        {16 * 1024, 1},
311                                        {8 * 1024, 2},
312                                        {32 * 1024, 1},
313                                        {64 * 1024, 3},
314                                },
315                                .block_erase = erase_sector_jedec,
316                        }, {
317                                .eraseblocks = { {256 * 1024, 1} },
318                                .block_erase = erase_chip_block_jedec,
319                        },
320                },
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 */
324        },
325
326        {
327                .vendor         = "AMD",
328                .name           = "Am29LV002BT",
329                .bustype        = BUS_PARALLEL,
330                .manufacture_id = AMD_ID,
331                .model_id       = AMD_AM29LV002BT,
332                .total_size     = 256,
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,
338                .block_erasers  =
339                {
340                        {
341                                .eraseblocks = {
342                                        {64 * 1024, 3},
343                                        {32 * 1024, 1},
344                                        {8 * 1024, 2},
345                                        {16 * 1024, 1},
346                                },
347                                .block_erase = erase_sector_jedec,
348                        }, {
349                                .eraseblocks = { {256 * 1024, 1} },
350                                .block_erase = erase_chip_block_jedec,
351                        },
352                },
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 */
356        },
357
358        {
359                .vendor         = "AMD",
360                .name           = "Am29LV004BB",
361                .bustype        = BUS_PARALLEL,
362                .manufacture_id = AMD_ID,
363                .model_id       = AMD_AM29LV004BB,
364                .total_size     = 512,
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,
370                .block_erasers  =
371                {
372                        {
373                                .eraseblocks = {
374                                        {16 * 1024, 1},
375                                        {8 * 1024, 2},
376                                        {32 * 1024, 1},
377                                        {64 * 1024, 7},
378                                },
379                                .block_erase = erase_sector_jedec,
380                        }, {
381                                .eraseblocks = { {512 * 1024, 1} },
382                                .block_erase = erase_chip_block_jedec,
383                        },
384                },
385                .write          = write_jedec_1,
386                .read           = read_memmapped,
387                .voltage        = {2700, 3600},
388        },
389
390        {
391                .vendor         = "AMD",
392                .name           = "Am29LV004BT",
393                .bustype        = BUS_PARALLEL,
394                .manufacture_id = AMD_ID,
395                .model_id       = AMD_AM29LV004BT,
396                .total_size     = 512,
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,
402                .block_erasers  =
403                {
404                        {
405                                .eraseblocks = {
406                                        {64 * 1024, 7},
407                                        {32 * 1024, 1},
408                                        {8 * 1024, 2},
409                                        {16 * 1024, 1},
410                                },
411                                .block_erase = erase_sector_jedec,
412                        }, {
413                                .eraseblocks = { {512 * 1024, 1} },
414                                .block_erase = erase_chip_block_jedec,
415                        },
416                },
417                .write          = write_jedec_1,
418                .read           = read_memmapped,
419                .voltage        = {2700, 3600},
420        },
421
422        {
423                .vendor         = "AMD",
424                .name           = "Am29LV008BB",
425                .bustype        = BUS_PARALLEL,
426                .manufacture_id = AMD_ID,
427                .model_id       = AMD_AM29LV008BB,
428                .total_size     = 1024,
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,
434                .block_erasers  =
435                {
436                        {
437                                .eraseblocks = {
438                                        {16 * 1024, 1},
439                                        {8 * 1024, 2},
440                                        {32 * 1024, 1},
441                                        {64 * 1024, 15},
442                                },
443                                .block_erase = erase_sector_jedec,
444                        }, {
445                                .eraseblocks = { {1024 * 1024, 1} },
446                                .block_erase = erase_chip_block_jedec,
447                        },
448                },
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 */
452        },
453
454        {
455                .vendor         = "AMD",
456                .name           = "Am29LV008BT",
457                .bustype        = BUS_PARALLEL,
458                .manufacture_id = AMD_ID,
459                .model_id       = AMD_AM29LV008BT,
460                .total_size     = 1024,
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,
466                .block_erasers  =
467                {
468                        {
469                                .eraseblocks = {
470                                        {64 * 1024, 15},
471                                        {32 * 1024, 1},
472                                        {8 * 1024, 2},
473                                        {16 * 1024, 1},
474                                },
475                                .block_erase = erase_sector_jedec,
476                        }, {
477                                .eraseblocks = { {1024 * 1024, 1} },
478                                .block_erase = erase_chip_block_jedec,
479                        },
480                },
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 */
484        },
485
486        {
487                .vendor         = "AMD",
488                .name           = "Am29LV040B",
489                .bustype        = BUS_PARALLEL,
490                .manufacture_id = AMD_ID,
491                .model_id       = AMD_AM29LV040B,
492                .total_size     = 512,
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,
498                .block_erasers  =
499                {
500                        {
501                                .eraseblocks = { {64 * 1024, 8} },
502                                .block_erase = erase_sector_jedec,
503                        }, {
504                                .eraseblocks = { {512 * 1024, 1} },
505                                .block_erase = erase_chip_block_jedec,
506                        },
507                },
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*/
511        },
512
513        {
514                .vendor         = "AMD",
515                .name           = "Am29LV081B",
516                .bustype        = BUS_PARALLEL,
517                .manufacture_id = AMD_ID,
518                .model_id       = AMD_AM29LV080B,
519                .total_size     = 1024,
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,
525                .block_erasers  =
526                {
527                        {
528                                .eraseblocks = { {64 * 1024, 16} },
529                                .block_erase = erase_sector_jedec,
530                        }, {
531                                .eraseblocks = { {1024 * 1024, 1} },
532                                .block_erase = erase_chip_block_jedec,
533                        },
534                },
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 */
538        },
539
540        {
541                .vendor         = "AMIC",
542                .name           = "A25L05PT",
543                .bustype        = BUS_SPI,
544                .manufacture_id = AMIC_ID,
545                .model_id       = AMIC_A25L05PT,
546                .total_size     = 64,
547                .page_size      = 256,
548                .feature_bits   = FEATURE_WRSR_WREN,
549                .tested         = TEST_UNTESTED,
550                .probe          = probe_spi_rdid4,
551                .probe_timing   = TIMING_ZERO,
552                .block_erasers  =
553                {
554                        {
555                                .eraseblocks = {
556                                        {32 * 1024, 1},
557                                        {16 * 1024, 1},
558                                        {8 * 1024, 1},
559                                        {4 * 1024, 2},
560                                },
561                                .block_erase = spi_block_erase_d8,
562                        }, {
563                                .eraseblocks = { {64 * 1024, 1} },
564                                .block_erase = spi_block_erase_c7,
565                        }
566                },
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},
572        },
573
574        {
575                .vendor         = "AMIC",
576                .name           = "A25L05PU",
577                .bustype        = BUS_SPI,
578                .manufacture_id = AMIC_ID,
579                .model_id       = AMIC_A25L05PU,
580                .total_size     = 64,
581                .page_size      = 256,
582                .feature_bits   = FEATURE_WRSR_WREN,
583                .tested         = TEST_UNTESTED,
584                .probe          = probe_spi_rdid4,
585                .probe_timing   = TIMING_ZERO,
586                .block_erasers  =
587                {
588                        {
589                                .eraseblocks = {
590                                        {4 * 1024, 2},
591                                        {8 * 1024, 1},
592                                        {16 * 1024, 1},
593                                        {32 * 1024, 1},
594                                },
595                                .block_erase = spi_block_erase_d8,
596                        }, {
597                                .eraseblocks = { {64 * 1024, 1} },
598                                .block_erase = spi_block_erase_c7,
599                        }
600                },
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},
606        },
607
608        {
609                .vendor         = "AMIC",
610                .name           = "A25L10PT",
611                .bustype        = BUS_SPI,
612                .manufacture_id = AMIC_ID,
613                .model_id       = AMIC_A25L10PT,
614                .total_size     = 128,
615                .page_size      = 256,
616                .feature_bits   = FEATURE_WRSR_WREN,
617                .tested         = TEST_UNTESTED,
618                .probe          = probe_spi_rdid4,
619                .probe_timing   = TIMING_ZERO,
620                .block_erasers  =
621                {
622                        {
623                                .eraseblocks = {
624                                        {64 * 1024, 1},
625                                        {32 * 1024, 1},
626                                        {16 * 1024, 1},
627                                        {8 * 1024, 1},
628                                        {4 * 1024, 2},
629                                },
630                                .block_erase = spi_block_erase_d8,
631                        }, {
632                                .eraseblocks = { {128 * 1024, 1} },
633                                .block_erase = spi_block_erase_c7,
634                        }
635                },
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},
641        },
642
643        {
644                .vendor         = "AMIC",
645                .name           = "A25L10PU",
646                .bustype        = BUS_SPI,
647                .manufacture_id = AMIC_ID,
648                .model_id       = AMIC_A25L10PU,
649                .total_size     = 128,
650                .page_size      = 256,
651                .feature_bits   = FEATURE_WRSR_WREN,
652                .tested         = TEST_UNTESTED,
653                .probe          = probe_spi_rdid4,
654                .probe_timing   = TIMING_ZERO,
655                .block_erasers  =
656                {
657                        {
658                                .eraseblocks = {
659                                        {4 * 1024, 2},
660                                        {8 * 1024, 1},
661                                        {16 * 1024, 1},
662                                        {32 * 1024, 1},
663                                        {64 * 1024, 1},
664                                },
665                                .block_erase = spi_block_erase_d8,
666                        }, {
667                                .eraseblocks = { {128 * 1024, 1} },
668                                .block_erase = spi_block_erase_c7,
669                        }
670                },
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},
676        },
677
678        {
679                .vendor         = "AMIC",
680                .name           = "A25L20PT",
681                .bustype        = BUS_SPI,
682                .manufacture_id = AMIC_ID,
683                .model_id       = AMIC_A25L20PT,
684                .total_size     = 256,
685                .page_size      = 256,
686                .feature_bits   = FEATURE_WRSR_WREN,
687                .tested         = TEST_UNTESTED,
688                .probe          = probe_spi_rdid4,
689                .probe_timing   = TIMING_ZERO,
690                .block_erasers  =
691                {
692                        {
693                                .eraseblocks = {
694                                        {64 * 1024, 3},
695                                        {32 * 1024, 1},
696                                        {16 * 1024, 1},
697                                        {8 * 1024, 1},
698                                        {4 * 1024, 2},
699                                },
700                                .block_erase = spi_block_erase_d8,
701                        }, {
702                                .eraseblocks = { {256 * 1024, 1} },
703                                .block_erase = spi_block_erase_c7,
704                        }
705                },
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},
711        },
712
713        {
714                .vendor         = "AMIC",
715                .name           = "A25L20PU",
716                .bustype        = BUS_SPI,
717                .manufacture_id = AMIC_ID,
718                .model_id       = AMIC_A25L20PU,
719                .total_size     = 256,
720                .page_size      = 256,
721                .feature_bits   = FEATURE_WRSR_WREN,
722                .tested         = TEST_UNTESTED,
723                .probe          = probe_spi_rdid4,
724                .probe_timing   = TIMING_ZERO,
725                .block_erasers  =
726                {
727                        {
728                                .eraseblocks = {
729                                        {4 * 1024, 2},
730                                        {8 * 1024, 1},
731                                        {16 * 1024, 1},
732                                        {32 * 1024, 1},
733                                        {64 * 1024, 3},
734                                },
735                                .block_erase = spi_block_erase_d8,
736                        }, {
737                                .eraseblocks = { {256 * 1024, 1} },
738                                .block_erase = spi_block_erase_c7,
739                        }
740                },
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},
746        },
747
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.
752         */
753        {
754                .vendor         = "AMIC",
755                .name           = "A25L40PT",
756                .bustype        = BUS_SPI,
757                .manufacture_id = AMIC_ID,
758                .model_id       = AMIC_A25L40PT,
759                .total_size     = 512,
760                .page_size      = 256,
761                .feature_bits   = FEATURE_WRSR_WREN,
762                .tested         = TEST_OK_PR,
763                .probe          = probe_spi_rdid4,
764                .probe_timing   = TIMING_ZERO,
765                .block_erasers  =
766                {
767                        {
768                                .eraseblocks = {
769                                        {64 * 1024, 7},
770                                        {32 * 1024, 1},
771                                        {16 * 1024, 1},
772                                        {8 * 1024, 1},
773                                        {4 * 1024, 2},
774                                },
775                                .block_erase = spi_block_erase_d8,
776                        }, {
777                                .eraseblocks = { {512 * 1024, 1} },
778                                .block_erase = spi_block_erase_c7,
779                        }
780                },
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},
786        },
787
788        {
789                .vendor         = "AMIC",
790                .name           = "A25L40PU",
791                .bustype        = BUS_SPI,
792                .manufacture_id = AMIC_ID,
793                .model_id       = AMIC_A25L40PU,
794                .total_size     = 512,
795                .page_size      = 256,
796                .feature_bits   = FEATURE_WRSR_WREN,
797                .tested         = TEST_OK_PR,
798                .probe          = probe_spi_rdid4,
799                .probe_timing   = TIMING_ZERO,
800                .block_erasers  =
801                {
802                        {
803                                .eraseblocks = {
804                                        {4 * 1024, 2},
805                                        {8 * 1024, 1},
806                                        {16 * 1024, 1},
807                                        {32 * 1024, 1},
808                                        {64 * 1024, 7},
809                                },
810                                .block_erase = spi_block_erase_d8,
811                        }, {
812                                .eraseblocks = { {512 * 1024, 1} },
813                                .block_erase = spi_block_erase_c7,
814                        }
815                },
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},
821        },
822
823        {
824                .vendor         = "AMIC",
825                .name           = "A25L80P",
826                .bustype        = BUS_SPI,
827                .manufacture_id = AMIC_ID,
828                .model_id       = AMIC_A25L80P,
829                .total_size     = 1024,
830                .page_size      = 256,
831                .feature_bits   = FEATURE_WRSR_WREN,
832                .tested         = TEST_OK_PRE,
833                .probe          = probe_spi_rdid4,
834                .probe_timing   = TIMING_ZERO,
835                .block_erasers  =
836                {
837                        {
838                                .eraseblocks = {
839                                        {4 * 1024, 2},
840                                        {8 * 1024, 1},
841                                        {16 * 1024, 1},
842                                        {32 * 1024, 1},
843                                        {64 * 1024, 15},
844                                },
845                                .block_erase = spi_block_erase_d8,
846                        }, {
847                                .eraseblocks = { {1024 * 1024, 1} },
848                                .block_erase = spi_block_erase_c7,
849                        }
850                },
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},
856        },
857
858        {
859                .vendor         = "AMIC",
860                .name           = "A25L16PT",
861                .bustype        = BUS_SPI,
862                .manufacture_id = AMIC_ID,
863                .model_id       = AMIC_A25L16PT,
864                .total_size     = 2048,
865                .page_size      = 256,
866                .feature_bits   = FEATURE_WRSR_WREN,
867                .tested         = TEST_UNTESTED,
868                .probe          = probe_spi_rdid4,
869                .probe_timing   = TIMING_ZERO,
870                .block_erasers  =
871                {
872                        {
873                                .eraseblocks = {
874                                        {64 * 1024, 31},
875                                        {32 * 1024, 1},
876                                        {16 * 1024, 1},
877                                        {8 * 1024, 1},
878                                        {4 * 1024, 2},
879                                },
880                                .block_erase = spi_block_erase_d8,
881                        }, {
882                                .eraseblocks = { {2048 * 1024, 1} },
883                                .block_erase = spi_block_erase_60,
884                        }, {
885                                .eraseblocks = { {2048 * 1024, 1} },
886                                .block_erase = spi_block_erase_c7,
887                        }
888                },
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},
894        },
895
896        {
897                .vendor         = "AMIC",
898                .name           = "A25L16PU",
899                .bustype        = BUS_SPI,
900                .manufacture_id = AMIC_ID,
901                .model_id       = AMIC_A25L16PU,
902                .total_size     = 2048,
903                .page_size      = 256,
904                .feature_bits   = FEATURE_WRSR_WREN,
905                .tested         = TEST_OK_PR,
906                .probe          = probe_spi_rdid4,
907                .probe_timing   = TIMING_ZERO,
908                .block_erasers  =
909                {
910                        {
911                                .eraseblocks = {
912                                        {4 * 1024, 2},
913                                        {8 * 1024, 1},
914                                        {16 * 1024, 1},
915                                        {32 * 1024, 1},
916                                        {64 * 1024, 31},
917                                },
918                                .block_erase = spi_block_erase_d8,
919                        }, {
920                                .eraseblocks = { {2048 * 1024, 1} },
921                                .block_erase = spi_block_erase_60,
922                        }, {
923                                .eraseblocks = { {2048 * 1024, 1} },
924                                .block_erase = spi_block_erase_c7,
925                        }
926                },
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},
932        },
933
934        {
935                .vendor         = "AMIC",
936                .name           = "A25L512",
937                .bustype        = BUS_SPI,
938                .manufacture_id = AMIC_ID_NOPREFIX,
939                .model_id       = AMIC_A25L512,
940                .total_size     = 64,
941                .page_size      = 256,
942                .feature_bits   = FEATURE_WRSR_WREN,
943                .tested         = TEST_UNTESTED,
944                .probe          = probe_spi_rdid,
945                .probe_timing   = TIMING_ZERO,
946                .block_erasers  =
947                {
948                        {
949                                .eraseblocks = { { 4 * 1024, 16 } },
950                                .block_erase = spi_block_erase_20,
951                        }, {
952                                .eraseblocks = { { 64 * 1024, 1 } },
953                                .block_erase = spi_block_erase_d8,
954                        }, {
955                                .eraseblocks = { { 64 * 1024, 1 } },
956                                .block_erase = spi_block_erase_c7,
957                        }                       
958                },
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},
964        },
965
966        {
967                .vendor         = "AMIC",
968                .name           = "A25L010",
969                .bustype        = BUS_SPI,
970                .manufacture_id = AMIC_ID_NOPREFIX,
971                .model_id       = AMIC_A25L010,
972                .total_size     = 128,
973                .page_size      = 256,
974                .feature_bits   = FEATURE_WRSR_WREN,
975                .tested         = TEST_UNTESTED,
976                .probe          = probe_spi_rdid,
977                .probe_timing   = TIMING_ZERO,
978                .block_erasers  =
979                {
980                        {
981                                .eraseblocks = { { 4 * 1024, 32 } },
982                                .block_erase = spi_block_erase_20,
983                        }, {
984                                .eraseblocks = { { 64 * 1024, 2 } },
985                                .block_erase = spi_block_erase_d8,
986                        }, {
987                                .eraseblocks = { { 128 * 1024, 1 } },
988                                .block_erase = spi_block_erase_c7,
989                        }                       
990                },
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},
996        },
997
998        {
999                .vendor         = "AMIC",
1000                .name           = "A25L020",
1001                .bustype        = BUS_SPI,
1002                .manufacture_id = AMIC_ID_NOPREFIX,
1003                .model_id       = AMIC_A25L020,
1004                .total_size     = 256,
1005                .page_size      = 256,
1006                .feature_bits   = FEATURE_WRSR_WREN,
1007                .tested         = TEST_UNTESTED,
1008                .probe          = probe_spi_rdid,
1009                .probe_timing   = TIMING_ZERO,
1010                .block_erasers  =
1011                {
1012                        {
1013                                .eraseblocks = { { 4 * 1024, 64 } },
1014                                .block_erase = spi_block_erase_20,
1015                        }, {
1016                                .eraseblocks = { { 64 * 1024, 4 } },
1017                                .block_erase = spi_block_erase_d8,
1018                        }, {
1019                                .eraseblocks = { { 256 * 1024, 1 } },
1020                                .block_erase = spi_block_erase_c7,
1021                        }                       
1022                },
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},
1028        },
1029
1030        {
1031                .vendor         = "AMIC",
1032                .name           = "A25L040",
1033                .bustype        = BUS_SPI,
1034                .manufacture_id = AMIC_ID_NOPREFIX,
1035                .model_id       = AMIC_A25L040,
1036                .total_size     = 512,
1037                .page_size      = 256,
1038                .feature_bits   = FEATURE_WRSR_WREN,
1039                .tested         = TEST_UNTESTED,
1040                .probe          = probe_spi_rdid,
1041                .probe_timing   = TIMING_ZERO,
1042                .block_erasers  =
1043                {
1044                        {
1045                                .eraseblocks = { { 4 * 1024, 128 } },
1046                                .block_erase = spi_block_erase_20,
1047                        }, {
1048                                .eraseblocks = { { 64 * 1024, 8 } },
1049                                .block_erase = spi_block_erase_d8,
1050                        }, {
1051                                .eraseblocks = { { 512 * 1024, 1 } },
1052                                .block_erase = spi_block_erase_c7,
1053                        }                       
1054                },
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},
1060        },
1061
1062        {
1063                .vendor         = "AMIC",
1064                .name           = "A25L080",
1065                .bustype        = BUS_SPI,
1066                .manufacture_id = AMIC_ID_NOPREFIX,
1067                .model_id       = AMIC_A25L080,
1068                .total_size     = 1024,
1069                .page_size      = 256,
1070                .feature_bits   = FEATURE_WRSR_WREN,
1071                .tested         = TEST_UNTESTED,
1072                .probe          = probe_spi_rdid,
1073                .probe_timing   = TIMING_ZERO,
1074                .block_erasers  =
1075                {
1076                        {
1077                                .eraseblocks = { { 4 * 1024, 256 } },
1078                                .block_erase = spi_block_erase_20,
1079                        }, {
1080                                .eraseblocks = { { 64 * 1024, 16 } },
1081                                .block_erase = spi_block_erase_d8,
1082                        }, {
1083                                .eraseblocks = { { 1024 * 1024, 1 } },
1084                                .block_erase = spi_block_erase_c7,
1085                        }                       
1086                },
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},
1092        },
1093
1094        {
1095                .vendor         = "AMIC",
1096                .name           = "A25L016",
1097                .bustype        = BUS_SPI,
1098                .manufacture_id = AMIC_ID_NOPREFIX,
1099                .model_id       = AMIC_A25L016,
1100                .total_size     = 2048,
1101                .page_size      = 256,
1102                .feature_bits   = FEATURE_WRSR_WREN,
1103                .tested         = TEST_UNTESTED,
1104                .probe          = probe_spi_rdid,
1105                .probe_timing   = TIMING_ZERO,
1106                .block_erasers  =
1107                {
1108                        {
1109                                .eraseblocks = { { 4 * 1024, 512 } },
1110                                .block_erase = spi_block_erase_20,
1111                        }, {
1112                                .eraseblocks = { { 64 * 1024, 32 } },
1113                                .block_erase = spi_block_erase_d8,
1114                        }, {
1115                                .eraseblocks = { { 2048 * 1024, 1 } },
1116                                .block_erase = spi_block_erase_c7,
1117                        }                       
1118                },
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},
1124        },
1125
1126        {
1127                .vendor         = "AMIC",
1128                .name           = "A25L032",
1129                .bustype        = BUS_SPI,
1130                .manufacture_id = AMIC_ID_NOPREFIX,
1131                .model_id       = AMIC_A25L032,
1132                .total_size     = 4096,
1133                .page_size      = 256,
1134                /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1135                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
1136                .tested         = TEST_UNTESTED,
1137                .probe          = probe_spi_rdid,
1138                .probe_timing   = TIMING_ZERO,
1139                .block_erasers  =
1140                {
1141                        {
1142                                .eraseblocks = { { 4 * 1024, 1024 } },
1143                                .block_erase = spi_block_erase_20,
1144                        }, {
1145                                .eraseblocks = { { 64 * 1024, 64 } },
1146                                .block_erase = spi_block_erase_52,
1147                        }, {
1148                                .eraseblocks = { { 64 * 1024, 64 } },
1149                                .block_erase = spi_block_erase_d8,
1150                        }, {
1151                                .eraseblocks = { { 4096 * 1024, 1 } },
1152                                .block_erase = spi_block_erase_60,
1153                        }, {
1154                                .eraseblocks = { { 4096 * 1024, 1 } },
1155                                .block_erase = spi_block_erase_c7,
1156                        }                       
1157                },
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},
1163        },
1164
1165        {
1166                .vendor         = "AMIC",
1167                .name           = "A25LQ032",
1168                .bustype        = BUS_SPI,
1169                .manufacture_id = AMIC_ID_NOPREFIX,
1170                .model_id       = AMIC_A25LQ032,
1171                .total_size     = 4096,
1172                .page_size      = 256,
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,
1178                .block_erasers  =
1179                {
1180                        {
1181                                .eraseblocks = { { 4 * 1024, 1024 } },
1182                                .block_erase = spi_block_erase_20,
1183                        }, {
1184                                .eraseblocks = { { 64 * 1024, 64 } },
1185                                .block_erase = spi_block_erase_52,
1186                        }, {
1187                                .eraseblocks = { { 64 * 1024, 64 } },
1188                                .block_erase = spi_block_erase_d8,
1189                        }, {
1190                                .eraseblocks = { { 4096 * 1024, 1 } },
1191                                .block_erase = spi_block_erase_60,
1192                        }, {
1193                                .eraseblocks = { { 4096 * 1024, 1 } },
1194                                .block_erase = spi_block_erase_c7,
1195                        }                       
1196                },
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},
1202        },
1203
1204        {
1205                .vendor         = "AMIC",
1206                .name           = "A29002B",
1207                .bustype        = BUS_PARALLEL,
1208                .manufacture_id = AMIC_ID_NOPREFIX,
1209                .model_id       = AMIC_A29002B,
1210                .total_size     = 256,
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,
1216                .block_erasers  =
1217                {
1218                        {
1219                                .eraseblocks = { 
1220                                        {16 * 1024, 1},
1221                                        {8 * 1024, 2},
1222                                        {32 * 1024, 1},
1223                                        {64 * 1024, 3},
1224                                },
1225                                .block_erase = erase_sector_jedec,
1226                        }, {
1227                                .eraseblocks = { {256 * 1024, 1} },
1228                                .block_erase = erase_chip_block_jedec,
1229                        },
1230                },
1231                .write          = write_jedec_1,
1232                .read           = read_memmapped,
1233                .voltage        = {4500, 5500},
1234        },
1235
1236        {
1237                .vendor         = "AMIC",
1238                .name           = "A29002T",
1239                .bustype        = BUS_PARALLEL,
1240                .manufacture_id = AMIC_ID_NOPREFIX,
1241                .model_id       = AMIC_A29002T,
1242                .total_size     = 256,
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,
1248                .block_erasers  =
1249                {
1250                        {
1251                                .eraseblocks = { 
1252                                        {64 * 1024, 3},
1253                                        {32 * 1024, 1},
1254                                        {8 * 1024, 2},
1255                                        {16 * 1024, 1},
1256                                },
1257                                .block_erase = erase_sector_jedec,
1258                        }, {
1259                                .eraseblocks = { {256 * 1024, 1} },
1260                                .block_erase = erase_chip_block_jedec,
1261                        },
1262                },
1263                .write          = write_jedec_1,
1264                .read           = read_memmapped,
1265                .voltage        = {4500, 5500},
1266        },
1267
1268        {
1269                .vendor         = "AMIC",
1270                .name           = "A29040B",
1271                .bustype        = BUS_PARALLEL,
1272                .manufacture_id = AMIC_ID_NOPREFIX,
1273                .model_id       = AMIC_A29040B,
1274                .total_size     = 512,
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,
1280                .block_erasers  =
1281                {
1282                        {
1283                                .eraseblocks = { {64 * 1024, 8} },
1284                                .block_erase = erase_sector_jedec,
1285                        }, {
1286                                .eraseblocks = { {512 * 1024, 1} },
1287                                .block_erase = erase_chip_block_jedec,
1288                        },
1289                },
1290                .write          = write_jedec_1,
1291                .read           = read_memmapped,
1292                .voltage        = {4500, 5500},
1293        },
1294
1295        {
1296                .vendor         = "AMIC",
1297                .name           = "A49LF040A",
1298                .bustype        = BUS_LPC,
1299                .manufacture_id = AMIC_ID_NOPREFIX,
1300                .model_id       = AMIC_A49LF040A,
1301                .total_size     = 512,
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) */
1307                .block_erasers  =
1308                {
1309                        {
1310                                .eraseblocks = { {64 * 1024, 8} },
1311                                .block_erase = erase_block_jedec,
1312                        }, {
1313                                .eraseblocks = { {512 * 1024, 1} },
1314                                .block_erase = erase_chip_block_jedec,
1315                        }
1316                },
1317                .unlock         = unlock_49fl00x,
1318                .write          = write_jedec_1,
1319                .read           = read_memmapped,
1320                .voltage        = {3000, 3600},
1321        },
1322
1323        {
1324                .vendor         = "Atmel",
1325                .name           = "AT25DF021",
1326                .bustype        = BUS_SPI,
1327                .manufacture_id = ATMEL_ID,
1328                .model_id       = ATMEL_AT25DF021,
1329                .total_size     = 256,
1330                .page_size      = 256,
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,
1336                .block_erasers  =
1337                {
1338                        {
1339                                .eraseblocks = { {4 * 1024, 64} },
1340                                .block_erase = spi_block_erase_20,
1341                        }, {
1342                                .eraseblocks = { {32 * 1024, 8} },
1343                                .block_erase = spi_block_erase_52,
1344                        }, {
1345                                .eraseblocks = { {64 * 1024, 4} },
1346                                .block_erase = spi_block_erase_d8,
1347                        }, {
1348                                .eraseblocks = { {256 * 1024, 1} },
1349                                .block_erase = spi_block_erase_60,
1350                        }, {
1351                                .eraseblocks = { {256 * 1024, 1} },
1352                                .block_erase = spi_block_erase_c7,
1353                        }
1354                },
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 */
1360        },
1361
1362        {
1363                .vendor         = "Atmel",
1364                .name           = "AT25DF041A",
1365                .bustype        = BUS_SPI,
1366                .manufacture_id = ATMEL_ID,
1367                .model_id       = ATMEL_AT25DF041A,
1368                .total_size     = 512,
1369                .page_size      = 256,
1370                .feature_bits   = FEATURE_WRSR_WREN,
1371                .tested         = TEST_UNTESTED,
1372                .probe          = probe_spi_rdid,
1373                .probe_timing   = TIMING_ZERO,
1374                .block_erasers  =
1375                {
1376                        {
1377                                .eraseblocks = { {4 * 1024, 128} },
1378                                .block_erase = spi_block_erase_20,
1379                        }, {
1380                                .eraseblocks = { {32 * 1024, 16} },
1381                                .block_erase = spi_block_erase_52,
1382                        }, {
1383                                .eraseblocks = { {64 * 1024, 8} },
1384                                .block_erase = spi_block_erase_d8,
1385                        }, {
1386                                .eraseblocks = { {512 * 1024, 1} },
1387                                .block_erase = spi_block_erase_60,
1388                        }, {
1389                                .eraseblocks = { {512 * 1024, 1} },
1390                                .block_erase = spi_block_erase_c7,
1391                        }
1392                },
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 */
1398        },
1399
1400        {
1401                .vendor         = "Atmel",
1402                .name           = "AT25DF081",
1403                .bustype        = BUS_SPI,
1404                .manufacture_id = ATMEL_ID,
1405                .model_id       = ATMEL_AT25DF081,
1406                .total_size     = 1024,
1407                .page_size      = 256,
1408                .feature_bits   = FEATURE_WRSR_WREN,
1409                .tested         = TEST_UNTESTED,
1410                .probe          = probe_spi_rdid,
1411                .probe_timing   = TIMING_ZERO,
1412                .block_erasers  =
1413                {
1414                        {
1415                                .eraseblocks = { {4 * 1024, 256} },
1416                                .block_erase = spi_block_erase_20,
1417                        }, {
1418                                .eraseblocks = { {32 * 1024, 32} },
1419                                .block_erase = spi_block_erase_52,
1420                        }, {
1421                                .eraseblocks = { {64 * 1024, 16} },
1422                                .block_erase = spi_block_erase_d8,
1423                        }, {
1424                                .eraseblocks = { {1024 * 1024, 1} },
1425                                .block_erase = spi_block_erase_60,
1426                        }, {
1427                                .eraseblocks = { {1024 * 1024, 1} },
1428                                .block_erase = spi_block_erase_c7,
1429                        }
1430                },
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 */
1436        },
1437
1438        {
1439                .vendor         = "Atmel",
1440                .name           = "AT25DF081A",
1441                .bustype        = BUS_SPI,
1442                .manufacture_id = ATMEL_ID,
1443                .model_id       = ATMEL_AT25DF081A,
1444                .total_size     = 1024,
1445                .page_size      = 256,
1446                .feature_bits   = FEATURE_WRSR_WREN,
1447                .tested         = TEST_UNTESTED,
1448                .probe          = probe_spi_rdid,
1449                .probe_timing   = TIMING_ZERO,
1450                .block_erasers  =
1451                {
1452                        {
1453                                .eraseblocks = { {4 * 1024, 256} },
1454                                .block_erase = spi_block_erase_20,
1455                        }, {
1456                                .eraseblocks = { {32 * 1024, 32} },
1457                                .block_erase = spi_block_erase_52,
1458                        }, {
1459                                .eraseblocks = { {64 * 1024, 16} },
1460                                .block_erase = spi_block_erase_d8,
1461                        }, {
1462                                .eraseblocks = { {1024 * 1024, 1} },
1463                                .block_erase = spi_block_erase_60,
1464                        }, {
1465                                .eraseblocks = { {1024 * 1024, 1} },
1466                                .block_erase = spi_block_erase_c7,
1467                        }
1468                },
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},
1474        },
1475
1476        {
1477                .vendor         = "Atmel",
1478                .name           = "AT25DF161",
1479                .bustype        = BUS_SPI,
1480                .manufacture_id = ATMEL_ID,
1481                .model_id       = ATMEL_AT25DF161,
1482                .total_size     = 2048,
1483                .page_size      = 256,
1484                .feature_bits   = FEATURE_WRSR_WREN,
1485                .tested         = TEST_OK_PROBE,
1486                .probe          = probe_spi_rdid,
1487                .probe_timing   = TIMING_ZERO,
1488                .block_erasers  =
1489                {
1490                        {
1491                                .eraseblocks = { {4 * 1024, 512} },
1492                                .block_erase = spi_block_erase_20,
1493                        }, {
1494                                .eraseblocks = { {32 * 1024, 64} },
1495                                .block_erase = spi_block_erase_52,
1496                        }, {
1497                                .eraseblocks = { {64 * 1024, 32} },
1498                                .block_erase = spi_block_erase_d8,
1499                        }, {
1500                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1501                                .block_erase = spi_block_erase_60,
1502                        }, {
1503                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1504                                .block_erase = spi_block_erase_c7,
1505                        }
1506                },
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},
1512        },
1513
1514        {
1515                .vendor         = "Atmel",
1516                .name           = "AT25DF321",
1517                .bustype        = BUS_SPI,
1518                .manufacture_id = ATMEL_ID,
1519                .model_id       = ATMEL_AT25DF321,
1520                .total_size     = 4096,
1521                .page_size      = 256,
1522                .feature_bits   = FEATURE_WRSR_WREN,
1523                .tested         = TEST_OK_PREW,
1524                .probe          = probe_spi_rdid,
1525                .probe_timing   = TIMING_ZERO,
1526                .block_erasers  =
1527                {
1528                        {
1529                                .eraseblocks = { {4 * 1024, 1024} },
1530                                .block_erase = spi_block_erase_20,
1531                        }, {
1532                                .eraseblocks = { {32 * 1024, 128} },
1533                                .block_erase = spi_block_erase_52,
1534                        }, {
1535                                .eraseblocks = { {64 * 1024, 64} },
1536                                .block_erase = spi_block_erase_d8,
1537                        }, {
1538                                .eraseblocks = { {4 * 1024 * 1024, 1} },
1539                                .block_erase = spi_block_erase_60,
1540                        }, {
1541                                .eraseblocks = { {4 * 1024 * 1024, 1} },
1542                                .block_erase = spi_block_erase_c7,
1543                        }
1544                },
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},
1550        },
1551
1552        {
1553                .vendor         = "Atmel",
1554                .name           = "AT25DF321A",
1555                .bustype        = BUS_SPI,
1556                .manufacture_id = ATMEL_ID,
1557                .model_id       = ATMEL_AT25DF321A,
1558                .total_size     = 4096,
1559                .page_size      = 256,
1560                /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1561                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
1562                .tested         = TEST_OK_PROBE,
1563                .probe          = probe_spi_rdid,
1564                .probe_timing   = TIMING_ZERO,
1565                .block_erasers  =
1566                {
1567                        {
1568                                .eraseblocks = { {4 * 1024, 1024} },
1569                                .block_erase = spi_block_erase_20,
1570                        }, {
1571                                .eraseblocks = { {32 * 1024, 128} },
1572                                .block_erase = spi_block_erase_52,
1573                        }, {
1574                                .eraseblocks = { {64 * 1024, 64} },
1575                                .block_erase = spi_block_erase_d8,
1576                        }, {
1577                                .eraseblocks = { {4 * 1024 * 1024, 1} },
1578                                .block_erase = spi_block_erase_60,
1579                        }, {
1580                                .eraseblocks = { {4 * 1024 * 1024, 1} },
1581                                .block_erase = spi_block_erase_c7,
1582                        }
1583                },
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},
1589        },
1590
1591        {
1592                .vendor         = "Atmel",
1593                .name           = "AT25DF641(A)",
1594                .bustype        = BUS_SPI,
1595                .manufacture_id = ATMEL_ID,
1596                .model_id       = ATMEL_AT25DF641,
1597                .total_size     = 8192,
1598                .page_size      = 256,
1599                .feature_bits   = FEATURE_WRSR_WREN,
1600                .tested         = TEST_UNTESTED,
1601                .probe          = probe_spi_rdid,
1602                .probe_timing   = TIMING_ZERO,
1603                .block_erasers  =
1604                {
1605                        {
1606                                .eraseblocks = { {4 * 1024, 2048} },
1607                                .block_erase = spi_block_erase_20,
1608                        }, {
1609                                .eraseblocks = { {32 * 1024, 256} },
1610                                .block_erase = spi_block_erase_52,
1611                        }, {
1612                                .eraseblocks = { {64 * 1024, 128} },
1613                                .block_erase = spi_block_erase_d8,
1614                        }, {
1615                                .eraseblocks = { {8 * 1024 * 1024, 1} },
1616                                .block_erase = spi_block_erase_60,
1617                        }, {
1618                                .eraseblocks = { {8 * 1024 * 1024, 1} },
1619                                .block_erase = spi_block_erase_c7,
1620                        }
1621                },
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},
1627        },
1628
1629        {
1630                .vendor         = "Atmel",
1631                .name           = "AT25DQ161",
1632                .bustype        = BUS_SPI,
1633                .manufacture_id = ATMEL_ID,
1634                .model_id       = ATMEL_AT25DQ161,
1635                .total_size     = 2048,
1636                .page_size      = 256,
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,
1642                .block_erasers  =
1643                {
1644                        {
1645                                .eraseblocks = { {4 * 1024, 512} },
1646                                .block_erase = spi_block_erase_20,
1647                        }, {
1648                                .eraseblocks = { {32 * 1024, 64} },
1649                                .block_erase = spi_block_erase_52,
1650                        }, {
1651                                .eraseblocks = { {64 * 1024, 32} },
1652                                .block_erase = spi_block_erase_d8,
1653                        }, {
1654                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1655                                .block_erase = spi_block_erase_60,
1656                        }, {
1657                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1658                                .block_erase = spi_block_erase_c7,
1659                        }
1660                },
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},
1666        },
1667
1668        {
1669                .vendor         = "Atmel",
1670                .name           = "AT25F512B",
1671                .bustype        = BUS_SPI,
1672                .manufacture_id = ATMEL_ID,
1673                .model_id       = ATMEL_AT25F512B,
1674                .total_size     = 64,
1675                .page_size      = 256,
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,
1681                .block_erasers  =
1682                {
1683                        {
1684                                .eraseblocks = { {4 * 1024, 16} },
1685                                .block_erase = spi_block_erase_20,
1686                        }, {
1687                                .eraseblocks = { {32 * 1024, 2} },
1688                                .block_erase = spi_block_erase_52,
1689                        }, {
1690                                .eraseblocks = { {32 * 1024, 2} },
1691                                .block_erase = spi_block_erase_d8,
1692                        }, {
1693                                .eraseblocks = { {64 * 1024, 1} },
1694                                .block_erase = spi_block_erase_60,
1695                        }, {
1696                                .eraseblocks = { {64 * 1024, 1} },
1697                                .block_erase = spi_block_erase_c7,
1698                        }
1699                },
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},
1705        },
1706
1707        {
1708                .vendor         = "Atmel",
1709                .name           = "AT25FS010",
1710                .bustype        = BUS_SPI,
1711                .manufacture_id = ATMEL_ID,
1712                .model_id       = ATMEL_AT25FS010,
1713                .total_size     = 128,
1714                .page_size      = 256,
1715                .feature_bits   = FEATURE_WRSR_WREN,
1716                .tested         = TEST_UNTESTED,
1717                .probe          = probe_spi_rdid,
1718                .probe_timing   = TIMING_ZERO,
1719                .block_erasers  =
1720                {
1721                        {
1722                                .eraseblocks = { {4 * 1024, 32} },
1723                                .block_erase = spi_block_erase_20,
1724                        }, {
1725                                .eraseblocks = { {4 * 1024, 32} },
1726                                .block_erase = spi_block_erase_d7,
1727                        }, {
1728                                .eraseblocks = { {32 * 1024, 4} },
1729                                .block_erase = spi_block_erase_52,
1730                        }, {
1731                                .eraseblocks = { {32 * 1024, 4} },
1732                                .block_erase = spi_block_erase_d8,
1733                        }, {
1734                                .eraseblocks = { {128 * 1024, 1} },
1735                                .block_erase = spi_block_erase_60,
1736                        }, {
1737                                .eraseblocks = { {128 * 1024, 1} },
1738                                .block_erase = spi_block_erase_c7,
1739                        }
1740                },
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},
1746        },
1747
1748        {
1749                .vendor         = "Atmel",
1750                .name           = "AT25FS040",
1751                .bustype        = BUS_SPI,
1752                .manufacture_id = ATMEL_ID,
1753                .model_id       = ATMEL_AT25FS040,
1754                .total_size     = 512,
1755                .page_size      = 256,
1756                .feature_bits   = FEATURE_WRSR_WREN,
1757                .tested         = TEST_UNTESTED,
1758                .probe          = probe_spi_rdid,
1759                .probe_timing   = TIMING_ZERO,
1760                .block_erasers  =
1761                {
1762                        {
1763                                .eraseblocks = { {4 * 1024, 128} },
1764                                .block_erase = spi_block_erase_20,
1765                        }, {
1766                                .eraseblocks = { {64 * 1024, 8} },
1767                                .block_erase = spi_block_erase_52,
1768                        }, {
1769                                .eraseblocks = { {64 * 1024, 8} },
1770                                .block_erase = spi_block_erase_d8,
1771                        }, {
1772                                .eraseblocks = { {512 * 1024, 1} },
1773                                .block_erase = spi_block_erase_60,
1774                        }, {
1775                                .eraseblocks = { {512 * 1024, 1} },
1776                                .block_erase = spi_block_erase_c7,
1777                        }
1778                },
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},
1784        },
1785
1786        {
1787                .vendor         = "Atmel",
1788                .name           = "AT26DF041",
1789                .bustype        = BUS_SPI,
1790                .manufacture_id = ATMEL_ID,
1791                .model_id       = ATMEL_AT26DF041,
1792                .total_size     = 512,
1793                .page_size      = 256,
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,
1798                .block_erasers  =
1799                {
1800                        {
1801                                .eraseblocks = { {4 * 1024, 128} },
1802                                .block_erase = spi_block_erase_20,
1803                        }
1804                },
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 */
1808        },
1809
1810        {
1811                .vendor         = "Atmel",
1812                .name           = "AT26DF081A",
1813                .bustype        = BUS_SPI,
1814                .manufacture_id = ATMEL_ID,
1815                .model_id       = ATMEL_AT26DF081A,
1816                .total_size     = 1024,
1817                .page_size      = 256,
1818                .feature_bits   = FEATURE_WRSR_WREN,
1819                .tested         = TEST_OK_PREW,
1820                .probe          = probe_spi_rdid,
1821                .probe_timing   = TIMING_ZERO,
1822                .block_erasers  =
1823                {
1824                        {
1825                                .eraseblocks = { {4 * 1024, 256} },
1826                                .block_erase = spi_block_erase_20,
1827                        }, {
1828                                .eraseblocks = { {32 * 1024, 32} },
1829                                .block_erase = spi_block_erase_52,
1830                        }, {
1831                                .eraseblocks = { {64 * 1024, 16} },
1832                                .block_erase = spi_block_erase_d8,
1833                        }, {
1834                                .eraseblocks = { {1024 * 1024, 1} },
1835                                .block_erase = spi_block_erase_60,
1836                        }, {
1837                                .eraseblocks = { {1024 * 1024, 1} },
1838                                .block_erase = spi_block_erase_c7,
1839                        }
1840                },
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},
1846        },
1847
1848        {
1849                .vendor         = "Atmel",
1850                .name           = "AT26DF161",
1851                .bustype        = BUS_SPI,
1852                .manufacture_id = ATMEL_ID,
1853                .model_id       = ATMEL_AT26DF161,
1854                .total_size     = 2048,
1855                .page_size      = 256,
1856                .feature_bits   = FEATURE_WRSR_WREN,
1857                .tested         = TEST_UNTESTED,
1858                .probe          = probe_spi_rdid,
1859                .probe_timing   = TIMING_ZERO,
1860                .block_erasers  =
1861                {
1862                        {
1863                                .eraseblocks = { {4 * 1024, 512} },
1864                                .block_erase = spi_block_erase_20,
1865                        }, {
1866                                .eraseblocks = { {32 * 1024, 64} },
1867                                .block_erase = spi_block_erase_52,
1868                        }, {
1869                                .eraseblocks = { {64 * 1024, 32} },
1870                                .block_erase = spi_block_erase_d8,
1871                        }, {
1872                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1873                                .block_erase = spi_block_erase_60,
1874                        }, {
1875                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1876                                .block_erase = spi_block_erase_c7,
1877                        }
1878                },
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},
1884        },
1885
1886        {
1887                .vendor         = "Atmel",
1888                .name           = "AT26DF161A",
1889                .bustype        = BUS_SPI,
1890                .manufacture_id = ATMEL_ID,
1891                .model_id       = ATMEL_AT26DF161A,
1892                .total_size     = 2048,
1893                .page_size      = 256,
1894                .feature_bits   = FEATURE_WRSR_WREN,
1895                .tested         = TEST_UNTESTED,
1896                .probe          = probe_spi_rdid,
1897                .probe_timing   = TIMING_ZERO,
1898                .block_erasers  =
1899                {
1900                        {
1901                                .eraseblocks = { {4 * 1024, 512} },
1902                                .block_erase = spi_block_erase_20,
1903                        }, {
1904                                .eraseblocks = { {32 * 1024, 64} },
1905                                .block_erase = spi_block_erase_52,
1906                        }, {
1907                                .eraseblocks = { {64 * 1024, 32} },
1908                                .block_erase = spi_block_erase_d8,
1909                        }, {
1910                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1911                                .block_erase = spi_block_erase_60,
1912                        }, {
1913                                .eraseblocks = { {2 * 1024 * 1024, 1} },
1914                                .block_erase = spi_block_erase_c7,
1915                        }
1916                },
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},
1922        },
1923
1924        /*The AT26DF321 has the same ID as the AT25DF321. */
1925        /*{
1926                .vendor         = "Atmel",
1927                .name           = "AT26DF321",
1928                .bustype        = BUS_SPI,
1929                .manufacture_id = ATMEL_ID,
1930                .model_id       = ATMEL_AT26DF321,
1931                .total_size     = 4096,
1932                .page_size      = 256,
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,
1941          },*/
1942
1943        {
1944                .vendor         = "Atmel",
1945                .name           = "AT26F004",
1946                .bustype        = BUS_SPI,
1947                .manufacture_id = ATMEL_ID,
1948                .model_id       = ATMEL_AT26F004,
1949                .total_size     = 512,
1950                .page_size      = 256,
1951                .tested         = TEST_UNTESTED,
1952                .feature_bits   = FEATURE_WRSR_WREN,
1953                .probe          = probe_spi_rdid,
1954                .probe_timing   = TIMING_ZERO,
1955                .block_erasers  =
1956                {
1957                        {
1958                                .eraseblocks = { {4 * 1024, 128} },
1959                                .block_erase = spi_block_erase_20,
1960                        }, {
1961                                .eraseblocks = { {32 * 1024, 16} },
1962                                .block_erase = spi_block_erase_52,
1963                        }, {
1964                                .eraseblocks = { {64 * 1024, 8} },
1965                                .block_erase = spi_block_erase_d8,
1966                        }, {
1967                                .eraseblocks = { {512 * 1024, 1} },
1968                                .block_erase = spi_block_erase_60,
1969                        }, {
1970                                .eraseblocks = { {512 * 1024, 1} },
1971                                .block_erase = spi_block_erase_c7,
1972                        }
1973                },
1974                .write          = NULL /* Incompatible Page write */,
1975                .read           = spi_chip_read,
1976                .voltage        = {2700, 3600},
1977        },
1978
1979        {
1980                .vendor         = "Atmel",
1981                .name           = "AT29C512",
1982                .bustype        = BUS_PARALLEL,
1983                .manufacture_id = ATMEL_ID,
1984                .model_id       = ATMEL_AT29C512,
1985                .total_size     = 64,
1986                .page_size      = 128,
1987                .feature_bits   = FEATURE_LONG_RESET,
1988                .tested         = TEST_OK_PREW,
1989                .probe          = probe_jedec,
1990                .probe_timing   = 10000, /* 10mS, Enter=Exec */
1991                .block_erasers  =
1992                {
1993                        {
1994                                .eraseblocks = { {64 * 1024, 1} },
1995                                .block_erase = erase_chip_block_jedec,
1996                        }
1997                },
1998                .write          = write_jedec,
1999                .read           = read_memmapped,
2000                .voltage        = {4500, 5500},
2001        },
2002
2003        {
2004                .vendor         = "Atmel",
2005                .name           = "AT29C010A",
2006                .bustype        = BUS_PARALLEL,
2007                .manufacture_id = ATMEL_ID,
2008                .model_id       = ATMEL_AT29C010A,
2009                .total_size     = 128,
2010                .page_size      = 128,
2011                .feature_bits   = FEATURE_LONG_RESET,
2012                .tested         = TEST_OK_PRE,
2013                .probe          = probe_jedec,
2014                .probe_timing   = 10000, /* 10mS, Enter=Exec */
2015                .block_erasers  =
2016                {
2017                        {
2018                                .eraseblocks = { {128 * 1024, 1} },
2019                                .block_erase = erase_chip_block_jedec,
2020                        }
2021                },
2022                .write          = write_jedec,  /* FIXME */
2023                .read           = read_memmapped,
2024                .voltage        = {4500, 5500},
2025        },
2026
2027        {
2028                .vendor         = "Atmel",
2029                .name           = "AT29C020",
2030                .bustype        = BUS_PARALLEL,
2031                .manufacture_id = ATMEL_ID,
2032                .model_id       = ATMEL_AT29C020,
2033                .total_size     = 256,
2034                .page_size      = 256,
2035                .feature_bits   = FEATURE_LONG_RESET,
2036                .tested         = TEST_UNTESTED,
2037                .probe          = probe_jedec,
2038                .probe_timing   = 10000,                        /* 10ms */
2039                .block_erasers  =
2040                {
2041                        {
2042                                .eraseblocks = { {256 * 1024, 1} },
2043                                .block_erase = erase_chip_block_jedec,
2044                        }
2045                },
2046                .write          = write_jedec,
2047                .read           = read_memmapped,
2048                .voltage        = {4500, 5500},
2049        },
2050
2051        {
2052                .vendor         = "Atmel",
2053                .name           = "AT29C040A",
2054                .bustype        = BUS_PARALLEL,
2055                .manufacture_id = ATMEL_ID,
2056                .model_id       = ATMEL_AT29C040A,
2057                .total_size     = 512,
2058                .page_size      = 256,
2059                .feature_bits   = FEATURE_LONG_RESET,
2060                .tested         = TEST_UNTESTED,
2061                .probe          = probe_jedec,
2062                .probe_timing   = 10000,                        /* 10 ms */
2063                .block_erasers  =
2064                {
2065                        {
2066                                .eraseblocks = { {512 * 1024, 1} },
2067                                .block_erase = erase_chip_block_jedec,
2068                        }
2069                },
2070                .write          = write_jedec,
2071                .read           = read_memmapped,
2072                .voltage        = {4500, 5500},
2073        },
2074
2075        {
2076                .vendor         = "Atmel",
2077                .name           = "AT45CS1282",
2078                .bustype        = BUS_SPI,
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},
2090        },
2091
2092        {
2093                .vendor         = "Atmel",
2094                .name           = "AT45DB011D",
2095                .bustype        = BUS_SPI,
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,
2104                .write          = NULL,
2105                .read           = NULL,
2106                .voltage        = {2700, 3600},
2107        },
2108
2109        {
2110                .vendor         = "Atmel",
2111                .name           = "AT45DB021D",
2112                .bustype        = BUS_SPI,
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,
2121                .write          = NULL,
2122                .read           = NULL,
2123                .voltage        = {2700, 3600},
2124        },
2125
2126        {
2127                .vendor         = "Atmel",
2128                .name           = "AT45DB041D",
2129                .bustype        = BUS_SPI,
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,
2138                .write          = NULL,
2139                .read           = NULL,
2140                .voltage        = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2141        },
2142
2143        {
2144                .vendor         = "Atmel",
2145                .name           = "AT45DB081D",
2146                .bustype        = BUS_SPI,
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,
2155                .write          = NULL,
2156                .read           = NULL,
2157                .voltage        = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2158        },
2159
2160        {
2161                .vendor         = "Atmel",
2162                .name           = "AT45DB161D",
2163                .bustype        = BUS_SPI,
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,
2172                .write          = NULL,
2173                .read           = NULL,
2174                .voltage        = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
2175        },
2176
2177        {
2178                .vendor         = "Atmel",
2179                .name           = "AT45DB321C",
2180                .bustype        = BUS_SPI,
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,
2189                .write          = NULL,
2190                .read           = NULL /* Incompatible read */,
2191                .voltage        = {2700, 3600},
2192        },
2193
2194        {
2195                .vendor         = "Atmel",
2196                .name           = "AT45DB321D",
2197                .bustype        = BUS_SPI,
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,
2208                .write          = NULL,
2209                .read           = NULL,
2210                .voltage        = {2700, 3600},
2211        },
2212
2213        {
2214                .vendor         = "Atmel",
2215                .name           = "AT45DB642D",
2216                .bustype        = BUS_SPI,
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,
2225                .write          = NULL,
2226                .read           = NULL,
2227                .voltage        = {2700, 3600},
2228        },
2229
2230        {
2231                .vendor         = "Atmel",
2232                .name           = "AT49BV512",
2233                .bustype        = BUS_PARALLEL,
2234                .manufacture_id = ATMEL_ID,
2235                .model_id       = ATMEL_AT49BV512,
2236                .total_size     = 64,
2237                .page_size      = 64,
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 */
2242                .block_erasers  =
2243                {
2244                        {
2245                                .eraseblocks = { {64 * 1024, 1} },
2246                                .block_erase = erase_chip_block_jedec,
2247                        }
2248                },
2249                .write          = write_jedec_1,
2250                .read           = read_memmapped,
2251                .voltage        = {2700, 3600},
2252        },
2253
2254        {
2255                .vendor         = "Atmel",
2256                .name           = "AT49F002(N)",
2257                .bustype        = BUS_PARALLEL,
2258                .manufacture_id = ATMEL_ID,
2259                .model_id       = ATMEL_AT49F002N,
2260                .total_size     = 256,
2261                .page_size      = 256,
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 */
2266                .block_erasers  =
2267                {
2268                        {
2269                                .eraseblocks = {
2270                                        {16 * 1024, 1},
2271                                        {8 * 1024, 2},
2272                                        {96 * 1024, 1},
2273                                        {128 * 1024, 1},
2274                                },
2275                                .block_erase = erase_sector_jedec,
2276                        }, {
2277                                .eraseblocks = { {256 * 1024, 1} },
2278                                .block_erase = erase_chip_block_jedec,
2279                        }
2280                },
2281                .write          = write_jedec_1,
2282                .read           = read_memmapped,
2283                .voltage        = {4500, 5500},
2284        },
2285
2286        {
2287                .vendor         = "Atmel",
2288                .name           = "AT49F002(N)T",
2289                .bustype        = BUS_PARALLEL,
2290                .manufacture_id = ATMEL_ID,
2291                .model_id       = ATMEL_AT49F002NT,
2292                .total_size     = 256,
2293                .page_size      = 256,
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 */
2298                .block_erasers  =
2299                {
2300                        {
2301                                .eraseblocks = {
2302                                        {128 * 1024, 1},
2303                                        {96 * 1024, 1},
2304                                        {8 * 1024, 2},
2305                                        {16 * 1024, 1},
2306                                },
2307                                .block_erase = erase_sector_jedec,
2308                        }, {
2309                                .eraseblocks = { {256 * 1024, 1} },
2310                                .block_erase = erase_chip_block_jedec,
2311                        }
2312                },
2313                .write          = write_jedec_1,
2314                .read           = read_memmapped,
2315                .voltage        = {4500, 5500},
2316        },
2317
2318        {
2319                .vendor         = "Atmel",
2320                .name           = "AT49F020",
2321                .bustype        = BUS_PARALLEL,
2322                .manufacture_id = ATMEL_ID,
2323                .model_id       = ATMEL_AT49F020,
2324                .total_size     = 256,
2325                .page_size      = 256,
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 */
2330                .block_erasers  =
2331                {
2332                        {
2333                                .eraseblocks = { {256 * 1024, 1} },
2334                                .block_erase = erase_chip_block_jedec,
2335                        }
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
2340                         * supported.
2341                         */
2342                },
2343                .printlock      = printlock_at49f,
2344                .write          = write_jedec_1,
2345                .read           = read_memmapped,
2346                .voltage        = {4500, 5500},
2347        },
2348
2349        {
2350                .vendor         = "Atmel",
2351                .name           = "AT49F040",
2352                .bustype        = BUS_PARALLEL,
2353                .manufacture_id = ATMEL_ID,
2354                .model_id       = ATMEL_AT49F040,
2355                .total_size     = 512,
2356                .page_size      = 512,
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 */
2361                .block_erasers  =
2362                {
2363                        {
2364                                .eraseblocks = { {512 * 1024, 1} },
2365                                .block_erase = erase_chip_block_jedec,
2366                        }
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
2371                         * supported.
2372                         */
2373                },
2374                .printlock      = printlock_at49f,
2375                .write          = write_jedec_1,
2376                .read           = read_memmapped,
2377                .voltage        = {4500, 5500},
2378        },
2379
2380        {
2381                .vendor         = "Atmel",
2382                .name           = "AT49LH002",
2383                .bustype        = BUS_LPC | BUS_FWH, /* A/A Mux */
2384                .manufacture_id = ATMEL_ID,
2385                .model_id       = ATMEL_AT49LH002,
2386                .total_size     = 256,
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,
2392                .block_erasers  =
2393                {
2394                        {
2395                                .eraseblocks = {
2396                                        {64 * 1024, 3},
2397                                        {32 * 1024, 1},
2398                                        {8 * 1024, 2},
2399                                        {16 * 1024, 1},
2400                                },
2401                                .block_erase = erase_block_82802ab,
2402                        }, {
2403                                .eraseblocks = {
2404                                        {64 * 1024, 4},
2405                                },
2406                                .block_erase = NULL, /* TODO: Implement. */
2407                        },
2408                },
2409                .printlock      = NULL, /* TODO */
2410                .unlock         = NULL, /* unlock_82802ab() not correct(?) */
2411                .write          = write_82802ab,
2412                .read           = read_memmapped,
2413                .voltage        = {3000, 3600},
2414        },
2415
2416        {
2417                .vendor         = "Catalyst",
2418                .name           = "CAT28F512",
2419                .bustype        = BUS_PARALLEL,
2420                .manufacture_id = CATALYST_ID,
2421                .model_id       = CATALYST_CAT28F512,
2422                .total_size     = 64,
2423                .page_size      = 0, /* unused */
2424                .feature_bits   = 0,
2425                .tested         = TEST_OK_PR,
2426                .probe          = probe_jedec, /* FIXME! */
2427                .probe_timing   = TIMING_ZERO,
2428                .block_erasers  =
2429                {
2430                        {
2431                                .eraseblocks = { {64 * 1024, 1} },
2432                                .block_erase = NULL, /* TODO */
2433                        },
2434                },
2435                .write          = NULL, /* TODO */
2436                .read           = read_memmapped,
2437                .voltage        = {4500, 5500},
2438        },
2439
2440        {
2441                .vendor         = "Bright",
2442                .name           = "BM29F040",
2443                .bustype        = BUS_PARALLEL,
2444                .manufacture_id = BRIGHT_ID,
2445                .model_id       = BRIGHT_BM29F040,
2446                .total_size     = 512,
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,
2452                .block_erasers  =
2453                {
2454                        {
2455                                .eraseblocks = { {64 * 1024, 8} },
2456                                .block_erase = erase_sector_jedec,
2457                        }, {
2458                                .eraseblocks = { {512 * 1024, 1} },
2459                                .block_erase = erase_chip_block_jedec,
2460                        },
2461                },
2462                .write          = write_jedec_1,
2463                .read           = read_memmapped,
2464                .voltage        = {4500, 5500},
2465        },
2466
2467        {
2468                .vendor         = "EMST",
2469                .name           = "F49B002UA",
2470                .bustype        = BUS_PARALLEL,
2471                .manufacture_id = EMST_ID,
2472                .model_id       = EMST_F49B002UA,
2473                .total_size     = 256,
2474                .page_size      = 4096,
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 */
2479                .block_erasers  =
2480                {
2481                        {
2482                                .eraseblocks = { 
2483                                        {128 * 1024, 1},
2484                                        {96 * 1024, 1},
2485                                        {8 * 1024, 2},
2486                                        {16 * 1024, 1},
2487                                },
2488                                .block_erase = erase_sector_jedec,
2489                        }, {
2490                                .eraseblocks = { {256 * 1024, 1} },
2491                                .block_erase = erase_chip_block_jedec,
2492                        }
2493                },
2494                .write          = write_jedec_1,
2495                .read           = read_memmapped,
2496                .voltage        = {4500, 5500},
2497        },
2498
2499        {
2500                .vendor         = "EMST",
2501                .name           = "F25L008A",
2502                .bustype        = BUS_SPI,
2503                .manufacture_id = EMST_ID,
2504                .model_id       = EMST_F25L008A,
2505                .total_size     = 1024,
2506                .page_size      = 256,
2507                .feature_bits   = FEATURE_WRSR_EITHER,
2508                .tested         = TEST_UNTESTED,
2509                .probe          = probe_spi_rdid,
2510                .probe_timing   = TIMING_ZERO,
2511                .block_erasers  =
2512                {
2513                        {
2514                                .eraseblocks = { {4 * 1024, 256} },
2515                                .block_erase = spi_block_erase_20,
2516                        }, {
2517                                .eraseblocks = { {64 * 1024, 16} },
2518                                .block_erase = spi_block_erase_d8,
2519                        }, {
2520                                .eraseblocks = { {1024 * 1024, 1} },
2521                                .block_erase = spi_block_erase_60,
2522                        }, {
2523                                .eraseblocks = { {1024 * 1024, 1} },
2524                                .block_erase = spi_block_erase_c7,
2525                        }
2526                },
2527                .unlock         = spi_disable_blockprotect,
2528                .write          = spi_chip_write_1,
2529                .read           = spi_chip_read,
2530                .voltage        = {2700, 3600},
2531        },
2532
2533        {
2534                .vendor         = "Eon",
2535                .name           = "EN25B05",
2536                .bustype        = BUS_SPI,
2537                .manufacture_id = EON_ID_NOPREFIX,
2538                .model_id       = EON_EN25B05,
2539                .total_size     = 64,
2540                .page_size      = 256,
2541                .feature_bits   = FEATURE_WRSR_WREN,
2542                .tested         = TEST_UNTESTED,
2543                .probe          = probe_spi_rdid,
2544                .probe_timing   = TIMING_ZERO,
2545                .block_erasers  =
2546                {
2547                        {
2548                                .eraseblocks = {
2549                                        {4 * 1024, 2},
2550                                        {8 * 1024, 1},
2551                                        {16 * 1024, 1},
2552                                        {32 * 1024, 1},
2553                                },
2554                                .block_erase = spi_block_erase_d8,
2555                        }, {
2556                                .eraseblocks = { {64 * 1024, 1} },
2557                                .block_erase = spi_block_erase_c7,
2558                        }
2559                },
2560                .unlock         = spi_disable_blockprotect,
2561                .write          = spi_chip_write_256,
2562                .read           = spi_chip_read,
2563                .voltage        = {2700, 3600},
2564        },
2565
2566        {
2567                .vendor         = "Eon",
2568                .name           = "EN25B05T",
2569                .bustype        = BUS_SPI,
2570                .manufacture_id = EON_ID_NOPREFIX,
2571                .model_id       = EON_EN25B05,
2572                .total_size     = 64,
2573                .page_size      = 256,
2574                .feature_bits   = FEATURE_WRSR_WREN,
2575                .tested         = TEST_UNTESTED,
2576                .probe          = probe_spi_rdid,
2577                .probe_timing   = TIMING_ZERO,
2578                .block_erasers  =
2579                {
2580                        {
2581                                .eraseblocks = {
2582                                        {32 * 1024, 1},
2583                                        {16 * 1024, 1},
2584                                        {8 * 1024, 1},
2585                                        {4 * 1024, 2},
2586                                },
2587                                .block_erase = spi_block_erase_d8,
2588                        }, {
2589                                .eraseblocks = { {64 * 1024, 1} },
2590                                .block_erase = spi_block_erase_c7,
2591                        }
2592                },
2593                .unlock         = spi_disable_blockprotect,
2594                .write          = spi_chip_write_256,
2595                .read           = spi_chip_read,
2596                .voltage        = {2700, 3600},
2597        },
2598
2599        {
2600                .vendor         = "Eon",
2601                .name           = "EN25B10",
2602                .bustype        = BUS_SPI,
2603                .manufacture_id = EON_ID_NOPREFIX,
2604                .model_id       = EON_EN25B10,
2605                .total_size     = 128,
2606                .page_size      = 256,
2607                .feature_bits   = FEATURE_WRSR_WREN,
2608                .tested         = TEST_UNTESTED,
2609                .probe          = probe_spi_rdid,
2610                .probe_timing   = TIMING_ZERO,
2611                .block_erasers  =
2612                {
2613                        {
2614                                .eraseblocks = {
2615                                        {4 * 1024, 2},
2616                                        {8 * 1024, 1},
2617                                        {16 * 1024, 1},
2618                                        {32 * 1024, 3},
2619                                },
2620                                .block_erase = spi_block_erase_d8,
2621                        }, {
2622                                .eraseblocks = { {128 * 1024, 1} },
2623                                .block_erase = spi_block_erase_c7,
2624                        }
2625                },
2626                .unlock         = spi_disable_blockprotect,
2627                .write          = spi_chip_write_256,
2628                .read           = spi_chip_read,
2629                .voltage        = {2700, 3600},
2630        },
2631
2632        {
2633                .vendor         = "Eon",
2634                .name           = "EN25B10T",
2635                .bustype        = BUS_SPI,
2636                .manufacture_id = EON_ID_NOPREFIX,
2637                .model_id       = EON_EN25B10,
2638                .total_size     = 128,
2639                .page_size      = 256,
2640                .feature_bits   = FEATURE_WRSR_WREN,
2641                .tested         = TEST_UNTESTED,
2642                .probe          = probe_spi_rdid,
2643                .probe_timing   = TIMING_ZERO,
2644                .block_erasers  =
2645                {
2646                        {
2647                                .eraseblocks = {
2648                                        {32 * 1024, 3},
2649                                        {16 * 1024, 1},
2650                                        {8 * 1024, 1},
2651                                        {4 * 1024, 2},
2652                                },
2653                                .block_erase = spi_block_erase_d8,
2654                        }, {
2655                                .eraseblocks = { {128 * 1024, 1} },
2656                                .block_erase = spi_block_erase_c7,
2657                        }
2658                },
2659                .unlock         = spi_disable_blockprotect,
2660                .write          = spi_chip_write_256,
2661                .read           = spi_chip_read,
2662                .voltage        = {2700, 3600},
2663        },
2664
2665        {
2666                .vendor         = "Eon",
2667                .name           = "EN25B20",
2668                .bustype        = BUS_SPI,
2669                .manufacture_id = EON_ID_NOPREFIX,
2670                .model_id       = EON_EN25B20,
2671                .total_size     = 256,
2672                .page_size      = 256,
2673                .feature_bits   = FEATURE_WRSR_WREN,
2674                .tested         = TEST_UNTESTED,
2675                .probe          = probe_spi_rdid,
2676                .probe_timing   = TIMING_ZERO,
2677                .block_erasers  =
2678                {
2679                        {
2680                                .eraseblocks = {
2681                                        {4 * 1024, 2},
2682                                        {8 * 1024, 1},
2683                                        {16 * 1024, 1},
2684                                        {32 * 1024, 1},
2685                                        {64 * 1024, 3}
2686                                },
2687                                .block_erase = spi_block_erase_d8,
2688                        }, {
2689                                .eraseblocks = { {256 * 1024, 1} },
2690                                .block_erase = spi_block_erase_c7,
2691                        }
2692                },
2693                .unlock         = spi_disable_blockprotect,
2694                .write          = spi_chip_write_256,
2695                .read           = spi_chip_read,
2696                .voltage        = {2700, 3600},
2697        },
2698
2699        {
2700                .vendor         = "Eon",
2701                .name           = "EN25B20T",
2702                .bustype        = BUS_SPI,
2703                .manufacture_id = EON_ID_NOPREFIX,
2704                .model_id       = EON_EN25B20,
2705                .total_size     = 256,
2706                .page_size      = 256,
2707                .feature_bits   = FEATURE_WRSR_WREN,
2708                .tested         = TEST_UNTESTED,
2709                .probe          = probe_spi_rdid,
2710                .probe_timing   = TIMING_ZERO,
2711                .block_erasers  =
2712                {
2713                        {
2714                                .eraseblocks = {
2715                                        {64 * 1024, 3},
2716                                        {32 * 1024, 1},
2717                                        {16 * 1024, 1},
2718                                        {8 * 1024, 1},
2719                                        {4 * 1024, 2},
2720                                },
2721                                .block_erase = spi_block_erase_d8,
2722                        }, {
2723                                .eraseblocks = { {256 * 1024, 1} },
2724                                .block_erase = spi_block_erase_c7,
2725                        }
2726                },
2727                .unlock         = spi_disable_blockprotect,
2728                .write          = spi_chip_write_256,
2729                .read           = spi_chip_read,
2730                .voltage        = {2700, 3600},
2731        },
2732
2733        {
2734                .vendor         = "Eon",
2735                .name           = "EN25B40",
2736                .bustype        = BUS_SPI,
2737                .manufacture_id = EON_ID_NOPREFIX,
2738                .model_id       = EON_EN25B40,
2739                .total_size     = 512,
2740                .page_size      = 256,
2741                .feature_bits   = FEATURE_WRSR_WREN,
2742                .tested         = TEST_UNTESTED,
2743                .probe          = probe_spi_rdid,
2744                .probe_timing   = TIMING_ZERO,
2745                .block_erasers  =
2746                {
2747                        {
2748                                .eraseblocks = {
2749                                        {4 * 1024, 2},
2750                                        {8 * 1024, 1},
2751                                        {16 * 1024, 1},
2752                                        {32 * 1024, 1},
2753                                        {64 * 1024, 7}
2754                                },
2755                                .block_erase = spi_block_erase_d8,
2756                        }, {
2757                                .eraseblocks = { {512 * 1024, 1} },
2758                                .block_erase = spi_block_erase_c7,
2759                        }
2760                },
2761                .unlock         = spi_disable_blockprotect,
2762                .write          = spi_chip_write_256,
2763                .read           = spi_chip_read,
2764                .voltage        = {2700, 3600},
2765        },
2766
2767        {
2768                .vendor         = "Eon",
2769                .name           = "EN25B40T",
2770                .bustype        = BUS_SPI,
2771                .manufacture_id = EON_ID_NOPREFIX,
2772                .model_id       = EON_EN25B40,
2773                .total_size     = 512,
2774                .page_size      = 256,
2775                .feature_bits   = FEATURE_WRSR_WREN,
2776                .tested         = TEST_UNTESTED,
2777                .probe          = probe_spi_rdid,
2778                .probe_timing   = TIMING_ZERO,
2779                .block_erasers  =
2780                {
2781                        {
2782                                .eraseblocks = {
2783                                        {64 * 1024, 7},
2784                                        {32 * 1024, 1},
2785                                        {16 * 1024, 1},
2786                                        {8 * 1024, 1},
2787                                        {4 * 1024, 2},
2788                                },
2789                                .block_erase = spi_block_erase_d8,
2790                        }, {
2791                                .eraseblocks = { {512 * 1024, 1} },
2792                                .block_erase = spi_block_erase_c7,
2793                        }
2794                },
2795                .unlock         = spi_disable_blockprotect,
2796                .write          = spi_chip_write_256,
2797                .read           = spi_chip_read,
2798                .voltage        = {2700, 3600},
2799        },
2800
2801        {
2802                .vendor         = "Eon",
2803                .name           = "EN25B80",
2804                .bustype        = BUS_SPI,
2805                .manufacture_id = EON_ID_NOPREFIX,
2806                .model_id       = EON_EN25B80,
2807                .total_size     = 1024,
2808                .page_size      = 256,
2809                .feature_bits   = FEATURE_WRSR_WREN,
2810                .tested         = TEST_UNTESTED,
2811                .probe          = probe_spi_rdid,
2812                .probe_timing   = TIMING_ZERO,
2813                .block_erasers  =
2814                {
2815                        {
2816                                .eraseblocks = {
2817                                        {4 * 1024, 2},
2818                                        {8 * 1024, 1},
2819                                        {16 * 1024, 1},
2820                                        {32 * 1024, 1},
2821                                        {64 * 1024, 15}
2822                                },
2823                                .block_erase = spi_block_erase_d8,
2824                        }, {
2825                                .eraseblocks = { {1024 * 1024, 1} },
2826                                .block_erase = spi_block_erase_c7,
2827                        }
2828                },
2829                .unlock         = spi_disable_blockprotect,
2830                .write          = spi_chip_write_256,
2831                .read           = spi_chip_read,
2832                .voltage        = {2700, 3600},
2833        },
2834
2835        {
2836                .vendor         = "Eon",
2837                .name           = "EN25B80T",
2838                .bustype        = BUS_SPI,
2839                .manufacture_id = EON_ID_NOPREFIX,
2840                .model_id       = EON_EN25B80,
2841                .total_size     = 1024,
2842                .page_size      = 256,
2843                .feature_bits   = FEATURE_WRSR_WREN,
2844                .tested         = TEST_UNTESTED,
2845                .probe          = probe_spi_rdid,
2846                .probe_timing   = TIMING_ZERO,
2847                .block_erasers  =
2848                {
2849                        {
2850                                .eraseblocks = {
2851                                        {64 * 1024, 15},
2852                                        {32 * 1024, 1},
2853                                        {16 * 1024, 1},
2854                                        {8 * 1024, 1},
2855                                        {4 * 1024, 2},
2856                                },
2857                                .block_erase = spi_block_erase_d8,
2858                        }, {
2859                                .eraseblocks = { {1024 * 1024, 1} },
2860                                .block_erase = spi_block_erase_c7,
2861                        }
2862                },
2863                .unlock         = spi_disable_blockprotect,
2864                .write          = spi_chip_write_256,
2865                .read           = spi_chip_read,
2866                .voltage        = {2700, 3600},
2867        },
2868
2869        {
2870                .vendor         = "Eon",
2871                .name           = "EN25B16",
2872                .bustype        = BUS_SPI,
2873                .manufacture_id = EON_ID_NOPREFIX,
2874                .model_id       = EON_EN25B16,
2875                .total_size     = 2048,
2876                .page_size      = 256,
2877                .feature_bits   = FEATURE_WRSR_WREN,
2878                .tested         = TEST_UNTESTED,
2879                .probe          = probe_spi_rdid,
2880                .probe_timing   = TIMING_ZERO,
2881                .block_erasers  =
2882                {
2883                        {
2884                                .eraseblocks = {
2885                                        {4 * 1024, 2},
2886                                        {8 * 1024, 1},
2887                                        {16 * 1024, 1},
2888                                        {32 * 1024, 1},
2889                                        {64 * 1024, 31},
2890                                },
2891                                .block_erase = spi_block_erase_d8,
2892                        }, {
2893                                .eraseblocks = { {2 * 1024 * 1024, 1} },
2894                                .block_erase = spi_block_erase_c7,
2895                        }
2896                },
2897                .unlock         = spi_disable_blockprotect,
2898                .write          = spi_chip_write_256,
2899                .read           = spi_chip_read,
2900                .voltage        = {2700, 3600},
2901        },
2902
2903        {
2904                .vendor         = "Eon",
2905                .name           = "EN25B16T",
2906                .bustype        = BUS_SPI,
2907                .manufacture_id = EON_ID_NOPREFIX,
2908                .model_id       = EON_EN25B16,
2909                .total_size     = 2048,
2910                .page_size      = 256,
2911                .feature_bits   = FEATURE_WRSR_WREN,
2912                .tested         = TEST_UNTESTED,
2913                .probe          = probe_spi_rdid,
2914                .probe_timing   = TIMING_ZERO,
2915                .block_erasers  =
2916                {
2917                        {
2918                                .eraseblocks = {
2919                                        {64 * 1024, 31},
2920                                        {32 * 1024, 1},
2921                                        {16 * 1024, 1},
2922                                        {8 * 1024, 1},
2923                                        {4 * 1024, 2},
2924                                },
2925                                .block_erase = spi_block_erase_d8,
2926                        }, {
2927                                .eraseblocks = { {2 * 1024 * 1024, 1} },
2928                                .block_erase = spi_block_erase_c7,
2929                        }
2930                },
2931                .unlock         = spi_disable_blockprotect,
2932                .write          = spi_chip_write_256,
2933                .read           = spi_chip_read,
2934                .voltage        = {2700, 3600},
2935        },
2936
2937        {
2938                .vendor         = "Eon",
2939                .name           = "EN25B32",
2940                .bustype        = BUS_SPI,
2941                .manufacture_id = EON_ID_NOPREFIX,
2942                .model_id       = EON_EN25B32,
2943                .total_size     = 4096,
2944                .page_size      = 256,
2945                .feature_bits   = FEATURE_WRSR_WREN,
2946                .tested         = TEST_UNTESTED,
2947                .probe          = probe_spi_rdid,
2948                .probe_timing   = TIMING_ZERO,
2949                .block_erasers  =
2950                {
2951                        {
2952                                .eraseblocks = {
2953                                        {4 * 1024, 2},
2954                                        {8 * 1024, 1},
2955                                        {16 * 1024, 1},
2956                                        {32 * 1024, 1},
2957                                        {64 * 1024, 63},
2958                                },
2959                                .block_erase = spi_block_erase_d8,
2960                        }, {
2961                                .eraseblocks = { {4 * 1024 * 1024, 1} },
2962                                .block_erase = spi_block_erase_c7,
2963                        }
2964                },
2965                .unlock         = spi_disable_blockprotect,
2966                .write          = spi_chip_write_256,
2967                .read           = spi_chip_read,
2968                .voltage        = {2700, 3600},
2969        },
2970
2971        {
2972                .vendor         = "Eon",
2973                .name           = "EN25B32T",
2974                .bustype        = BUS_SPI,
2975                .manufacture_id = EON_ID_NOPREFIX,
2976                .model_id       = EON_EN25B32,
2977                .total_size     = 4096,
2978                .page_size      = 256,
2979                .feature_bits   = FEATURE_WRSR_WREN,
2980                .tested         = TEST_UNTESTED,
2981                .probe          = probe_spi_rdid,
2982                .probe_timing   = TIMING_ZERO,
2983                .block_erasers  =
2984                {
2985                        {
2986                                .eraseblocks = {
2987                                        {64 * 1024, 63},
2988                                        {32 * 1024, 1},
2989                                        {16 * 1024, 1},
2990                                        {8 * 1024, 1},
2991                                        {4 * 1024, 2},
2992                                },
2993                                .block_erase = spi_block_erase_d8,
2994                        }, {
2995                                .eraseblocks = { {4 * 1024 * 1024, 1} },
2996                                .block_erase = spi_block_erase_c7,
2997                        }
2998                },
2999                .unlock         = spi_disable_blockprotect,
3000                .write          = spi_chip_write_256,
3001                .read           = spi_chip_read,
3002                .voltage        = {2700, 3600},
3003        },
3004
3005        {
3006                .vendor         = "Eon",
3007                .name           = "EN25B64",
3008                .bustype        = BUS_SPI,
3009                .manufacture_id = EON_ID_NOPREFIX,
3010                .model_id       = EON_EN25B64,
3011                .total_size     = 8192,
3012                .page_size      = 256,
3013                .feature_bits   = FEATURE_WRSR_WREN,
3014                .tested         = TEST_UNTESTED,
3015                .probe          = probe_spi_rdid,
3016                .probe_timing   = TIMING_ZERO,
3017                .block_erasers  =
3018                {
3019                        {
3020                                .eraseblocks = {
3021                                        {4 * 1024, 2},
3022                                        {8 * 1024, 1},
3023                                        {16 * 1024, 1},
3024                                        {32 * 1024, 1},
3025                                        {64 * 1024, 127},
3026                                },
3027                                .block_erase = spi_block_erase_d8,
3028                        }, {
3029                                .eraseblocks = { {8 * 1024 * 1024, 1} },
3030                                .block_erase = spi_block_erase_c7,
3031                        }
3032                },
3033                .unlock         = spi_disable_blockprotect,
3034                .write          = spi_chip_write_256,
3035                .read           = spi_chip_read,
3036                .voltage        = {2700, 3600},
3037        },
3038
3039        {
3040                .vendor         = "Eon",
3041                .name           = "EN25B64T",
3042                .bustype        = BUS_SPI,
3043                .manufacture_id = EON_ID_NOPREFIX,
3044                .model_id       = EON_EN25B64,
3045                .total_size     = 8192,
3046                .page_size      = 256,
3047                .feature_bits   = FEATURE_WRSR_WREN,
3048                .tested         = TEST_UNTESTED,
3049                .probe          = probe_spi_rdid,
3050                .probe_timing   = TIMING_ZERO,
3051                .block_erasers  =
3052                {
3053                        {
3054                                .eraseblocks = {
3055                                        {64 * 1024, 127},
3056                                        {32 * 1024, 1},
3057                                        {16 * 1024, 1},
3058                                        {8 * 1024, 1},
3059                                        {4 * 1024, 2},
3060                                },
3061                                .block_erase = spi_block_erase_d8,
3062                        }, {
3063                                .eraseblocks = { {8 * 1024 * 1024, 1} },
3064                                .block_erase = spi_block_erase_c7,
3065                        }
3066                },
3067                .unlock         = spi_disable_blockprotect,
3068                .write          = spi_chip_write_256,
3069                .read           = spi_chip_read,
3070                .voltage        = {2700, 3600},
3071        },
3072
3073        {
3074                .vendor         = "Eon",
3075                .name           = "EN25F05",
3076                .bustype        = BUS_SPI,
3077                .manufacture_id = EON_ID_NOPREFIX,
3078                .model_id       = EON_EN25F05,
3079                .total_size     = 64,
3080                .page_size      = 256,
3081                .feature_bits   = FEATURE_WRSR_WREN,
3082                .tested         = TEST_UNTESTED,
3083                .probe          = probe_spi_rdid,
3084                .probe_timing   = TIMING_ZERO,
3085                .block_erasers  =
3086                {
3087                        {
3088                                .eraseblocks = { {4 * 1024, 16} },
3089                                .block_erase = spi_block_erase_20,
3090                        }, {
3091                                .eraseblocks = { {32 * 1024, 2} },
3092                                .block_erase = spi_block_erase_d8,
3093                        }, {
3094                                .eraseblocks = { {32 * 1024, 2} },
3095                                .block_erase = spi_block_erase_52,
3096                        }, {
3097                                .eraseblocks = { {64 * 1024, 1} },
3098                                .block_erase = spi_block_erase_60,
3099                        }, {
3100                                .eraseblocks = { {64 * 1024, 1} },
3101                                .block_erase = spi_block_erase_c7,
3102                        }
3103                },
3104                .unlock         = spi_disable_blockprotect,
3105                .write          = spi_chip_write_256,
3106                .read           = spi_chip_read,
3107                .voltage        = {2700, 3600},
3108        },
3109
3110        {
3111                .vendor         = "Eon",
3112                .name           = "EN25F10",
3113                .bustype        = BUS_SPI,
3114                .manufacture_id = EON_ID_NOPREFIX,
3115                .model_id       = EON_EN25F10,
3116                .total_size     = 128,
3117                .page_size      = 256,
3118                .feature_bits   = FEATURE_WRSR_WREN,
3119                .tested         = TEST_UNTESTED,
3120                .probe          = probe_spi_rdid,
3121                .probe_timing   = TIMING_ZERO,
3122                .block_erasers  =
3123                {
3124                        {
3125                                .eraseblocks = { {4 * 1024, 32} },
3126                                .block_erase = spi_block_erase_20,
3127                        }, {
3128                                .eraseblocks = { {32 * 1024, 4} },
3129                                .block_erase = spi_block_erase_d8,
3130                        }, {
3131                                .eraseblocks = { {32 * 1024, 4} },
3132                                .block_erase = spi_block_erase_52,
3133                        }, {
3134                                .eraseblocks = { {128 * 1024, 1} },
3135                                .block_erase = spi_block_erase_60,
3136                        }, {
3137                                .eraseblocks = { {128 * 1024, 1} },
3138                                .block_erase = spi_block_erase_c7,
3139                        }
3140                },
3141                .unlock         = spi_disable_blockprotect,
3142                .write          = spi_chip_write_256,
3143                .read           = spi_chip_read,
3144                .voltage        = {2700, 3600},
3145        },
3146
3147        {
3148                .vendor         = "Eon",
3149                .name           = "EN25F20",
3150                .bustype        = BUS_SPI,
3151                .manufacture_id = EON_ID_NOPREFIX,
3152                .model_id       = EON_EN25F20,
3153                .total_size     = 256,
3154                .page_size      = 256,
3155                .feature_bits   = FEATURE_WRSR_WREN,
3156                .tested         = TEST_UNTESTED,
3157                .probe          = probe_spi_rdid,
3158                .probe_timing   = TIMING_ZERO,
3159                .block_erasers  =
3160                {
3161                        {
3162                                .eraseblocks = { {4 * 1024, 64} },
3163                                .block_erase = spi_block_erase_20,
3164                        }, {
3165                                .eraseblocks = { {64 * 1024, 4} },
3166                                .block_erase = spi_block_erase_d8,
3167                        }, {
3168                                .eraseblocks = { {64 * 1024, 4} },
3169                                .block_erase = spi_block_erase_52,
3170                        }, {
3171                                .eraseblocks = { {256 * 1024, 1} },
3172                                .block_erase = spi_block_erase_60,
3173                        }, {
3174                                .eraseblocks = { {256 * 1024, 1} },
3175                                .block_erase = spi_block_erase_c7,
3176                        }
3177                },
3178                .unlock         = spi_disable_blockprotect,
3179                .write          = spi_chip_write_256,
3180                .read           = spi_chip_read,
3181                .voltage        = {2700, 3600},
3182        },
3183
3184        {
3185                .vendor         = "Eon",
3186                .name           = "EN25F40",
3187                .bustype        = BUS_SPI,
3188                .manufacture_id = EON_ID_NOPREFIX,
3189                .model_id       = EON_EN25F40,
3190                .total_size     = 512,
3191                .page_size      = 256,
3192                .feature_bits   = FEATURE_WRSR_WREN,
3193                .tested         = TEST_OK_PROBE,
3194                .probe          = probe_spi_rdid,
3195                .probe_timing   = TIMING_ZERO,
3196                .block_erasers  =
3197                {
3198                        {
3199                                .eraseblocks = { {4 * 1024, 128} },
3200                                .block_erase = spi_block_erase_20,
3201                        }, {
3202                                .eraseblocks = { {64 * 1024, 8} },
3203                                .block_erase = spi_block_erase_d8,
3204                        }, {
3205                                .eraseblocks = { {512 * 1024, 1} },
3206                                .block_erase = spi_block_erase_60,
3207                        }, {
3208                                .eraseblocks = { {512 * 1024, 1} },
3209                                .block_erase = spi_block_erase_c7,
3210                        },
3211                },
3212                .unlock         = spi_disable_blockprotect,
3213                .write          = spi_chip_write_256,
3214                .read           = spi_chip_read,
3215                .voltage        = {2700, 3600},
3216        },
3217
3218        {
3219                .vendor         = "Eon",
3220                .name           = "EN25F80",
3221                .bustype        = BUS_SPI,
3222                .manufacture_id = EON_ID_NOPREFIX,
3223                .model_id       = EON_EN25F80,
3224                .total_size     = 1024,
3225                .page_size      = 256,
3226                .feature_bits   = FEATURE_WRSR_WREN,
3227                .tested         = TEST_OK_PREW,
3228                .probe          = probe_spi_rdid,
3229                .probe_timing   = TIMING_ZERO,
3230                .block_erasers  =
3231                {
3232                        {
3233                                .eraseblocks = { {4 * 1024, 256} },
3234                                .block_erase = spi_block_erase_20,
3235                        }, {
3236                                .eraseblocks = { {64 * 1024, 16} },
3237                                .block_erase = spi_block_erase_d8,
3238                        }, {
3239                                .eraseblocks = { {1024 * 1024, 1} },
3240                                .block_erase = spi_block_erase_60,
3241                        }, {
3242                                .eraseblocks = { {1024 * 1024, 1} },
3243                                .block_erase = spi_block_erase_c7,
3244                        }
3245                },
3246                .unlock         = spi_disable_blockprotect,
3247                .write          = spi_chip_write_256,
3248                .read           = spi_chip_read,
3249                .voltage        = {2700, 3600},
3250        },
3251
3252        {
3253                .vendor         = "Eon",
3254                .name           = "EN25F16",
3255                .bustype        = BUS_SPI,
3256                .manufacture_id = EON_ID_NOPREFIX,
3257                .model_id       = EON_EN25F16,
3258                .total_size     = 2048,
3259                .page_size      = 256,
3260                .feature_bits   = FEATURE_WRSR_WREN,
3261                .tested         = TEST_OK_PREW,
3262                .probe          = probe_spi_rdid,
3263                .probe_timing   = TIMING_ZERO,
3264                .block_erasers  =
3265                {
3266                        {
3267                                .eraseblocks = { {4 * 1024, 512} },
3268                                .block_erase = spi_block_erase_20,
3269                        }, {
3270                                .eraseblocks = { {64 * 1024, 32} },
3271                                .block_erase = spi_block_erase_d8,
3272                        }, {
3273                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3274                                .block_erase = spi_block_erase_60,
3275                        }, {
3276                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3277                                .block_erase = spi_block_erase_c7,
3278                        }
3279                },
3280                .unlock         = spi_disable_blockprotect,
3281                .write          = spi_chip_write_256,
3282                .read           = spi_chip_read,
3283                .voltage        = {2700, 3600},
3284        },
3285
3286        {
3287                .vendor         = "Eon",
3288                .name           = "EN25F32",
3289                .bustype        = BUS_SPI,
3290                .manufacture_id = EON_ID_NOPREFIX,
3291                .model_id       = EON_EN25F32,
3292                .total_size     = 4096,
3293                .page_size      = 256,
3294                .feature_bits   = FEATURE_WRSR_WREN,
3295                .tested         = TEST_UNTESTED,
3296                .probe          = probe_spi_rdid,
3297                .probe_timing   = TIMING_ZERO,
3298                .block_erasers  =
3299                {
3300                        {
3301                                .eraseblocks = { {4 * 1024, 1024} },
3302                                .block_erase = spi_block_erase_20,
3303                        }, {
3304                                .eraseblocks = { {64 * 1024, 64} },
3305                                .block_erase = spi_block_erase_d8,
3306                        }, {
3307                                .eraseblocks = { {4 * 1024 * 1024, 1} },
3308                                .block_erase = spi_block_erase_60,
3309                        }, {
3310                                .eraseblocks = { {4 * 1024 * 1024, 1} },
3311                                .block_erase = spi_block_erase_c7,
3312                        }
3313                },
3314                .unlock         = spi_disable_blockprotect,
3315                .write          = spi_chip_write_256,
3316                .read           = spi_chip_read,
3317                .voltage        = {2700, 3600},
3318        },
3319
3320        {
3321                .vendor         = "Eon",
3322                .name           = "EN25Q40",
3323                .bustype        = BUS_SPI,
3324                .manufacture_id = EON_ID_NOPREFIX,
3325                .model_id       = EON_EN25Q40,
3326                .total_size     = 512,
3327                .page_size      = 256,
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,
3333                .block_erasers  =
3334                {
3335                        {
3336                                .eraseblocks = { {4 * 1024, 128} },
3337                                .block_erase = spi_block_erase_20,
3338                        }, {
3339                                .eraseblocks = { {64 * 1024, 8} },
3340                                .block_erase = spi_block_erase_d8,
3341                        }, {
3342                                .eraseblocks = { {512 * 1024, 1} },
3343                                .block_erase = spi_block_erase_60,
3344                        }, {
3345                                .eraseblocks = { {512 * 1024, 1} },
3346                                .block_erase = spi_block_erase_c7,
3347                        }
3348                },
3349                .unlock         = spi_disable_blockprotect,
3350                .write          = spi_chip_write_256,
3351                .read           = spi_chip_read,
3352                .voltage        = {2700, 3600},
3353        },
3354
3355        {
3356                .vendor         = "Eon",
3357                .name           = "EN25Q80(A)",
3358                .bustype        = BUS_SPI,
3359                .manufacture_id = EON_ID_NOPREFIX,
3360                .model_id       = EON_EN25Q80,
3361                .total_size     = 1024,
3362                .page_size      = 256,
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,
3368                .block_erasers  =
3369                {
3370                        {
3371                                .eraseblocks = { {4 * 1024, 256} },
3372                                .block_erase = spi_block_erase_20,
3373                        }, {
3374                                .eraseblocks = { {64 * 1024, 16} },
3375                                .block_erase = spi_block_erase_d8,
3376                        }, {
3377                                .eraseblocks = { {1024 * 1024, 1} },
3378                                .block_erase = spi_block_erase_60,
3379                        }, {
3380                                .eraseblocks = { {1024 * 1024, 1} },
3381                                .block_erase = spi_block_erase_c7,
3382                        }
3383                },
3384                .unlock         = spi_disable_blockprotect,
3385                .write          = spi_chip_write_256,
3386                .read           = spi_chip_read,
3387                .voltage        = {2700, 3600},
3388        },
3389
3390        {
3391                /* Note: EN25D16 is an evil twin which shares the model ID
3392                   but has different write protection capabilities */
3393                .vendor         = "Eon",
3394                .name           = "EN25Q16",
3395                .bustype        = BUS_SPI,
3396                .manufacture_id = EON_ID_NOPREFIX,
3397                .model_id       = EON_EN25Q16,
3398                .total_size     = 2048,
3399                .page_size      = 256,
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,
3405                .block_erasers  =
3406                {
3407                        {
3408                                .eraseblocks = { {4 * 1024, 512} },
3409                                .block_erase = spi_block_erase_20,
3410                        }, {
3411                                .eraseblocks = { {64 * 1024, 32} },
3412                                .block_erase = spi_block_erase_d8,
3413                        }, {
3414                                /* not supported by Q16 version */
3415                                .eraseblocks = { {64 * 1024, 32} },
3416                                .block_erase = spi_block_erase_52,
3417                        }, {
3418                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3419                                .block_erase = spi_block_erase_60,
3420                        }, {
3421                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3422                                .block_erase = spi_block_erase_c7,
3423                        }
3424                },
3425                .unlock         = spi_disable_blockprotect,
3426                .write          = spi_chip_write_256,
3427                .read           = spi_chip_read,
3428                .voltage        = {2700, 3600},
3429        },
3430
3431        {
3432                .vendor         = "Eon",
3433                .name           = "EN25Q32(A/B)",
3434                .bustype        = BUS_SPI,
3435                .manufacture_id = EON_ID_NOPREFIX,
3436                .model_id       = EON_EN25Q32,
3437                .total_size     = 4096,
3438                .page_size      = 256,
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,
3444                .block_erasers  =
3445                {
3446                        {
3447                                .eraseblocks = { {4 * 1024, 1024} },
3448                                .block_erase = spi_block_erase_20,
3449                        }, {
3450                                .eraseblocks = { {64 * 1024, 64} },
3451                                .block_erase = spi_block_erase_d8,
3452                        }, {
3453                                .eraseblocks = { {4 * 1024 * 1024, 1} },
3454                                .block_erase = spi_block_erase_60,
3455                        }, {
3456                                .eraseblocks = { {4 * 1024 * 1024, 1} },
3457                                .block_erase = spi_block_erase_c7,
3458                        }
3459                },
3460                .unlock         = spi_disable_blockprotect,
3461                .write          = spi_chip_write_256,
3462                .read           = spi_chip_read,
3463                .voltage        = {2700, 3600},
3464        },
3465
3466        {
3467                .vendor         = "Eon",
3468                .name           = "EN25Q64",
3469                .bustype        = BUS_SPI,
3470                .manufacture_id = EON_ID_NOPREFIX,
3471                .model_id       = EON_EN25Q64,
3472                .total_size     = 8192,
3473                .page_size      = 256,
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,
3479                .block_erasers  =
3480                {
3481                        {
3482                                .eraseblocks = { {4 * 1024, 2048} },
3483                                .block_erase = spi_block_erase_20,
3484                        }, {
3485                                .eraseblocks = { {64 * 1024, 128} },
3486                                .block_erase = spi_block_erase_d8,
3487                        }, {
3488                                .eraseblocks = { {8 * 1024 * 1024, 1} },
3489                                .block_erase = spi_block_erase_60,
3490                        }, {
3491                                .eraseblocks = { {8 * 1024 * 1024, 1} },
3492                                .block_erase = spi_block_erase_c7,
3493                        }
3494                },
3495                .unlock         = spi_disable_blockprotect,
3496                .write          = spi_chip_write_256,
3497                .read           = spi_chip_read,
3498                .voltage        = {2700, 3600},
3499        },
3500
3501        {
3502                .vendor         = "Eon",
3503                .name           = "EN25Q128",
3504                .bustype        = BUS_SPI,
3505                .manufacture_id = EON_ID_NOPREFIX,
3506                .model_id       = EON_EN25Q128,
3507                .total_size     = 16384,
3508                .page_size      = 256,
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,
3514                .block_erasers  =
3515                {
3516                        {
3517                                .eraseblocks = { {4 * 1024, 4096} },
3518                                .block_erase = spi_block_erase_20,
3519                        }, {
3520                                .eraseblocks = { {64 * 1024, 256} },
3521                                .block_erase = spi_block_erase_d8,
3522                        }, {
3523                                .eraseblocks = { {16 * 1024 * 1024, 1} },
3524                                .block_erase = spi_block_erase_60,
3525                        }, {
3526                                .eraseblocks = { {16 * 1024 * 1024, 1} },
3527                                .block_erase = spi_block_erase_c7,
3528                        }
3529                },
3530                .unlock         = spi_disable_blockprotect,
3531                .write          = spi_chip_write_256,
3532                .read           = spi_chip_read,
3533        },
3534
3535        {
3536                .vendor         = "Eon",
3537                .name           = "EN25QH16",
3538                .bustype        = BUS_SPI,
3539                .manufacture_id = EON_ID_NOPREFIX,
3540                .model_id       = EON_EN25QH16,
3541                .total_size     = 2048,
3542                .page_size      = 256,
3543                /* supports SFDP */
3544                /* OTP: 512B total; enter 0x3A */
3545                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
3546                .tested         = TEST_UNTESTED,
3547                .probe          = probe_spi_rdid,
3548                .probe_timing   = TIMING_ZERO,
3549                .block_erasers  =
3550                {
3551                        {
3552                                .eraseblocks = { {4 * 1024, 512} },
3553                                .block_erase = spi_block_erase_20,
3554                        }, {
3555                                .eraseblocks = { {64 * 1024, 32} },
3556                                .block_erase = spi_block_erase_d8,
3557                        }, {
3558                                .eraseblocks = { {1024 * 2048, 1} },
3559                                .block_erase = spi_block_erase_60,
3560                        }, {
3561                                .eraseblocks = { {1024 * 2048, 1} },
3562                                .block_erase = spi_block_erase_c7,
3563                        }
3564                },
3565                .unlock         = spi_disable_blockprotect,
3566                .write          = spi_chip_write_256,
3567                .read           = spi_chip_read,
3568                .voltage        = {2700, 3600},
3569        },
3570
3571        {
3572                .vendor         = "Eon",
3573                .name           = "EN25QH32",
3574                .bustype        = BUS_SPI,
3575                .manufacture_id = EON_ID_NOPREFIX,
3576                .model_id       = EON_EN25QH32,
3577                .total_size     = 4096,
3578                .page_size      = 256,
3579                /* supports SFDP */
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,
3585                .block_erasers  =
3586                {
3587                        {
3588                                .eraseblocks = { {4 * 1024, 1024} },
3589                                .block_erase = spi_block_erase_20,
3590                        }, {
3591                                .eraseblocks = { {64 * 1024, 64} },
3592                                .block_erase = spi_block_erase_d8,
3593                        }, {
3594                                .eraseblocks = { {1024 * 4096, 1} },
3595                                .block_erase = spi_block_erase_60,
3596                        }, {
3597                                .eraseblocks = { {1024 * 4096, 1} },
3598                                .block_erase = spi_block_erase_c7,
3599                        }
3600                },
3601                .unlock         = spi_disable_blockprotect,
3602                .write          = spi_chip_write_256,
3603                .read           = spi_chip_read,
3604                .voltage        = {2700, 3600},
3605        },
3606
3607        {
3608                .vendor         = "Eon",
3609                .name           = "EN29F010",
3610                .bustype        = BUS_PARALLEL,
3611                .manufacture_id = EON_ID,
3612                .model_id       = EON_EN29F010,
3613                .total_size     = 128,
3614                .page_size      = 128,
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 */
3619                .block_erasers  =
3620                {
3621                        {
3622                                .eraseblocks = { {16 * 1024, 8} },
3623                                .block_erase = erase_sector_jedec,
3624                        },
3625                        {
3626                                .eraseblocks = { {128 * 1024, 1} },
3627                                .block_erase = erase_chip_block_jedec,
3628                        },
3629                },
3630                .write          = write_jedec_1,
3631                .read           = read_memmapped,
3632                .voltage        = {4500, 5500},
3633        },
3634
3635        {
3636                .vendor         = "Eon",
3637                .name           = "EN29F002(A)(N)B",
3638                .bustype        = BUS_PARALLEL,
3639                .manufacture_id = EON_ID,
3640                .model_id       = EON_EN29F002B,
3641                .total_size     = 256,
3642                .page_size      = 256,
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 */
3647                .block_erasers  =
3648                {
3649                        {
3650                                .eraseblocks = {
3651                                        {16 * 1024, 1},
3652                                        {8 * 1024, 2},
3653                                        {32 * 1024, 1},
3654                                        {64 * 1024, 3},
3655                                },
3656                                .block_erase = erase_sector_jedec,
3657                        }, {
3658                                .eraseblocks = { {256 * 1024, 1} },
3659                                .block_erase = erase_chip_block_jedec,
3660                        },
3661                },
3662                .write          = write_jedec_1,
3663                .read           = read_memmapped,
3664                .voltage        = {4500, 5500},
3665        },
3666
3667        {
3668                .vendor         = "Eon",
3669                .name           = "EN29F002(A)(N)T",
3670                .bustype        = BUS_PARALLEL,
3671                .manufacture_id = EON_ID,
3672                .model_id       = EON_EN29F002T,
3673                .total_size     = 256,
3674                .page_size      = 256,
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 */
3679                .block_erasers  =
3680                {
3681                        {
3682                                .eraseblocks = {
3683                                        {64 * 1024, 3},
3684                                        {32 * 1024, 1},
3685                                        {8 * 1024, 2},
3686                                        {16 * 1024, 1},
3687                                },
3688                                .block_erase = erase_sector_jedec,
3689                        }, {
3690                                .eraseblocks = { {256 * 1024, 1} },
3691                                .block_erase = erase_chip_block_jedec,
3692                        },
3693                },
3694                .write          = write_jedec_1,
3695                .read           = read_memmapped,
3696                .voltage        = {4500, 5500},
3697        },
3698
3699        {
3700                .vendor         = "Eon",
3701                .name           = "EN29LV640B",
3702                .bustype        = BUS_PARALLEL,
3703                .manufacture_id = EON_ID,
3704                .model_id       = EON_EN29LV640B,
3705                .total_size     = 8192,
3706                .page_size      = 8192,
3707                .feature_bits   = 0,
3708                .tested         = TEST_OK_PREW,
3709                .probe          = probe_en29lv640b,
3710                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
3711                .block_erasers  =
3712                {
3713                        {
3714                                .eraseblocks = {
3715                                        {8 * 1024, 8},
3716                                        {64 * 1024, 127},
3717                                },
3718                                .block_erase = block_erase_en29lv640b,
3719                        }, {
3720                                .eraseblocks = { {8 * 1024 * 1024, 1} },
3721                                .block_erase = block_erase_chip_en29lv640b,
3722                        },
3723                },
3724                .write          = write_en29lv640b,
3725                .read           = read_memmapped,
3726                .voltage        = {2700, 3600},
3727        },
3728
3729        {
3730                .vendor         = "Fujitsu",
3731                .name           = "MBM29F004BC",
3732                .bustype        = BUS_PARALLEL,
3733                .manufacture_id = FUJITSU_ID,
3734                .model_id       = FUJITSU_MBM29F004BC,
3735                .total_size     = 512,
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 */
3741                .block_erasers  =
3742                {
3743                        {
3744                                .eraseblocks = { 
3745                                        {16 * 1024, 1},
3746                                        {8 * 1024, 2},
3747                                        {32 * 1024, 1},
3748                                        {64 * 1024, 7},
3749                                },
3750                                .block_erase = erase_sector_jedec,
3751                        }, {
3752                                .eraseblocks = { {512 * 1024, 1} },
3753                                .block_erase = erase_chip_block_jedec,
3754                        },
3755                },
3756                .write          = NULL,
3757                .read           = read_memmapped,
3758                .voltage        = {4500, 5500},
3759        },
3760
3761        {
3762                .vendor         = "Fujitsu",
3763                .name           = "MBM29F004TC",
3764                .bustype        = BUS_PARALLEL,
3765                .manufacture_id = FUJITSU_ID,
3766                .model_id       = FUJITSU_MBM29F004TC,
3767                .total_size     = 512,
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 */
3773                .block_erasers  =
3774                {
3775                        {
3776                                .eraseblocks = { 
3777                                        {64 * 1024, 7},
3778                                        {32 * 1024, 1},
3779                                        {8 * 1024, 2},
3780                                        {16 * 1024, 1},
3781                                },
3782                                .block_erase = erase_sector_jedec,
3783                        }, {
3784                                .eraseblocks = { {512 * 1024, 1} },
3785                                .block_erase = erase_chip_block_jedec,
3786                        },
3787                },
3788                .write          = NULL,
3789                .read           = read_memmapped,
3790                .voltage        = {4500, 5500},
3791        },
3792
3793        {
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,
3800                .total_size     = 512,
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) */
3806                .block_erasers  =
3807                {
3808                        {
3809                                .eraseblocks = { 
3810                                        {16 * 1024, 1},
3811                                        {8 * 1024, 2},
3812                                        {32 * 1024, 1},
3813                                        {64 * 1024, 7},
3814                                },
3815                                .block_erase = block_erase_m29f400bt,
3816                        }, {
3817                                .eraseblocks = { {512 * 1024, 1} },
3818                                .block_erase = block_erase_chip_m29f400bt,
3819                        },
3820                },
3821                .write          = write_m29f400bt,
3822                .read           = read_memmapped,
3823                .voltage        = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3824        },
3825
3826        {
3827                .vendor         = "Fujitsu",
3828                .name           = "MBM29F400TC",
3829                .bustype        = BUS_PARALLEL,
3830                .manufacture_id = FUJITSU_ID,
3831                .model_id       = FUJITSU_MBM29F400TC,
3832                .total_size     = 512,
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) */
3838                .block_erasers  =
3839                {
3840                        {
3841                                .eraseblocks = { 
3842                                        {64 * 1024, 7},
3843                                        {32 * 1024, 1},
3844                                        {8 * 1024, 2},
3845                                        {16 * 1024, 1},
3846                                },
3847                                .block_erase = block_erase_m29f400bt,
3848                        }, {
3849                                .eraseblocks = { {512 * 1024, 1} },
3850                                .block_erase = block_erase_chip_m29f400bt,
3851                        },
3852                },
3853                .write          = write_m29f400bt,
3854                .read           = read_memmapped,
3855                .voltage        = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
3856        },
3857
3858        {
3859                .vendor         = "GigaDevice",
3860                .name           = "GD25Q20",
3861                .bustype        = BUS_SPI,
3862                .manufacture_id = GIGADEVICE_ID,
3863                .model_id       = GIGADEVICE_GD25Q20,
3864                .total_size     = 256,
3865                .page_size      = 256,
3866                .feature_bits   = FEATURE_WRSR_WREN,
3867                .tested         = TEST_UNTESTED,
3868                .probe          = probe_spi_rdid,
3869                .probe_timing   = TIMING_ZERO,
3870                .block_erasers  =
3871                {
3872                        {
3873                                .eraseblocks = { {4 * 1024, 64} },
3874                                .block_erase = spi_block_erase_20,
3875                        }, {
3876                                .eraseblocks = { {32 * 1024, 8} },
3877                                .block_erase = spi_block_erase_52,
3878                        }, {
3879                                .eraseblocks = { {64 * 1024, 4} },
3880                                .block_erase = spi_block_erase_d8,
3881                        }, {
3882                                .eraseblocks = { {256 * 1024, 1} },
3883                                .block_erase = spi_block_erase_60,
3884                        }, {
3885                                .eraseblocks = { {256 * 1024, 1} },
3886                                .block_erase = spi_block_erase_c7,
3887                        }
3888                },
3889                .unlock         = spi_disable_blockprotect,
3890                .write          = spi_chip_write_256,
3891                .read           = spi_chip_read,
3892                .voltage        = {2700, 3600},
3893        },
3894
3895        {
3896                .vendor         = "GigaDevice",
3897                .name           = "GD25Q40",
3898                .bustype        = BUS_SPI,
3899                .manufacture_id = GIGADEVICE_ID,
3900                .model_id       = GIGADEVICE_GD25Q40,
3901                .total_size     = 512,
3902                .page_size      = 256,
3903                .feature_bits   = FEATURE_WRSR_WREN,
3904                .tested         = TEST_UNTESTED,
3905                .probe          = probe_spi_rdid,
3906                .probe_timing   = TIMING_ZERO,
3907                .block_erasers  =
3908                {
3909                        {
3910                                .eraseblocks = { {4 * 1024, 128} },
3911                                .block_erase = spi_block_erase_20,
3912                        }, {
3913                                .eraseblocks = { {32 * 1024, 16} },
3914                                .block_erase = spi_block_erase_52,
3915                        }, {
3916                                .eraseblocks = { {64 * 1024, 8} },
3917                                .block_erase = spi_block_erase_d8,
3918                        }, {
3919                                .eraseblocks = { {512 * 1024, 1} },
3920                                .block_erase = spi_block_erase_60,
3921                        }, {
3922                                .eraseblocks = { {512 * 1024, 1} },
3923                                .block_erase = spi_block_erase_c7,
3924                        }
3925                },
3926                .unlock         = spi_disable_blockprotect,
3927                .write          = spi_chip_write_256,
3928                .read           = spi_chip_read,
3929                .voltage        = {2700, 3600},
3930        },
3931
3932        {
3933                .vendor         = "GigaDevice",
3934                .name           = "GD25Q80",
3935                .bustype        = BUS_SPI,
3936                .manufacture_id = GIGADEVICE_ID,
3937                .model_id       = GIGADEVICE_GD25Q80,
3938                .total_size     = 1024,
3939                .page_size      = 256,
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,
3945                .block_erasers  =
3946                {
3947                        {
3948                                .eraseblocks = { {4 * 1024, 256} },
3949                                .block_erase = spi_block_erase_20,
3950                        }, {
3951                                .eraseblocks = { {32 * 1024, 32} },
3952                                .block_erase = spi_block_erase_52,
3953                        }, {
3954                                .eraseblocks = { {64 * 1024, 16} },
3955                                .block_erase = spi_block_erase_d8,
3956                        }, {
3957                                .eraseblocks = { {1024 * 1024, 1} },
3958                                .block_erase = spi_block_erase_60,
3959                        }, {
3960                                .eraseblocks = { {1024 * 1024, 1} },
3961                                .block_erase = spi_block_erase_c7,
3962                        }
3963                },
3964                .unlock         = spi_disable_blockprotect,
3965                .write          = spi_chip_write_256,
3966                .read           = spi_chip_read,
3967                .voltage        = {2700, 3600},
3968        },
3969
3970        {
3971                .vendor         = "GigaDevice",
3972                .name           = "GD25Q16",
3973                .bustype        = BUS_SPI,
3974                .manufacture_id = GIGADEVICE_ID,
3975                .model_id       = GIGADEVICE_GD25Q16,
3976                .total_size     = 2048,
3977                .page_size      = 256,
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,
3983                .block_erasers  =
3984                {
3985                        {
3986                                .eraseblocks = { {4 * 1024, 512} },
3987                                .block_erase = spi_block_erase_20,
3988                        }, {
3989                                .eraseblocks = { {32 * 1024, 64} },
3990                                .block_erase = spi_block_erase_52,
3991                        }, {
3992                                .eraseblocks = { {64 * 1024, 32} },
3993                                .block_erase = spi_block_erase_d8,
3994                        }, {
3995                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3996                                .block_erase = spi_block_erase_60,
3997                        }, {
3998                                .eraseblocks = { {2 * 1024 * 1024, 1} },
3999                                .block_erase = spi_block_erase_c7,
4000                        }
4001                },
4002                .unlock         = spi_disable_blockprotect,
4003                .write          = spi_chip_write_256,
4004                .read           = spi_chip_read,
4005                .voltage        = {2700, 3600},
4006        },
4007
4008        {
4009                .vendor         = "GigaDevice",
4010                .name           = "GD25Q32",
4011                .bustype        = BUS_SPI,
4012                .manufacture_id = GIGADEVICE_ID,
4013                .model_id       = GIGADEVICE_GD25Q32,
4014                .total_size     = 4096,
4015                .page_size      = 256,
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,
4021                .block_erasers  =
4022                {
4023                        {
4024                                .eraseblocks = { {4 * 1024, 1024} },
4025                                .block_erase = spi_block_erase_20,
4026                        }, {
4027                                .eraseblocks = { {32 * 1024, 128} },
4028                                .block_erase = spi_block_erase_52,
4029                        }, {
4030                                .eraseblocks = { {64 * 1024, 64} },
4031                                .block_erase = spi_block_erase_d8,
4032                        }, {
4033                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4034                                .block_erase = spi_block_erase_60,
4035                        }, {
4036                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4037                                .block_erase = spi_block_erase_c7,
4038                        }
4039                },
4040                .unlock         = spi_disable_blockprotect,
4041                .write          = spi_chip_write_256,
4042                .read           = spi_chip_read,
4043                .voltage        = {2700, 3600},
4044        },
4045
4046        {
4047                .vendor         = "GigaDevice",
4048                .name           = "GD25Q64",
4049                .bustype        = BUS_SPI,
4050                .manufacture_id = GIGADEVICE_ID,
4051                .model_id       = GIGADEVICE_GD25Q64,
4052                .total_size     = 8192,
4053                .page_size      = 256,
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,
4059                .block_erasers  =
4060                {
4061                        {
4062                                .eraseblocks = { {4 * 1024, 2048} },
4063                                .block_erase = spi_block_erase_20,
4064                        }, {
4065                                .eraseblocks = { {32 * 1024, 256} },
4066                                .block_erase = spi_block_erase_52,
4067                        }, {
4068                                .eraseblocks = { {64 * 1024, 128} },
4069                                .block_erase = spi_block_erase_d8,
4070                        }, {
4071                                .eraseblocks = { {8 * 1024 * 1024, 1} },
4072                                .block_erase = spi_block_erase_60,
4073                        }, {
4074                                .eraseblocks = { {8 * 1024 * 1024, 1} },
4075                                .block_erase = spi_block_erase_c7,
4076                        }
4077                },
4078                .unlock         = spi_disable_blockprotect,
4079                .write          = spi_chip_write_256,
4080                .read           = spi_chip_read,
4081        },
4082
4083        {
4084                .vendor         = "GigaDevice",
4085                .name           = "GD25Q128",
4086                .bustype        = BUS_SPI,
4087                .manufacture_id = GIGADEVICE_ID,
4088                .model_id       = GIGADEVICE_GD25Q128,
4089                .total_size     = 16384,
4090                .page_size      = 256,
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,
4096                .block_erasers  =
4097                {
4098                        {
4099                                .eraseblocks = { {4 * 1024, 4096} },
4100                                .block_erase = spi_block_erase_20,
4101                        }, {
4102                                .eraseblocks = { {32 * 1024, 512} },
4103                                .block_erase = spi_block_erase_52,
4104                        }, {
4105                                .eraseblocks = { {64 * 1024, 256} },
4106                                .block_erase = spi_block_erase_d8,
4107                        }, {
4108                                .eraseblocks = { {16 * 1024 * 1024, 1} },
4109                                .block_erase = spi_block_erase_60,
4110                        }, {
4111                                .eraseblocks = { {16 * 1024 * 1024, 1} },
4112                                .block_erase = spi_block_erase_c7,
4113                        }
4114                },
4115                .unlock         = spi_disable_blockprotect,
4116                .write          = spi_chip_write_256,
4117                .read           = spi_chip_read,
4118        },
4119
4120        {
4121                .vendor         = "Hyundai",
4122                .name           = "HY29F002T",
4123                .bustype        = BUS_PARALLEL,
4124                .manufacture_id = HYUNDAI_ID,
4125                .model_id       = HYUNDAI_HY29F002T,
4126                .total_size     = 256,
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 */
4132                .block_erasers  =
4133                {
4134                        {
4135                                .eraseblocks = {
4136                                        {64 * 1024, 3},
4137                                        {32 * 1024, 1},
4138                                        {8 * 1024, 2},
4139                                        {16 * 1024, 1},
4140                                },
4141                                .block_erase = erase_sector_jedec,
4142                        }, {
4143                                .eraseblocks = { {256 * 1024, 1} },
4144                                .block_erase = erase_chip_block_jedec,
4145                        },
4146                },
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 */
4150        },
4151
4152        {
4153                .vendor         = "Hyundai",
4154                .name           = "HY29F002B",
4155                .bustype        = BUS_PARALLEL,
4156                .manufacture_id = HYUNDAI_ID,
4157                .model_id       = HYUNDAI_HY29F002B,
4158                .total_size     = 256,
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 */
4164                .block_erasers  =
4165                {
4166                        {
4167                                .eraseblocks = {
4168                                        {16 * 1024, 1},
4169                                        {8 * 1024, 2},
4170                                        {32 * 1024, 1},
4171                                        {64 * 1024, 3},
4172                                },
4173                                .block_erase = erase_sector_jedec,
4174                        }, {
4175                                .eraseblocks = { {256 * 1024, 1} },
4176                                .block_erase = erase_chip_block_jedec,
4177                        },
4178                },
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 */
4182        },
4183
4184        {
4185                .vendor         = "Hyundai",
4186                .name           = "HY29F040A",
4187                .bustype        = BUS_PARALLEL,
4188                .manufacture_id = HYUNDAI_ID,
4189                .model_id       = HYUNDAI_HY29F040A,
4190                .total_size     = 512,
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,
4196                .block_erasers  =
4197                {
4198                        {
4199                                .eraseblocks = { {64 * 1024, 8} },
4200                                .block_erase = erase_sector_jedec,
4201                        }, {
4202                                .eraseblocks = { {512 * 1024, 1} },
4203                                .block_erase = erase_chip_block_jedec,
4204                        },
4205                },
4206                .write          = write_jedec_1,
4207                .read           = read_memmapped,
4208                .voltage        = {4500, 5500},
4209        },
4210
4211        {
4212                .vendor         = "Intel",
4213                .name           = "28F001BN/BX-B",
4214                .bustype        = BUS_PARALLEL,
4215                .manufacture_id = INTEL_ID,
4216                .model_id       = INTEL_28F001B,
4217                .total_size     = 128,
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 */
4222                .block_erasers  =
4223                {
4224                        {
4225                                .eraseblocks = { 
4226                                        {8 * 1024, 1},
4227                                        {4 * 1024, 2},
4228                                        {112 * 1024, 1},
4229                                },
4230                                .block_erase = erase_block_82802ab,
4231                        },
4232                },
4233                .write          = write_82802ab,
4234                .read           = read_memmapped,
4235                .voltage        = {4500, 5500},
4236        },
4237
4238        {
4239                .vendor         = "Intel",
4240                .name           = "28F001BN/BX-T",
4241                .bustype        = BUS_PARALLEL,
4242                .manufacture_id = INTEL_ID,
4243                .model_id       = INTEL_28F001T,
4244                .total_size     = 128,
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 */
4249                .block_erasers  =
4250                {
4251                        {
4252                                .eraseblocks = {
4253                                        {112 * 1024, 1},
4254                                        {4 * 1024, 2},
4255                                        {8 * 1024, 1},
4256                                },
4257                                .block_erase = erase_block_82802ab,
4258                        },
4259                },
4260                .write          = write_82802ab,
4261                .read           = read_memmapped,
4262                .voltage        = {4500, 5500},
4263        },
4264
4265        {
4266                .vendor         = "Intel",
4267                .name           = "28F002BC/BL/BV/BX-T",
4268                .bustype        = BUS_PARALLEL,
4269                .manufacture_id = INTEL_ID,
4270                .model_id       = INTEL_28F002T,
4271                .total_size     = 256,
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 */
4276                .block_erasers  =
4277                {
4278                        {
4279                                .eraseblocks = {
4280                                        {128 * 1024, 1},
4281                                        {96 * 1024, 1},
4282                                        {8 * 1024, 2},
4283                                        {16 * 1024, 1},
4284                                },
4285                                .block_erase = erase_block_82802ab,
4286                        },
4287                },
4288                .write          = write_82802ab,
4289                .read           = read_memmapped,
4290        },
4291
4292        {
4293                .vendor         = "Intel",
4294                .name           = "28F008S3/S5/SC",
4295                .bustype        = BUS_PARALLEL,
4296                .manufacture_id = INTEL_ID,
4297                .model_id       = INTEL_28F004S3,
4298                .total_size     = 512,
4299                .page_size      = 256,
4300                .tested         = TEST_UNTESTED,
4301                .probe          = probe_82802ab,
4302                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
4303                .block_erasers  =
4304                {
4305                        {
4306                                .eraseblocks = { {64 * 1024, 8} },
4307                                .block_erase = erase_block_82802ab,
4308                        },
4309                },
4310                .unlock         = unlock_28f004s5,
4311                .write          = write_82802ab,
4312                .read           = read_memmapped,
4313        },
4314
4315        {
4316                .vendor         = "Intel",
4317                .name           = "28F004B5/BE/BV/BX-B",
4318                .bustype        = BUS_PARALLEL,
4319                .manufacture_id = INTEL_ID,
4320                .model_id       = INTEL_28F004B,
4321                .total_size     = 512,
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 */
4326                .block_erasers  =
4327                {
4328                        {
4329                                .eraseblocks = { 
4330                                        {16 * 1024, 1},
4331                                        {8 * 1024, 2},
4332                                        {96 * 1024, 1},
4333                                        {128 * 1024, 3},
4334                                },
4335                                .block_erase = erase_block_82802ab,
4336                        },
4337                },
4338                .write          = write_82802ab,
4339                .read           = read_memmapped,
4340        },
4341
4342        {
4343                .vendor         = "Intel",
4344                .name           = "28F004B5/BE/BV/BX-T",
4345                .bustype        = BUS_PARALLEL,
4346                .manufacture_id = INTEL_ID,
4347                .model_id       = INTEL_28F004T,
4348                .total_size     = 512,
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 */
4353                .block_erasers  =
4354                {
4355                        {
4356                                .eraseblocks = { 
4357                                        {128 * 1024, 3},
4358                                        {96 * 1024, 1},
4359                                        {8 * 1024, 2},
4360                                        {16 * 1024, 1},
4361                                },
4362                                .block_erase = erase_block_82802ab,
4363                        },
4364                },
4365                .write          = write_82802ab,
4366                .read           = read_memmapped,
4367        },
4368
4369        {
4370                .vendor         = "Intel",
4371                .name           = "28F400BV/BX/CE/CV-B",
4372                .bustype        = BUS_PARALLEL,
4373                .manufacture_id = INTEL_ID,
4374                .model_id       = INTEL_28F400B,
4375                .total_size     = 512,
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 */
4381                .block_erasers  =
4382                {
4383                        {
4384                                .eraseblocks = { 
4385                                        {16 * 1024, 1},
4386                                        {8 * 1024, 2},
4387                                        {96 * 1024, 1},
4388                                        {128 * 1024, 3},
4389                                },
4390                                .block_erase = erase_block_82802ab,
4391                        },
4392                },
4393                .write          = write_82802ab,
4394                .read           = read_memmapped,
4395        },
4396
4397        {
4398                .vendor         = "Intel",
4399                .name           = "28F400BV/BX/CE/CV-T",
4400                .bustype        = BUS_PARALLEL,
4401                .manufacture_id = INTEL_ID,
4402                .model_id       = INTEL_28F400T,
4403                .total_size     = 512,
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 */
4409                .block_erasers  =
4410                {
4411                        {
4412                                .eraseblocks = { 
4413                                        {128 * 1024, 3},
4414                                        {96 * 1024, 1},
4415                                        {8 * 1024, 2},
4416                                        {16 * 1024, 1},
4417                                },
4418                                .block_erase = erase_block_82802ab,
4419                        },
4420                },
4421                .write          = write_82802ab,
4422                .read           = read_memmapped,
4423        },
4424
4425        {
4426                .vendor         = "Intel",
4427                .name           = "82802AB",
4428                .bustype        = BUS_FWH,
4429                .manufacture_id = INTEL_ID,
4430                .model_id       = INTEL_82802AB,
4431                .total_size     = 512,
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) */
4437                .block_erasers  =
4438                {
4439                        {
4440                                .eraseblocks = { {64 * 1024, 8} },
4441                                .block_erase = erase_block_82802ab,
4442                        },
4443                },
4444                .unlock         = unlock_82802ab,
4445                .write          = write_82802ab,
4446                .read           = read_memmapped,
4447                .voltage        = {3000, 3600},
4448        },
4449
4450        {
4451                .vendor         = "Intel",
4452                .name           = "82802AC",
4453                .bustype        = BUS_FWH,
4454                .manufacture_id = INTEL_ID,
4455                .model_id       = INTEL_82802AC,
4456                .total_size     = 1024,
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) */
4462                .block_erasers  =
4463                {
4464                        {
4465                                .eraseblocks = { {64 * 1024, 16} },
4466                                .block_erase = erase_block_82802ab,
4467                        },
4468                },
4469                .unlock         = unlock_82802ab,
4470                .write          = write_82802ab,
4471                .read           = read_memmapped,
4472                .voltage        = {3000, 3600},
4473        },
4474
4475        {
4476                .vendor         = "Macronix",
4477                .name           = "MX25L512",
4478                .bustype        = BUS_SPI,
4479                .manufacture_id = MACRONIX_ID,
4480                .model_id       = MACRONIX_MX25L512,
4481                .total_size     = 64,
4482                .page_size      = 256,
4483                .feature_bits   = FEATURE_WRSR_WREN,
4484                .tested         = TEST_UNTESTED,
4485                .probe          = probe_spi_rdid,
4486                .probe_timing   = TIMING_ZERO,
4487                .block_erasers  =
4488                {
4489                        {
4490                                .eraseblocks = { {4 * 1024, 16} },
4491                                .block_erase = spi_block_erase_20,
4492                        }, {
4493                                .eraseblocks = { {64 * 1024, 1} },
4494                                .block_erase = spi_block_erase_52,
4495                        }, {
4496                                .eraseblocks = { {64 * 1024, 1} },
4497                                .block_erase = spi_block_erase_d8,
4498                        }, {
4499                                .eraseblocks = { {64 * 1024, 1} },
4500                                .block_erase = spi_block_erase_60,
4501                        }, {
4502                                .eraseblocks = { {64 * 1024, 1} },
4503                                .block_erase = spi_block_erase_c7,
4504                        },
4505                },
4506                .unlock         = spi_disable_blockprotect,
4507                .write          = spi_chip_write_256,
4508                .read           = spi_chip_read,
4509                .voltage        = {2700, 3600},
4510        },
4511
4512        {
4513                .vendor         = "Macronix",
4514                .name           = "MX25L1005",
4515                .bustype        = BUS_SPI,
4516                .manufacture_id = MACRONIX_ID,
4517                .model_id       = MACRONIX_MX25L1005,
4518                .total_size     = 128,
4519                .page_size      = 256,
4520                .feature_bits   = FEATURE_WRSR_WREN,
4521                .tested         = TEST_UNTESTED,
4522                .probe          = probe_spi_rdid,
4523                .probe_timing   = TIMING_ZERO,
4524                .block_erasers  =
4525                {
4526                        {
4527                                .eraseblocks = { {4 * 1024, 32} },
4528                                .block_erase = spi_block_erase_20,
4529                        }, {
4530                                .eraseblocks = { {64 * 1024, 2} },
4531                                .block_erase = spi_block_erase_d8,
4532                        }, {
4533                                .eraseblocks = { {128 * 1024, 1} },
4534                                .block_erase = spi_block_erase_60,
4535                        }, {
4536                                .eraseblocks = { {128 * 1024, 1} },
4537                                .block_erase = spi_block_erase_c7,
4538                        },
4539                },
4540                .unlock         = spi_disable_blockprotect,
4541                .write          = spi_chip_write_256,
4542                .read           = spi_chip_read,
4543                .voltage        = {2700, 3600},
4544        },
4545
4546        {
4547                .vendor         = "Macronix",
4548                .name           = "MX25L2005",
4549                .bustype        = BUS_SPI,
4550                .manufacture_id = MACRONIX_ID,
4551                .model_id       = MACRONIX_MX25L2005,
4552                .total_size     = 256,
4553                .page_size      = 256,
4554                .feature_bits   = FEATURE_WRSR_WREN,
4555                .tested         = TEST_UNTESTED,
4556                .probe          = probe_spi_rdid,
4557                .probe_timing   = TIMING_ZERO,
4558                .block_erasers  =
4559                {
4560                        {
4561                                .eraseblocks = { {4 * 1024, 64} },
4562                                .block_erase = spi_block_erase_20,
4563                        }, {
4564                                .eraseblocks = { {64 * 1024, 4} },
4565                                .block_erase = spi_block_erase_52,
4566                        }, {
4567                                .eraseblocks = { {64 * 1024, 4} },
4568                                .block_erase = spi_block_erase_d8,
4569                        }, {
4570                                .eraseblocks = { {256 * 1024, 1} },
4571                                .block_erase = spi_block_erase_60,
4572                        }, {
4573                                .eraseblocks = { {256 * 1024, 1} },
4574                                .block_erase = spi_block_erase_c7,
4575                        },
4576                },
4577                .unlock         = spi_disable_blockprotect,
4578                .write          = spi_chip_write_256,
4579                .read           = spi_chip_read,
4580                .voltage        = {2700, 3600},
4581        },
4582
4583        {
4584                .vendor         = "Macronix",
4585                .name           = "MX25L4005",
4586                .bustype        = BUS_SPI,
4587                .manufacture_id = MACRONIX_ID,
4588                .model_id       = MACRONIX_MX25L4005,
4589                .total_size     = 512,
4590                .page_size      = 256,
4591                .feature_bits   = FEATURE_WRSR_WREN,
4592                .tested         = TEST_OK_PREW,
4593                .probe          = probe_spi_rdid,
4594                .probe_timing   = TIMING_ZERO,
4595                .block_erasers  =
4596                {
4597                        {
4598                                .eraseblocks = { {4 * 1024, 128} },
4599                                .block_erase = spi_block_erase_20,
4600                        }, {
4601                                .eraseblocks = { {64 * 1024, 8} },
4602                                .block_erase = spi_block_erase_52,
4603                        }, {
4604                                .eraseblocks = { {64 * 1024, 8} },
4605                                .block_erase = spi_block_erase_d8,
4606                        }, {
4607                                .eraseblocks = { {512 * 1024, 1} },
4608                                .block_erase = spi_block_erase_60,
4609                        }, {
4610                                .eraseblocks = { {512 * 1024, 1} },
4611                                .block_erase = spi_block_erase_c7,
4612                        },
4613                },
4614                .unlock         = spi_disable_blockprotect,
4615                .write          = spi_chip_write_256,
4616                .read           = spi_chip_read,
4617                .voltage        = {2700, 3600},
4618        },
4619
4620        {
4621                .vendor         = "Macronix",
4622                .name           = "MX25L8005",
4623                .bustype        = BUS_SPI,
4624                .manufacture_id = MACRONIX_ID,
4625                .model_id       = MACRONIX_MX25L8005,
4626                .total_size     = 1024,
4627                .page_size      = 256,
4628                .feature_bits   = FEATURE_WRSR_WREN,
4629                .tested         = TEST_OK_PREW,
4630                .probe          = probe_spi_rdid,
4631                .probe_timing   = TIMING_ZERO,
4632                .block_erasers  =
4633                {
4634                        {
4635                                .eraseblocks = { {4 * 1024, 256} },
4636                                .block_erase = spi_block_erase_20,
4637                        }, {
4638                                .eraseblocks = { {64 * 1024, 16} },
4639                                .block_erase = spi_block_erase_52,
4640                        }, {
4641                                .eraseblocks = { {64 * 1024, 16} },
4642                                .block_erase = spi_block_erase_d8,
4643                        }, {
4644                                .eraseblocks = { {1024 * 1024, 1} },
4645                                .block_erase = spi_block_erase_60,
4646                        }, {
4647                                .eraseblocks = { {1024 * 1024, 1} },
4648                                .block_erase = spi_block_erase_c7,
4649                        },
4650                },
4651                .unlock         = spi_disable_blockprotect,
4652                .write          = spi_chip_write_256,
4653                .read           = spi_chip_read,
4654                .voltage        = {2700, 3600},
4655        },
4656
4657        {
4658                .vendor         = "Macronix",
4659                .name           = "MX25L1605",
4660                .bustype        = BUS_SPI,
4661                .manufacture_id = MACRONIX_ID,
4662                .model_id       = MACRONIX_MX25L1605,
4663                .total_size     = 2048,
4664                .page_size      = 256,
4665                .feature_bits   = FEATURE_WRSR_WREN,
4666                .tested         = TEST_OK_PREW,
4667                .probe          = probe_spi_rdid,
4668                .probe_timing   = TIMING_ZERO,
4669                .block_erasers  =
4670                {
4671                        {
4672                                .eraseblocks = { {4 * 1024, 512} },
4673                                .block_erase = spi_block_erase_20,      /* This erase function has 64k blocksize for eLiteFlash */
4674                        }, {
4675                                .eraseblocks = { {64 * 1024, 32} },     /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
4676                                .block_erase = spi_block_erase_52,
4677                        }, {
4678                                .eraseblocks = { {64 * 1024, 32} },
4679                                .block_erase = spi_block_erase_d8,
4680                        }, {
4681                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4682                                .block_erase = spi_block_erase_60,
4683                        }, {
4684                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4685                                .block_erase = spi_block_erase_c7,
4686                        },
4687                },
4688                .unlock         = spi_disable_blockprotect,
4689                .write          = spi_chip_write_256,
4690                .read           = spi_chip_read,
4691                .voltage        = {2700, 3600},
4692        },
4693
4694        {
4695                .vendor         = "Macronix",
4696                .name           = "MX25L1635D",
4697                .bustype        = BUS_SPI,
4698                .manufacture_id = MACRONIX_ID,
4699                .model_id       = MACRONIX_MX25L1635D,
4700                .total_size     = 2048,
4701                .page_size      = 256,
4702                .feature_bits   = FEATURE_WRSR_WREN,
4703                .tested         = TEST_UNTESTED,
4704                .probe          = probe_spi_rdid,
4705                .probe_timing   = TIMING_ZERO,
4706                .block_erasers  =
4707                {
4708                        {
4709                                .eraseblocks = { {4 * 1024, 512} },
4710                                .block_erase = spi_block_erase_20,
4711                        }, {
4712                                .eraseblocks = { {64 * 1024, 32} },
4713                                .block_erase = spi_block_erase_d8,
4714                        }, {
4715                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4716                                .block_erase = spi_block_erase_60,
4717                        }, {
4718                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4719                                .block_erase = spi_block_erase_c7,
4720                        }
4721                },
4722                .unlock         = spi_disable_blockprotect,
4723                .write          = spi_chip_write_256,
4724                .read           = spi_chip_read,
4725                .voltage        = {2700, 3600},
4726        },
4727
4728        {
4729                .vendor         = "Macronix",
4730                .name           = "MX25L1635E",
4731                .bustype        = BUS_SPI,
4732                .manufacture_id = MACRONIX_ID,
4733                .model_id       = MACRONIX_MX25L1635E,
4734                .total_size     = 2048,
4735                .page_size      = 256,
4736                .feature_bits   = FEATURE_WRSR_WREN,
4737                .tested         = TEST_UNTESTED,
4738                .probe          = probe_spi_rdid,
4739                .probe_timing   = TIMING_ZERO,
4740                .block_erasers  =
4741                {
4742                        {
4743                                .eraseblocks = { {4 * 1024, 512} },
4744                                .block_erase = spi_block_erase_20,
4745                        }, {
4746                                .eraseblocks = { {64 * 1024, 32} },
4747                                .block_erase = spi_block_erase_d8,
4748                        }, {
4749                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4750                                .block_erase = spi_block_erase_60,
4751                        }, {
4752                                .eraseblocks = { {2 * 1024 * 1024, 1} },
4753                                .block_erase = spi_block_erase_c7,
4754                        }
4755                },
4756                .unlock         = spi_disable_blockprotect,
4757                .write          = spi_chip_write_256,
4758                .read           = spi_chip_read,
4759                .voltage        = {2700, 3600},
4760        },
4761
4762        {
4763                .vendor         = "Macronix",
4764                .name           = "MX25L3205",
4765                .bustype        = BUS_SPI,
4766                .manufacture_id = MACRONIX_ID,
4767                .model_id       = MACRONIX_MX25L3205,
4768                .total_size     = 4096,
4769                .page_size      = 256,
4770                .feature_bits   = FEATURE_WRSR_WREN,
4771                .tested         = TEST_OK_PREW,
4772                .probe          = probe_spi_rdid,
4773                .probe_timing   = TIMING_ZERO,
4774                .block_erasers  =
4775                {
4776                        {
4777                                .eraseblocks = { {4 * 1024, 1024} },
4778                                .block_erase = spi_block_erase_20,
4779                        }, {
4780                                .eraseblocks = { {4 * 1024, 1024} },
4781                                .block_erase = spi_block_erase_d8,
4782                        }, {
4783                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4784                                .block_erase = spi_block_erase_60,
4785                        }, {
4786                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4787                                .block_erase = spi_block_erase_c7,
4788                        },
4789                },
4790                .unlock         = spi_disable_blockprotect,
4791                .write          = spi_chip_write_256,
4792                .read           = spi_chip_read,
4793                .voltage        = {2700, 3600},
4794        },
4795
4796        {
4797                .vendor         = "Macronix",
4798                .name           = "MX25L3235D",
4799                .bustype        = BUS_SPI,
4800                .manufacture_id = MACRONIX_ID,
4801                .model_id       = MACRONIX_MX25L3235D,
4802                .total_size     = 4096,
4803                .page_size      = 256,
4804                .feature_bits   = FEATURE_WRSR_WREN,
4805                .tested         = TEST_UNTESTED,
4806                .probe          = probe_spi_rdid,
4807                .probe_timing   = TIMING_ZERO,
4808                .block_erasers  =
4809                {
4810                        {
4811                                .eraseblocks = { {4 * 1024, 1024} },
4812                                .block_erase = spi_block_erase_20,
4813                        }, {
4814                                .eraseblocks = { {64 * 1024, 64} },
4815                                .block_erase = spi_block_erase_d8,
4816                        }, {
4817                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4818                                .block_erase = spi_block_erase_60,
4819                        }, {
4820                                .eraseblocks = { {4 * 1024 * 1024, 1} },
4821                                .block_erase = spi_block_erase_c7,
4822                        }
4823                },
4824                .unlock         = spi_disable_blockprotect,
4825                .write          = spi_chip_write_256,
4826                .read           = spi_chip_read,
4827                .voltage        = {2700, 3600},
4828        },
4829
4830        {
4831                .vendor         = "Macronix",
4832                .name           = "MX25L6405",
4833                .bustype        = BUS_SPI,
4834                .manufacture_id = MACRONIX_ID,
4835                .model_id       = MACRONIX_MX25L6405,
4836                .total_size     = 8192,
4837                .page_size      = 256,
4838                .feature_bits   = FEATURE_WRSR_WREN,
4839                .tested         = TEST_OK_PREW,
4840                .probe          = probe_spi_rdid,
4841                .probe_timing   = TIMING_ZERO,
4842                .block_erasers  =
4843                {
4844                        {
4845                                .eraseblocks = { {64 * 1024, 128} },
4846                                .block_erase = spi_block_erase_20,
4847                        }, {
4848                                .eraseblocks = { {64 * 1024, 128} },
4849                                .block_erase = spi_block_erase_d8,
4850                        }, {
4851                                .eraseblocks = { {8 * 1024 * 1024, 1} },
4852                                .block_erase = spi_block_erase_60,
4853                        }, {
4854                                .eraseblocks = { {8 * 1024 * 1024, 1} },
4855                                .block_erase = spi_block_erase_c7,
4856                        }
4857                },
4858                .unlock         = spi_disable_blockprotect,
4859                .write          = spi_chip_write_256,
4860                .read           = spi_chip_read,
4861                .voltage        = {2700, 3600},
4862        },
4863
4864        {
4865                .vendor         = "Macronix",
4866                .name           = "MX25L12805",
4867                .bustype        = BUS_SPI,
4868                .manufacture_id = MACRONIX_ID,
4869                .model_id       = MACRONIX_MX25L12805,
4870                .total_size     = 16384,
4871                .page_size      = 256,
4872                .feature_bits   = FEATURE_WRSR_WREN,
4873                .tested         = TEST_UNTESTED,
4874                .probe          = probe_spi_rdid,
4875                .probe_timing   = TIMING_ZERO,
4876                .block_erasers  =
4877                {
4878                        {
4879                                .eraseblocks = { {4 * 1024, 4096} },
4880                                .block_erase = spi_block_erase_20,
4881                        }, {
4882                                .eraseblocks = { {64 * 1024, 256} },
4883                                .block_erase = spi_block_erase_d8,
4884                        }, {
4885                                .eraseblocks = { {16 * 1024 * 1024, 1} },
4886                                .block_erase = spi_block_erase_60,
4887                        }, {
4888                                .eraseblocks = { {16 * 1024 * 1024, 1} },
4889                                .block_erase = spi_block_erase_c7,
4890                        }
4891                },
4892                .unlock         = spi_disable_blockprotect,
4893                .write          = spi_chip_write_256,
4894                .read           = spi_chip_read,
4895                .voltage        = {2700, 3600},
4896        },
4897
4898        {
4899                .vendor         = "Macronix",
4900                .name           = "MX29F001B",
4901                .bustype        = BUS_PARALLEL,
4902                .manufacture_id = MACRONIX_ID,
4903                .model_id       = MACRONIX_MX29F001B,
4904                .total_size     = 128,
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,
4910                .block_erasers  =
4911                {
4912                        {
4913                                .eraseblocks = { 
4914                                        {8 * 1024, 1},
4915                                        {4 * 1024, 2},
4916                                        {8 * 1024, 2},
4917                                        {32 * 1024, 1},
4918                                        {64 * 1024, 1},
4919                                },
4920                                .block_erase = erase_sector_jedec,
4921                        }, {
4922                                .eraseblocks = { {128 * 1024, 1} },
4923                                .block_erase = erase_chip_block_jedec,
4924                        }
4925                },
4926                .write          = write_jedec_1,
4927                .read           = read_memmapped,
4928                .voltage        = {4500, 5500},
4929        },
4930
4931        {
4932                .vendor         = "Macronix",
4933                .name           = "MX29F001T",
4934                .bustype        = BUS_PARALLEL,
4935                .manufacture_id = MACRONIX_ID,
4936                .model_id       = MACRONIX_MX29F001T,
4937                .total_size     = 128,
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,
4943                .block_erasers  =
4944                {
4945                        {
4946                                .eraseblocks = { 
4947                                        {64 * 1024, 1},
4948                                        {32 * 1024, 1},
4949                                        {8 * 1024, 2},
4950                                        {4 * 1024, 2},
4951                                        {8 * 1024, 1},
4952                                },
4953                                .block_erase = erase_sector_jedec,
4954                        }, {
4955                                .eraseblocks = { {128 * 1024, 1} },
4956                                .block_erase = erase_chip_block_jedec,
4957                        }
4958                },
4959                .write          = write_jedec_1,
4960                .read           = read_memmapped,
4961                .voltage        = {4500, 5500},
4962        },
4963
4964        {
4965                .vendor         = "Macronix",
4966                .name           = "MX29F002(N)B",
4967                .bustype        = BUS_PARALLEL,
4968                .manufacture_id = MACRONIX_ID,
4969                .model_id       = MACRONIX_MX29F002B,
4970                .total_size     = 256,
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,
4976                .block_erasers  =
4977                {
4978                        {
4979                                .eraseblocks = {
4980                                        {16 * 1024, 1},
4981                                        {8 * 1024, 2},
4982                                        {32 * 1024, 1},
4983                                        {64 * 1024, 3},
4984                                },
4985                                .block_erase = erase_sector_jedec,
4986                        }, {
4987                                .eraseblocks = { {256 * 1024, 1} },
4988                                .block_erase = erase_chip_block_jedec,
4989                        },
4990                },
4991                .write          = write_jedec_1,
4992                .read           = read_memmapped,
4993                .voltage        = {4500, 5500},
4994        },
4995
4996        {
4997                .vendor         = "Macronix",
4998                .name           = "MX29F002(N)T",
4999                .bustype        = BUS_PARALLEL,
5000                .manufacture_id = MACRONIX_ID,
5001                .model_id       = MACRONIX_MX29F002T,
5002                .total_size     = 256,
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,
5008                .block_erasers  =
5009                {
5010                        {
5011                                .eraseblocks = {
5012                                        {64 * 1024, 3},
5013                                        {32 * 1024, 1},
5014                                        {8 * 1024, 2},
5015                                        {16 * 1024, 1},
5016                                },
5017                                .block_erase = erase_sector_jedec,
5018                        }, {
5019                                .eraseblocks = { {256 * 1024, 1} },
5020                                .block_erase = erase_chip_block_jedec,
5021                        },
5022                },
5023                .write          = write_jedec_1,
5024                .read           = read_memmapped,
5025                .voltage        = {4500, 5500},
5026        },
5027
5028        {
5029                .vendor         = "Macronix",
5030                .name           = "MX29F040",
5031                .bustype        = BUS_PARALLEL,
5032                .manufacture_id = MACRONIX_ID,
5033                .model_id       = MACRONIX_MX29F040,
5034                .total_size     = 512,
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,
5040                .block_erasers  =
5041                {
5042                        {
5043                                .eraseblocks = { {64 * 1024, 8} },
5044                                .block_erase = erase_sector_jedec,
5045                        }, {
5046                                .eraseblocks = { {512 * 1024, 1} },
5047                                .block_erase = erase_chip_block_jedec,
5048                        },
5049                },
5050                .write          = write_jedec_1,
5051                .read           = read_memmapped,
5052                .voltage        = {4500, 5500},
5053        },
5054
5055        {
5056                .vendor         = "Macronix",
5057                .name           = "MX29LV040",
5058                .bustype        = BUS_PARALLEL,
5059                .manufacture_id = MACRONIX_ID,
5060                .model_id       = MACRONIX_MX29LV040,
5061                .total_size     = 512,
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,
5067                .block_erasers  =
5068                {
5069                        {
5070                                .eraseblocks = { {64 * 1024, 8}, },
5071                                .block_erase = erase_sector_jedec,
5072                        }, {
5073                                .eraseblocks = { {512 * 1024, 1} },
5074                                .block_erase = erase_chip_block_jedec,
5075                        },
5076                },
5077                .write          = write_jedec_1,
5078                .read           = read_memmapped,
5079                .voltage        = {2700, 3600},
5080        },
5081
5082        {
5083                .vendor         = "MoselVitelic",
5084                .name           = "V29C51000B",
5085                .bustype        = BUS_PARALLEL,
5086                .manufacture_id = SYNCMOS_MVC_ID,
5087                .model_id       = MVC_V29C51000B,
5088                .total_size     = 64,
5089                .page_size      = 512,
5090                .feature_bits   = FEATURE_EITHER_RESET,
5091                .tested         = TEST_UNTESTED,
5092                .probe          = probe_jedec,
5093                .probe_timing   = TIMING_ZERO,
5094                .block_erasers  =
5095                {
5096                        {
5097                                .eraseblocks = { {512, 128} },
5098                                .block_erase = erase_sector_jedec,
5099                        }, {
5100                                .eraseblocks = { {64 * 1024, 1} },
5101                                .block_erase = erase_chip_block_jedec,
5102                        },
5103                },
5104                .write          = write_jedec_1,
5105                .read           = read_memmapped,
5106                .voltage        = {4500, 5500},
5107        },
5108
5109        {
5110                .vendor         = "MoselVitelic",
5111                .name           = "V29C51000T",
5112                .bustype        = BUS_PARALLEL,
5113                .manufacture_id = SYNCMOS_MVC_ID,
5114                .model_id       = MVC_V29C51000T,
5115                .total_size     = 64,
5116                .page_size      = 512,
5117                .feature_bits   = FEATURE_EITHER_RESET,
5118                .tested         = TEST_UNTESTED,
5119                .probe          = probe_jedec,
5120                .probe_timing   = TIMING_ZERO,
5121                .block_erasers  =
5122                {
5123                        {
5124                                .eraseblocks = { {512, 128} },
5125                                .block_erase = erase_sector_jedec,
5126                        }, {
5127                                .eraseblocks = { {64 * 1024, 1} },
5128                                .block_erase = erase_chip_block_jedec,
5129                        },
5130                },
5131                .write          = write_jedec_1,
5132                .read           = read_memmapped,
5133                .voltage        = {4500, 5500},
5134        },
5135
5136        {
5137                .vendor         = "MoselVitelic",
5138                .name           = "V29C51400B",
5139                .bustype        = BUS_PARALLEL,
5140                .manufacture_id = SYNCMOS_MVC_ID,
5141                .model_id       = MVC_V29C51400B,
5142                .total_size     = 512,
5143                .page_size      = 1024,
5144                .feature_bits   = FEATURE_EITHER_RESET,
5145                .tested         = TEST_UNTESTED,
5146                .probe          = probe_jedec,
5147                .probe_timing   = TIMING_ZERO,
5148                .block_erasers  =
5149                {
5150                        {
5151                                .eraseblocks = { {1024, 512} },
5152                                .block_erase = erase_sector_jedec,
5153                        }, {
5154                                .eraseblocks = { {512 * 1024, 1} },
5155                                .block_erase = erase_chip_block_jedec,
5156                        },
5157                },
5158                .write          = write_jedec_1,
5159                .read           = read_memmapped,
5160                .voltage        = {4500, 5500},
5161        },
5162
5163        {
5164                .vendor         = "MoselVitelic",
5165                .name           = "V29C51400T",
5166                .bustype        = BUS_PARALLEL,
5167                .manufacture_id = SYNCMOS_MVC_ID,
5168                .model_id       = MVC_V29C51400T,
5169                .total_size     = 512,
5170                .page_size      = 1024,
5171                .feature_bits   = FEATURE_EITHER_RESET,
5172                .tested         = TEST_UNTESTED,
5173                .probe          = probe_jedec,
5174                .probe_timing   = TIMING_ZERO,
5175                .block_erasers  =
5176                {
5177                        {
5178                                .eraseblocks = { {1024, 512} },
5179                                .block_erase = erase_sector_jedec,
5180                        }, {
5181                                .eraseblocks = { {512 * 1024, 1} },
5182                                .block_erase = erase_chip_block_jedec,
5183                        },
5184                },
5185                .write          = write_jedec_1,
5186                .read           = read_memmapped,
5187                .voltage        = {4500, 5500},
5188        },
5189
5190        {
5191                .vendor         = "MoselVitelic",
5192                .name           = "V29LC51000",
5193                .bustype        = BUS_PARALLEL,
5194                .manufacture_id = SYNCMOS_MVC_ID,
5195                .model_id       = MVC_V29LC51000,
5196                .total_size     = 64,
5197                .page_size      = 512,
5198                .feature_bits   = FEATURE_EITHER_RESET,
5199                .tested         = TEST_UNTESTED,
5200                .probe          = probe_jedec,
5201                .probe_timing   = TIMING_ZERO,
5202                .block_erasers  =
5203                {
5204                        {
5205                                .eraseblocks = { {512, 128} },
5206                                .block_erase = erase_sector_jedec,
5207                        }, {
5208                                .eraseblocks = { {64 * 1024, 1} },
5209                                .block_erase = erase_chip_block_jedec,
5210                        },
5211                },
5212                .write          = write_jedec_1,
5213                .read           = read_memmapped,
5214                .voltage        = {4500, 5500},
5215        },
5216
5217        {
5218                .vendor         = "MoselVitelic",
5219                .name           = "V29LC51001",
5220                .bustype        = BUS_PARALLEL,
5221                .manufacture_id = SYNCMOS_MVC_ID,
5222                .model_id       = MVC_V29LC51001,
5223                .total_size     = 128,
5224                .page_size      = 512,
5225                .feature_bits   = FEATURE_EITHER_RESET,
5226                .tested         = TEST_UNTESTED,
5227                .probe          = probe_jedec,
5228                .probe_timing   = TIMING_ZERO,
5229                .block_erasers  =
5230                {
5231                        {
5232                                .eraseblocks = { {512, 256} },
5233                                .block_erase = erase_sector_jedec,
5234                        }, {
5235                                .eraseblocks = { {128 * 1024, 1} },
5236                                .block_erase = erase_chip_block_jedec,
5237                        },
5238                },
5239                .write          = write_jedec_1,
5240                .read           = read_memmapped,
5241                .voltage        = {4500, 5500},
5242        },
5243
5244        {
5245                .vendor         = "MoselVitelic",
5246                .name           = "V29LC51002",
5247                .bustype        = BUS_PARALLEL,
5248                .manufacture_id = SYNCMOS_MVC_ID,
5249                .model_id       = MVC_V29LC51002,
5250                .total_size     = 256,
5251                .page_size      = 512,
5252                .feature_bits   = FEATURE_EITHER_RESET,
5253                .tested         = TEST_UNTESTED,
5254                .probe          = probe_jedec,
5255                .probe_timing   = TIMING_ZERO,
5256                .block_erasers  =
5257                {
5258                        {
5259                                .eraseblocks = { {512, 512} },
5260                                .block_erase = erase_sector_jedec,
5261                        }, {
5262                                .eraseblocks = { {256 * 1024, 1} },
5263                                .block_erase = erase_chip_block_jedec,
5264                        },
5265                },
5266                .write          = write_jedec_1,
5267                .read           = read_memmapped,
5268                .voltage        = {4500, 5500},
5269        },
5270
5271        {
5272                .vendor         = "Numonyx",
5273                .name           = "M25PE10",
5274                .bustype        = BUS_SPI,
5275                .manufacture_id = ST_ID,
5276                .model_id       = ST_M25PE10,
5277                .total_size     = 128,
5278                .page_size      = 256,
5279                .feature_bits   = FEATURE_WRSR_WREN,
5280                .tested         = TEST_UNTESTED,
5281                .probe          = probe_spi_rdid,
5282                .probe_timing   = TIMING_ZERO,
5283                .block_erasers  =
5284                {
5285                        {
5286                                .eraseblocks = { {4 * 1024, 32} },
5287                                .block_erase = spi_block_erase_20,
5288                        }, {
5289                                .eraseblocks = { {64 * 1024, 2} },
5290                                .block_erase = spi_block_erase_d8,
5291                        }, {
5292                                .eraseblocks = { {128 * 1024, 1} },
5293                                .block_erase = spi_block_erase_c7,
5294                        }
5295                },
5296                .unlock         = spi_disable_blockprotect,
5297                .write          = spi_chip_write_256,
5298                .read           = spi_chip_read,
5299                .voltage        = {2700, 3600},
5300        },
5301
5302        {
5303                .vendor         = "Numonyx",
5304                .name           = "M25PE20",
5305                .bustype        = BUS_SPI,
5306                .manufacture_id = ST_ID,
5307                .model_id       = ST_M25PE20,
5308                .total_size     = 256,
5309                .page_size      = 256,
5310                .feature_bits   = FEATURE_WRSR_WREN,
5311                .tested         = TEST_UNTESTED,
5312                .probe          = probe_spi_rdid,
5313                .probe_timing   = TIMING_ZERO,
5314                .block_erasers  =
5315                {
5316                        {
5317                                .eraseblocks = { {4 * 1024, 64} },
5318                                .block_erase = spi_block_erase_20,
5319                        }, {
5320                                .eraseblocks = { {64 * 1024, 4} },
5321                                .block_erase = spi_block_erase_d8,
5322                        }, {
5323                                .eraseblocks = { {256 * 1024, 1} },
5324                                .block_erase = spi_block_erase_c7,
5325                        }
5326                },
5327                .unlock         = spi_disable_blockprotect,
5328                .write          = spi_chip_write_256,
5329                .read           = spi_chip_read,
5330                .voltage        = {2700, 3600},
5331        },
5332
5333        {
5334                .vendor         = "Numonyx",
5335                .name           = "M25PE40",
5336                .bustype        = BUS_SPI,
5337                .manufacture_id = ST_ID,
5338                .model_id       = ST_M25PE40,
5339                .total_size     = 512,
5340                .page_size      = 256,
5341                .feature_bits   = FEATURE_WRSR_WREN,
5342                .tested         = TEST_UNTESTED,
5343                .probe          = probe_spi_rdid,
5344                .probe_timing   = TIMING_ZERO,
5345                .block_erasers  =
5346                {
5347                        {
5348                                .eraseblocks = { {4 * 1024, 128} },
5349                                .block_erase = spi_block_erase_20,
5350                        }, {
5351                                .eraseblocks = { {64 * 1024, 8} },
5352                                .block_erase = spi_block_erase_d8,
5353                        }, {
5354                                .eraseblocks = { {512 * 1024, 1} },
5355                                .block_erase = spi_block_erase_c7,
5356                        }
5357                },
5358                .unlock         = spi_disable_blockprotect,
5359                .write          = spi_chip_write_256,
5360                .read           = spi_chip_read,
5361                .voltage        = {2700, 3600},
5362        },
5363
5364        {
5365                .vendor         = "Numonyx",
5366                .name           = "M25PE80",
5367                .bustype        = BUS_SPI,
5368                .manufacture_id = ST_ID,
5369                .model_id       = ST_M25PE80,
5370                .total_size     = 1024,
5371                .page_size      = 256,
5372                .feature_bits   = FEATURE_WRSR_WREN,
5373                .tested         = TEST_OK_PREW,
5374                .probe          = probe_spi_rdid,
5375                .probe_timing   = TIMING_ZERO,
5376                .block_erasers  =
5377                {
5378                        {
5379                                .eraseblocks = { {4 * 1024, 256} },
5380                                .block_erase = spi_block_erase_20,
5381                        }, {
5382                                .eraseblocks = { {64 * 1024, 16} },
5383                                .block_erase = spi_block_erase_d8,
5384                        }, {
5385                                .eraseblocks = { {1024 * 1024, 1} },
5386                                .block_erase = spi_block_erase_c7,
5387                        }
5388                },
5389                .unlock         = spi_disable_blockprotect,
5390                .write          = spi_chip_write_256,
5391                .read           = spi_chip_read,
5392                .voltage        = {2700, 3600},
5393        },
5394
5395        {
5396                .vendor         = "Numonyx",
5397                .name           = "M25PE16",
5398                .bustype        = BUS_SPI,
5399                .manufacture_id = ST_ID,
5400                .model_id       = ST_M25PE16,
5401                .total_size     = 2048,
5402                .page_size      = 256,
5403                .feature_bits   = FEATURE_WRSR_WREN,
5404                .tested         = TEST_UNTESTED,
5405                .probe          = probe_spi_rdid,
5406                .probe_timing   = TIMING_ZERO,
5407                .block_erasers  =
5408                {
5409                        {
5410                                .eraseblocks = { {4 * 1024, 512} },
5411                                .block_erase = spi_block_erase_20,
5412                        }, {
5413                                .eraseblocks = { {64 * 1024, 32} },
5414                                .block_erase = spi_block_erase_d8,
5415                        }, {
5416                                .eraseblocks = { {2 * 1024 * 1024, 1} },
5417                                .block_erase = spi_block_erase_c7,
5418                        }
5419                },
5420                .unlock         = spi_disable_blockprotect,
5421                .write          = spi_chip_write_256,
5422                .read           = spi_chip_read,
5423                .voltage        = {2700, 3600},
5424        },
5425
5426        {
5427                .vendor         = "Numonyx",
5428                .name           = "N25Q064",
5429                .bustype        = BUS_SPI,
5430                .manufacture_id = ST_ID,
5431                .model_id       = ST_N25Q064,
5432                .total_size     = 8192,
5433                .page_size      = 256,
5434                .tested         = TEST_OK_PREW,
5435                .probe          = probe_spi_rdid,
5436                .probe_timing   = TIMING_ZERO,
5437                .block_erasers  =
5438                {
5439                        {
5440                                .eraseblocks = { {4 * 1024, 2048 } },
5441                                .block_erase = spi_block_erase_20,
5442                        }, {
5443                                .eraseblocks = { {64 * 1024, 128} },
5444                                .block_erase = spi_block_erase_d8,
5445                        }, {
5446                                .eraseblocks = { {8 * 1024 * 1024, 1} },
5447                                .block_erase = spi_block_erase_c7,
5448                        }
5449                },
5450                .unlock         = spi_disable_blockprotect,
5451                .write          = spi_chip_write_256,
5452                .read           = spi_chip_read,
5453        },
5454
5455        {
5456                .vendor         = "PMC",
5457                .name           = "Pm25LV010",
5458                .bustype        = BUS_SPI,
5459                .manufacture_id = PMC_ID,
5460                .model_id       = PMC_PM25LV010,
5461                .total_size     = 128,
5462                .page_size      = 256,
5463                .feature_bits   = FEATURE_WRSR_WREN,
5464                .tested         = TEST_UNTESTED,
5465                .probe          = probe_spi_rdid,
5466                .probe_timing   = TIMING_ZERO,
5467                .block_erasers  =
5468                {
5469                        {
5470                                .eraseblocks = { {4 * 1024, 32} },
5471                                .block_erase = spi_block_erase_d7,
5472                        }, {
5473                                .eraseblocks = { {32 * 1024, 4} },
5474                                .block_erase = spi_block_erase_d8,
5475                        }, {
5476                                .eraseblocks = { {128 * 1024, 1} },
5477                                .block_erase = spi_block_erase_c7,
5478                        }
5479                },
5480                .unlock         = spi_disable_blockprotect,
5481                .write          = spi_chip_write_256,
5482                .read           = spi_chip_read,
5483                .voltage        = {2700, 3600},
5484        },
5485
5486        {
5487                .vendor         = "PMC",
5488                .name           = "Pm25LV016B",
5489                .bustype        = BUS_SPI,
5490                .manufacture_id = PMC_ID,
5491                .model_id       = PMC_PM25LV016B,
5492                .total_size     = 2048,
5493                .page_size      = 256,
5494                .feature_bits   = FEATURE_WRSR_WREN,
5495                .tested         = TEST_UNTESTED,
5496                .probe          = probe_spi_rdid,
5497                .probe_timing   = TIMING_ZERO,
5498                .block_erasers  =
5499                {
5500                        {
5501                                .eraseblocks = { {4 * 1024, 512} },
5502                                .block_erase = spi_block_erase_d7,
5503                        }, {
5504                                .eraseblocks = { {4 * 1024, 512} },
5505                                .block_erase = spi_block_erase_20,
5506                        }, {
5507                                .eraseblocks = { {64 * 1024, 32} },
5508                                .block_erase = spi_block_erase_d8,
5509                        }, {
5510                                .eraseblocks = { {2 * 1024 * 1024, 1} },
5511                                .block_erase = spi_block_erase_60,
5512                        }, {
5513                                .eraseblocks = { {2 * 1024 * 1024, 1} },
5514                                .block_erase = spi_block_erase_c7,
5515                        }
5516                },
5517                .unlock         = spi_disable_blockprotect,
5518                .write          = spi_chip_write_256,
5519                .read           = spi_chip_read,
5520                .voltage        = {2700, 3600},
5521        },
5522
5523        {
5524                .vendor         = "PMC",
5525                .name           = "Pm25LV020",
5526                .bustype        = BUS_SPI,
5527                .manufacture_id = PMC_ID,
5528                .model_id       = PMC_PM25LV020,
5529                .total_size     = 256,
5530                .page_size      = 256,
5531                .feature_bits   = FEATURE_WRSR_WREN,
5532                .tested         = TEST_UNTESTED,
5533                .probe          = probe_spi_rdid,
5534                .probe_timing   = TIMING_ZERO,
5535                .block_erasers  =
5536                {
5537                        {
5538                                .eraseblocks = { {4 * 1024, 64} },
5539                                .block_erase = spi_block_erase_d7,
5540                        }, {
5541                                .eraseblocks = { {64 * 1024, 4} },
5542                                .block_erase = spi_block_erase_d8,
5543                        }, {
5544                                .eraseblocks = { {256 * 1024, 1} },
5545                                .block_erase = spi_block_erase_c7,
5546                        }
5547                },
5548                .unlock         = spi_disable_blockprotect,
5549                .write          = spi_chip_write_256,
5550                .read           = spi_chip_read,
5551                .voltage        = {2700, 3600},
5552        },
5553
5554        {
5555                .vendor         = "PMC",
5556                .name           = "Pm25LV040",
5557                .bustype        = BUS_SPI,
5558                .manufacture_id = PMC_ID,
5559                .model_id       = PMC_PM25LV040,
5560                .total_size     = 512,
5561                .page_size      = 256,
5562                .feature_bits   = FEATURE_WRSR_WREN,
5563                .tested         = TEST_OK_PREW,
5564                .probe          = probe_spi_rdid,
5565                .probe_timing   = TIMING_ZERO,
5566                .block_erasers  =
5567                {
5568                        {
5569                                .eraseblocks = { {4 * 1024, 128} },
5570                                .block_erase = spi_block_erase_d7,
5571                        }, {
5572                                .eraseblocks = { {64 * 1024, 8} },
5573                                .block_erase = spi_block_erase_d8,
5574                        }, {
5575                                .eraseblocks = { {512 * 1024, 1} },
5576                                .block_erase = spi_block_erase_c7,
5577                        }
5578                },
5579                .unlock         = spi_disable_blockprotect,
5580                .write          = spi_chip_write_256,
5581                .read           = spi_chip_read,
5582                .voltage        = {2700, 3600},
5583        },
5584
5585        {
5586                .vendor         = "PMC",
5587                .name           = "Pm25LV080B",
5588                .bustype        = BUS_SPI,
5589                .manufacture_id = PMC_ID,
5590                .model_id       = PMC_PM25LV080B,
5591                .total_size     = 1024,
5592                .page_size      = 256,
5593                .feature_bits   = FEATURE_WRSR_WREN,
5594                .tested         = TEST_UNTESTED,
5595                .probe          = probe_spi_rdid,
5596                .probe_timing   = TIMING_ZERO,
5597                .block_erasers  =
5598                {
5599                        {
5600                                .eraseblocks = { {4 * 1024, 256} },
5601                                .block_erase = spi_block_erase_d7,
5602                        }, {
5603                                .eraseblocks = { {4 * 1024, 256} },
5604                                .block_erase = spi_block_erase_20,
5605                        }, {
5606                                .eraseblocks = { {64 * 1024, 16} },
5607                                .block_erase = spi_block_erase_d8,
5608                        }, {
5609                                .eraseblocks = { {1024 * 1024, 1} },
5610                                .block_erase = spi_block_erase_60,
5611                        }, {
5612                                .eraseblocks = { {1024 * 1024, 1} },
5613                                .block_erase = spi_block_erase_c7,
5614                        }
5615                },
5616                .unlock         = spi_disable_blockprotect,
5617                .write          = spi_chip_write_256,
5618                .read           = spi_chip_read,
5619                .voltage        = {2700, 3600},
5620        },
5621
5622        {
5623                .vendor         = "PMC",
5624                .name           = "Pm25LV512",
5625                .bustype        = BUS_SPI,
5626                .manufacture_id = PMC_ID,
5627                .model_id       = PMC_PM25LV512,
5628                .total_size     = 64,
5629                .page_size      = 256,
5630                .feature_bits   = FEATURE_WRSR_WREN,
5631                .tested         = TEST_UNTESTED,
5632                .probe          = probe_spi_rdid,
5633                .probe_timing   = TIMING_ZERO,
5634                .block_erasers  =
5635                {
5636                        {
5637                                .eraseblocks = { {4 * 1024, 16} },
5638                                .block_erase = spi_block_erase_d7,
5639                        }, {
5640                                .eraseblocks = { {32 * 1024, 2} },
5641                                .block_erase = spi_block_erase_d8,
5642                        }, {
5643                                .eraseblocks = { {64 * 1024, 1} },
5644                                .block_erase = spi_block_erase_c7,
5645                        }
5646                },
5647                .unlock         = spi_disable_blockprotect,
5648                .write          = spi_chip_write_256,
5649                .read           = spi_chip_read,
5650                .voltage        = {2700, 3600},
5651        },
5652
5653        {
5654                .vendor         = "PMC",
5655                .name           = "Pm29F002T",
5656                .bustype        = BUS_PARALLEL,
5657                .manufacture_id = PMC_ID_NOPREFIX,
5658                .model_id       = PMC_PM29F002T,
5659                .total_size     = 256,
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,
5665                .block_erasers  =
5666                {
5667                        {
5668                                .eraseblocks = {
5669                                        {128 * 1024, 1},
5670                                        {96 * 1024, 1},
5671                                        {8 * 1024, 2},
5672                                        {16 * 1024, 1},
5673                                },
5674                                .block_erase = erase_sector_jedec,
5675                        }, {
5676                                .eraseblocks = { {256 * 1024, 1} },
5677                                .block_erase = erase_chip_block_jedec,
5678                        },
5679                },
5680                .write          = write_jedec_1,
5681                .read           = read_memmapped,
5682                .voltage        = {4500, 5500},
5683        },
5684
5685        {
5686                .vendor         = "PMC",
5687                .name           = "Pm29F002B",
5688                .bustype        = BUS_PARALLEL,
5689                .manufacture_id = PMC_ID_NOPREFIX,
5690                .model_id       = PMC_PM29F002B,
5691                .total_size     = 256,
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, 
5697                .block_erasers  =
5698                {
5699                        {
5700                                .eraseblocks = {
5701                                        {16 * 1024, 1},
5702                                        {8 * 1024, 2},
5703                                        {96 * 1024, 1},
5704                                        {128 * 1024, 1},
5705                                },
5706                                .block_erase = erase_sector_jedec,
5707                        }, {
5708                                .eraseblocks = { {256 * 1024, 1} },
5709                                .block_erase = erase_chip_block_jedec,
5710                        },
5711                },
5712                .write          = write_jedec_1,
5713                .read           = read_memmapped,
5714                .voltage        = {4500, 5500},
5715        },
5716
5717        {
5718                .vendor         = "PMC",
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 */
5723                .total_size     = 128,
5724                .page_size      = 4096,
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 */
5729                .block_erasers  =
5730                {
5731                        {
5732                                .eraseblocks = { {4 * 1024, 32} },
5733                                .block_erase = erase_sector_jedec,
5734                        }, {
5735                                .eraseblocks = { {64 * 1024, 2} },
5736                                .block_erase = erase_block_jedec,
5737                        }, {
5738                                .eraseblocks = { {128 * 1024, 1} },
5739                                .block_erase = erase_chip_block_jedec,
5740                        }
5741                },
5742                .write          = write_jedec_1,
5743                .read           = read_memmapped,
5744                .voltage        = {2700, 3600},
5745        },
5746
5747        {
5748                .vendor         = "PMC",
5749                .name           = "Pm39LV020",
5750                .bustype        = BUS_PARALLEL,
5751                .manufacture_id = PMC_ID_NOPREFIX,
5752                .model_id       = PMC_PM39LV020,
5753                .total_size     = 256,
5754                .page_size      = 4096,
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 */
5759                .block_erasers =
5760                {
5761                        {
5762                                .eraseblocks = { {4 * 1024, 64} },
5763                                .block_erase = erase_sector_jedec,
5764                        }, {
5765                                .eraseblocks = { {64 * 1024, 4} },
5766                                .block_erase = erase_block_jedec,
5767                        }, {
5768                                .eraseblocks = { {256 * 1024, 1} },
5769                                .block_erase = erase_chip_block_jedec,
5770                        }
5771                },
5772                .write          = write_jedec_1,
5773                .read           = read_memmapped,
5774                .voltage        = {2700, 3600},
5775        },
5776
5777        {
5778                .vendor         = "PMC",
5779                .name           = "Pm39LV040",
5780                .bustype        = BUS_PARALLEL,
5781                .manufacture_id = PMC_ID_NOPREFIX,
5782                .model_id       = PMC_PM39LV040,
5783                .total_size     = 512,
5784                .page_size      = 4096,
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 */
5789                .block_erasers =
5790                {
5791                        {
5792                                .eraseblocks = { {4 * 1024, 128} },
5793                                .block_erase = erase_sector_jedec,
5794                        }, {
5795                                .eraseblocks = { {64 * 1024, 8} },
5796                                .block_erase = erase_block_jedec,
5797                        }, {
5798                                .eraseblocks = { {512 * 1024, 1} },
5799                                .block_erase = erase_chip_block_jedec,
5800                        }
5801                },
5802                .write          = write_jedec_1,
5803                .read           = read_memmapped,
5804                .voltage        = {2700, 3600},
5805        },
5806       
5807        {
5808                .vendor         = "PMC",
5809                .name           = "Pm49FL002",
5810                .bustype        = BUS_LPC | BUS_FWH, /* A/A Mux */
5811                .manufacture_id = PMC_ID_NOPREFIX,
5812                .model_id       = PMC_PM49FL002,
5813                .total_size     = 256,
5814                .page_size      = 16 * 1024,
5815                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5816                .tested         = TEST_OK_PREW,
5817                .probe          = probe_jedec,
5818                .probe_timing   = TIMING_ZERO,  /* routine is wrapper to probe_jedec (pm49fl00x.c) */
5819                .block_erasers  =
5820                {
5821                        {
5822                                .eraseblocks = { {4 * 1024, 64} },
5823                                .block_erase = erase_sector_jedec,
5824                        }, {
5825                                .eraseblocks = { {16 * 1024, 16} },
5826                                .block_erase = erase_block_jedec,
5827                        }, {
5828                                .eraseblocks = { {256 * 1024, 1} },
5829                                .block_erase = erase_chip_block_jedec,
5830                        }
5831                },
5832                .unlock         = unlock_49fl00x,
5833                .write          = write_jedec_1,
5834                .read           = read_memmapped,
5835                .voltage        = {3000, 3600},
5836        },
5837
5838        {
5839                .vendor         = "PMC",
5840                .name           = "Pm49FL004",
5841                .bustype        = BUS_LPC | BUS_FWH, /* A/A Mux */
5842                .manufacture_id = PMC_ID_NOPREFIX,
5843                .model_id       = PMC_PM49FL004,
5844                .total_size     = 512,
5845                .page_size      = 64 * 1024,
5846                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
5847                .tested         = TEST_OK_PREW,
5848                .probe          = probe_jedec,
5849                .probe_timing   = TIMING_ZERO,  /* routine is wrapper to probe_jedec (pm49fl00x.c) */
5850                .block_erasers  =
5851                {
5852                        {
5853                                .eraseblocks = { {4 * 1024, 128} },
5854                                .block_erase = erase_sector_jedec,
5855                        }, {
5856                                .eraseblocks = { {64 * 1024, 8} },
5857                                .block_erase = erase_block_jedec,
5858                        }, {
5859                                .eraseblocks = { {512 * 1024, 1} },
5860                                .block_erase = erase_chip_block_jedec,
5861                        }
5862                },
5863                .unlock         = unlock_49fl00x,
5864                .write          = write_jedec_1,
5865                .read           = read_memmapped,
5866                .voltage        = {3000, 3600},
5867        },
5868
5869        {
5870                .vendor         = "Sanyo",
5871                .name           = "LF25FW203A",
5872                .bustype        = BUS_SPI,
5873                .manufacture_id = SANYO_ID,
5874                .model_id       = SANYO_LE25FW203A,
5875                .total_size     = 2048,
5876                .page_size      = 256,
5877                .tested         = TEST_UNTESTED,
5878                .probe          = probe_spi_rdid,
5879                .probe_timing   = TIMING_ZERO,
5880                .block_erasers  =
5881                {
5882                        {
5883                                .eraseblocks = { {64 * 1024, 32} },
5884                                .block_erase = spi_block_erase_d8,
5885                        },      {
5886                                .eraseblocks = { {2 * 1024 * 1024, 1} },
5887                                .block_erase = spi_block_erase_c7,
5888                        }
5889                },
5890                .unlock         = spi_disable_blockprotect,
5891                .write          = spi_chip_write_256,
5892                .read           = spi_chip_read,
5893        },
5894
5895        {
5896                .vendor         = "Sharp",
5897                .name           = "LH28F008BJT-BTLZ1",
5898                .bustype        = BUS_PARALLEL,
5899                .manufacture_id = SHARP_ID,
5900                .model_id       = SHARP_LH28F008BJxxPB,
5901                .total_size     = 1024,
5902                .page_size      = 64 * 1024,
5903                .tested         = TEST_OK_PREW,
5904                .probe          = probe_82802ab,
5905                .probe_timing   = TIMING_ZERO,
5906                .block_erasers  =
5907                {
5908                        {
5909                                .eraseblocks = {
5910                                        {8 * 1024, 8},
5911                                        {64 * 1024, 15}
5912                                 },
5913                                .block_erase = erase_block_82802ab,
5914                        }, {
5915                                .eraseblocks = { {1024 * 1024, 1} },
5916                                .block_erase = erase_sector_49lfxxxc,
5917                        }
5918                },
5919                .unlock         = unlock_lh28f008bjt,
5920                .write          = write_82802ab,
5921                .read           = read_memmapped,
5922                .voltage        = {2700, 3600},
5923        },
5924
5925        {
5926                .vendor         = "Sharp",
5927                .name           = "LHF00L04",
5928                .bustype        = BUS_FWH, /* A/A Mux */
5929                .manufacture_id = SHARP_ID,
5930                .model_id       = SHARP_LHF00L04,
5931                .total_size     = 1024,
5932                .page_size      = 64 * 1024,
5933                .feature_bits   = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
5934                .tested         = TEST_UNTESTED,
5935                .probe          = probe_82802ab,
5936                .probe_timing   = TIMING_ZERO,
5937                .block_erasers  =
5938                {
5939                        {
5940                                .eraseblocks = {
5941                                        {64 * 1024, 15},
5942                                        {8 * 1024, 8}
5943                                 },
5944                                .block_erase = erase_block_82802ab,
5945                        }, {
5946                                .eraseblocks = {
5947                                        {1024 * 1024, 1}
5948                                },
5949                                .block_erase = NULL, /* 30 D0, only in A/A mux mode */
5950                        },
5951                },
5952                .unlock         = unlock_82802ab,
5953                .write          = write_82802ab,
5954                .read           = read_memmapped,
5955                .voltage        = {3000, 3600},
5956        },
5957
5958        {
5959                .vendor         = "Spansion",
5960                .name           = "S25FL004A",
5961                .bustype        = BUS_SPI,
5962                .manufacture_id = SPANSION_ID,
5963                .model_id       = SPANSION_S25FL004A,
5964                .total_size     = 512,
5965                .page_size      = 256,
5966                .feature_bits   = FEATURE_WRSR_WREN,
5967                .tested         = TEST_UNTESTED,
5968                .probe          = probe_spi_rdid,
5969                .probe_timing   = TIMING_ZERO,
5970                .block_erasers  =
5971                {
5972                        {
5973                                .eraseblocks = { {64 * 1024, 8} },
5974                                .block_erase = spi_block_erase_d8,
5975                        }, {
5976                                .eraseblocks = { {512 * 1024, 1} },
5977                                .block_erase = spi_block_erase_c7,
5978                        }
5979                },
5980                .unlock         = spi_disable_blockprotect,
5981                .write          = spi_chip_write_256,
5982                .read           = spi_chip_read,
5983                .voltage        = {2700, 3600},
5984        },
5985
5986        {
5987                .vendor         = "Spansion",
5988                .name           = "S25FL008A",
5989                .bustype        = BUS_SPI,
5990                .manufacture_id = SPANSION_ID,
5991                .model_id       = SPANSION_S25FL008A,
5992                .total_size     = 1024,
5993                .page_size      = 256,
5994                .feature_bits   = FEATURE_WRSR_WREN,
5995                .tested         = TEST_OK_PRE,
5996                .probe          = probe_spi_rdid,
5997                .probe_timing   = TIMING_ZERO,
5998                .block_erasers  =
5999                {
6000                        {
6001                                .eraseblocks = { {64 * 1024, 16} },
6002                                .block_erase = spi_block_erase_d8,
6003                        }, {
6004                                .eraseblocks = { {1024 * 1024, 1} },
6005                                .block_erase = spi_block_erase_c7,
6006                        }
6007                },
6008                .unlock         = spi_disable_blockprotect,
6009                .write          = spi_chip_write_256,
6010                .read           = spi_chip_read,
6011                .voltage        = {2700, 3600},
6012        },
6013
6014        {
6015                .vendor         = "Spansion",
6016                .name           = "S25FL016A",
6017                .bustype        = BUS_SPI,
6018                .manufacture_id = SPANSION_ID,
6019                .model_id       = SPANSION_S25FL016A,
6020                .total_size     = 2048,
6021                .page_size      = 256,
6022                .feature_bits   = FEATURE_WRSR_WREN,
6023                .tested         = TEST_OK_PR,
6024                .probe          = probe_spi_rdid,
6025                .probe_timing   = TIMING_ZERO,
6026                .block_erasers  =
6027                {
6028                        {
6029                                .eraseblocks = { {64 * 1024, 32} },
6030                                .block_erase = spi_block_erase_d8,
6031                        }, {
6032                                .eraseblocks = { {2 * 1024 * 1024, 1} },
6033                                .block_erase = spi_block_erase_c7,
6034                        }
6035                },
6036                .unlock         = spi_disable_blockprotect,
6037                .write          = spi_chip_write_256,
6038                .read           = spi_chip_read,
6039                .voltage        = {2700, 3600},
6040        },
6041
6042        {
6043                .vendor         = "Spansion",
6044                .name           = "S25FL032A",
6045                .bustype        = BUS_SPI,
6046                .manufacture_id = SPANSION_ID,
6047                .model_id       = SPANSION_S25FL032A,
6048                .total_size     = 4096,
6049                .page_size      = 256,
6050                .feature_bits   = FEATURE_WRSR_WREN,
6051                .tested         = TEST_OK_PR,
6052                .probe          = probe_spi_rdid,
6053                .probe_timing   = TIMING_ZERO,
6054                .block_erasers  =
6055                {
6056                        {
6057                                .eraseblocks = { {64 * 1024, 64} },
6058                                .block_erase = spi_block_erase_d8,
6059                        }, {
6060                                .eraseblocks = { {4 * 1024 * 1024, 1} },
6061                                .block_erase = spi_block_erase_c7,
6062                        }
6063                },
6064                .unlock         = spi_disable_blockprotect,
6065                .write          = spi_chip_write_256,
6066                .read           = spi_chip_read,
6067                .voltage        = {2700, 3600},
6068        },
6069
6070        {
6071                .vendor         = "Spansion",
6072                .name           = "S25FL064A",
6073                .bustype        = BUS_SPI,
6074                .manufacture_id = SPANSION_ID,
6075                .model_id       = SPANSION_S25FL064A,
6076                .total_size     = 8192,
6077                .page_size      = 256,
6078                .feature_bits   = FEATURE_WRSR_WREN,
6079                .tested         = TEST_OK_PREW,
6080                .probe          = probe_spi_rdid,
6081                .probe_timing   = TIMING_ZERO,
6082                .block_erasers  =
6083                {
6084                        {
6085                                .eraseblocks = { {64 * 1024, 128} },
6086                                .block_erase = spi_block_erase_d8,
6087                        }, {
6088                                .eraseblocks = { {8 * 1024 * 1024, 1} },
6089                                .block_erase = spi_block_erase_c7,
6090                        }
6091                },
6092                .unlock         = spi_disable_blockprotect,
6093                .write          = spi_chip_write_256,
6094                .read           = spi_chip_read,
6095                .voltage        = {2700, 3600},
6096        },
6097
6098        {
6099                .vendor         = "SST",
6100                .name           = "SST25LF040A",
6101                .bustype        = BUS_SPI,
6102                .manufacture_id = SST_ID,
6103                .model_id       = SST_SST25VF040_REMS,
6104                .total_size     = 512,
6105                .page_size      = 256,
6106                .feature_bits   = FEATURE_WRSR_EWSR,
6107                .tested         = TEST_OK_PREW,
6108                .probe          = probe_spi_res2,
6109                .probe_timing   = TIMING_ZERO,
6110                .block_erasers  =
6111                {
6112                        {
6113                                .eraseblocks = { {4 * 1024, 128} },
6114                                .block_erase = spi_block_erase_20,
6115                        }, {
6116                                .eraseblocks = { {32 * 1024, 16} },
6117                                .block_erase = spi_block_erase_52,
6118                        }, {
6119                                .eraseblocks = { {512 * 1024, 1} },
6120                                .block_erase = spi_block_erase_60,
6121                        },
6122                },
6123                .unlock         = spi_disable_blockprotect,
6124                .write          = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6125                .read           = spi_chip_read,
6126                .voltage        = {3000, 3600},
6127        },
6128
6129        {
6130                .vendor         = "SST",
6131                .name           = "SST25LF080A",
6132                .bustype        = BUS_SPI,
6133                .manufacture_id = SST_ID,
6134                .model_id       = SST_SST25VF080_REMS,
6135                .total_size     = 1024,
6136                .page_size      = 256,
6137                .feature_bits   = FEATURE_WRSR_EWSR,
6138                .tested         = TEST_UNTESTED,
6139                .probe          = probe_spi_res2,
6140                .probe_timing   = TIMING_ZERO,
6141                .block_erasers  =
6142                {
6143                        {
6144                                .eraseblocks = { {4 * 1024, 256} },
6145                                .block_erase = spi_block_erase_20,
6146                        }, {
6147                                .eraseblocks = { {32 * 1024, 32} },
6148                                .block_erase = spi_block_erase_52,
6149                        }, {
6150                                .eraseblocks = { {1024 * 1024, 1} },
6151                                .block_erase = spi_block_erase_60,
6152                        },
6153                },
6154                .unlock         = spi_disable_blockprotect,
6155                .write          = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6156                .read           = spi_chip_read,
6157                .voltage        = {3000, 3600},
6158        },
6159
6160        {
6161                .vendor         = "SST",
6162                .name           = "SST25VF010",
6163                .bustype        = BUS_SPI,
6164                .manufacture_id = SST_ID,
6165                .model_id       = SST_SST25VF010_REMS,
6166                .total_size     = 128,
6167                .page_size      = 256,
6168                .feature_bits   = FEATURE_WRSR_EWSR,
6169                .tested         = TEST_OK_PREW,
6170                .probe          = probe_spi_rems,
6171                .probe_timing   = TIMING_ZERO,
6172                .block_erasers  =
6173                {
6174                        {
6175                                .eraseblocks = { {4 * 1024, 32} },
6176                                .block_erase = spi_block_erase_20,
6177                        }, {
6178                                .eraseblocks = { {32 * 1024, 4} },
6179                                .block_erase = spi_block_erase_52,
6180                        }, {
6181                                .eraseblocks = { {128 * 1024, 1} },
6182                                .block_erase = spi_block_erase_60,
6183                        },
6184                },
6185                .unlock         = spi_disable_blockprotect,
6186                .write          = spi_chip_write_1,
6187                .read           = spi_chip_read,
6188                .voltage        = {2700, 3600},
6189        },
6190
6191        {
6192                .vendor         = "SST",
6193                .name           = "SST25VF016B",
6194                .bustype        = BUS_SPI,
6195                .manufacture_id = SST_ID,
6196                .model_id       = SST_SST25VF016B,
6197                .total_size     = 2048,
6198                .page_size      = 256,
6199                .feature_bits   = FEATURE_WRSR_EWSR,
6200                .tested         = TEST_OK_PREW,
6201                .probe          = probe_spi_rdid,
6202                .probe_timing   = TIMING_ZERO,
6203                .block_erasers  =
6204                {
6205                        {
6206                                .eraseblocks = { {4 * 1024, 512} },
6207                                .block_erase = spi_block_erase_20,
6208                        }, {
6209                                .eraseblocks = { {32 * 1024, 64} },
6210                                .block_erase = spi_block_erase_52,
6211                        }, {
6212                                .eraseblocks = { {64 * 1024, 32} },
6213                                .block_erase = spi_block_erase_d8,
6214                        }, {
6215                                .eraseblocks = { {2 * 1024 * 1024, 1} },
6216                                .block_erase = spi_block_erase_60,
6217                        }, {
6218                                .eraseblocks = { {2 * 1024 * 1024, 1} },
6219                                .block_erase = spi_block_erase_c7,
6220                        },
6221                },
6222                .unlock         = spi_disable_blockprotect,
6223                .write          = spi_aai_write,
6224                .read           = spi_chip_read,
6225                .voltage        = {2700, 3600},
6226        },
6227
6228        {
6229                .vendor         = "SST",
6230                .name           = "SST25VF032B",
6231                .bustype        = BUS_SPI,
6232                .manufacture_id = SST_ID,
6233                .model_id       = SST_SST25VF032B,
6234                .total_size     = 4096,
6235                .page_size      = 256,
6236                .feature_bits   = FEATURE_WRSR_EWSR,
6237                .tested         = TEST_OK_PREW,
6238                .probe          = probe_spi_rdid,
6239                .probe_timing   = TIMING_ZERO,
6240                .block_erasers  =
6241                {
6242                        {
6243                                .eraseblocks = { {4 * 1024, 1024} },
6244                                .block_erase = spi_block_erase_20,
6245                        }, {
6246                                .eraseblocks = { {32 * 1024, 128} },
6247                                .block_erase = spi_block_erase_52,
6248                        }, {
6249                                .eraseblocks = { {64 * 1024, 64} },
6250                                .block_erase = spi_block_erase_d8,
6251                        }, {
6252                                .eraseblocks = { {4 * 1024 * 1024, 1} },
6253                                .block_erase = spi_block_erase_60,
6254                        }, {
6255                                .eraseblocks = { {4 * 1024 * 1024, 1} },
6256                                .block_erase = spi_block_erase_c7,
6257                        },
6258                },
6259                .unlock         = spi_disable_blockprotect,
6260                .write          = spi_aai_write,
6261                .read           = spi_chip_read,
6262                .voltage        = {2700, 3600},
6263        },
6264
6265        {
6266                .vendor         = "SST",
6267                .name           = "SST25VF064C",
6268                .bustype        = BUS_SPI,
6269                .manufacture_id = SST_ID,
6270                .model_id       = SST_SST25VF064C,
6271                .total_size     = 8192,
6272                .page_size      = 256,
6273                .feature_bits   = FEATURE_WRSR_EWSR,
6274                .tested         = TEST_OK_PREW,
6275                .probe          = probe_spi_rdid,
6276                .probe_timing   = TIMING_ZERO,
6277                .block_erasers  =
6278                {
6279                        {
6280                                .eraseblocks = { {4 * 1024, 2048} },
6281                                .block_erase = spi_block_erase_20,
6282                        }, {
6283                                .eraseblocks = { {32 * 1024, 256} },
6284                                .block_erase = spi_block_erase_52,
6285                        }, {
6286                                .eraseblocks = { {64 * 1024, 128} },
6287                                .block_erase = spi_block_erase_d8,
6288                        }, {
6289                                .eraseblocks = { {8 * 1024 * 1024, 1} },
6290                                .block_erase = spi_block_erase_60,
6291                        }, {
6292                                .eraseblocks = { {8 * 1024 * 1024, 1} },
6293                                .block_erase = spi_block_erase_c7,
6294                        },
6295                },
6296                .unlock         = spi_disable_blockprotect,
6297                .write          = spi_chip_write_256,
6298                .read           = spi_chip_read,
6299                .voltage        = {2700, 3600},
6300        },
6301
6302        {
6303                .vendor         = "SST",
6304                .name           = "SST25VF040",
6305                .bustype        = BUS_SPI,
6306                .manufacture_id = SST_ID,
6307                .model_id       = SST_SST25VF040_REMS,
6308                .total_size     = 512,
6309                .page_size      = 256,
6310                .feature_bits   = FEATURE_WRSR_EWSR,
6311                .tested         = TEST_OK_PR,
6312                .probe          = probe_spi_rems,
6313                .probe_timing   = TIMING_ZERO,
6314                .block_erasers  =
6315                {
6316                        {
6317                                .eraseblocks = { {4 * 1024, 128} },
6318                                .block_erase = spi_block_erase_20,
6319                        }, {
6320                                .eraseblocks = { {32 * 1024, 16} },
6321                                .block_erase = spi_block_erase_52,
6322                        }, {
6323                                .eraseblocks = { {512 * 1024, 1} },
6324                                .block_erase = spi_block_erase_60,
6325                        },
6326                },
6327                .unlock         = spi_disable_blockprotect,
6328                .write          = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6329                .read           = spi_chip_read,
6330                .voltage        = {2700, 3600},
6331        },
6332
6333        {
6334                .vendor         = "SST",
6335                .name           = "SST25VF040B",
6336                .bustype        = BUS_SPI,
6337                .manufacture_id = SST_ID,
6338                .model_id       = SST_SST25VF040B,
6339                .total_size     = 512,
6340                .page_size      = 256,
6341                .feature_bits   = FEATURE_WRSR_EWSR,
6342                .tested         = TEST_UNTESTED,
6343                .probe          = probe_spi_rdid,
6344                .probe_timing   = TIMING_ZERO,
6345                .block_erasers  =
6346                {
6347                        {
6348                                .eraseblocks = { {4 * 1024, 128} },
6349                                .block_erase = spi_block_erase_20,
6350                        }, {
6351                                .eraseblocks = { {32 * 1024, 16} },
6352                                .block_erase = spi_block_erase_52,
6353                        }, {
6354                                .eraseblocks = { {64 * 1024, 8} },
6355                                .block_erase = spi_block_erase_d8,
6356                        }, {
6357                                .eraseblocks = { {512 * 1024, 1} },
6358                                .block_erase = spi_block_erase_60,
6359                        }, {
6360                                .eraseblocks = { {512 * 1024, 1} },
6361                                .block_erase = spi_block_erase_c7,
6362                        },
6363                },
6364                .unlock         = spi_disable_blockprotect,
6365                .write          = spi_aai_write,
6366                .read           = spi_chip_read,
6367                .voltage        = {2700, 3600},
6368        },
6369
6370        {
6371                .vendor         = "SST",
6372                .name           = "SST25VF040B.REMS",
6373                .bustype        = BUS_SPI,
6374                .manufacture_id = SST_ID,
6375                .model_id       = SST_SST25VF040B_REMS,
6376                .total_size     = 512,
6377                .page_size      = 256,
6378                .feature_bits   = FEATURE_WRSR_EWSR,
6379                .tested         = TEST_OK_PR,
6380                .probe          = probe_spi_rems,
6381                .probe_timing   = TIMING_ZERO,
6382                .block_erasers  =
6383                {
6384                        {
6385                                .eraseblocks = { {4 * 1024, 128} },
6386                                .block_erase = spi_block_erase_20,
6387                        }, {
6388                                .eraseblocks = { {32 * 1024, 16} },
6389                                .block_erase = spi_block_erase_52,
6390                        }, {
6391                                .eraseblocks = { {64 * 1024, 8} },
6392                                .block_erase = spi_block_erase_d8,
6393                        }, {
6394                                .eraseblocks = { {512 * 1024, 1} },
6395                                .block_erase = spi_block_erase_60,
6396                        }, {
6397                                .eraseblocks = { {512 * 1024, 1} },
6398                                .block_erase = spi_block_erase_c7,
6399                        },
6400                },
6401                .unlock         = spi_disable_blockprotect,
6402                .write          = spi_aai_write,
6403                .read           = spi_chip_read,
6404                .voltage        = {2700, 3600},
6405        },
6406
6407        {
6408                .vendor         = "SST",
6409                .name           = "SST25VF080B",
6410                .bustype        = BUS_SPI,
6411                .manufacture_id = SST_ID,
6412                .model_id       = SST_SST25VF080B,
6413                .total_size     = 1024,
6414                .page_size      = 256,
6415                .feature_bits   = FEATURE_WRSR_EWSR,
6416                .tested         = TEST_OK_PREW,
6417                .probe          = probe_spi_rdid,
6418                .probe_timing   = TIMING_ZERO,
6419                .block_erasers  =
6420                {
6421                        {
6422                                .eraseblocks = { {4 * 1024, 256} },
6423                                .block_erase = spi_block_erase_20,
6424                        }, {
6425                                .eraseblocks = { {32 * 1024, 32} },
6426                                .block_erase = spi_block_erase_52,
6427                        }, {
6428                                .eraseblocks = { {64 * 1024, 16} },
6429                                .block_erase = spi_block_erase_d8,
6430                        }, {
6431                                .eraseblocks = { {1024 * 1024, 1} },
6432                                .block_erase = spi_block_erase_60,
6433                        }, {
6434                                .eraseblocks = { {1024 * 1024, 1} },
6435                                .block_erase = spi_block_erase_c7,
6436                        },
6437                },
6438                .unlock         = spi_disable_blockprotect,
6439                .write          = spi_aai_write,
6440                .read           = spi_chip_read,
6441                .voltage        = {2700, 3600},
6442        },
6443
6444        {
6445                .vendor         = "SST",
6446                .name           = "SST28SF040A",
6447                .bustype        = BUS_PARALLEL,
6448                .manufacture_id = SST_ID,
6449                .model_id       = SST_SST28SF040,
6450                .total_size     = 512,
6451                .page_size      = 256,
6452                .feature_bits   = 0,
6453                .tested         = TEST_UNTESTED,
6454                .probe          = probe_82802ab,
6455                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
6456                .block_erasers  =
6457                {
6458                        {
6459                                .eraseblocks = { {128, 4096} },
6460                                .block_erase = erase_sector_28sf040,
6461                        }, {
6462                                .eraseblocks = { {512 * 1024, 1} },
6463                                .block_erase = erase_chip_28sf040,
6464                        }
6465                },
6466                .unlock         = unprotect_28sf040,
6467                .write          = write_28sf040,
6468                .read           = read_memmapped,
6469                .voltage        = {4500, 5500},
6470        },
6471
6472        {
6473                .vendor         = "SST",
6474                .name           = "SST29EE010",
6475                .bustype        = BUS_PARALLEL,
6476                .manufacture_id = SST_ID,
6477                .model_id       = SST_SST29EE010,
6478                .total_size     = 128,
6479                .page_size      = 128,
6480                .feature_bits   = FEATURE_LONG_RESET,
6481                .tested         = TEST_OK_PR,
6482                .probe          = probe_jedec,
6483                .probe_timing   = 10, 
6484                .block_erasers  =
6485                {
6486                        {
6487                                .eraseblocks = { {128 * 1024, 1} },
6488                                .block_erase = erase_chip_block_jedec,
6489                        }
6490                },
6491                .write          = write_jedec,
6492                .read           = read_memmapped,
6493                .voltage        = {4500, 5500},
6494        },
6495
6496        {
6497                .vendor         = "SST",
6498                .name           = "SST29LE010",
6499                .bustype        = BUS_PARALLEL,
6500                .manufacture_id = SST_ID,
6501                .model_id       = SST_SST29LE010,
6502                .total_size     = 128,
6503                .page_size      = 128,
6504                .feature_bits   = FEATURE_LONG_RESET,
6505                .tested         = TEST_UNTESTED,
6506                .probe          = probe_jedec,
6507                .probe_timing   = 10, 
6508                .block_erasers  =
6509                {
6510                        {
6511                                .eraseblocks = { {128 * 1024, 1} },
6512                                .block_erase = erase_chip_block_jedec,
6513                        }
6514                },
6515                .write          = write_jedec,
6516                .read           = read_memmapped,
6517                .voltage        = {3000, 3600},
6518        },
6519
6520        {
6521                .vendor         = "SST",
6522                .name           = "SST29EE020A",
6523                .bustype        = BUS_PARALLEL,
6524                .manufacture_id = SST_ID,
6525                .model_id       = SST_SST29EE020A,
6526                .total_size     = 256,
6527                .page_size      = 128,
6528                .feature_bits   = FEATURE_LONG_RESET,
6529                .tested         = TEST_OK_PRE,
6530                .probe          = probe_jedec,
6531                .probe_timing   = 10,
6532                .block_erasers  =
6533                {
6534                        {
6535                                .eraseblocks = { {256 * 1024, 1} },
6536                                .block_erase = erase_chip_block_jedec,
6537                        }
6538                },
6539                .write          = write_jedec,
6540                .read           = read_memmapped,
6541                .voltage        = {4500, 5500},
6542        },
6543
6544        {
6545                .vendor         = "SST",
6546                .name           = "SST29LE020",
6547                .bustype        = BUS_PARALLEL,
6548                .manufacture_id = SST_ID,
6549                .model_id       = SST_SST29LE020,
6550                .total_size     = 256,
6551                .page_size      = 128,
6552                .feature_bits   = FEATURE_LONG_RESET,
6553                .tested         = TEST_OK_PRE,
6554                .probe          = probe_jedec,
6555                .probe_timing   = 10, 
6556                .block_erasers  =
6557                {
6558                        {
6559                                .eraseblocks = { {256 * 1024, 1} },
6560                                .block_erase = erase_chip_block_jedec,
6561                        }
6562                },
6563                .write          = write_jedec,
6564                .read           = read_memmapped,
6565                .voltage        = {3000, 3600},
6566        },
6567
6568        {
6569                .vendor         = "SST",
6570                .name           = "SST39SF512",
6571                .bustype        = BUS_PARALLEL,
6572                .manufacture_id = SST_ID,
6573                .model_id       = SST_SST39SF512,
6574                .total_size     = 64,
6575                .page_size      = 4096,
6576                .feature_bits   = FEATURE_EITHER_RESET,
6577                .tested         = TEST_OK_PREW,
6578                .probe          = probe_jedec,
6579                .probe_timing   = 1,                    /* 150 ns */
6580                .block_erasers  =
6581                {
6582                        {
6583                                .eraseblocks = { {4 * 1024, 16} },
6584                                .block_erase = erase_sector_jedec,
6585                        }, {
6586                                .eraseblocks = { {64 * 1024, 1} },
6587                                .block_erase = erase_chip_block_jedec,
6588                        }
6589                },
6590                .write          = write_jedec_1,
6591                .read           = read_memmapped,
6592                .voltage        = {4500, 5500},
6593        },
6594
6595        {
6596                .vendor         = "SST",
6597                .name           = "SST39SF010A",
6598                .bustype        = BUS_PARALLEL,
6599                .manufacture_id = SST_ID,
6600                .model_id       = SST_SST39SF010,
6601                .total_size     = 128,
6602                .page_size      = 4096,
6603                .feature_bits   = FEATURE_EITHER_RESET,
6604                .tested         = TEST_OK_PREW,
6605                .probe          = probe_jedec,
6606                .probe_timing   = 1,                    /* 150 ns */
6607                .block_erasers  =
6608                {
6609                        {
6610                                .eraseblocks = { {4 * 1024, 32} },
6611                                .block_erase = erase_sector_jedec,
6612                        }, {
6613                                .eraseblocks = { {128 * 1024, 1} },
6614                                .block_erase = erase_chip_block_jedec,
6615                        }
6616                },
6617                .write          = write_jedec_1,
6618                .read           = read_memmapped,
6619                .voltage        = {4500, 5500},
6620        },
6621
6622        {
6623                .vendor         = "SST",
6624                .name           = "SST39SF020A",
6625                .bustype        = BUS_PARALLEL,
6626                .manufacture_id = SST_ID,
6627                .model_id       = SST_SST39SF020,
6628                .total_size     = 256,
6629                .page_size      = 4096,
6630                .feature_bits   = FEATURE_EITHER_RESET,
6631                .tested         = TEST_OK_PREW,
6632                .probe          = probe_jedec,
6633                .probe_timing   = 1,                    /* 150 ns */
6634                .block_erasers  =
6635                {
6636                        {
6637                                .eraseblocks = { {4 * 1024, 64} },
6638                                .block_erase = erase_sector_jedec,
6639                        }, {
6640                                .eraseblocks = { {256 * 1024, 1} },
6641                                .block_erase = erase_chip_block_jedec,
6642                        }
6643                },
6644                .write          = write_jedec_1,
6645                .read           = read_memmapped,
6646                .voltage        = {4500, 5500},
6647        },
6648
6649        {
6650                .vendor         = "SST",
6651                .name           = "SST39SF040",
6652                .bustype        = BUS_PARALLEL,
6653                .manufacture_id = SST_ID,
6654                .model_id       = SST_SST39SF040,
6655                .total_size     = 512,
6656                .page_size      = 4096,
6657                .feature_bits   = FEATURE_EITHER_RESET,
6658                .tested         = TEST_OK_PREW,
6659                .probe          = probe_jedec,
6660                .probe_timing   = 1,                    /* 150 ns */
6661                .block_erasers  =
6662                {
6663                        {
6664                                .eraseblocks = { {4 * 1024, 128} },
6665                                .block_erase = erase_sector_jedec,
6666                        }, {
6667                                .eraseblocks = { {512 * 1024, 1} },
6668                                .block_erase = erase_chip_block_jedec,
6669                        }
6670                },
6671                .write          = write_jedec_1,
6672                .read           = read_memmapped,
6673                .voltage        = {4500, 5500},
6674        },
6675
6676        {
6677                .vendor         = "SST",
6678                .name           = "SST39VF512",
6679                .bustype        = BUS_PARALLEL,
6680                .manufacture_id = SST_ID,
6681                .model_id       = SST_SST39VF512,
6682                .total_size     = 64,
6683                .page_size      = 4096,
6684                .feature_bits   = FEATURE_EITHER_RESET,
6685                .tested         = TEST_OK_PRE,
6686                .probe          = probe_jedec,
6687                .probe_timing   = 1,                    /* 150 ns */
6688                .block_erasers  =
6689                {
6690                        {
6691                                .eraseblocks = { {4 * 1024, 16} },
6692                                .block_erase = erase_sector_jedec,
6693                        }, {
6694                                .eraseblocks = { {64 * 1024, 1} },
6695                                .block_erase = erase_chip_block_jedec,
6696                        }
6697                },
6698                .write          = write_jedec_1,
6699                .read           = read_memmapped,
6700                .voltage        = {2700, 3600},
6701        },
6702
6703        {
6704                .vendor         = "SST",
6705                .name           = "SST39VF010",
6706                .bustype        = BUS_PARALLEL,
6707                .manufacture_id = SST_ID,
6708                .model_id       = SST_SST39VF010,
6709                .total_size     = 128,
6710                .page_size      = 4096,
6711                .feature_bits   = FEATURE_EITHER_RESET,
6712                .tested         = TEST_OK_PRE,
6713                .probe          = probe_jedec,
6714                .probe_timing   = 1,                    /* 150 ns */
6715                .block_erasers  =
6716                {
6717                        {
6718                                .eraseblocks = { {4 * 1024, 32} },
6719                                .block_erase = erase_sector_jedec,
6720                        }, {
6721                                .eraseblocks = { {128 * 1024, 1} },
6722                                .block_erase = erase_chip_block_jedec,
6723                        }
6724                },
6725                .write          = write_jedec_1,
6726                .read           = read_memmapped,
6727                .voltage        = {2700, 3600},
6728        },
6729
6730        {
6731                .vendor         = "SST",
6732                .name           = "SST39VF020",
6733                .bustype        = BUS_PARALLEL,
6734                .manufacture_id = SST_ID,
6735                .model_id       = SST_SST39VF020,
6736                .total_size     = 256,
6737                .page_size      = 4096,
6738                .feature_bits   = FEATURE_EITHER_RESET,
6739                .tested         = TEST_UNTESTED,
6740                .probe          = probe_jedec,
6741                .probe_timing   = 1,                    /* 150 ns */
6742                .block_erasers  =
6743                {
6744                        {
6745                                .eraseblocks = { {4 * 1024, 64} },
6746                                .block_erase = erase_sector_jedec,
6747                        }, {
6748                                .eraseblocks = { {256 * 1024, 1} },
6749                                .block_erase = erase_chip_block_jedec,
6750                        }
6751                },
6752                .write          = write_jedec_1,
6753                .read           = read_memmapped,
6754                .voltage        = {2700, 3600},
6755        },
6756
6757        {
6758                .vendor         = "SST",
6759                .name           = "SST39VF040",
6760                .bustype        = BUS_PARALLEL,
6761                .manufacture_id = SST_ID,
6762                .model_id       = SST_SST39VF040,
6763                .total_size     = 512,
6764                .page_size      = 4096,
6765                .feature_bits   = FEATURE_EITHER_RESET,
6766                .tested         = TEST_UNTESTED,
6767                .probe          = probe_jedec,
6768                .probe_timing   = 1,                    /* 150 ns */
6769                .block_erasers  =
6770                {
6771                        {
6772                                .eraseblocks = { {4 * 1024, 128} },
6773                                .block_erase = erase_sector_jedec,
6774                        }, {
6775                                .eraseblocks = { {512 * 1024, 1} },
6776                                .block_erase = erase_chip_block_jedec,
6777                        }
6778                },
6779                .write          = write_jedec_1,
6780                .read           = read_memmapped,
6781                .voltage        = {2700, 3600},
6782        },
6783
6784        {
6785                .vendor         = "SST",
6786                .name           = "SST39VF080",
6787                .bustype        = BUS_PARALLEL,
6788                .manufacture_id = SST_ID,
6789                .model_id       = SST_SST39VF080,
6790                .total_size     = 1024,
6791                .page_size      = 4096,
6792                .feature_bits   = FEATURE_EITHER_RESET,
6793                .tested         = TEST_UNTESTED,
6794                .probe          = probe_jedec,
6795                .probe_timing   = 1,                    /* 150 ns */
6796                .block_erasers  =
6797                {
6798                        {
6799                                .eraseblocks = { {4 * 1024, 256} },
6800                                .block_erase = erase_sector_jedec,
6801                        }, {
6802                                .eraseblocks = { {64 * 1024, 16} },
6803                                .block_erase = erase_block_jedec,
6804                        }, {
6805                                .eraseblocks = { {1024 * 1024, 1} },
6806                                .block_erase = erase_chip_block_jedec,
6807                        }
6808                },
6809                .write          = write_jedec_1,
6810                .read           = read_memmapped,
6811                .voltage        = {2700, 3600},
6812        },
6813
6814        {
6815                .vendor         = "SST",
6816                .name           = "SST49LF002A/B",
6817                .bustype        = BUS_FWH, /* A/A Mux */
6818                .manufacture_id = SST_ID,
6819                .model_id       = SST_SST49LF002A,
6820                .total_size     = 256,
6821                .page_size      = 16 * 1024,
6822                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6823                .tested         = TEST_OK_PREW,
6824                .probe          = probe_jedec,
6825                .probe_timing   = 1,            /* 150 ns */
6826                .block_erasers  =
6827                {
6828                        {
6829                                .eraseblocks = { {4 * 1024, 64} },
6830                                .block_erase = erase_sector_jedec,
6831                        }, {
6832                                .eraseblocks = { {16 * 1024, 16} },
6833                                .block_erase = erase_block_jedec,
6834                        }, {
6835                                .eraseblocks = { {256 * 1024, 1} },
6836                                .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6837                        }
6838                },
6839                .printlock      = printlock_sst_fwhub,
6840                .unlock         = unlock_sst_fwhub,
6841                .write          = write_jedec_1,
6842                .read           = read_memmapped,
6843                .voltage        = {3000, 3600},
6844        },
6845
6846        {
6847                .vendor         = "SST",
6848                .name           = "SST49LF003A/B",
6849                .bustype        = BUS_FWH, /* A/A Mux */
6850                .manufacture_id = SST_ID,
6851                .model_id       = SST_SST49LF003A,
6852                .total_size     = 384,
6853                .page_size      = 64 * 1024,
6854                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6855                .tested         = TEST_OK_PR,
6856                .probe          = probe_jedec,
6857                .probe_timing   = 1,            /* 150 ns */
6858                .block_erasers  =
6859                {
6860                        {
6861                                .eraseblocks = { {4 * 1024, 96} },
6862                                .block_erase = erase_sector_jedec,
6863                        }, {
6864                                .eraseblocks = { {64 * 1024, 6} },
6865                                .block_erase = erase_block_jedec,
6866                        }, {
6867                                .eraseblocks = { {384 * 1024, 1} },
6868                                .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6869                        }
6870                },
6871                .printlock      = printlock_sst_fwhub,
6872                .unlock         = unlock_sst_fwhub,
6873                .write          = write_jedec_1,
6874                .read           = read_memmapped,
6875                .voltage        = {3000, 3600},
6876        },
6877
6878        {
6879                /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
6880                 * and is only honored for 64k block erase, but not 4k sector erase.
6881                 */
6882                .vendor         = "SST",
6883                .name           = "SST49LF004A/B",
6884                .bustype        = BUS_FWH, /* A/A Mux */
6885                .manufacture_id = SST_ID,
6886                .model_id       = SST_SST49LF004A,
6887                .total_size     = 512,
6888                .page_size      = 64 * 1024,
6889                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6890                .tested         = TEST_OK_PREW,
6891                .probe          = probe_jedec,
6892                .probe_timing   = 1,            /* 150 ns */
6893                .block_erasers  =
6894                {
6895                        {
6896                                .eraseblocks = { {4 * 1024, 128} },
6897                                .block_erase = erase_sector_jedec,
6898                        }, {
6899                                .eraseblocks = { {64 * 1024, 8} },
6900                                .block_erase = erase_block_jedec,
6901                        }, {
6902                                .eraseblocks = { {512 * 1024, 1} },
6903                                .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6904                        },
6905                },
6906                .printlock      = printlock_sst_fwhub,
6907                .unlock         = unlock_sst_fwhub,
6908                .write          = write_jedec_1,
6909                .read           = read_memmapped,
6910                .voltage        = {3000, 3600},
6911        },
6912
6913        {
6914                .vendor         = "SST",
6915                .name           = "SST49LF004C",
6916                .bustype        = BUS_FWH,
6917                .manufacture_id = SST_ID,
6918                .model_id       = SST_SST49LF004C,
6919                .total_size     = 512,
6920                .page_size      = 4 * 1024,
6921                .feature_bits   = FEATURE_REGISTERMAP,
6922                .tested         = TEST_UNTESTED,
6923                .probe          = probe_82802ab,
6924                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6925                .block_erasers  =
6926                {
6927                        {
6928                                .eraseblocks = { {4 * 1024, 128} },
6929                                .block_erase = erase_sector_49lfxxxc,
6930                        }, {
6931                                .eraseblocks = { 
6932                                        {64 * 1024, 7},
6933                                        {32 * 1024, 1},
6934                                        {8 * 1024, 2},
6935                                        {16 * 1024, 1},
6936                                },
6937                                .block_erase = erase_block_82802ab,
6938                        }
6939                },
6940                .unlock         = unlock_49lfxxxc,
6941                .write          = write_82802ab,
6942                .read           = read_memmapped,
6943                .voltage        = {3000, 3600},
6944        },
6945
6946        {
6947                .vendor         = "SST",
6948                .name           = "SST49LF008A",
6949                .bustype        = BUS_FWH, /* A/A Mux */
6950                .manufacture_id = SST_ID,
6951                .model_id       = SST_SST49LF008A,
6952                .total_size     = 1024,
6953                .page_size      = 64 * 1024,
6954                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
6955                .tested         = TEST_OK_PREW,
6956                .probe          = probe_jedec,
6957                .probe_timing   = 1,            /* 150 ns */
6958                .block_erasers  =
6959                {
6960                        {
6961                                .eraseblocks = { {4 * 1024, 256} },
6962                                .block_erase = erase_sector_jedec,
6963                        }, {
6964                                .eraseblocks = { {64 * 1024, 16} },
6965                                .block_erase = erase_block_jedec,
6966                        }, {
6967                                .eraseblocks = { {1024 * 1024, 1} },
6968                                .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
6969                        }
6970                },
6971                .printlock      = printlock_sst_fwhub,
6972                .unlock         = unlock_sst_fwhub,
6973                .write          = write_jedec_1,
6974                .read           = read_memmapped,
6975                .voltage        = {3000, 3600},
6976        },
6977
6978        {
6979                .vendor         = "SST",
6980                .name           = "SST49LF008C",
6981                .bustype        = BUS_FWH,
6982                .manufacture_id = SST_ID,
6983                .model_id       = SST_SST49LF008C,
6984                .total_size     = 1024,
6985                .page_size      = 4 * 1024,
6986                .feature_bits   = FEATURE_REGISTERMAP,
6987                .tested         = TEST_UNTESTED,
6988                .probe          = probe_82802ab,
6989                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
6990                .block_erasers  =
6991                {
6992                        {
6993                                .eraseblocks = { {4 * 1024, 256} },
6994                                .block_erase = erase_sector_49lfxxxc,
6995                        }, {
6996                                .eraseblocks = { 
6997                                        {64 * 1024, 15},
6998                                        {32 * 1024, 1},
6999                                        {8 * 1024, 2},
7000                                        {16 * 1024, 1},
7001                                },
7002                                .block_erase = erase_block_82802ab,
7003                        }
7004                },
7005                .unlock         = unlock_49lfxxxc,
7006                .write          = write_82802ab,
7007                .read           = read_memmapped,
7008                .voltage        = {3000, 3600},
7009        },
7010
7011        {
7012                .vendor         = "SST",
7013                .name           = "SST49LF016C",
7014                .bustype        = BUS_FWH,
7015                .manufacture_id = SST_ID,
7016                .model_id       = SST_SST49LF016C,
7017                .total_size     = 2048,
7018                .page_size      = 4 * 1024,
7019                .feature_bits   = FEATURE_REGISTERMAP,
7020                .tested         = TEST_OK_PREW,
7021                .probe          = probe_82802ab,
7022                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7023                .block_erasers  =
7024                {
7025                        {
7026                                .eraseblocks = { {4 * 1024, 512} },
7027                                .block_erase = erase_sector_49lfxxxc,
7028                        }, {
7029                                .eraseblocks = { 
7030                                        {64 * 1024, 31},
7031                                        {32 * 1024, 1},
7032                                        {8 * 1024, 2},
7033                                        {16 * 1024, 1},
7034                                },
7035                                .block_erase = erase_block_82802ab,
7036                        }
7037                },
7038                .unlock         = unlock_49lfxxxc,
7039                .write          = write_82802ab,
7040                .read           = read_memmapped,
7041                .voltage        = {3000, 3600},
7042        },
7043
7044        {
7045                .vendor         = "SST",
7046                .name           = "SST49LF020",
7047                .bustype        = BUS_LPC,
7048                .manufacture_id = SST_ID,
7049                .model_id       = SST_SST49LF020,
7050                .total_size     = 256,
7051                .page_size      = 16 * 1024,
7052                .feature_bits   = FEATURE_EITHER_RESET,
7053                .tested         = TEST_OK_PREW,
7054                .probe          = probe_jedec,
7055                .probe_timing   = 1,                    /* 150 ns */
7056                .block_erasers  =
7057                {
7058                        {
7059                                .eraseblocks = { {4 * 1024, 64} },
7060                                .block_erase = erase_sector_jedec,
7061                        }, {
7062                                .eraseblocks = { {16 * 1024, 16} },
7063                                .block_erase = erase_block_jedec,
7064                        }, {
7065                                .eraseblocks = { {256 * 1024, 1} },
7066                                .block_erase = NULL,
7067                        }
7068                },
7069                .write          = write_jedec_1,
7070                .read           = read_memmapped,
7071                .voltage        = {3000, 3600},
7072        },
7073
7074        {
7075                .vendor         = "SST",
7076                .name           = "SST49LF020A",
7077                .bustype        = BUS_LPC,
7078                .manufacture_id = SST_ID,
7079                .model_id       = SST_SST49LF020A,
7080                .total_size     = 256,
7081                .page_size      = 4 * 1024,
7082                .feature_bits   = FEATURE_EITHER_RESET,
7083                .tested         = TEST_OK_PRE,
7084                .probe          = probe_jedec,
7085                .probe_timing   = 1,                    /* 150 ns */
7086                .block_erasers  =
7087                {
7088                        {
7089                                .eraseblocks = { {4 * 1024, 64} },
7090                                .block_erase = erase_sector_jedec,
7091                        }, {
7092                                .eraseblocks = { {16 * 1024, 16} },
7093                                .block_erase = erase_block_jedec,
7094                        }, {
7095                                .eraseblocks = { {256 * 1024, 1} },
7096                                .block_erase = NULL,
7097                        }
7098                },
7099                .write          = write_jedec_1,
7100                .read           = read_memmapped,
7101                .voltage        = {3000, 3600},
7102        },
7103
7104        {
7105                .vendor         = "SST",
7106                .name           = "SST49LF040",
7107                .bustype        = BUS_LPC,
7108                .manufacture_id = SST_ID,
7109                .model_id       = SST_SST49LF040,
7110                .total_size     = 512,
7111                .page_size      = 4096,
7112                .feature_bits   = FEATURE_EITHER_RESET,
7113                .tested         = TEST_OK_PRE,
7114                .probe          = probe_jedec,
7115                .probe_timing   = 1,                    /* 150 ns */
7116                .block_erasers  =
7117                {
7118                        {
7119                                .eraseblocks = { {4 * 1024, 128} },
7120                                .block_erase = erase_sector_jedec,
7121                        }, {
7122                                .eraseblocks = { {64 * 1024, 8} },
7123                                .block_erase = erase_block_jedec,
7124                        }, {
7125                                .eraseblocks = { {512 * 1024, 1} },
7126                                .block_erase = NULL,
7127                        }
7128                },
7129                .write          = write_jedec_1,
7130                .read           = read_memmapped,
7131                .voltage        = {3000, 3600},
7132        },
7133
7134        {
7135                .vendor         = "SST",
7136                .name           = "SST49LF040B",
7137                .bustype        = BUS_LPC, /* A/A Mux */
7138                .manufacture_id = SST_ID,
7139                .model_id       = SST_SST49LF040B,
7140                .total_size     = 512,
7141                .page_size      = 64 * 1024,
7142                .feature_bits   = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
7143                .tested         = TEST_OK_PREW,
7144                .probe          = probe_jedec,
7145                .probe_timing   = 1,            /* 150ns */
7146                .block_erasers  =
7147                {
7148                        {
7149                                .eraseblocks = { {4 * 1024, 128} },
7150                                .block_erase = erase_sector_jedec,
7151                        }, {
7152                                .eraseblocks = { {64 * 1024, 8} },
7153                                .block_erase = erase_block_jedec,
7154                        }, {
7155                                .eraseblocks = { {512 * 1024, 1} },
7156                                .block_erase = NULL,
7157                        }
7158                },
7159                .unlock         = unlock_82802ab,
7160                .write          = write_jedec_1,
7161                .read           = read_memmapped,
7162                .voltage        = {3000, 3600},
7163        },
7164
7165        {
7166                .vendor         = "SST",
7167                .name           = "SST49LF080A",
7168                .bustype        = BUS_LPC, /* A/A Mux */
7169                .manufacture_id = SST_ID,
7170                .model_id       = SST_SST49LF080A,
7171                .total_size     = 1024,
7172                .page_size      = 4096,
7173                .feature_bits   = FEATURE_EITHER_RESET,
7174                .tested         = TEST_OK_PREW,
7175                .probe          = probe_jedec,
7176                .probe_timing   = TIMING_FIXME, 
7177                .block_erasers  =
7178                {
7179                        {
7180                                .eraseblocks = { {4 * 1024, 256} },
7181                                .block_erase = erase_sector_jedec,
7182                        }, {
7183                                .eraseblocks = { {64 * 1024, 16} },
7184                                .block_erase = erase_block_jedec,
7185                        }, {
7186                                .eraseblocks = { {1024 * 1024, 1} },
7187                                .block_erase = NULL,
7188                        }
7189                },
7190                .write          = write_jedec_1,
7191                .read           = read_memmapped,
7192                .voltage        = {3000, 3600},
7193        },
7194
7195        {
7196                .vendor         = "SST",
7197                .name           = "SST49LF160C",
7198                .bustype        = BUS_LPC,
7199                .manufacture_id = SST_ID,
7200                .model_id       = SST_SST49LF160C,
7201                .total_size     = 2048,
7202                .page_size      = 4 * 1024,
7203                .feature_bits   = FEATURE_REGISTERMAP,
7204                .tested         = TEST_OK_PRE,
7205                .probe          = probe_82802ab,
7206                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
7207                .block_erasers  =
7208                {
7209                        {
7210                                .eraseblocks = { {4 * 1024, 512} },
7211                                .block_erase = erase_sector_49lfxxxc,
7212                        }, {
7213                                .eraseblocks = { 
7214                                        {64 * 1024, 31},
7215                                        {32 * 1024, 1},
7216                                        {8 * 1024, 2},
7217                                        {16 * 1024, 1},
7218                                },
7219                                .block_erase = erase_block_82802ab,
7220                        }
7221                },
7222                .unlock         = unlock_49lfxxxc,
7223                .write          = write_82802ab,
7224                .read           = read_memmapped,
7225                .voltage        = {3000, 3600},
7226        },
7227
7228        {
7229                .vendor         = "ST",
7230                .name           = "M25P05-A",
7231                .bustype        = BUS_SPI,
7232                .manufacture_id = ST_ID,
7233                .model_id       = ST_M25P05A,
7234                .total_size     = 64,
7235                .page_size      = 256,
7236                .feature_bits   = FEATURE_WRSR_WREN,
7237                .tested         = TEST_UNTESTED,
7238                .probe          = probe_spi_rdid,
7239                .probe_timing   = TIMING_ZERO,
7240                .block_erasers  =
7241                {
7242                        {
7243                                .eraseblocks = { {32 * 1024, 2} },
7244                                .block_erase = spi_block_erase_d8,
7245                        }, {
7246                                .eraseblocks = { {64 * 1024, 1} },
7247                                .block_erase = spi_block_erase_c7,
7248                        }
7249                },
7250                .unlock         = spi_disable_blockprotect,
7251                .write          = spi_chip_write_256,
7252                .read           = spi_chip_read,
7253                .voltage        = {2700, 3600},
7254        },
7255
7256        /* The ST M25P05 is a bit of a problem. It has the same ID as the
7257         * ST M25P05-A in RES mode, but supports only 128 byte writes instead
7258         * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
7259         * only is successful if RDID does not work.
7260         */
7261        {
7262                .vendor         = "ST",
7263                .name           = "M25P05",
7264                .bustype        = BUS_SPI,
7265                .manufacture_id = 0, /* Not used. */
7266                .model_id       = ST_M25P05_RES,
7267                .total_size     = 64,
7268                .page_size      = 256,
7269                .feature_bits   = FEATURE_WRSR_WREN,
7270                .tested         = TEST_UNTESTED,
7271                .probe          = probe_spi_res1,
7272                .probe_timing   = TIMING_ZERO,
7273                .block_erasers  =
7274                {
7275                        {
7276                                .eraseblocks = { {32 * 1024, 2} },
7277                                .block_erase = spi_block_erase_d8,
7278                        }, {
7279                                .eraseblocks = { {64 * 1024, 1} },
7280                                .block_erase = spi_block_erase_c7,
7281                        }
7282                },
7283                .unlock         = spi_disable_blockprotect,
7284                .write          = spi_chip_write_1, /* 128 */
7285                .read           = spi_chip_read,
7286                .voltage        = {2700, 3600},
7287        },
7288
7289        {
7290                .vendor         = "ST",
7291                .name           = "M25P10-A",
7292                .bustype        = BUS_SPI,
7293                .manufacture_id = ST_ID,
7294                .model_id       = ST_M25P10A,
7295                .total_size     = 128,
7296                .page_size      = 256,
7297                .feature_bits   = FEATURE_WRSR_WREN,
7298                .tested         = TEST_OK_PRE,
7299                .probe          = probe_spi_rdid,
7300                .probe_timing   = TIMING_ZERO,
7301                .block_erasers  =
7302                {
7303                        {
7304                                .eraseblocks = { {32 * 1024, 4} },
7305                                .block_erase = spi_block_erase_d8,
7306                        }, {
7307                                .eraseblocks = { {128 * 1024, 1} },
7308                                .block_erase = spi_block_erase_c7,
7309                        }
7310                },
7311                .unlock         = spi_disable_blockprotect,
7312                .write          = spi_chip_write_256,
7313                .read           = spi_chip_read,
7314                .voltage        = {2700, 3600},
7315        },
7316
7317        /* The ST M25P10 has the same problem as the M25P05. */
7318        {
7319                .vendor         = "ST",
7320                .name           = "M25P10",
7321                .bustype        = BUS_SPI,
7322                .manufacture_id = 0, /* Not used. */
7323                .model_id       = ST_M25P10_RES,
7324                .total_size     = 128,
7325                .page_size      = 256,
7326                .feature_bits   = FEATURE_WRSR_WREN,
7327                .tested         = TEST_UNTESTED,
7328                .probe          = probe_spi_res1,
7329                .probe_timing   = TIMING_ZERO,
7330                .block_erasers  =
7331                {
7332                        {
7333                                .eraseblocks = { {32 * 1024, 4} },
7334                                .block_erase = spi_block_erase_d8,
7335                        }, {
7336                                .eraseblocks = { {128 * 1024, 1} },
7337                                .block_erase = spi_block_erase_c7,
7338                        }
7339                },
7340                .unlock         = spi_disable_blockprotect,
7341                .write          = spi_chip_write_1, /* 128 */
7342                .read           = spi_chip_read,
7343                .voltage        = {2700, 3600},
7344        },
7345
7346        {
7347                .vendor         = "ST",
7348                .name           = "M25P20",
7349                .bustype        = BUS_SPI,
7350                .manufacture_id = ST_ID,
7351                .model_id       = ST_M25P20,
7352                .total_size     = 256,
7353                .page_size      = 256,
7354                .feature_bits   = FEATURE_WRSR_WREN,
7355                .tested         = TEST_UNTESTED,
7356                .probe          = probe_spi_rdid,
7357                .probe_timing   = TIMING_ZERO,
7358                .block_erasers  =
7359                {
7360                        {
7361                                .eraseblocks = { {64 * 1024, 4} },
7362                                .block_erase = spi_block_erase_d8,
7363                        }, {
7364                                .eraseblocks = { {256 * 1024, 1} },
7365                                .block_erase = spi_block_erase_c7,
7366                        }
7367                },
7368                .unlock         = spi_disable_blockprotect,
7369                .write          = spi_chip_write_256,
7370                .read           = spi_chip_read,
7371                .voltage        = {2700, 3600},
7372        },
7373
7374        {
7375                .vendor         = "ST", /* Numonyx */
7376                .name           = "M25P40",
7377                .bustype        = BUS_SPI,
7378                .manufacture_id = ST_ID,
7379                .model_id       = ST_M25P40,
7380                .total_size     = 512,
7381                .page_size      = 256,
7382                .feature_bits   = FEATURE_WRSR_WREN,
7383                .tested         = TEST_OK_PREW,
7384                .probe          = probe_spi_rdid,
7385                .probe_timing   = TIMING_ZERO,
7386                .block_erasers  =
7387                {
7388                        {
7389                                .eraseblocks = { {64 * 1024, 8} },
7390                                .block_erase = spi_block_erase_d8,
7391                        }, {
7392                                .eraseblocks = { {512 * 1024, 1} },
7393                                .block_erase = spi_block_erase_c7,
7394                        }
7395                },
7396                .unlock         = spi_disable_blockprotect,
7397                .write          = spi_chip_write_256,
7398                .read           = spi_chip_read,
7399                .voltage        = {2700, 3600},
7400        },
7401
7402        {
7403                .vendor         = "ST",
7404                .name           = "M25P40-old",
7405                .bustype        = BUS_SPI,
7406                .manufacture_id = 0, /* Not used. */
7407                .model_id       = ST_M25P40_RES,
7408                .total_size     = 512,
7409                .page_size      = 256,
7410                .feature_bits   = FEATURE_WRSR_WREN,
7411                .tested         = TEST_UNTESTED,
7412                .probe          = probe_spi_res1,
7413                .probe_timing   = TIMING_ZERO,
7414                .block_erasers  =
7415                {
7416                        {
7417                                .eraseblocks = { {64 * 1024, 8} },
7418                                .block_erase = spi_block_erase_d8,
7419                        }, {
7420                                .eraseblocks = { {512 * 1024, 1} },
7421                                .block_erase = spi_block_erase_c7,
7422                        }
7423                },
7424                .unlock         = spi_disable_blockprotect,
7425                .write          = spi_chip_write_256,
7426                .read           = spi_chip_read,
7427        },
7428
7429        {
7430                .vendor         = "ST",
7431                .name           = "M25P80",
7432                .bustype        = BUS_SPI,
7433                .manufacture_id = ST_ID,
7434                .model_id       = ST_M25P80,
7435                .total_size     = 1024,
7436                .page_size      = 256,
7437                .feature_bits   = FEATURE_WRSR_WREN,
7438                .tested         = TEST_OK_PREW,
7439                .probe          = probe_spi_rdid,
7440                .probe_timing   = TIMING_ZERO,
7441                .block_erasers  =
7442                {
7443                        {
7444                                .eraseblocks = { {64 * 1024, 16} },
7445                                .block_erase = spi_block_erase_d8,
7446                        }, {
7447                                .eraseblocks = { {1024 * 1024, 1} },
7448                                .block_erase = spi_block_erase_c7,
7449                        }
7450                },
7451                .unlock         = spi_disable_blockprotect,
7452                .write          = spi_chip_write_256,
7453                .read           = spi_chip_read,
7454                .voltage        = {2700, 3600},
7455        },
7456
7457        {
7458                .vendor         = "ST",
7459                .name           = "M25P16",
7460                .bustype        = BUS_SPI,
7461                .manufacture_id = ST_ID,
7462                .model_id       = ST_M25P16,
7463                .total_size     = 2048,
7464                .page_size      = 256,
7465                .feature_bits   = FEATURE_WRSR_WREN,
7466                .tested         = TEST_OK_PR,
7467                .probe          = probe_spi_rdid,
7468                .probe_timing   = TIMING_ZERO,
7469                .block_erasers  =
7470                {
7471                        {
7472                                .eraseblocks = { {64 * 1024, 32} },
7473                                .block_erase = spi_block_erase_d8,
7474                        }, {
7475                                .eraseblocks = { {2 * 1024 * 1024, 1} },
7476                                .block_erase = spi_block_erase_c7,
7477                        }
7478                },
7479                .unlock         = spi_disable_blockprotect,
7480                .write          = spi_chip_write_256,
7481                .read           = spi_chip_read,
7482                .voltage        = {2700, 3600},
7483        },
7484
7485        {
7486                .vendor         = "ST",
7487                .name           = "M25P32",
7488                .bustype        = BUS_SPI,
7489                .manufacture_id = ST_ID,
7490                .model_id       = ST_M25P32,
7491                .total_size     = 4096,
7492                .page_size      = 256,
7493                .feature_bits   = FEATURE_WRSR_WREN,
7494                .tested         = TEST_OK_PREW,
7495                .probe          = probe_spi_rdid,
7496                .probe_timing   = TIMING_ZERO,
7497                .block_erasers  =
7498                {
7499                        {
7500                                .eraseblocks = { {64 * 1024, 64} },
7501                                .block_erase = spi_block_erase_d8,
7502                        }, {
7503                                .eraseblocks = { {4 * 1024 * 1024, 1} },
7504                                .block_erase = spi_block_erase_c7,
7505                        }
7506                },
7507                .unlock         = spi_disable_blockprotect,
7508                .write          = spi_chip_write_256,
7509                .read           = spi_chip_read,
7510                .voltage        = {2700, 3600},
7511        },
7512
7513        {
7514                .vendor         = "ST",
7515                .name           = "M25P64",
7516                .bustype        = BUS_SPI,
7517                .manufacture_id = ST_ID,
7518                .model_id       = ST_M25P64,
7519                .total_size     = 8192,
7520                .page_size      = 256,
7521                .feature_bits   = FEATURE_WRSR_WREN,
7522                .tested         = TEST_UNTESTED,
7523                .probe          = probe_spi_rdid,
7524                .probe_timing   = TIMING_ZERO,
7525                .block_erasers  =
7526                {
7527                        {
7528                                .eraseblocks = { {64 * 1024, 128} },
7529                                .block_erase = spi_block_erase_d8,
7530                        }, {
7531                                .eraseblocks = { {8 * 1024 * 1024, 1} },
7532                                .block_erase = spi_block_erase_c7,
7533                        }
7534                },
7535                .unlock         = spi_disable_blockprotect,
7536                .write          = spi_chip_write_256,
7537                .read           = spi_chip_read,
7538                .voltage        = {2700, 3600},
7539        },
7540
7541        {
7542                .vendor         = "ST",
7543                .name           = "M25P128",
7544                .bustype        = BUS_SPI,
7545                .manufacture_id = ST_ID,
7546                .model_id       = ST_M25P128,
7547                .total_size     = 16384,
7548                .page_size      = 256,
7549                .feature_bits   = FEATURE_WRSR_WREN,
7550                .tested         = TEST_OK_PREW,
7551                .probe          = probe_spi_rdid,
7552                .probe_timing   = TIMING_ZERO,
7553                .block_erasers  =
7554                {
7555                        {
7556                                .eraseblocks = { {256 * 1024, 64} },
7557                                .block_erase = spi_block_erase_d8,
7558                        }, {
7559                                .eraseblocks = { {16 * 1024 * 1024, 1} },
7560                                .block_erase = spi_block_erase_c7,
7561                        }
7562                },
7563                .unlock         = spi_disable_blockprotect,
7564                .write          = spi_chip_write_256,
7565                .read           = spi_chip_read,
7566                .voltage        = {2700, 3600},
7567        },
7568
7569        {
7570                .vendor         = "ST",
7571                .name           = "M25PX16",
7572                .bustype        = BUS_SPI,
7573                .manufacture_id = ST_ID,
7574                .model_id       = ST_M25PX16,
7575                .total_size     = 2048,
7576                .page_size      = 256,
7577                /* OTP: 64B total; read 0x4B; write 0x42 */
7578                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
7579                .tested         = TEST_OK_PREW,
7580                .probe          = probe_spi_rdid,
7581                .probe_timing   = TIMING_ZERO,
7582                .block_erasers  =
7583                {
7584                        {
7585                                .eraseblocks = { { 4 * 1024, 512 } },
7586                                .block_erase = spi_block_erase_20,
7587                        }, {
7588                                .eraseblocks = { {64 * 1024, 32} },
7589                                .block_erase = spi_block_erase_d8,
7590                        }, {
7591                                .eraseblocks = { {2 * 1024 * 1024, 1} },
7592                                .block_erase = spi_block_erase_c7,
7593                        }
7594                },
7595                .unlock         = spi_disable_blockprotect,
7596                .write          = spi_chip_write_256,
7597                .read           = spi_chip_read,
7598        },
7599
7600        {
7601                .vendor         = "ST",
7602                .name           = "M25PX32",
7603                .bustype        = BUS_SPI,
7604                .manufacture_id = ST_ID,
7605                .model_id       = ST_M25PX32,
7606                .total_size     = 4096,
7607                .page_size      = 256,
7608                .feature_bits   = FEATURE_WRSR_WREN,
7609                .tested         = TEST_OK_PRE,
7610                .probe          = probe_spi_rdid,
7611                .probe_timing   = TIMING_ZERO,
7612                .block_erasers  =
7613                {
7614                        {
7615                                .eraseblocks = { { 4 * 1024, 1024 } },
7616                                .block_erase = spi_block_erase_20,
7617                        }, {
7618                                .eraseblocks = { {64 * 1024, 64} },
7619                                .block_erase = spi_block_erase_d8,
7620                        }, {
7621                                .eraseblocks = { {4 * 1024 * 1024, 1} },
7622                                .block_erase = spi_block_erase_c7,
7623                        }
7624                },
7625                .unlock         = spi_disable_blockprotect,
7626                .write          = spi_chip_write_256,
7627                .read           = spi_chip_read,
7628                .voltage        = {2700, 3600},
7629        },
7630
7631        {
7632                .vendor         = "ST",
7633                .name           = "M25PX64",
7634                .bustype        = BUS_SPI,
7635                .manufacture_id = ST_ID,
7636                .model_id       = ST_M25PX64,
7637                .total_size     = 8192,
7638                .page_size      = 256,
7639                .feature_bits   = FEATURE_WRSR_WREN,
7640                .tested         = TEST_OK_PRE,
7641                .probe          = probe_spi_rdid,
7642                .probe_timing   = TIMING_ZERO,
7643                .block_erasers  =
7644                {
7645                        {
7646                                .eraseblocks = { { 4 * 1024, 2048 } },
7647                                .block_erase = spi_block_erase_20,
7648                        }, {
7649                                .eraseblocks = { {64 * 1024, 128} },
7650                                .block_erase = spi_block_erase_d8,
7651                        }, {
7652                                .eraseblocks = { {8 * 1024 * 1024, 1} },
7653                                .block_erase = spi_block_erase_c7,
7654                        }
7655                },
7656                .unlock         = spi_disable_blockprotect,
7657                .write          = spi_chip_write_256,
7658                .read           = spi_chip_read,
7659        },
7660
7661        {
7662                .vendor         = "ST",
7663                .name           = "M29F002B",
7664                .bustype        = BUS_PARALLEL,
7665                .manufacture_id = ST_ID,
7666                .model_id       = ST_M29F002B,
7667                .total_size     = 256,
7668                .page_size      = 64 * 1024,
7669                .feature_bits   = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7670                .tested         = TEST_UNTESTED,
7671                .probe          = probe_jedec,
7672                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
7673                .block_erasers  =
7674                {
7675                        {
7676                                .eraseblocks = {
7677                                        {16 * 1024, 1},
7678                                        {8 * 1024, 2},
7679                                        {32 * 1024, 1},
7680                                        {64 * 1024, 3},
7681                                },
7682                                .block_erase = erase_sector_jedec,
7683                        }, {
7684                                .eraseblocks = { {256 * 1024, 1} },
7685                                .block_erase = erase_chip_block_jedec,
7686                        }
7687                },
7688                .write          = write_jedec_1,
7689                .read           = read_memmapped,
7690                .voltage        = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7691        },
7692
7693        {
7694                .vendor         = "ST",
7695                .name           = "M29F002T/NT",
7696                .bustype        = BUS_PARALLEL,
7697                .manufacture_id = ST_ID,
7698                .model_id       = ST_M29F002T,
7699                .total_size     = 256,
7700                .page_size      = 64 * 1024,
7701                .feature_bits   = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
7702                .tested         = TEST_UNTESTED,
7703                .probe          = probe_jedec,
7704                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
7705                .block_erasers  =
7706                {
7707                        {
7708                                .eraseblocks = {
7709                                        {64 * 1024, 3},
7710                                        {32 * 1024, 1},
7711                                        {8 * 1024, 2},
7712                                        {16 * 1024, 1},
7713                                },
7714                                .block_erase = erase_sector_jedec,
7715                        }, {
7716                                .eraseblocks = { {256 * 1024, 1} },
7717                                .block_erase = erase_chip_block_jedec,
7718                        }
7719                },
7720                .write          = write_jedec_1,
7721                .read           = read_memmapped,
7722                .voltage        = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
7723        },
7724
7725        {
7726                .vendor         = "ST",
7727                .name           = "M29F040B",
7728                .bustype        = BUS_PARALLEL,
7729                .manufacture_id = ST_ID,
7730                .model_id       = ST_M29F040B,
7731                .total_size     = 512,
7732                .page_size      = 64 * 1024,
7733                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7734                .tested         = TEST_UNTESTED,
7735                .probe          = probe_jedec,
7736                .probe_timing   = TIMING_ZERO, /* datasheet specifies no timing */
7737                .block_erasers  =
7738                {
7739                        {
7740                                .eraseblocks = { {64 * 1024, 8}, },
7741                                .block_erase = erase_sector_jedec,
7742                        }, {
7743                                .eraseblocks = { {512 * 1024, 1} },
7744                                .block_erase = erase_chip_block_jedec,
7745                        }
7746                },
7747                .write          = write_jedec_1,
7748                .read           = read_memmapped,
7749                .voltage        = {4500, 5500},
7750        },
7751
7752        {
7753                /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7754                .vendor         = "ST",
7755                .name           = "M29F400BB",
7756                .bustype        = BUS_PARALLEL,
7757                .manufacture_id = ST_ID,
7758                .model_id       = ST_M29F400BB,
7759                .total_size     = 512,
7760                .page_size      = 64 * 1024,
7761                .feature_bits   = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7762                .tested         = TEST_UNTESTED,
7763                .probe          = probe_m29f400bt,
7764                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7765                .block_erasers  =
7766                {
7767                        {
7768                                .eraseblocks = {
7769                                        {16 * 1024, 1},
7770                                        {8 * 1024, 2},
7771                                        {32 * 1024, 1},
7772                                        {64 * 1024, 7},
7773                                },
7774                                .block_erase = block_erase_m29f400bt,
7775                        }, {
7776                                .eraseblocks = { {512 * 1024, 1} },
7777                                .block_erase = block_erase_chip_m29f400bt,
7778                        }
7779                },
7780                .write          = write_m29f400bt,
7781                .read           = read_memmapped,
7782                .voltage        = {4500, 5500},
7783        },
7784        {
7785                /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
7786                .vendor         = "ST",
7787                .name           = "M29F400BT",
7788                .bustype        = BUS_PARALLEL,
7789                .manufacture_id = ST_ID,
7790                .model_id       = ST_M29F400BT,
7791                .total_size     = 512,
7792                .page_size      = 64 * 1024,
7793                .feature_bits   = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
7794                .tested         = TEST_UNTESTED,
7795                .probe          = probe_m29f400bt,
7796                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
7797                .block_erasers  =
7798                {
7799                        {
7800                                .eraseblocks = {
7801                                        {64 * 1024, 7},
7802                                        {32 * 1024, 1},
7803                                        {8 * 1024, 2},
7804                                        {16 * 1024, 1},
7805                                },
7806                                .block_erase = block_erase_m29f400bt,
7807                        }, {
7808                                .eraseblocks = { {512 * 1024, 1} },
7809                                .block_erase = block_erase_chip_m29f400bt,
7810                        }
7811                },
7812                .write          = write_m29f400bt,
7813                .read           = read_memmapped,
7814                .voltage        = {4500, 5500},
7815        },
7816
7817        {
7818                .vendor         = "ST",
7819                .name           = "M29W010B",
7820                .bustype        = BUS_PARALLEL,
7821                .manufacture_id = ST_ID,
7822                .model_id       = ST_M29W010B,
7823                .total_size     = 128,
7824                .page_size      = 16 * 1024,
7825                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7826                .tested         = TEST_UNTESTED,
7827                .probe          = probe_jedec,
7828                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
7829                .block_erasers  =
7830                {
7831                        {
7832                                .eraseblocks = { {16 * 1024, 8}, },
7833                                .block_erase = erase_sector_jedec,
7834                        }, {
7835                                .eraseblocks = { {128 * 1024, 1} },
7836                                .block_erase = erase_chip_block_jedec,
7837                        }
7838                },
7839                .write          = write_jedec_1,
7840                .read           = read_memmapped,
7841                .voltage        = {2700, 3600},
7842        },
7843
7844        {
7845                .vendor         = "ST",
7846                .name           = "M29W040B",
7847                .bustype        = BUS_PARALLEL,
7848                .manufacture_id = ST_ID,
7849                .model_id       = ST_M29W040B,
7850                .total_size     = 512,
7851                .page_size      = 64 * 1024,
7852                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7853                .tested         = TEST_UNTESTED,
7854                .probe          = probe_jedec,
7855                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
7856                .block_erasers  =
7857                {
7858                        {
7859                                .eraseblocks = { {64 * 1024, 8}, },
7860                                .block_erase = erase_sector_jedec,
7861                        }, {
7862                                .eraseblocks = { {512 * 1024, 1} },
7863                                .block_erase = erase_chip_block_jedec,
7864                        }
7865                },
7866                .write          = write_jedec_1,
7867                .read           = read_memmapped,
7868                .voltage        = {2700, 3600},
7869        },
7870
7871        {
7872                .vendor         = "ST",
7873                .name           = "M29W512B",
7874                .bustype        = BUS_PARALLEL,
7875                .manufacture_id = ST_ID,
7876                .model_id       = ST_M29W512B,
7877                .total_size     = 64,
7878                .page_size      = 64 * 1024,
7879                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7880                .tested         = TEST_OK_PRE,
7881                .probe          = probe_jedec,
7882                .probe_timing   = TIMING_ZERO,
7883                .block_erasers  =
7884                {
7885                        {
7886                                .eraseblocks = { {64 * 1024, 1} },
7887                                .block_erase = erase_chip_block_jedec,
7888                        }
7889                },
7890                .write          = write_jedec_1,
7891                .read           = read_memmapped,
7892                .voltage        = {2700, 3600},
7893        },
7894
7895        {
7896                .vendor         = "ST",
7897                .name           = "M50FLW040A",
7898                .bustype        = BUS_FWH | BUS_LPC, /* A/A Mux */
7899                .manufacture_id = ST_ID,
7900                .model_id       = ST_M50FLW040A,
7901                .total_size     = 512,
7902                .page_size      = 64 * 1024,
7903                .feature_bits   = FEATURE_REGISTERMAP,
7904                .tested         = TEST_UNTESTED,
7905                .probe          = probe_82802ab,
7906                .probe_timing   = TIMING_FIXME,
7907                .block_erasers  =
7908                {
7909                        {
7910                                .eraseblocks = {
7911                                        {4 * 1024, 16}, /* sector */
7912                                        {64 * 1024, 5}, /* block */
7913                                        {4 * 1024, 16}, /* sector */
7914                                        {4 * 1024, 16}, /* sector */
7915                                },
7916                                .block_erase = NULL,
7917                        }, {
7918                                .eraseblocks = { {64 * 1024, 8}, },
7919                                .block_erase = erase_block_82802ab,
7920                        }
7921                },
7922                .unlock         = unlock_stm50flw0x0x,
7923                .write          = write_82802ab,
7924                .read           = read_memmapped,
7925                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
7926        },
7927
7928        {
7929                .vendor         = "ST",
7930                .name           = "M50FLW040B",
7931                .bustype        = BUS_FWH | BUS_LPC, /* A/A Mux */
7932                .manufacture_id = ST_ID,
7933                .model_id       = ST_M50FLW040B,
7934                .total_size     = 512,
7935                .page_size      = 64 * 1024,
7936                .feature_bits   = FEATURE_REGISTERMAP,
7937                .tested         = TEST_UNTESTED,
7938                .probe          = probe_82802ab,
7939                .probe_timing   = TIMING_FIXME,
7940                .block_erasers  =
7941                {
7942                        {
7943                                .eraseblocks = {
7944                                        {4 * 1024, 16}, /* sector */
7945                                        {4 * 1024, 16}, /* sector */
7946                                        {64 * 1024, 5}, /* block */
7947                                        {4 * 1024, 16}, /* sector */
7948                                },
7949                                .block_erase = NULL,
7950                        }, {
7951                                .eraseblocks = { {64 * 1024, 8}, },
7952                                .block_erase = erase_block_82802ab,
7953                        }
7954                },
7955                .unlock         = unlock_stm50flw0x0x,
7956                .write          = write_82802ab,
7957                .read           = read_memmapped,
7958                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
7959        },
7960
7961        {
7962                .vendor         = "ST",
7963                .name           = "M50FLW080A",
7964                .bustype        = BUS_FWH | BUS_LPC, /* A/A Mux */
7965                .manufacture_id = ST_ID,
7966                .model_id       = ST_M50FLW080A,
7967                .total_size     = 1024,
7968                .page_size      = 64 * 1024,
7969                .feature_bits   = FEATURE_REGISTERMAP,
7970                .tested         = TEST_OK_PRE,
7971                .probe          = probe_82802ab,
7972                .probe_timing   = TIMING_FIXME,
7973                .block_erasers  =
7974                {
7975                        {
7976                                .eraseblocks = {
7977                                        {4 * 1024, 16}, /* sector */
7978                                        {64 * 1024, 13}, /* block */
7979                                        {4 * 1024, 16}, /* sector */
7980                                        {4 * 1024, 16}, /* sector */
7981                                },
7982                                .block_erase = NULL,
7983                        }, {
7984                                .eraseblocks = { {64 * 1024, 16}, },
7985                                .block_erase = erase_block_82802ab,
7986                        }
7987                },
7988                .unlock         = unlock_stm50flw0x0x,
7989                .write          = write_82802ab,
7990                .read           = read_memmapped,
7991                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
7992        },
7993
7994        {
7995                .vendor         = "ST",
7996                .name           = "M50FLW080B",
7997                .bustype        = BUS_FWH | BUS_LPC, /* A/A Mux */
7998                .manufacture_id = ST_ID,
7999                .model_id       = ST_M50FLW080B,
8000                .total_size     = 1024,
8001                .page_size      = 64 * 1024,
8002                .feature_bits   = FEATURE_REGISTERMAP,
8003                .tested         = TEST_UNTESTED,
8004                .probe          = probe_82802ab,
8005                .probe_timing   = TIMING_FIXME,
8006                .block_erasers  =
8007                {
8008                        {
8009                                .eraseblocks = {
8010                                        {4 * 1024, 16}, /* sector */
8011                                        {4 * 1024, 16}, /* sector */
8012                                        {64 * 1024, 13}, /* block */
8013                                        {4 * 1024, 16}, /* sector */
8014                                },
8015                                .block_erase = NULL,
8016                        }, {
8017                                .eraseblocks = { {64 * 1024, 16}, },
8018                                .block_erase = erase_block_82802ab,
8019                        }
8020                },
8021                .unlock         = unlock_stm50flw0x0x,
8022                .write          = write_82802ab,
8023                .read           = read_memmapped,
8024                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8025        },
8026
8027        {
8028                .vendor         = "ST",
8029                .name           = "M50FW002",
8030                .bustype        = BUS_FWH, /* A/A Mux */
8031                .manufacture_id = ST_ID,
8032                .model_id       = ST_M50FW002,
8033                .total_size     = 256,
8034                .page_size      = 64 * 1024,
8035                .feature_bits   = FEATURE_REGISTERMAP,
8036                .tested         = TEST_UNTESTED,
8037                .probe          = probe_82802ab,
8038                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
8039                .block_erasers  =
8040                {
8041                        {
8042                                .eraseblocks = {
8043                                        {64 * 1024, 3},
8044                                        {32 * 1024, 1},
8045                                        {8 * 1024, 2},
8046                                        {16 * 1024, 1},
8047                                },
8048                                .block_erase = erase_block_82802ab,
8049                        }
8050                },
8051                .unlock         = unlock_stm50flw0x0x,
8052                .write          = write_82802ab,
8053                .read           = read_memmapped,
8054                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8055        },
8056
8057        {
8058                .vendor         = "ST",
8059                .name           = "M50FW016",
8060                .bustype        = BUS_FWH, /* A/A Mux */
8061                .manufacture_id = ST_ID,
8062                .model_id       = ST_M50FW016,
8063                .total_size     = 2048,
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 (82802ab.c) */
8069                .block_erasers  =
8070                {
8071                        {
8072                                .eraseblocks = { {64 * 1024, 32}, },
8073                                .block_erase = erase_block_82802ab,
8074                        }
8075                },
8076                .unlock         = unlock_stm50flw0x0x,
8077                .write          = write_82802ab,
8078                .read           = read_memmapped,
8079                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8080        },
8081
8082        {
8083                .vendor         = "ST",
8084                .name           = "M50FW040",
8085                .bustype        = BUS_FWH, /* A/A Mux */
8086                .manufacture_id = ST_ID,
8087                .model_id       = ST_M50FW040,
8088                .total_size     = 512,
8089                .page_size      = 64 * 1024,
8090                .feature_bits   = FEATURE_REGISTERMAP,
8091                .tested         = TEST_OK_PR,
8092                .probe          = probe_82802ab,
8093                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
8094                .block_erasers  =
8095                {
8096                        {
8097                                .eraseblocks = { {64 * 1024, 8}, },
8098                                .block_erase = erase_block_82802ab,
8099                        }
8100                },
8101                .unlock         = unlock_stm50flw0x0x,
8102                .write          = write_82802ab,
8103                .read           = read_memmapped,
8104                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8105        },
8106
8107        {
8108                .vendor         = "ST",
8109                .name           = "M50FW080",
8110                .bustype        = BUS_FWH, /* A/A Mux */
8111                .manufacture_id = ST_ID,
8112                .model_id       = ST_M50FW080,
8113                .total_size     = 1024,
8114                .page_size      = 64 * 1024,
8115                .feature_bits   = FEATURE_REGISTERMAP,
8116                .tested         = TEST_OK_PREW,
8117                .probe          = probe_82802ab,
8118                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
8119                .block_erasers  =
8120                {
8121                        {
8122                                .eraseblocks = { {64 * 1024, 16}, },
8123                                .block_erase = erase_block_82802ab,
8124                        }
8125                },
8126                .unlock         = unlock_stm50flw0x0x,
8127                .write          = write_82802ab,
8128                .read           = read_memmapped,
8129                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8130        },
8131
8132        {
8133                .vendor         = "ST",
8134                .name           = "M50LPW116",
8135                .bustype        = BUS_LPC, /* A/A Mux */
8136                .manufacture_id = ST_ID,
8137                .model_id       = ST_M50LPW116,
8138                .total_size     = 2048,
8139                .page_size      = 64 * 1024,
8140                .feature_bits   = FEATURE_REGISTERMAP,
8141                .tested         = TEST_UNTESTED,
8142                .probe          = probe_82802ab,
8143                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8144                .block_erasers  =
8145                {
8146                        {
8147                                .eraseblocks = {
8148                                        {4 * 1024, 16},
8149                                        {64 * 1024, 30},
8150                                        {32 * 1024, 1},
8151                                        {8 * 1024, 2},
8152                                        {16 * 1024, 1},
8153                                },
8154                                .block_erase = erase_block_82802ab,
8155                        }
8156                },
8157                .unlock         = unlock_stm50flw0x0x,
8158                .write          = write_82802ab,
8159                .read           = read_memmapped,
8160                .voltage        = {3000, 3600}, /* Also has 12V fast program & erase */
8161        },
8162
8163        {
8164                .vendor         = "SyncMOS/MoselVitelic",
8165                .name           = "{F,S,V}29C51001B",
8166                .bustype        = BUS_PARALLEL,
8167                .manufacture_id = SYNCMOS_MVC_ID,
8168                .model_id       = SM_MVC_29C51001B,
8169                .total_size     = 128,
8170                .page_size      = 512,
8171                .feature_bits   = FEATURE_EITHER_RESET,
8172                .tested         = TEST_UNTESTED,
8173                .probe          = probe_jedec,
8174                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8175                .block_erasers  =
8176                {
8177                        {
8178                                .eraseblocks = { {512, 256} },
8179                                .block_erase = erase_sector_jedec,
8180                        }, {
8181                                .eraseblocks = { {128 * 1024, 1} },
8182                                .block_erase = erase_chip_block_jedec,
8183                        },
8184                },
8185                .write          = write_jedec_1,
8186                .read           = read_memmapped,
8187                .voltage        = {4500, 5500},
8188        },
8189
8190        {
8191                .vendor         = "SyncMOS/MoselVitelic",
8192                .name           = "{F,S,V}29C51001T",
8193                .bustype        = BUS_PARALLEL,
8194                .manufacture_id = SYNCMOS_MVC_ID,
8195                .model_id       = SM_MVC_29C51001T,
8196                .total_size     = 128,
8197                .page_size      = 512,
8198                .feature_bits   = FEATURE_EITHER_RESET,
8199                .tested         = TEST_UNTESTED,
8200                .probe          = probe_jedec,
8201                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8202                .block_erasers  =
8203                {
8204                        {
8205                                .eraseblocks = { {512, 256} },
8206                                .block_erase = erase_sector_jedec,
8207                        }, {
8208                                .eraseblocks = { {128 * 1024, 1} },
8209                                .block_erase = erase_chip_block_jedec,
8210                        },
8211                },
8212                .write          = write_jedec_1,
8213                .read           = read_memmapped,
8214                .voltage        = {4500, 5500},
8215        },
8216
8217        {
8218                .vendor         = "SyncMOS/MoselVitelic",
8219                .name           = "{F,S,V}29C51002B",
8220                .bustype        = BUS_PARALLEL,
8221                .manufacture_id = SYNCMOS_MVC_ID,
8222                .model_id       = SM_MVC_29C51002B,
8223                .total_size     = 256,
8224                .page_size      = 512,
8225                .feature_bits   = FEATURE_EITHER_RESET,
8226                .tested         = TEST_UNTESTED,
8227                .probe          = probe_jedec,
8228                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8229                .block_erasers  =
8230                {
8231                        {
8232                                .eraseblocks = { {512, 512} },
8233                                .block_erase = erase_sector_jedec,
8234                        }, {
8235                                .eraseblocks = { {256 * 1024, 1} },
8236                                .block_erase = erase_chip_block_jedec,
8237                        },
8238                },
8239                .write          = write_jedec_1,
8240                .read           = read_memmapped,
8241        },
8242
8243        {
8244                .vendor         = "SyncMOS/MoselVitelic",
8245                .name           = "{F,S,V}29C51002T",
8246                .bustype        = BUS_PARALLEL,
8247                .manufacture_id = SYNCMOS_MVC_ID,
8248                .model_id       = SM_MVC_29C51002T,
8249                .total_size     = 256,
8250                .page_size      = 512,
8251                .feature_bits   = FEATURE_EITHER_RESET,
8252                .tested         = TEST_OK_PREW,
8253                .probe          = probe_jedec,
8254                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8255                .block_erasers  =
8256                {
8257                        {
8258                                .eraseblocks = { {512, 512} },
8259                                .block_erase = erase_sector_jedec,
8260                        }, {
8261                                .eraseblocks = { {256 * 1024, 1} },
8262                                .block_erase = erase_chip_block_jedec,
8263                        },
8264                },
8265                .write          = write_jedec_1,
8266                .read           = read_memmapped,
8267        },
8268
8269        {
8270                .vendor         = "SyncMOS/MoselVitelic",
8271                .name           = "{F,S,V}29C51004B",
8272                .bustype        = BUS_PARALLEL,
8273                .manufacture_id = SYNCMOS_MVC_ID,
8274                .model_id       = SM_MVC_29C51004B,
8275                .total_size     = 512,
8276                .page_size      = 1024,
8277                .feature_bits   = FEATURE_EITHER_RESET,
8278                .tested         = TEST_UNTESTED,
8279                .probe          = probe_jedec,
8280                .probe_timing   = TIMING_ZERO,
8281                .block_erasers  =
8282                {
8283                        {
8284                                .eraseblocks = { {1024, 512} },
8285                                .block_erase = erase_sector_jedec,
8286                        }, {
8287                                .eraseblocks = { {512 * 1024, 1} },
8288                                .block_erase = erase_chip_block_jedec,
8289                        },
8290                },
8291                .write          = write_jedec_1,
8292                .read           = read_memmapped,
8293                .voltage        = {4500, 5500},
8294        },
8295
8296        {
8297                .vendor         = "SyncMOS/MoselVitelic",
8298                .name           = "{F,S,V}29C51004T",
8299                .bustype        = BUS_PARALLEL,
8300                .manufacture_id = SYNCMOS_MVC_ID,
8301                .model_id       = SM_MVC_29C51004T,
8302                .total_size     = 512,
8303                .page_size      = 1024,
8304                .feature_bits   = FEATURE_EITHER_RESET,
8305                .tested         = TEST_UNTESTED,
8306                .probe          = probe_jedec,
8307                .probe_timing   = TIMING_ZERO,
8308                .block_erasers  =
8309                {
8310                        {
8311                                .eraseblocks = { {1024, 512} },
8312                                .block_erase = erase_sector_jedec,
8313                        }, {
8314                                .eraseblocks = { {512 * 1024, 1} },
8315                                .block_erase = erase_chip_block_jedec,
8316                        },
8317                },
8318                .write          = write_jedec_1,
8319                .read           = read_memmapped,
8320                .voltage        = {4500, 5500},
8321        },
8322
8323        {
8324                .vendor         = "SyncMOS/MoselVitelic",
8325                .name           = "{S,V}29C31004B",
8326                .bustype        = BUS_PARALLEL,
8327                .manufacture_id = SYNCMOS_MVC_ID,
8328                .model_id       = SM_MVC_29C31004B,
8329                .total_size     = 512,
8330                .page_size      = 1024,
8331                .feature_bits   = FEATURE_EITHER_RESET,
8332                .tested         = TEST_UNTESTED,
8333                .probe          = probe_jedec,
8334                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8335                .block_erasers  =
8336                {
8337                        {
8338                                .eraseblocks = { {1024, 512} },
8339                                .block_erase = erase_sector_jedec,
8340                        }, {
8341                                .eraseblocks = { {512 * 1024, 1} },
8342                                .block_erase = erase_chip_block_jedec,
8343                        },
8344                },
8345                .write          = write_jedec_1,
8346                .read           = read_memmapped,
8347                .voltage        = {3000, 3600},
8348        },
8349
8350        {
8351                .vendor         = "SyncMOS/MoselVitelic",
8352                .name           = "{S,V}29C31004T",
8353                .bustype        = BUS_PARALLEL,
8354                .manufacture_id = SYNCMOS_MVC_ID,
8355                .model_id       = SM_MVC_29C31004T,
8356                .total_size     = 512,
8357                .page_size      = 1024,
8358                .feature_bits   = FEATURE_EITHER_RESET,
8359                .tested         = TEST_UNTESTED,
8360                .probe          = probe_jedec,
8361                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8362                .block_erasers  =
8363                {
8364                        {
8365                                .eraseblocks = { {1024, 512} },
8366                                .block_erase = erase_sector_jedec,
8367                        }, {
8368                                .eraseblocks = { {512 * 1024, 1} },
8369                                .block_erase = erase_chip_block_jedec,
8370                        },
8371                },
8372                .write          = write_jedec_1,
8373                .read           = read_memmapped,
8374                .voltage        = {3000, 3600},
8375        },
8376
8377        {
8378                .vendor         = "TI",
8379                .name           = "TMS29F002RB",
8380                .bustype        = BUS_PARALLEL,
8381                .manufacture_id = TI_OLD_ID,
8382                .model_id       = TI_TMS29F002RB,
8383                .total_size     = 256,
8384                .page_size      = 16384, /* Non-uniform sectors */
8385                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8386                .tested         = TEST_UNTESTED,
8387                .probe          = probe_jedec,
8388                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8389                .block_erasers  =
8390                {
8391                        {
8392                                .eraseblocks = {
8393                                        {16 * 1024, 1},
8394                                        {8 * 1024, 2},
8395                                        {32 * 1024, 1},
8396                                        {64 * 1024, 3},
8397                                },
8398                                .block_erase = erase_sector_jedec,
8399                        }, {
8400                                .eraseblocks = { {256 * 1024, 1} },
8401                                .block_erase = erase_chip_block_jedec,
8402                        },
8403                },
8404                .write          = write_jedec_1,
8405                .read           = read_memmapped,
8406                .voltage        = {4500, 5500},
8407        },
8408
8409        {
8410                .vendor         = "TI",
8411                .name           = "TMS29F002RT",
8412                .bustype        = BUS_PARALLEL,
8413                .manufacture_id = TI_OLD_ID,
8414                .model_id       = TI_TMS29F002RT,
8415                .total_size     = 256,
8416                .page_size      = 16384, /* Non-uniform sectors */
8417                .feature_bits   = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8418                .tested         = TEST_UNTESTED,
8419                .probe          = probe_jedec,
8420                .probe_timing   = TIMING_ZERO,  /* Datasheet has no timing info specified */
8421                .block_erasers  =
8422                {
8423                        {
8424                                .eraseblocks = {
8425                                        {64 * 1024, 3},
8426                                        {32 * 1024, 1},
8427                                        {8 * 1024, 2},
8428                                        {16 * 1024, 1},
8429                                },
8430                                .block_erase = erase_sector_jedec,
8431                        }, {
8432                                .eraseblocks = { {256 * 1024, 1} },
8433                                .block_erase = erase_chip_block_jedec,
8434                        },
8435                },
8436                .write          = write_jedec_1,
8437                .read           = read_memmapped,
8438                .voltage        = {4500, 5500},
8439        },
8440
8441        {
8442                .vendor         = "Winbond",
8443                .name           = "W25Q80",
8444                .bustype        = BUS_SPI,
8445                .manufacture_id = WINBOND_NEX_ID,
8446                .model_id       = WINBOND_NEX_W25Q80,
8447                .total_size     = 1024,
8448                .page_size      = 256,
8449                /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8450                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
8451                .tested         = TEST_OK_PREW,
8452                .probe          = probe_spi_rdid,
8453                .probe_timing   = TIMING_ZERO,
8454                .block_erasers  =
8455                {
8456                        {
8457                                .eraseblocks = { {4 * 1024, 256} },
8458                                .block_erase = spi_block_erase_20,
8459                        }, {
8460                                .eraseblocks = { {32 * 1024, 32} },
8461                                .block_erase = spi_block_erase_52,
8462                        }, {
8463                                .eraseblocks = { {64 * 1024, 16} },
8464                                .block_erase = spi_block_erase_d8,
8465                        }, {
8466                                .eraseblocks = { {1024 * 1024, 1} },
8467                                .block_erase = spi_block_erase_60,
8468                        }, {
8469                                .eraseblocks = { {1024 * 1024, 1} },
8470                                .block_erase = spi_block_erase_c7,
8471                        }
8472                },
8473                .unlock         = spi_disable_blockprotect,
8474                .write          = spi_chip_write_256,
8475                .read           = spi_chip_read,
8476                .voltage        = {2700, 3600},
8477        },
8478
8479        {
8480                .vendor         = "Winbond",
8481                .name           = "W25Q16",
8482                .bustype        = BUS_SPI,
8483                .manufacture_id = WINBOND_NEX_ID,
8484                .model_id       = WINBOND_NEX_W25Q16,
8485                .total_size     = 2048,
8486                .page_size      = 256,
8487                /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8488                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
8489                .tested         = TEST_OK_PREW,
8490                .probe          = probe_spi_rdid,
8491                .probe_timing   = TIMING_ZERO,
8492                .block_erasers  =
8493                {
8494                        {
8495                                .eraseblocks = { {4 * 1024, 512} },
8496                                .block_erase = spi_block_erase_20,
8497                        }, {
8498                                .eraseblocks = { {32 * 1024, 64} },
8499                                .block_erase = spi_block_erase_52,
8500                        }, {
8501                                .eraseblocks = { {64 * 1024, 32} },
8502                                .block_erase = spi_block_erase_d8,
8503                        }, {
8504                                .eraseblocks = { {2 * 1024 * 1024, 1} },
8505                                .block_erase = spi_block_erase_60,
8506                        }, {
8507                                .eraseblocks = { {2 * 1024 * 1024, 1} },
8508                                .block_erase = spi_block_erase_c7,
8509                        }
8510                },
8511                .unlock         = spi_disable_blockprotect,
8512                .write          = spi_chip_write_256,
8513                .read           = spi_chip_read,
8514                .voltage        = {2700, 3600},
8515        },
8516
8517        {
8518                .vendor         = "Winbond",
8519                .name           = "W25Q32",
8520                .bustype        = BUS_SPI,
8521                .manufacture_id = WINBOND_NEX_ID,
8522                .model_id       = WINBOND_NEX_W25Q32,
8523                .total_size     = 4096,
8524                .page_size      = 256,
8525                /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8526                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
8527                .tested         = TEST_OK_PREW,
8528                .probe          = probe_spi_rdid,
8529                .probe_timing   = TIMING_ZERO,
8530                .block_erasers  =
8531                {
8532                        {
8533                                .eraseblocks = { {4 * 1024, 1024} },
8534                                .block_erase = spi_block_erase_20,
8535                        }, {
8536                                .eraseblocks = { {32 * 1024, 128} },
8537                                .block_erase = spi_block_erase_52,
8538                        }, {
8539                                .eraseblocks = { {64 * 1024, 64} },
8540                                .block_erase = spi_block_erase_d8,
8541                        }, {
8542                                .eraseblocks = { {4 * 1024 * 1024, 1} },
8543                                .block_erase = spi_block_erase_60,
8544                        }, {
8545                                .eraseblocks = { {4 * 1024 * 1024, 1} },
8546                                .block_erase = spi_block_erase_c7,
8547                        }
8548                },
8549                .unlock         = spi_disable_blockprotect,
8550                .write          = spi_chip_write_256,
8551                .read           = spi_chip_read,
8552                .voltage        = {2700, 3600},
8553        },
8554
8555        {
8556                .vendor         = "Winbond",
8557                .name           = "W25Q64",
8558                .bustype        = BUS_SPI,
8559                .manufacture_id = WINBOND_NEX_ID,
8560                .model_id       = WINBOND_NEX_W25Q64,
8561                .total_size     = 8192,
8562                .page_size      = 256,
8563                /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8564                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
8565                .tested         = TEST_OK_PREW,
8566                .probe          = probe_spi_rdid,
8567                .probe_timing   = TIMING_ZERO,
8568                .block_erasers  =
8569                {
8570                        {
8571                                .eraseblocks = { {4 * 1024, 2048} },
8572                                .block_erase = spi_block_erase_20,
8573                        }, {
8574                                .eraseblocks = { {32 * 1024, 256} },
8575                                .block_erase = spi_block_erase_52,
8576                        }, {
8577                                .eraseblocks = { {64 * 1024, 128} },
8578                                .block_erase = spi_block_erase_d8,
8579                        }, {
8580                                .eraseblocks = { {8 * 1024 * 1024, 1} },
8581                                .block_erase = spi_block_erase_60,
8582                        }, {
8583                                .eraseblocks = { {8 * 1024 * 1024, 1} },
8584                                .block_erase = spi_block_erase_c7,
8585                        }
8586                },
8587                .unlock         = spi_disable_blockprotect,
8588                .write          = spi_chip_write_256,
8589                .read           = spi_chip_read,
8590        },
8591
8592        {
8593                .vendor         = "Winbond",
8594                .name           = "W25Q128",
8595                .bustype        = BUS_SPI,
8596                .manufacture_id = WINBOND_NEX_ID,
8597                .model_id       = WINBOND_NEX_W25Q128,
8598                .total_size     = 16384,
8599                .page_size      = 256,
8600                /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
8601                .feature_bits   = FEATURE_WRSR_WREN | FEATURE_OTP,
8602                .tested         = TEST_OK_PROBE,
8603                .probe          = probe_spi_rdid,
8604                .probe_timing   = TIMING_ZERO,
8605                .block_erasers  =
8606                {
8607                        {
8608                                .eraseblocks = { {4 * 1024, 4096} },
8609                                .block_erase = spi_block_erase_20,
8610                        }, {
8611                                .eraseblocks = { {32 * 1024, 512} },
8612                                .block_erase = spi_block_erase_52,
8613                        }, {
8614                                .eraseblocks = { {64 * 1024, 256} },
8615                                .block_erase = spi_block_erase_d8,
8616                        }, {
8617                                .eraseblocks = { {16 * 1024 * 1024, 1} },
8618                                .block_erase = spi_block_erase_60,
8619                        }, {
8620                                .eraseblocks = { {16 * 1024 * 1024, 1} },
8621                                .block_erase = spi_block_erase_c7,
8622                        }
8623                },
8624                .unlock         = spi_disable_blockprotect,
8625                .write          = spi_chip_write_256,
8626                .read           = spi_chip_read,
8627        },
8628
8629        {
8630                .vendor         = "Winbond",
8631                .name           = "W25X10",
8632                .bustype        = BUS_SPI,
8633                .manufacture_id = WINBOND_NEX_ID,
8634                .model_id       = WINBOND_NEX_W25X10,
8635                .total_size     = 128,
8636                .page_size      = 256,
8637                .feature_bits   = FEATURE_WRSR_WREN,
8638                .tested         = TEST_UNTESTED,
8639                .probe          = probe_spi_rdid,
8640                .probe_timing   = TIMING_ZERO,
8641                .block_erasers  =
8642                {
8643                        {
8644                                .eraseblocks = { {4 * 1024, 32} },
8645                                .block_erase = spi_block_erase_20,
8646                        }, {
8647                                .eraseblocks = { {64 * 1024, 2} },
8648                                .block_erase = spi_block_erase_d8,
8649                        }, {
8650                                .eraseblocks = { {128 * 1024, 1} },
8651                                .block_erase = spi_block_erase_c7,
8652                        }
8653                },
8654                .unlock         = spi_disable_blockprotect,
8655                .write          = spi_chip_write_256,
8656                .read           = spi_chip_read,
8657                .voltage        = {2700, 3600},
8658        },
8659
8660        {
8661                .vendor         = "Winbond",
8662                .name           = "W25X20",
8663                .bustype        = BUS_SPI,
8664                .manufacture_id = WINBOND_NEX_ID,
8665                .model_id       = WINBOND_NEX_W25X20,
8666                .total_size     = 256,
8667                .page_size      = 256,
8668                .feature_bits   = FEATURE_WRSR_WREN,
8669                .tested         = TEST_UNTESTED,
8670                .probe          = probe_spi_rdid,
8671                .probe_timing   = TIMING_ZERO,
8672                .block_erasers  =
8673                {
8674                        {
8675                                .eraseblocks = { {4 * 1024, 64} },
8676                                .block_erase = spi_block_erase_20,
8677                        }, {
8678                                .eraseblocks = { {64 * 1024, 4} },
8679                                .block_erase = spi_block_erase_d8,
8680                        }, {
8681                                .eraseblocks = { {256 * 1024, 1} },
8682                                .block_erase = spi_block_erase_c7,
8683                        }
8684                },
8685                .unlock         = spi_disable_blockprotect,
8686                .write          = spi_chip_write_256,
8687                .read           = spi_chip_read,
8688                .voltage        = {2700, 3600},
8689        },
8690
8691        {
8692                .vendor         = "Winbond",
8693                .name           = "W25X40",
8694                .bustype        = BUS_SPI,
8695                .manufacture_id = WINBOND_NEX_ID,
8696                .model_id       = WINBOND_NEX_W25X40,
8697                .total_size     = 512,
8698                .page_size      = 256,
8699                .feature_bits   = FEATURE_WRSR_WREN,
8700                .tested         = TEST_OK_PREW,
8701                .probe          = probe_spi_rdid,
8702                .probe_timing   = TIMING_ZERO,
8703                .block_erasers  =
8704                {
8705                        {
8706                                .eraseblocks = { {4 * 1024, 128} },
8707                                .block_erase = spi_block_erase_20,
8708                        }, {
8709                                .eraseblocks = { {64 * 1024, 8} },
8710                                .block_erase = spi_block_erase_d8,
8711                        }, {
8712                                .eraseblocks = { {512 * 1024, 1} },
8713                                .block_erase = spi_block_erase_c7,
8714                        }
8715                },
8716                .unlock         = spi_disable_blockprotect,
8717                .write          = spi_chip_write_256,
8718                .read           = spi_chip_read,
8719                .voltage        = {2700, 3600},
8720        },
8721
8722        {
8723                .vendor         = "Winbond",
8724                .name           = "W25X80",
8725                .bustype        = BUS_SPI,
8726                .manufacture_id = WINBOND_NEX_ID,
8727                .model_id       = WINBOND_NEX_W25X80,
8728                .total_size     = 1024,
8729                .page_size      = 256,
8730                .feature_bits   = FEATURE_WRSR_WREN,
8731                .tested         = TEST_OK_PREW,
8732                .probe          = probe_spi_rdid,
8733                .probe_timing   = TIMING_ZERO,
8734                .block_erasers  =
8735                {
8736                        {
8737                                .eraseblocks = { {4 * 1024, 256} },
8738                                .block_erase = spi_block_erase_20,
8739                        }, {
8740                                .eraseblocks = { {64 * 1024, 16} },
8741                                .block_erase = spi_block_erase_d8,
8742                        }, {
8743                                .eraseblocks = { {1024 * 1024, 1} },
8744                                .block_erase = spi_block_erase_c7,
8745                        }
8746                },
8747                .unlock         = spi_disable_blockprotect,
8748                .write          = spi_chip_write_256,
8749                .read           = spi_chip_read,
8750                .voltage        = {2700, 3600},
8751        },
8752
8753        {
8754                .vendor         = "Winbond",
8755                .name           = "W25X16",
8756                .bustype        = BUS_SPI,
8757                .manufacture_id = WINBOND_NEX_ID,
8758                .model_id       = WINBOND_NEX_W25X16,
8759                .total_size     = 2048,
8760                .page_size      = 256,
8761                .feature_bits   = FEATURE_WRSR_WREN,
8762                .tested         = TEST_OK_PREW,
8763                .probe          = probe_spi_rdid,
8764                .probe_timing   = TIMING_ZERO,
8765                .block_erasers  =
8766                {
8767                        {
8768                                .eraseblocks = { {4 * 1024, 512} },
8769                                .block_erase = spi_block_erase_20,
8770                        }, {
8771                                .eraseblocks = { {32 * 1024, 64} },
8772                                .block_erase = spi_block_erase_52,
8773                        }, {
8774                                .eraseblocks = { {64 * 1024, 32} },
8775                                .block_erase = spi_block_erase_d8,
8776                        }, {
8777                                .eraseblocks = { {2 * 1024 * 1024, 1} },
8778                                .block_erase = spi_block_erase_60,
8779                        }, {
8780                                .eraseblocks = { {2 * 1024 * 1024, 1} },
8781                                .block_erase = spi_block_erase_c7,
8782                        }
8783                },
8784                .unlock         = spi_disable_blockprotect,
8785                .write          = spi_chip_write_256,
8786                .read           = spi_chip_read,
8787                .voltage        = {2700, 3600},
8788        },
8789
8790        {
8791                .vendor         = "Winbond",
8792                .name           = "W25X32",
8793                .bustype        = BUS_SPI,
8794                .manufacture_id = WINBOND_NEX_ID,
8795                .model_id       = WINBOND_NEX_W25X32,
8796                .total_size     = 4096,
8797                .page_size      = 256,
8798                .feature_bits   = FEATURE_WRSR_WREN,
8799                .tested         = TEST_OK_PROBE,
8800                .probe          = probe_spi_rdid,
8801                .probe_timing   = TIMING_ZERO,
8802                .block_erasers  =
8803                {
8804                        {
8805                                .eraseblocks = { {4 * 1024, 1024} },
8806                                .block_erase = spi_block_erase_20,
8807                        }, {
8808                                .eraseblocks = { {32 * 1024, 128} },
8809                                .block_erase = spi_block_erase_52,
8810                        }, {
8811                                .eraseblocks = { {64 * 1024, 64} },
8812                                .block_erase = spi_block_erase_d8,
8813                        }, {
8814                                .eraseblocks = { {4 * 1024 * 1024, 1} },
8815                                .block_erase = spi_block_erase_60,
8816                        }, {
8817                                .eraseblocks = { {4 * 1024 * 1024, 1} },
8818                                .block_erase = spi_block_erase_c7,
8819                        }
8820                },
8821                .unlock         = spi_disable_blockprotect,
8822                .write          = spi_chip_write_256,
8823                .read           = spi_chip_read,
8824                .voltage        = {2700, 3600},
8825        },
8826
8827        {
8828                .vendor         = "Winbond",
8829                .name           = "W25X64",
8830                .bustype        = BUS_SPI,
8831                .manufacture_id = WINBOND_NEX_ID,
8832                .model_id       = WINBOND_NEX_W25X64,
8833                .total_size     = 8192,
8834                .page_size      = 256,
8835                .feature_bits   = FEATURE_WRSR_WREN,
8836                .tested         = TEST_OK_PROBE,
8837                .probe          = probe_spi_rdid,
8838                .probe_timing   = TIMING_ZERO,
8839                .block_erasers  =
8840                {
8841                        {
8842                                .eraseblocks = { {4 * 1024, 2048} },
8843                                .block_erase = spi_block_erase_20,
8844                        }, {
8845                                .eraseblocks = { {32 * 1024, 256} },
8846                                .block_erase = spi_block_erase_52,
8847                        }, {
8848                                .eraseblocks = { {64 * 1024, 128} },
8849                                .block_erase = spi_block_erase_d8,
8850                        }, {
8851                                .eraseblocks = { {8 * 1024 * 1024, 1} },
8852                                .block_erase = spi_block_erase_60,
8853                        }, {
8854                                .eraseblocks = { {8 * 1024 * 1024, 1} },
8855                                .block_erase = spi_block_erase_c7,
8856                        }
8857                },
8858                .unlock         = spi_disable_blockprotect,
8859                .write          = spi_chip_write_256,
8860                .read           = spi_chip_read,
8861                .voltage        = {2700, 3600},
8862        },
8863
8864        {
8865                .vendor         = "Winbond",
8866                .name           = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
8867                .bustype        = BUS_PARALLEL,
8868                .manufacture_id = WINBOND_ID,
8869                .model_id       = WINBOND_W29C010,
8870                .total_size     = 128,
8871                .page_size      = 128,
8872                .feature_bits   = FEATURE_LONG_RESET,
8873                .tested         = TEST_OK_PRE,
8874                .probe          = probe_w29ee011,
8875                .probe_timing   = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
8876                .block_erasers  =
8877                {
8878                        {
8879                                .eraseblocks = { {128 * 1024, 1} },
8880                                .block_erase = erase_chip_block_jedec,
8881                        }
8882                },
8883                .write          = write_jedec,
8884                .read           = read_memmapped,
8885        },
8886
8887        {/* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
8888                .vendor         = "Winbond",
8889                .name           = "W29C010(M)/W29C011A/W29EE011/W29EE012",
8890                .bustype        = BUS_PARALLEL,
8891                .manufacture_id = WINBOND_ID,
8892                .model_id       = WINBOND_W29C010,
8893                .total_size     = 128,
8894                .page_size      = 128,
8895                .feature_bits   = FEATURE_LONG_RESET,
8896                .tested         = TEST_OK_PREW,
8897                .probe          = probe_jedec,
8898                .probe_timing   = 10,           /* used datasheet for the W29C011A */
8899                .block_erasers  =
8900                {
8901                        {
8902                                .eraseblocks = { {128 * 1024, 1} },
8903                                .block_erase = erase_chip_block_jedec,
8904                        }
8905                },
8906                .write          = write_jedec,
8907                .read           = read_memmapped,
8908        },
8909
8910        {
8911                .vendor         = "Winbond",
8912                .name           = "W29C020(C)/W29C022",
8913                .bustype        = BUS_PARALLEL,
8914                .manufacture_id = WINBOND_ID,
8915                .model_id       = WINBOND_W29C020,
8916                .total_size     = 256,
8917                .page_size      = 128,
8918                .feature_bits   = FEATURE_LONG_RESET,
8919                .tested         = TEST_OK_PREW,
8920                .probe          = probe_jedec,
8921                .probe_timing   = 10,
8922                .block_erasers  =
8923                {
8924                        {
8925                                .eraseblocks = { {256 * 1024, 1} },
8926                                .block_erase = erase_chip_block_jedec,
8927                        }
8928                },
8929                .write          = write_jedec,
8930                .read           = read_memmapped,
8931                .voltage        = {4500, 5500},
8932        },
8933
8934        {
8935                .vendor         = "Winbond",
8936                .name           = "W29C040/P",
8937                .bustype        = BUS_PARALLEL,
8938                .manufacture_id = WINBOND_ID,
8939                .model_id       = WINBOND_W29C040,
8940                .total_size     = 512,
8941                .page_size      = 256,
8942                .feature_bits   = FEATURE_LONG_RESET,
8943                .tested         = TEST_UNTESTED,
8944                .probe          = probe_jedec,
8945                .probe_timing   = 10, 
8946                .block_erasers  =
8947                {
8948                        {
8949                                .eraseblocks = { {512 * 1024, 1} },
8950                                .block_erase = erase_chip_block_jedec,
8951                        }
8952                },
8953                .write          = write_jedec,
8954                .read           = read_memmapped,
8955                .voltage        = {4500, 5500},
8956        },
8957
8958        {
8959                .vendor         = "Winbond",
8960                .name           = "W39L040",
8961                .bustype        = BUS_PARALLEL,
8962                .manufacture_id = WINBOND_ID,
8963                .model_id       = WINBOND_W39L040,
8964                .total_size     = 512,
8965                .page_size      = 64 * 1024,
8966                .feature_bits   = FEATURE_EITHER_RESET,
8967                .tested         = TEST_OK_PR,
8968                .probe          = probe_jedec,
8969                .probe_timing   = 10,
8970                .block_erasers  =
8971                {
8972                        {
8973                                .eraseblocks = { {4 * 1024, 128} },
8974                                .block_erase = erase_block_jedec,
8975                        }, {
8976                                .eraseblocks = { {64 * 1024, 8} },
8977                                .block_erase = erase_sector_jedec,
8978                        }, {
8979                                .eraseblocks = { {512 * 1024, 1} },
8980                                .block_erase = erase_chip_block_jedec,
8981                        }
8982                },
8983                .printlock      = printlock_w39l040,
8984                .write          = write_jedec_1,
8985                .read           = read_memmapped,
8986                .voltage        = {3000, 3600},
8987        },
8988
8989        {
8990                .vendor         = "Winbond",
8991                .name           = "W39V040A",
8992                .bustype        = BUS_LPC,
8993                .manufacture_id = WINBOND_ID,
8994                .model_id       = WINBOND_W39V040A,
8995                .total_size     = 512,
8996                .page_size      = 64 * 1024,
8997                .feature_bits   = FEATURE_EITHER_RESET,
8998                .tested         = TEST_OK_PREW,
8999                .probe          = probe_jedec,
9000                .probe_timing   = 10,
9001                .block_erasers  =
9002                {
9003                        {
9004                                .eraseblocks = { {64 * 1024, 8} },
9005                                .block_erase = erase_sector_jedec,
9006                        }, {
9007                                .eraseblocks = { {512 * 1024, 1} },
9008                                .block_erase = erase_chip_block_jedec,
9009                        }
9010                },
9011                .printlock      = printlock_w39v040a,
9012                .write          = write_jedec_1,
9013                .read           = read_memmapped,
9014                .voltage        = {3000, 3600},
9015        },
9016
9017        {
9018                .vendor         = "Winbond",
9019                .name           = "W39V040B",
9020                .bustype        = BUS_LPC,
9021                .manufacture_id = WINBOND_ID,
9022                .model_id       = WINBOND_W39V040B,
9023                .total_size     = 512,
9024                .page_size      = 64 * 1024,
9025                .feature_bits   = FEATURE_EITHER_RESET,
9026                .tested         = TEST_OK_PREW,
9027                .probe          = probe_jedec,
9028                .probe_timing   = 10,
9029                .block_erasers  =
9030                {
9031                        {
9032                                .eraseblocks = { {64 * 1024, 8} },
9033                                .block_erase = erase_sector_jedec,
9034                        }, {
9035                                .eraseblocks = { {512 * 1024, 1} },
9036                                .block_erase = erase_chip_block_jedec,
9037                        }
9038                },
9039                .printlock      = printlock_w39v040b,
9040                .write          = write_jedec_1,
9041                .read           = read_memmapped,
9042                .voltage        = {3000, 3600},
9043        },
9044
9045        {
9046                .vendor         = "Winbond",
9047                .name           = "W39V040C",
9048                .bustype        = BUS_LPC,
9049                .manufacture_id = WINBOND_ID,
9050                .model_id       = WINBOND_W39V040C,
9051                .total_size     = 512,
9052                .page_size      = 64 * 1024,
9053                .feature_bits   = FEATURE_EITHER_RESET,
9054                .tested         = TEST_OK_PREW,
9055                .probe          = probe_jedec,
9056                .probe_timing   = 10,
9057                .block_erasers  =
9058                {
9059                        {
9060                                .eraseblocks = { {64 * 1024, 8} },
9061                                .block_erase = erase_sector_jedec,
9062                        }, {
9063                                .eraseblocks = { {512 * 1024, 1} },
9064                                .block_erase = erase_chip_block_jedec,
9065                        }
9066                },
9067                .printlock      = printlock_w39v040c,
9068                .write          = write_jedec_1,
9069                .read           = read_memmapped,
9070                .voltage        = {3000, 3600},
9071        },
9072
9073        {
9074                .vendor         = "Winbond",
9075                .name           = "W39V040FA",
9076                .bustype        = BUS_FWH,
9077                .manufacture_id = WINBOND_ID,
9078                .model_id       = WINBOND_W39V040FA,
9079                .total_size     = 512,
9080                .page_size      = 64 * 1024,
9081                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9082                .tested         = TEST_OK_PREW,
9083                .probe          = probe_jedec,
9084                .probe_timing   = 10,
9085                .block_erasers  =
9086                {
9087                        {
9088                                .eraseblocks = { {4 * 1024, 128} },
9089                                .block_erase = erase_block_jedec,
9090                        }, {
9091                                .eraseblocks = { {64 * 1024, 8} },
9092                                .block_erase = erase_sector_jedec,
9093                        }, {
9094                                .eraseblocks = { {512 * 1024, 1} },
9095                                .block_erase = erase_chip_block_jedec,
9096                        }
9097                },
9098                .printlock      = printlock_w39v040fa,
9099                .unlock         = unlock_sst_fwhub,
9100                .write          = write_jedec_1,
9101                .read           = read_memmapped,
9102                .voltage        = {3000, 3600},
9103        },
9104
9105        {
9106                .vendor         = "Winbond",
9107                .name           = "W39V040FB",
9108                .bustype        = BUS_FWH,
9109                .manufacture_id = WINBOND_ID,
9110                .model_id       = WINBOND_W39V040B,
9111                .total_size     = 512,
9112                .page_size      = 64 * 1024,
9113                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9114                .tested         = TEST_OK_PREW,
9115                .probe          = probe_jedec,
9116                .probe_timing   = 10, 
9117                .block_erasers  =
9118                {
9119                        {
9120                                .eraseblocks = { {64 * 1024, 8} },
9121                                .block_erase = erase_sector_jedec,
9122                        }, {
9123                                .eraseblocks = { {512 * 1024, 1} },
9124                                .block_erase = erase_chip_block_jedec,
9125                        }
9126                },
9127                .printlock      = printlock_w39v040fb,
9128                .unlock         = unlock_w39v040fb,
9129                .write          = write_jedec_1,
9130                .read           = read_memmapped,
9131                .voltage        = {3000, 3600}, /* Also has 12V fast program */
9132        },
9133
9134        {
9135                .vendor         = "Winbond",
9136                .name           = "W39V040FC",
9137                .bustype        = BUS_FWH,
9138                .manufacture_id = WINBOND_ID,
9139                .model_id       = WINBOND_W39V040C,
9140                .total_size     = 512,
9141                .page_size      = 64 * 1024,
9142                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9143                .tested         = TEST_OK_PREW,
9144                .probe          = probe_jedec,
9145                .probe_timing   = 10,
9146                .block_erasers  =
9147                {
9148                        {
9149                                .eraseblocks = { {64 * 1024, 8} },
9150                                .block_erase = erase_sector_jedec,
9151                        }, {
9152                                .eraseblocks = { {512 * 1024, 1} },
9153                                .block_erase = erase_chip_block_jedec,
9154                        }
9155                },
9156                .printlock      = printlock_w39v040fc,
9157                .write          = write_jedec_1,
9158                .read           = read_memmapped,
9159                .voltage        = {3000, 3600}, /* Also has 12V fast program */
9160        },
9161
9162        {
9163                .vendor         = "Winbond",
9164                .name           = "W39V080A",
9165                .bustype        = BUS_LPC,
9166                .manufacture_id = WINBOND_ID,
9167                .model_id       = WINBOND_W39V080A,
9168                .total_size     = 1024,
9169                .page_size      = 64 * 1024,
9170                .feature_bits   = FEATURE_EITHER_RESET,
9171                .tested         = TEST_OK_PREW,
9172                .probe          = probe_jedec,
9173                .probe_timing   = 10,
9174                .block_erasers  =
9175                {
9176                        {
9177                                .eraseblocks = { {64 * 1024, 16} },
9178                                .block_erase = erase_sector_jedec,
9179                        }, {
9180                                .eraseblocks = { {1024 * 1024, 1} },
9181                                .block_erase = erase_chip_block_jedec,
9182                        }
9183                },
9184                .printlock      = printlock_w39v080a,
9185                .write          = write_jedec_1,
9186                .read           = read_memmapped,
9187                .voltage        = {3000, 3600},
9188        },
9189
9190        {
9191                .vendor         = "Winbond",
9192                .name           = "W49F002U/N",
9193                .bustype        = BUS_PARALLEL,
9194                .manufacture_id = WINBOND_ID,
9195                .model_id       = WINBOND_W49F002U,
9196                .total_size     = 256,
9197                .page_size      = 128,
9198                .feature_bits   = FEATURE_EITHER_RESET,
9199                .tested         = TEST_OK_PREW,
9200                .probe          = probe_jedec,
9201                .probe_timing   = 10,
9202                .block_erasers  =
9203                {
9204                        {
9205                                .eraseblocks = {
9206                                        {128 * 1024, 1},
9207                                        {96 * 1024, 1},
9208                                        {8 * 1024, 2},
9209                                        {16 * 1024, 1},
9210                                },
9211                                .block_erase = erase_sector_jedec,
9212                        }, {
9213                                .eraseblocks = { {256 * 1024, 1} },
9214                                .block_erase = erase_chip_block_jedec,
9215                        }
9216                },
9217                .write          = write_jedec_1,
9218                .read           = read_memmapped,
9219                .voltage        = {4500, 5500},
9220        },
9221
9222        {
9223                .vendor         = "Winbond",
9224                .name           = "W49F020",
9225                .bustype        = BUS_PARALLEL,
9226                .manufacture_id = WINBOND_ID,
9227                .model_id       = WINBOND_W49F020,
9228                .total_size     = 256,
9229                .page_size      = 128,
9230                .feature_bits   = FEATURE_EITHER_RESET,
9231                .tested         = TEST_OK_PROBE,
9232                .probe          = probe_jedec,
9233                .probe_timing   = 10,
9234                .block_erasers  =
9235                {
9236                        {
9237                                .eraseblocks = { {256 * 1024, 1} },
9238                                .block_erase = erase_chip_block_jedec,
9239                        }
9240                },
9241                .write          = write_jedec_1,
9242                .read           = read_memmapped,
9243                .voltage        = {4500, 5500},
9244        },
9245
9246        {
9247                .vendor         = "Winbond",
9248                .name           = "W49V002A",
9249                .bustype        = BUS_LPC,
9250                .manufacture_id = WINBOND_ID,
9251                .model_id       = WINBOND_W49V002A,
9252                .total_size     = 256,
9253                .page_size      = 128,
9254                .feature_bits   = FEATURE_EITHER_RESET,
9255                .tested         = TEST_OK_PREW,
9256                .probe          = probe_jedec,
9257                .probe_timing   = 10,
9258                .block_erasers  =
9259                {
9260                        {
9261                                .eraseblocks = {
9262                                        {64 * 1024, 3},
9263                                        {32 * 1024, 1},
9264                                        {8 * 1024, 2},
9265                                        {16 * 1024, 1},
9266                                },
9267                                .block_erase = erase_sector_jedec,
9268                        }, {
9269                                .eraseblocks = { {256 * 1024, 1} },
9270                                .block_erase = erase_chip_block_jedec,
9271                        }
9272                },
9273                .write          = write_jedec_1,
9274                .read           = read_memmapped,
9275                .voltage        = {3000, 3600},
9276        },
9277
9278        {
9279                .vendor         = "Winbond",
9280                .name           = "W49V002FA",
9281                .bustype        = BUS_FWH,
9282                .manufacture_id = WINBOND_ID,
9283                .model_id       = WINBOND_W49V002FA,
9284                .total_size     = 256,
9285                .page_size      = 128,
9286                .feature_bits   = FEATURE_EITHER_RESET,
9287                .tested         = TEST_OK_PR,
9288                .probe          = probe_jedec,
9289                .probe_timing   = 10,
9290                .block_erasers  =
9291                {
9292                        {
9293                                .eraseblocks = {
9294                                        {64 * 1024, 3},
9295                                        {32 * 1024, 1},
9296                                        {8 * 1024, 2},
9297                                        {16 * 1024, 1},
9298                                },
9299                                .block_erase = erase_sector_jedec,
9300                        }, {
9301                                .eraseblocks = { {256 * 1024, 1} },
9302                                .block_erase = erase_chip_block_jedec,
9303                        }
9304                },
9305                .write          = write_jedec_1,
9306                .read           = read_memmapped,
9307                .voltage        = {3000, 3600},
9308        },
9309
9310        {
9311                .vendor         = "Winbond",
9312                .name           = "W39V080FA",
9313                .bustype        = BUS_FWH,
9314                .manufacture_id = WINBOND_ID,
9315                .model_id       = WINBOND_W39V080FA,
9316                .total_size     = 1024,
9317                .page_size      = 64 * 1024,
9318                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9319                .tested         = TEST_OK_PREW,
9320                .probe          = probe_jedec,
9321                .probe_timing   = 10,
9322                .block_erasers  =
9323                {
9324                        {
9325                                .eraseblocks = { {64 * 1024, 16}, },
9326                                .block_erase = erase_sector_jedec,
9327                        }, {
9328                                .eraseblocks = { {1024 * 1024, 1} },
9329                                .block_erase = erase_chip_block_jedec,
9330                        }
9331                },
9332                .printlock      = printlock_w39v080fa,
9333                .unlock         = unlock_w39v080fa,
9334                .write          = write_jedec_1,
9335                .read           = read_memmapped,
9336                .voltage        = {3000, 3600}, /* Also has 12V fast program */
9337        },
9338
9339        {
9340                .vendor         = "Winbond",
9341                .name           = "W39V080FA (dual mode)",
9342                .bustype        = BUS_FWH,
9343                .manufacture_id = WINBOND_ID,
9344                .model_id       = WINBOND_W39V080FA_DM,
9345                .total_size     = 512,
9346                .page_size      = 64 * 1024,
9347                .feature_bits   = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
9348                .tested         = TEST_UNTESTED,
9349                .probe          = probe_jedec,
9350                .probe_timing   = 10,
9351                .block_erasers  =
9352                {
9353                        {
9354                                .eraseblocks = { {64 * 1024, 8}, },
9355                                .block_erase = erase_sector_jedec,
9356                        }, {
9357                                .eraseblocks = { {512 * 1024, 1} },
9358                                .block_erase = erase_chip_block_jedec,
9359                        }
9360                },
9361                .printlock      = printlock_w39v080fa_dual,
9362                .write          = write_jedec_1,
9363                .read           = read_memmapped,
9364                .voltage        = {3000, 3600}, /* Also has 12V fast program */
9365        },
9366       
9367        {
9368                .vendor         = "Unknown",
9369                .name           = "SFDP-capable chip",
9370                .bustype        = BUS_SPI,
9371                .manufacture_id = GENERIC_MANUF_ID,
9372                .model_id       = SFDP_DEVICE_ID,
9373                /* We present our own "report this" text hence we do not
9374                 * want the default "This flash part has status UNTESTED..."
9375                 * text to be printed. */
9376                .tested         = TEST_OK_PREW,
9377                .probe          = probe_spi_sfdp,
9378                .unlock         = spi_disable_blockprotect, /* is this safe? */
9379                .read           = spi_chip_read,
9380                /* FIXME: some vendor extensions define this */
9381                .voltage        = {},
9382                 /* Everything below will be set by the probing function. */
9383                .write          = NULL,
9384                .total_size     = 0,
9385                .page_size      = 0,
9386                .feature_bits   = 0,
9387                .block_erasers  = {},
9388        },
9389
9390        {
9391                .vendor         = "Programmer",
9392                .name           = "Opaque flash chip",
9393                .bustype        = BUS_PROG,
9394                .manufacture_id = PROGMANUF_ID,
9395                .model_id       = PROGDEV_ID,
9396                .total_size     = 0,
9397                .page_size      = 256,
9398                /* probe is assumed to work, rest will be filled in by probe */
9399                .tested         = TEST_OK_PROBE,
9400                .probe          = probe_opaque,
9401                /* eraseblock sizes will be set by the probing function */
9402                .block_erasers  =
9403                {
9404                        {
9405                                .block_erase = erase_opaque,
9406                        }
9407                },
9408                .write          = write_opaque,
9409                .read           = read_opaque,
9410        },
9411
9412        {
9413                .vendor         = "AMIC",
9414                .name           = "unknown AMIC SPI chip",
9415                .bustype        = BUS_SPI,
9416                .manufacture_id = AMIC_ID,
9417                .model_id       = GENERIC_DEVICE_ID,
9418                .total_size     = 0,
9419                .page_size      = 256,
9420                .tested         = TEST_BAD_PREW,
9421                .probe          = probe_spi_rdid4,
9422                .probe_timing   = TIMING_ZERO,
9423                .write          = NULL,
9424                .read           = NULL,
9425        },
9426
9427        {
9428                .vendor         = "Atmel",
9429                .name           = "unknown Atmel SPI chip",
9430                .bustype        = BUS_SPI,
9431                .manufacture_id = ATMEL_ID,
9432                .model_id       = GENERIC_DEVICE_ID,
9433                .total_size     = 0,
9434                .page_size      = 256,
9435                .tested         = TEST_BAD_PREW,
9436                .probe          = probe_spi_rdid,
9437                .probe_timing   = TIMING_ZERO,
9438                .write          = NULL,
9439                .read           = NULL,
9440        },
9441
9442        {
9443                .vendor         = "Eon",
9444                .name           = "unknown Eon SPI chip",
9445                .bustype        = BUS_SPI,
9446                .manufacture_id = EON_ID_NOPREFIX,
9447                .model_id       = GENERIC_DEVICE_ID,
9448                .total_size     = 0,
9449                .page_size      = 256,
9450                .tested         = TEST_BAD_PREW,
9451                .probe          = probe_spi_rdid,
9452                .probe_timing   = TIMING_ZERO,
9453                .write          = NULL,
9454                .read           = NULL,
9455        },
9456
9457        {
9458                .vendor         = "Macronix",
9459                .name           = "unknown Macronix SPI chip",
9460                .bustype        = BUS_SPI,
9461                .manufacture_id = MACRONIX_ID,
9462                .model_id       = GENERIC_DEVICE_ID,
9463                .total_size     = 0,
9464                .page_size      = 256,
9465                .tested         = TEST_BAD_PREW,
9466                .probe          = probe_spi_rdid,
9467                .probe_timing   = TIMING_ZERO,
9468                .write          = NULL,
9469                .read           = NULL,
9470        },
9471
9472        {
9473                .vendor         = "PMC",
9474                .name           = "unknown PMC SPI chip",
9475                .bustype        = BUS_SPI,
9476                .manufacture_id = PMC_ID,
9477                .model_id       = GENERIC_DEVICE_ID,
9478                .total_size     = 0,
9479                .page_size      = 256,
9480                .tested         = TEST_BAD_PREW,
9481                .probe          = probe_spi_rdid,
9482                .probe_timing   = TIMING_ZERO,
9483                .write          = NULL,
9484                .read           = NULL,
9485        },
9486
9487        {
9488                .vendor         = "SST",
9489                .name           = "unknown SST SPI chip",
9490                .bustype        = BUS_SPI,
9491                .manufacture_id = SST_ID,
9492                .model_id       = GENERIC_DEVICE_ID,
9493                .total_size     = 0,
9494                .page_size      = 256,
9495                .tested         = TEST_BAD_PREW,
9496                .probe          = probe_spi_rdid,
9497                .probe_timing   = TIMING_ZERO,
9498                .write          = NULL,
9499                .read           = NULL,
9500        },
9501
9502        {
9503                .vendor         = "ST",
9504                .name           = "unknown ST SPI chip",
9505                .bustype        = BUS_SPI,
9506                .manufacture_id = ST_ID,
9507                .model_id       = GENERIC_DEVICE_ID,
9508                .total_size     = 0,
9509                .page_size      = 256,
9510                .tested         = TEST_BAD_PREW,
9511                .probe          = probe_spi_rdid,
9512                .probe_timing   = TIMING_ZERO,
9513                .write          = NULL,
9514                .read           = NULL,
9515        },
9516
9517        {
9518                .vendor         = "Sanyo",
9519                .name           = "unknown Sanyo SPI chip",
9520                .bustype        = BUS_SPI,
9521                .manufacture_id = SANYO_ID,
9522                .model_id       = GENERIC_DEVICE_ID,
9523                .total_size     = 0,
9524                .page_size      = 256,
9525                .tested         = TEST_BAD_PREW,
9526                .probe          = probe_spi_rdid,
9527                .probe_timing   = TIMING_ZERO,
9528                .write          = NULL,
9529                .read           = NULL,
9530        },
9531
9532        {
9533                .vendor         = "Generic",
9534                .name           = "unknown SPI chip (RDID)",
9535                .bustype        = BUS_SPI,
9536                .manufacture_id = GENERIC_MANUF_ID,
9537                .model_id       = GENERIC_DEVICE_ID,
9538                .total_size     = 0,
9539                .page_size      = 256,
9540                .tested         = TEST_BAD_PREW,
9541                .probe          = probe_spi_rdid,
9542                .write          = NULL,
9543        },
9544
9545        {
9546                .vendor         = "Generic",
9547                .name           = "unknown SPI chip (REMS)",
9548                .bustype        = BUS_SPI,
9549                .manufacture_id = GENERIC_MANUF_ID,
9550                .model_id       = GENERIC_DEVICE_ID,
9551                .total_size     = 0,
9552                .page_size      = 256,
9553                .tested         = TEST_BAD_PREW,
9554                .probe          = probe_spi_rems,
9555                .write          = NULL,
9556        },
9557
9558        { NULL  }
9559};
Note: See TracBrowser for help on using the repository browser.