blob: 609df034187987abfa62bed539d33d890e27ce3a [file] [log] [blame]
Ollie Lho184a4042005-11-26 21:55:36 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ollie Lho184a4042005-11-26 21:55:36 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
Stefan Reinauer4c390c82008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Sean Nelsonc57a9202010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Uwe Hermannd1107642007-08-29 17:52:32 +00009 *
Stefan Reinauerce532972007-05-23 17:20:56 +000010 * 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.
Ollie Lho184a4042005-11-26 21:55:36 +000014 *
Stefan Reinauerce532972007-05-23 17:20:56 +000015 * 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.
Ollie Lho184a4042005-11-26 21:55:36 +000019 */
20
21#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000022#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000023#include "chipdrivers.h"
Ollie Lho184a4042005-11-26 21:55:36 +000024
Uwe Hermannfc425e82008-03-16 02:06:25 +000025/**
Uwe Hermanna9720402009-05-21 15:55:46 +000026 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000027 *
Alan Green1f9cc7d2019-07-01 11:10:45 +100028 * Temporarily, this file is sorted alphabetically by vendor and name to
29 * assist with merging the Chromium fork of flashrom.
30 *
31 * The usual intention is that that this list is sorted by vendor, then chip
32 * family and chip density, which is useful for the output of 'flashrom -L'.
Uwe Hermannfc425e82008-03-16 02:06:25 +000033 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000034const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000035
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000036 /*
37 * .vendor = Vendor name
38 * .name = Chip name
39 * .bustype = Supported flash bus types (Parallel, LPC...)
40 * .manufacture_id = Manufacturer chip ID
41 * .model_id = Model chip ID
42 * .total_size = Total size in (binary) kbytes
43 * .page_size = Page or eraseblock(?) size in bytes
44 * .tested = Test status
45 * .probe = Probe function
46 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000047 * .block_erasers[] = Array of erase layouts and erase functions
48 * {
49 * .eraseblocks[] = Array of { blocksize, blockcount }
50 * .block_erase = Block erase function
51 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000052 * .printlock = Chip lock status function
53 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000054 * .write = Chip write function
55 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000056 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000057 */
58
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000059 {
60 .vendor = "AMD",
61 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000062 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000063 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000064 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000065 .total_size = 256,
66 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000067 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000068 .tested = TEST_UNTESTED,
69 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000070 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000071 .block_erasers =
72 {
73 {
74 .eraseblocks = {
75 {16 * 1024, 1},
76 {8 * 1024, 2},
77 {32 * 1024, 1},
78 {64 * 1024, 3},
79 },
80 .block_erase = erase_sector_jedec,
81 }, {
82 .eraseblocks = { {256 * 1024, 1} },
83 .block_erase = erase_chip_block_jedec,
84 },
85 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000086 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000087 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000088 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000089 },
90
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000091 {
92 .vendor = "AMD",
93 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000094 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000095 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000096 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000097 .total_size = 256,
98 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000099 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
100 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000101 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000102 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000103 .block_erasers =
104 {
105 {
106 .eraseblocks = {
107 {64 * 1024, 3},
108 {32 * 1024, 1},
109 {8 * 1024, 2},
110 {16 * 1024, 1},
111 },
112 .block_erase = erase_sector_jedec,
113 }, {
114 .eraseblocks = { {256 * 1024, 1} },
115 .block_erase = erase_chip_block_jedec,
116 },
117 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000118 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000119 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000120 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +0000121 },
122
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000123 {
124 .vendor = "AMD",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000125 .name = "Am29F010",
126 .bustype = BUS_PARALLEL,
127 .manufacture_id = AMD_ID,
128 .model_id = AMD_AM29F010,
129 .total_size = 128,
130 .page_size = 16 * 1024,
131 .feature_bits = FEATURE_SHORT_RESET,
132 .tested = TEST_UNTESTED,
133 .probe = probe_jedec,
134 .probe_timing = TIMING_ZERO,
135 .block_erasers =
136 {
137 {
138 .eraseblocks = { {16 * 1024, 8} },
139 .block_erase = erase_sector_jedec,
140 }, {
141 .eraseblocks = { {128 * 1024, 1} },
142 .block_erase = erase_chip_block_jedec,
143 },
144 },
145 .write = write_jedec_1,
146 .read = read_memmapped,
147 .voltage = {4500, 5500},
148 },
149
150 {
151 .vendor = "AMD",
152 .name = "Am29F010A/B",
153 .bustype = BUS_PARALLEL,
154 .manufacture_id = AMD_ID,
155 .model_id = AMD_AM29F010,
156 .total_size = 128,
157 .page_size = 16 * 1024,
158 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Alan Greena4e579f2019-07-24 14:18:39 +1000159 .tested = TEST_OK_PRE,
Alan Green1f9cc7d2019-07-01 11:10:45 +1000160 .probe = probe_jedec,
161 .probe_timing = TIMING_ZERO,
162 .block_erasers =
163 {
164 {
165 .eraseblocks = { {16 * 1024, 8} },
166 .block_erase = erase_sector_jedec,
167 }, {
168 .eraseblocks = { {128 * 1024, 1} },
169 .block_erase = erase_chip_block_jedec,
170 },
171 },
172 .write = write_jedec_1,
173 .read = read_memmapped,
174 .voltage = {4500, 5500},
175 },
176
177 {
178 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000179 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000180 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000181 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000182 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000183 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000184 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000185 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000186 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000187 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000188 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000189 .block_erasers =
190 {
191 {
192 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000193 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000194 }, {
195 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000196 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000197 },
198 },
Sean Nelson35727f72010-01-28 23:55:12 +0000199 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000200 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000201 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000202 },
203
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000204 {
205 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000206 .name = "Am29F040",
207 .bustype = BUS_PARALLEL,
208 .manufacture_id = AMD_ID,
209 .model_id = AMD_AM29F040,
210 .total_size = 512,
211 .page_size = 64 * 1024,
212 .feature_bits = FEATURE_EITHER_RESET,
213 .tested = TEST_UNTESTED,
214 .probe = probe_jedec,
215 .probe_timing = TIMING_ZERO,
216 .block_erasers =
217 {
218 {
219 .eraseblocks = { {64 * 1024, 8} },
220 .block_erase = erase_sector_jedec,
221 }, {
222 .eraseblocks = { {512 * 1024, 1} },
223 .block_erase = erase_chip_block_jedec,
224 },
225 },
226 .write = write_jedec_1,
227 .read = read_memmapped,
228 .voltage = {4500, 5500},
229 },
230
231 {
232 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000233 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000234 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000235 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000236 .model_id = AMD_AM29F040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000237 .total_size = 512,
238 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000239 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
240 .tested = TEST_UNTESTED,
241 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000242 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000243 .block_erasers =
244 {
245 {
246 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000247 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000248 }, {
249 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000250 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000251 },
252 },
Sean Nelson35727f72010-01-28 23:55:12 +0000253 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000254 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000255 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +0000256 },
257
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000258 {
259 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000260 .name = "Am29F080",
261 .bustype = BUS_PARALLEL,
262 .manufacture_id = AMD_ID,
263 .model_id = AMD_AM29F080,
264 .total_size = 1024,
265 .page_size = 64 * 1024,
266 .feature_bits = FEATURE_EITHER_RESET,
267 .tested = TEST_UNTESTED,
268 .probe = probe_jedec,
269 .probe_timing = TIMING_ZERO,
270 .block_erasers =
271 {
272 {
273 .eraseblocks = { {64 * 1024, 16} },
274 .block_erase = erase_sector_jedec,
275 }, {
276 .eraseblocks = { {1024 * 1024, 1} },
277 .block_erase = erase_chip_block_jedec,
278 },
279 },
280 .write = write_jedec_1,
281 .read = read_memmapped,
282 .voltage = {4500, 5500},
283 },
284
285 {
286 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000287 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000288 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000289 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000290 .model_id = AMD_AM29F080,
Peter Stuge8440cc02009-01-25 23:55:12 +0000291 .total_size = 1024,
292 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000293 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000294 .tested = TEST_UNTESTED,
295 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000296 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000297 .block_erasers =
298 {
299 {
300 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000301 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000302 }, {
303 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000304 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000305 },
306 },
Sean Nelson35727f72010-01-28 23:55:12 +0000307 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000308 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000309 .voltage = {4500, 5500},
Peter Stuge8440cc02009-01-25 23:55:12 +0000310 },
311
312 {
313 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000314 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000315 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000316 .manufacture_id = AMD_ID,
317 .model_id = AMD_AM29LV001BB,
318 .total_size = 128,
319 .page_size = 64 * 1024, /* unused */
320 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
321 .tested = TEST_OK_PREW,
322 .probe = probe_jedec,
323 .probe_timing = TIMING_ZERO,
324 .block_erasers =
325 {
326 {
327 .eraseblocks = {
328 {8 * 1024, 1},
329 {4 * 1024, 2},
330 {16 * 1024, 7},
331 },
332 .block_erase = erase_sector_jedec,
333 }, {
334 .eraseblocks = { {128 * 1024, 1} },
335 .block_erase = erase_chip_block_jedec,
336 },
337 },
338 .write = write_jedec_1,
339 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000340 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000341 },
342
343 {
344 .vendor = "AMD",
345 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000346 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000347 .manufacture_id = AMD_ID,
348 .model_id = AMD_AM29LV001BT,
349 .total_size = 128,
350 .page_size = 64 * 1024, /* unused */
351 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
352 .tested = TEST_UNTESTED,
353 .probe = probe_jedec,
354 .probe_timing = TIMING_ZERO,
355 .block_erasers =
356 {
357 {
358 .eraseblocks = {
359 {16 * 1024, 7},
360 {4 * 1024, 2},
361 {8 * 1024, 1},
362 },
363 .block_erase = erase_sector_jedec,
364 }, {
365 .eraseblocks = { {128 * 1024, 1} },
366 .block_erase = erase_chip_block_jedec,
367 },
368 },
369 .write = write_jedec_1,
370 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000371 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000372 },
373
374 {
375 .vendor = "AMD",
376 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000377 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000378 .manufacture_id = AMD_ID,
379 .model_id = AMD_AM29LV002BB,
380 .total_size = 256,
381 .page_size = 64 * 1024, /* unused */
382 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
383 .tested = TEST_UNTESTED,
384 .probe = probe_jedec,
385 .probe_timing = TIMING_ZERO,
386 .block_erasers =
387 {
388 {
389 .eraseblocks = {
390 {16 * 1024, 1},
391 {8 * 1024, 2},
392 {32 * 1024, 1},
393 {64 * 1024, 3},
394 },
395 .block_erase = erase_sector_jedec,
396 }, {
397 .eraseblocks = { {256 * 1024, 1} },
398 .block_erase = erase_chip_block_jedec,
399 },
400 },
401 .write = write_jedec_1,
402 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000403 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000404 },
405
406 {
407 .vendor = "AMD",
408 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000409 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000410 .manufacture_id = AMD_ID,
411 .model_id = AMD_AM29LV002BT,
412 .total_size = 256,
413 .page_size = 64 * 1024, /* unused */
414 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
415 .tested = TEST_UNTESTED,
416 .probe = probe_jedec,
417 .probe_timing = TIMING_ZERO,
418 .block_erasers =
419 {
420 {
421 .eraseblocks = {
422 {64 * 1024, 3},
423 {32 * 1024, 1},
424 {8 * 1024, 2},
425 {16 * 1024, 1},
426 },
427 .block_erase = erase_sector_jedec,
428 }, {
429 .eraseblocks = { {256 * 1024, 1} },
430 .block_erase = erase_chip_block_jedec,
431 },
432 },
433 .write = write_jedec_1,
434 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000435 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000436 },
437
438 {
439 .vendor = "AMD",
440 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000441 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000442 .manufacture_id = AMD_ID,
443 .model_id = AMD_AM29LV004BB,
444 .total_size = 512,
445 .page_size = 64 * 1024, /* unused */
446 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
447 .tested = TEST_UNTESTED,
448 .probe = probe_jedec,
449 .probe_timing = TIMING_ZERO,
450 .block_erasers =
451 {
452 {
453 .eraseblocks = {
454 {16 * 1024, 1},
455 {8 * 1024, 2},
456 {32 * 1024, 1},
457 {64 * 1024, 7},
458 },
459 .block_erase = erase_sector_jedec,
460 }, {
461 .eraseblocks = { {512 * 1024, 1} },
462 .block_erase = erase_chip_block_jedec,
463 },
464 },
465 .write = write_jedec_1,
466 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000467 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000468 },
469
470 {
471 .vendor = "AMD",
472 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000473 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000474 .manufacture_id = AMD_ID,
475 .model_id = AMD_AM29LV004BT,
476 .total_size = 512,
477 .page_size = 64 * 1024, /* unused */
478 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
479 .tested = TEST_UNTESTED,
480 .probe = probe_jedec,
481 .probe_timing = TIMING_ZERO,
482 .block_erasers =
483 {
484 {
485 .eraseblocks = {
486 {64 * 1024, 7},
487 {32 * 1024, 1},
488 {8 * 1024, 2},
489 {16 * 1024, 1},
490 },
491 .block_erase = erase_sector_jedec,
492 }, {
493 .eraseblocks = { {512 * 1024, 1} },
494 .block_erase = erase_chip_block_jedec,
495 },
496 },
497 .write = write_jedec_1,
498 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000499 .voltage = {2700, 3600},
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000500 },
501
502 {
503 .vendor = "AMD",
504 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000505 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000506 .manufacture_id = AMD_ID,
507 .model_id = AMD_AM29LV008BB,
508 .total_size = 1024,
509 .page_size = 64 * 1024, /* unused */
510 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000511 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000512 .probe = probe_jedec,
513 .probe_timing = TIMING_ZERO,
514 .block_erasers =
515 {
516 {
517 .eraseblocks = {
518 {16 * 1024, 1},
519 {8 * 1024, 2},
520 {32 * 1024, 1},
521 {64 * 1024, 15},
522 },
523 .block_erase = erase_sector_jedec,
524 }, {
525 .eraseblocks = { {1024 * 1024, 1} },
526 .block_erase = erase_chip_block_jedec,
527 },
528 },
529 .write = write_jedec_1,
530 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000531 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000532 },
533
534 {
535 .vendor = "AMD",
536 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000537 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000538 .manufacture_id = AMD_ID,
539 .model_id = AMD_AM29LV008BT,
540 .total_size = 1024,
541 .page_size = 64 * 1024, /* unused */
542 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
543 .tested = TEST_UNTESTED,
544 .probe = probe_jedec,
545 .probe_timing = TIMING_ZERO,
546 .block_erasers =
547 {
548 {
549 .eraseblocks = {
550 {64 * 1024, 15},
551 {32 * 1024, 1},
552 {8 * 1024, 2},
553 {16 * 1024, 1},
554 },
555 .block_erase = erase_sector_jedec,
556 }, {
557 .eraseblocks = { {1024 * 1024, 1} },
558 .block_erase = erase_chip_block_jedec,
559 },
560 },
561 .write = write_jedec_1,
562 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000563 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000564 },
565
566 {
567 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000568 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000569 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000570 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000571 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000572 .total_size = 512,
573 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000574 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000575 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000576 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000577 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000578 .block_erasers =
579 {
580 {
581 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000582 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000583 }, {
584 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000585 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000586 },
587 },
Sean Nelson35727f72010-01-28 23:55:12 +0000588 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000589 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000590 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
FENG yu ningff692fb2008-12-08 18:15:10 +0000591 },
592
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000593 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000594 .vendor = "AMD",
595 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000596 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000597 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000598 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000599 .total_size = 1024,
600 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000601 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000602 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000603 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000604 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000605 .block_erasers =
606 {
607 {
608 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000609 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000610 }, {
611 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000612 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000613 },
614 },
Sean Nelson35727f72010-01-28 23:55:12 +0000615 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000616 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000617 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Peter Stuge8440cc02009-01-25 23:55:12 +0000618 },
619
620 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000621 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000622 .name = "A25L010",
623 .bustype = BUS_SPI,
624 .manufacture_id = AMIC_ID_NOPREFIX,
625 .model_id = AMIC_A25L010,
626 .total_size = 128,
627 .page_size = 256,
628 .feature_bits = FEATURE_WRSR_WREN,
629 .tested = TEST_UNTESTED,
630 .probe = probe_spi_rdid,
631 .probe_timing = TIMING_ZERO,
632 .block_erasers =
633 {
634 {
635 .eraseblocks = { { 4 * 1024, 32 } },
636 .block_erase = spi_block_erase_20,
637 }, {
638 .eraseblocks = { { 64 * 1024, 2 } },
639 .block_erase = spi_block_erase_d8,
640 }, {
641 .eraseblocks = { { 128 * 1024, 1 } },
642 .block_erase = spi_block_erase_c7,
643 }
644 },
645 .printlock = spi_prettyprint_status_register_bp2_srwd,
646 .unlock = spi_disable_blockprotect,
647 .write = spi_chip_write_256,
648 .read = spi_chip_read,
649 .voltage = {2700, 3600},
650 },
651
652 {
653 .vendor = "AMIC",
654 .name = "A25L016",
655 .bustype = BUS_SPI,
656 .manufacture_id = AMIC_ID_NOPREFIX,
657 .model_id = AMIC_A25L016,
658 .total_size = 2048,
659 .page_size = 256,
660 .feature_bits = FEATURE_WRSR_WREN,
661 .tested = TEST_UNTESTED,
662 .probe = probe_spi_rdid,
663 .probe_timing = TIMING_ZERO,
664 .block_erasers =
665 {
666 {
667 .eraseblocks = { { 4 * 1024, 512 } },
668 .block_erase = spi_block_erase_20,
669 }, {
670 .eraseblocks = { { 64 * 1024, 32 } },
671 .block_erase = spi_block_erase_d8,
672 }, {
673 .eraseblocks = { { 2048 * 1024, 1 } },
674 .block_erase = spi_block_erase_c7,
675 }
676 },
677 .printlock = spi_prettyprint_status_register_bp2_srwd,
678 .unlock = spi_disable_blockprotect,
679 .write = spi_chip_write_256,
680 .read = spi_chip_read,
681 .voltage = {2700, 3600},
682 },
683
684 {
685 .vendor = "AMIC",
686 .name = "A25L020",
687 .bustype = BUS_SPI,
688 .manufacture_id = AMIC_ID_NOPREFIX,
689 .model_id = AMIC_A25L020,
690 .total_size = 256,
691 .page_size = 256,
692 .feature_bits = FEATURE_WRSR_WREN,
693 .tested = TEST_UNTESTED,
694 .probe = probe_spi_rdid,
695 .probe_timing = TIMING_ZERO,
696 .block_erasers =
697 {
698 {
699 .eraseblocks = { { 4 * 1024, 64 } },
700 .block_erase = spi_block_erase_20,
701 }, {
702 .eraseblocks = { { 64 * 1024, 4 } },
703 .block_erase = spi_block_erase_d8,
704 }, {
705 .eraseblocks = { { 256 * 1024, 1 } },
706 .block_erase = spi_block_erase_c7,
707 }
708 },
709 .printlock = spi_prettyprint_status_register_bp2_srwd,
710 .unlock = spi_disable_blockprotect,
711 .write = spi_chip_write_256,
712 .read = spi_chip_read,
713 .voltage = {2700, 3600},
714 },
715
716 {
717 .vendor = "AMIC",
718 .name = "A25L032",
719 .bustype = BUS_SPI,
720 .manufacture_id = AMIC_ID_NOPREFIX,
721 .model_id = AMIC_A25L032,
722 .total_size = 4096,
723 .page_size = 256,
724 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
726 .tested = TEST_OK_PREW,
727 .probe = probe_spi_rdid,
728 .probe_timing = TIMING_ZERO,
729 .block_erasers =
730 {
731 {
732 .eraseblocks = { { 4 * 1024, 1024 } },
733 .block_erase = spi_block_erase_20,
734 }, {
735 .eraseblocks = { { 64 * 1024, 64 } },
736 .block_erase = spi_block_erase_52,
737 }, {
738 .eraseblocks = { { 64 * 1024, 64 } },
739 .block_erase = spi_block_erase_d8,
740 }, {
741 .eraseblocks = { { 4096 * 1024, 1 } },
742 .block_erase = spi_block_erase_60,
743 }, {
744 .eraseblocks = { { 4096 * 1024, 1 } },
745 .block_erase = spi_block_erase_c7,
746 }
747 },
748 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
749 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
750 .write = spi_chip_write_256,
751 .read = spi_chip_read,
752 .voltage = {2700, 3600},
753 },
754
755 {
756 .vendor = "AMIC",
757 .name = "A25L040",
758 .bustype = BUS_SPI,
759 .manufacture_id = AMIC_ID_NOPREFIX,
760 .model_id = AMIC_A25L040,
761 .total_size = 512,
762 .page_size = 256,
763 .feature_bits = FEATURE_WRSR_WREN,
764 .tested = TEST_UNTESTED,
765 .probe = probe_spi_rdid,
766 .probe_timing = TIMING_ZERO,
767 .block_erasers =
768 {
769 {
770 .eraseblocks = { { 4 * 1024, 128 } },
771 .block_erase = spi_block_erase_20,
772 }, {
773 .eraseblocks = { { 64 * 1024, 8 } },
774 .block_erase = spi_block_erase_d8,
775 }, {
776 .eraseblocks = { { 512 * 1024, 1 } },
777 .block_erase = spi_block_erase_c7,
778 }
779 },
780 .printlock = spi_prettyprint_status_register_bp2_srwd,
781 .unlock = spi_disable_blockprotect,
782 .write = spi_chip_write_256,
783 .read = spi_chip_read,
784 .voltage = {2700, 3600},
785 },
786
787 {
788 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000789 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000790 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000791 .manufacture_id = AMIC_ID,
792 .model_id = AMIC_A25L05PT,
793 .total_size = 64,
794 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000795 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000796 .tested = TEST_UNTESTED,
797 .probe = probe_spi_rdid4,
798 .probe_timing = TIMING_ZERO,
799 .block_erasers =
800 {
801 {
802 .eraseblocks = {
803 {32 * 1024, 1},
804 {16 * 1024, 1},
805 {8 * 1024, 1},
806 {4 * 1024, 2},
807 },
808 .block_erase = spi_block_erase_d8,
809 }, {
810 .eraseblocks = { {64 * 1024, 1} },
811 .block_erase = spi_block_erase_c7,
812 }
813 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000814 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000815 .unlock = spi_disable_blockprotect,
816 .write = spi_chip_write_256,
817 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000818 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000819 },
820
821 {
822 .vendor = "AMIC",
823 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000824 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000825 .manufacture_id = AMIC_ID,
826 .model_id = AMIC_A25L05PU,
827 .total_size = 64,
828 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000829 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000830 .tested = TEST_UNTESTED,
831 .probe = probe_spi_rdid4,
832 .probe_timing = TIMING_ZERO,
833 .block_erasers =
834 {
835 {
836 .eraseblocks = {
837 {4 * 1024, 2},
838 {8 * 1024, 1},
839 {16 * 1024, 1},
840 {32 * 1024, 1},
841 },
842 .block_erase = spi_block_erase_d8,
843 }, {
844 .eraseblocks = { {64 * 1024, 1} },
845 .block_erase = spi_block_erase_c7,
846 }
847 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000848 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000849 .unlock = spi_disable_blockprotect,
850 .write = spi_chip_write_256,
851 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000852 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000853 },
854
855 {
856 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000857 .name = "A25L080",
858 .bustype = BUS_SPI,
859 .manufacture_id = AMIC_ID_NOPREFIX,
860 .model_id = AMIC_A25L080,
861 .total_size = 1024,
862 .page_size = 256,
863 .feature_bits = FEATURE_WRSR_WREN,
864 .tested = TEST_UNTESTED,
865 .probe = probe_spi_rdid,
866 .probe_timing = TIMING_ZERO,
867 .block_erasers =
868 {
869 {
870 .eraseblocks = { { 4 * 1024, 256 } },
871 .block_erase = spi_block_erase_20,
872 }, {
873 .eraseblocks = { { 64 * 1024, 16 } },
874 .block_erase = spi_block_erase_d8,
875 }, {
876 .eraseblocks = { { 1024 * 1024, 1 } },
877 .block_erase = spi_block_erase_c7,
878 }
879 },
880 .printlock = spi_prettyprint_status_register_bp2_srwd,
881 .unlock = spi_disable_blockprotect,
882 .write = spi_chip_write_256,
883 .read = spi_chip_read,
884 .voltage = {2700, 3600},
885 },
886
887 {
888 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000889 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000890 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000891 .manufacture_id = AMIC_ID,
892 .model_id = AMIC_A25L10PT,
893 .total_size = 128,
894 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000895 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000896 .tested = TEST_UNTESTED,
897 .probe = probe_spi_rdid4,
898 .probe_timing = TIMING_ZERO,
899 .block_erasers =
900 {
901 {
902 .eraseblocks = {
903 {64 * 1024, 1},
904 {32 * 1024, 1},
905 {16 * 1024, 1},
906 {8 * 1024, 1},
907 {4 * 1024, 2},
908 },
909 .block_erase = spi_block_erase_d8,
910 }, {
911 .eraseblocks = { {128 * 1024, 1} },
912 .block_erase = spi_block_erase_c7,
913 }
914 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000915 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000916 .unlock = spi_disable_blockprotect,
917 .write = spi_chip_write_256,
918 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000919 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000920 },
921
922 {
923 .vendor = "AMIC",
924 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000925 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000926 .manufacture_id = AMIC_ID,
927 .model_id = AMIC_A25L10PU,
928 .total_size = 128,
929 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000930 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000931 .tested = TEST_UNTESTED,
932 .probe = probe_spi_rdid4,
933 .probe_timing = TIMING_ZERO,
934 .block_erasers =
935 {
936 {
937 .eraseblocks = {
938 {4 * 1024, 2},
939 {8 * 1024, 1},
940 {16 * 1024, 1},
941 {32 * 1024, 1},
942 {64 * 1024, 1},
943 },
944 .block_erase = spi_block_erase_d8,
945 }, {
946 .eraseblocks = { {128 * 1024, 1} },
947 .block_erase = spi_block_erase_c7,
948 }
949 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000950 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000951 .unlock = spi_disable_blockprotect,
952 .write = spi_chip_write_256,
953 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000954 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000955 },
956
957 {
958 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000959 .name = "A25L16PT",
960 .bustype = BUS_SPI,
961 .manufacture_id = AMIC_ID,
962 .model_id = AMIC_A25L16PT,
963 .total_size = 2048,
964 .page_size = 256,
965 .feature_bits = FEATURE_WRSR_WREN,
966 .tested = TEST_UNTESTED,
967 .probe = probe_spi_rdid4,
968 .probe_timing = TIMING_ZERO,
969 .block_erasers =
970 {
971 {
972 .eraseblocks = {
973 {64 * 1024, 31},
974 {32 * 1024, 1},
975 {16 * 1024, 1},
976 {8 * 1024, 1},
977 {4 * 1024, 2},
978 },
979 .block_erase = spi_block_erase_d8,
980 }, {
981 .eraseblocks = { {2048 * 1024, 1} },
982 .block_erase = spi_block_erase_60,
983 }, {
984 .eraseblocks = { {2048 * 1024, 1} },
985 .block_erase = spi_block_erase_c7,
986 }
987 },
988 .printlock = spi_prettyprint_status_register_bp2_srwd,
989 .unlock = spi_disable_blockprotect,
990 .write = spi_chip_write_256,
991 .read = spi_chip_read,
992 .voltage = {2700, 3600},
993 },
994
995 {
996 .vendor = "AMIC",
997 .name = "A25L16PU",
998 .bustype = BUS_SPI,
999 .manufacture_id = AMIC_ID,
1000 .model_id = AMIC_A25L16PU,
1001 .total_size = 2048,
1002 .page_size = 256,
1003 .feature_bits = FEATURE_WRSR_WREN,
1004 .tested = TEST_OK_PR,
1005 .probe = probe_spi_rdid4,
1006 .probe_timing = TIMING_ZERO,
1007 .block_erasers =
1008 {
1009 {
1010 .eraseblocks = {
1011 {4 * 1024, 2},
1012 {8 * 1024, 1},
1013 {16 * 1024, 1},
1014 {32 * 1024, 1},
1015 {64 * 1024, 31},
1016 },
1017 .block_erase = spi_block_erase_d8,
1018 }, {
1019 .eraseblocks = { {2048 * 1024, 1} },
1020 .block_erase = spi_block_erase_60,
1021 }, {
1022 .eraseblocks = { {2048 * 1024, 1} },
1023 .block_erase = spi_block_erase_c7,
1024 }
1025 },
1026 .printlock = spi_prettyprint_status_register_bp2_srwd,
1027 .unlock = spi_disable_blockprotect,
1028 .write = spi_chip_write_256,
1029 .read = spi_chip_read,
1030 .voltage = {2700, 3600},
1031 },
1032
1033 {
1034 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001035 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001036 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001037 .manufacture_id = AMIC_ID,
1038 .model_id = AMIC_A25L20PT,
1039 .total_size = 256,
1040 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001041 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001042 .tested = TEST_UNTESTED,
1043 .probe = probe_spi_rdid4,
1044 .probe_timing = TIMING_ZERO,
1045 .block_erasers =
1046 {
1047 {
1048 .eraseblocks = {
1049 {64 * 1024, 3},
1050 {32 * 1024, 1},
1051 {16 * 1024, 1},
1052 {8 * 1024, 1},
1053 {4 * 1024, 2},
1054 },
1055 .block_erase = spi_block_erase_d8,
1056 }, {
1057 .eraseblocks = { {256 * 1024, 1} },
1058 .block_erase = spi_block_erase_c7,
1059 }
1060 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001061 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001062 .unlock = spi_disable_blockprotect,
1063 .write = spi_chip_write_256,
1064 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001065 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001066 },
1067
1068 {
1069 .vendor = "AMIC",
1070 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001071 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001072 .manufacture_id = AMIC_ID,
1073 .model_id = AMIC_A25L20PU,
1074 .total_size = 256,
1075 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001076 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001077 .tested = TEST_UNTESTED,
1078 .probe = probe_spi_rdid4,
1079 .probe_timing = TIMING_ZERO,
1080 .block_erasers =
1081 {
1082 {
1083 .eraseblocks = {
1084 {4 * 1024, 2},
1085 {8 * 1024, 1},
1086 {16 * 1024, 1},
1087 {32 * 1024, 1},
1088 {64 * 1024, 3},
1089 },
1090 .block_erase = spi_block_erase_d8,
1091 }, {
1092 .eraseblocks = { {256 * 1024, 1} },
1093 .block_erase = spi_block_erase_c7,
1094 }
1095 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001096 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001097 .unlock = spi_disable_blockprotect,
1098 .write = spi_chip_write_256,
1099 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001100 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001101 },
1102
1103 /* The A25L40P{T,U} chips are distinguished by their
1104 * erase block layouts, but without any distinction in RDID.
1105 * This inexplicable quirk was verified by Rudolf Marek
1106 * and discussed on the flashrom mailing list on 2010-07-12.
1107 */
1108 {
1109 .vendor = "AMIC",
1110 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001111 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001112 .manufacture_id = AMIC_ID,
1113 .model_id = AMIC_A25L40PT,
1114 .total_size = 512,
1115 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001116 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001117 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001118 .probe = probe_spi_rdid4,
1119 .probe_timing = TIMING_ZERO,
1120 .block_erasers =
1121 {
1122 {
1123 .eraseblocks = {
1124 {64 * 1024, 7},
1125 {32 * 1024, 1},
1126 {16 * 1024, 1},
1127 {8 * 1024, 1},
1128 {4 * 1024, 2},
1129 },
1130 .block_erase = spi_block_erase_d8,
1131 }, {
1132 .eraseblocks = { {512 * 1024, 1} },
1133 .block_erase = spi_block_erase_c7,
1134 }
1135 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001136 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001137 .unlock = spi_disable_blockprotect,
1138 .write = spi_chip_write_256,
1139 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001140 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001141 },
1142
1143 {
1144 .vendor = "AMIC",
1145 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001146 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001147 .manufacture_id = AMIC_ID,
1148 .model_id = AMIC_A25L40PU,
1149 .total_size = 512,
1150 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001151 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons6f088352018-09-30 19:59:42 +02001152 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001153 .probe = probe_spi_rdid4,
1154 .probe_timing = TIMING_ZERO,
1155 .block_erasers =
1156 {
1157 {
1158 .eraseblocks = {
1159 {4 * 1024, 2},
1160 {8 * 1024, 1},
1161 {16 * 1024, 1},
1162 {32 * 1024, 1},
1163 {64 * 1024, 7},
1164 },
1165 .block_erase = spi_block_erase_d8,
1166 }, {
1167 .eraseblocks = { {512 * 1024, 1} },
1168 .block_erase = spi_block_erase_c7,
1169 }
1170 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001171 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001172 .unlock = spi_disable_blockprotect,
1173 .write = spi_chip_write_256,
1174 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001175 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001176 },
1177
1178 {
1179 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001180 .name = "A25L512",
1181 .bustype = BUS_SPI,
1182 .manufacture_id = AMIC_ID_NOPREFIX,
1183 .model_id = AMIC_A25L512,
1184 .total_size = 64,
1185 .page_size = 256,
1186 .feature_bits = FEATURE_WRSR_WREN,
1187 .tested = TEST_UNTESTED,
1188 .probe = probe_spi_rdid,
1189 .probe_timing = TIMING_ZERO,
1190 .block_erasers =
1191 {
1192 {
1193 .eraseblocks = { { 4 * 1024, 16 } },
1194 .block_erase = spi_block_erase_20,
1195 }, {
1196 .eraseblocks = { { 64 * 1024, 1 } },
1197 .block_erase = spi_block_erase_d8,
1198 }, {
1199 .eraseblocks = { { 64 * 1024, 1 } },
1200 .block_erase = spi_block_erase_c7,
1201 }
1202 },
1203 .printlock = spi_prettyprint_status_register_bp2_srwd,
1204 .unlock = spi_disable_blockprotect,
1205 .write = spi_chip_write_256,
1206 .read = spi_chip_read,
1207 .voltage = {2700, 3600},
1208 },
1209
1210 {
1211 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001212 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001213 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001214 .manufacture_id = AMIC_ID,
1215 .model_id = AMIC_A25L80P,
1216 .total_size = 1024,
1217 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001218 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001219 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001220 .probe = probe_spi_rdid4,
1221 .probe_timing = TIMING_ZERO,
1222 .block_erasers =
1223 {
1224 {
1225 .eraseblocks = {
1226 {4 * 1024, 2},
1227 {8 * 1024, 1},
1228 {16 * 1024, 1},
1229 {32 * 1024, 1},
1230 {64 * 1024, 15},
1231 },
1232 .block_erase = spi_block_erase_d8,
1233 }, {
1234 .eraseblocks = { {1024 * 1024, 1} },
1235 .block_erase = spi_block_erase_c7,
1236 }
1237 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001238 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001239 .unlock = spi_disable_blockprotect,
1240 .write = spi_chip_write_256,
1241 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001242 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001243 },
1244
1245 {
1246 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001247 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001248 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001249 .manufacture_id = AMIC_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001250 .model_id = AMIC_A25LQ032,
Dan Lenski11617122010-07-29 15:00:40 +00001251 .total_size = 4096,
1252 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001253 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001254 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1255 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001256 .tested = TEST_UNTESTED,
Dan Lenski11617122010-07-29 15:00:40 +00001257 .probe = probe_spi_rdid,
1258 .probe_timing = TIMING_ZERO,
1259 .block_erasers =
1260 {
1261 {
1262 .eraseblocks = { { 4 * 1024, 1024 } },
1263 .block_erase = spi_block_erase_20,
1264 }, {
1265 .eraseblocks = { { 64 * 1024, 64 } },
1266 .block_erase = spi_block_erase_52,
1267 }, {
1268 .eraseblocks = { { 64 * 1024, 64 } },
1269 .block_erase = spi_block_erase_d8,
1270 }, {
1271 .eraseblocks = { { 4096 * 1024, 1 } },
1272 .block_erase = spi_block_erase_60,
1273 }, {
1274 .eraseblocks = { { 4096 * 1024, 1 } },
1275 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001276 }
Dan Lenski11617122010-07-29 15:00:40 +00001277 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001278 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1279 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Dan Lenski11617122010-07-29 15:00:40 +00001280 .write = spi_chip_write_256,
1281 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001282 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001283 },
1284
1285 {
1286 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001287 .name = "A25LQ16",
1288 .bustype = BUS_SPI,
1289 .manufacture_id = AMIC_ID_NOPREFIX,
1290 .model_id = AMIC_A25LQ16,
1291 .total_size = 2048,
1292 .page_size = 256,
1293 /* supports SFDP */
1294 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1295 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1296 .tested = TEST_UNTESTED,
1297 .probe = probe_spi_rdid,
1298 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10001299 .block_erasers =
1300 {
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001301 {
1302 .eraseblocks = { { 4 * 1024, 512 } },
1303 .block_erase = spi_block_erase_20,
1304 }, {
1305 .eraseblocks = { { 64 * 1024, 32 } },
1306 .block_erase = spi_block_erase_52,
1307 }, {
1308 .eraseblocks = { { 64 * 1024, 32 } },
1309 .block_erase = spi_block_erase_d8,
1310 }, {
1311 .eraseblocks = { { 2048 * 1024, 1 } },
1312 .block_erase = spi_block_erase_60,
1313 }, {
1314 .eraseblocks = { { 2048 * 1024, 1 } },
1315 .block_erase = spi_block_erase_c7,
1316 }
1317 },
1318 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1319 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1320 .write = spi_chip_write_256,
1321 .read = spi_chip_read,
1322 .voltage = {2700, 3600},
1323 },
1324
1325 {
1326 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001327 .name = "A25LQ64",
1328 .bustype = BUS_SPI,
1329 .manufacture_id = AMIC_ID_NOPREFIX,
Stefan Tauner23e10b82016-01-23 16:16:49 +00001330 .model_id = AMIC_A25LQ64,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001331 .total_size = 8192,
1332 .page_size = 256,
1333 /* supports SFDP */
1334 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1335 /* QPI enable 0x35, disable 0xF5 */
1336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1337 .tested = TEST_UNTESTED,
1338 .probe = probe_spi_rdid,
1339 .probe_timing = TIMING_ZERO,
1340 .block_erasers =
1341 {
1342 {
1343 .eraseblocks = { { 4 * 1024, 2048 } },
1344 .block_erase = spi_block_erase_20,
1345 }, {
1346 .eraseblocks = { { 32 * 1024, 256 } },
1347 .block_erase = spi_block_erase_52,
1348 }, {
1349 .eraseblocks = { { 64 * 1024, 128 } },
1350 .block_erase = spi_block_erase_d8,
1351 }, {
1352 .eraseblocks = { { 8192 * 1024, 1 } },
1353 .block_erase = spi_block_erase_60,
1354 }, {
1355 .eraseblocks = { { 8192 * 1024, 1 } },
1356 .block_erase = spi_block_erase_c7,
1357 }
1358 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001359 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001360 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001361 .write = spi_chip_write_256,
1362 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001363 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001364 },
1365
1366 {
1367 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001368 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001369 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001370 .manufacture_id = AMIC_ID_NOPREFIX,
1371 .model_id = AMIC_A29002B,
1372 .total_size = 256,
1373 .page_size = 64 * 1024,
1374 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1375 .tested = TEST_UNTESTED,
1376 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001377 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001378 .block_erasers =
1379 {
1380 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001381 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001382 {16 * 1024, 1},
1383 {8 * 1024, 2},
1384 {32 * 1024, 1},
1385 {64 * 1024, 3},
1386 },
1387 .block_erase = erase_sector_jedec,
1388 }, {
1389 .eraseblocks = { {256 * 1024, 1} },
1390 .block_erase = erase_chip_block_jedec,
1391 },
1392 },
1393 .write = write_jedec_1,
1394 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001395 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001396 },
1397
1398 {
1399 .vendor = "AMIC",
1400 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001401 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001402 .manufacture_id = AMIC_ID_NOPREFIX,
1403 .model_id = AMIC_A29002T,
1404 .total_size = 256,
1405 .page_size = 64 * 1024,
1406 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001407 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001408 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001409 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001410 .block_erasers =
1411 {
1412 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001413 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001414 {64 * 1024, 3},
1415 {32 * 1024, 1},
1416 {8 * 1024, 2},
1417 {16 * 1024, 1},
1418 },
1419 .block_erase = erase_sector_jedec,
1420 }, {
1421 .eraseblocks = { {256 * 1024, 1} },
1422 .block_erase = erase_chip_block_jedec,
1423 },
1424 },
1425 .write = write_jedec_1,
1426 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001427 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001428 },
1429
1430 {
1431 .vendor = "AMIC",
1432 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001433 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001434 .manufacture_id = AMIC_ID_NOPREFIX,
1435 .model_id = AMIC_A29040B,
1436 .total_size = 512,
1437 .page_size = 64 * 1024,
1438 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001439 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001440 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001441 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001442 .block_erasers =
1443 {
1444 {
1445 .eraseblocks = { {64 * 1024, 8} },
1446 .block_erase = erase_sector_jedec,
1447 }, {
1448 .eraseblocks = { {512 * 1024, 1} },
1449 .block_erase = erase_chip_block_jedec,
1450 },
1451 },
1452 .write = write_jedec_1,
1453 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001454 .voltage = {4500, 5500},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001455 },
1456
1457 {
1458 .vendor = "AMIC",
1459 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001460 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001461 .manufacture_id = AMIC_ID_NOPREFIX,
1462 .model_id = AMIC_A49LF040A,
1463 .total_size = 512,
1464 .page_size = 64 * 1024,
1465 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001466 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001467 .probe = probe_jedec,
1468 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1469 .block_erasers =
1470 {
1471 {
1472 .eraseblocks = { {64 * 1024, 8} },
1473 .block_erase = erase_block_jedec,
1474 }, {
1475 .eraseblocks = { {512 * 1024, 1} },
1476 .block_erase = erase_chip_block_jedec,
1477 }
1478 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001479 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001480 .write = write_jedec_1,
1481 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001482 .voltage = {3000, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001483 },
1484
1485 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001486 .vendor = "Atmel",
1487 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001488 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001489 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001490 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001491 .total_size = 256,
1492 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001493 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1494 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001495 .tested = TEST_UNTESTED,
1496 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001497 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001498 .block_erasers =
1499 {
1500 {
1501 .eraseblocks = { {4 * 1024, 64} },
1502 .block_erase = spi_block_erase_20,
1503 }, {
1504 .eraseblocks = { {32 * 1024, 8} },
1505 .block_erase = spi_block_erase_52,
1506 }, {
1507 .eraseblocks = { {64 * 1024, 4} },
1508 .block_erase = spi_block_erase_d8,
1509 }, {
1510 .eraseblocks = { {256 * 1024, 1} },
1511 .block_erase = spi_block_erase_60,
1512 }, {
1513 .eraseblocks = { {256 * 1024, 1} },
1514 .block_erase = spi_block_erase_c7,
1515 }
1516 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001517 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001518 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001519 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001520 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001521 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001522 },
1523
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001524 {
1525 .vendor = "Atmel",
Steffen Mauch0b59b0d2018-06-02 23:46:03 +02001526 .name = "AT25DF021A",
1527 .bustype = BUS_SPI,
1528 .manufacture_id = ATMEL_ID,
1529 .model_id = ATMEL_AT25DF021A,
1530 .total_size = 256,
1531 .page_size = 256,
1532 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1533 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1534 .tested = TEST_OK_PREW,
1535 .probe = probe_spi_rdid,
1536 .probe_timing = TIMING_ZERO,
1537 .block_erasers =
1538 {
1539 {
1540 .eraseblocks = { {4 * 1024, 64} },
1541 .block_erase = spi_block_erase_20,
1542 }, {
1543 .eraseblocks = { {32 * 1024, 8} },
1544 .block_erase = spi_block_erase_52,
1545 }, {
1546 .eraseblocks = { {64 * 1024, 4} },
1547 .block_erase = spi_block_erase_d8,
1548 }, {
1549 .eraseblocks = { {256 * 1024, 1} },
1550 .block_erase = spi_block_erase_60,
1551 }, {
1552 .eraseblocks = { {256 * 1024, 1} },
1553 .block_erase = spi_block_erase_c7,
1554 }
1555 },
1556 .printlock = spi_prettyprint_status_register_at25df,
1557 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1558 .write = spi_chip_write_256,
1559 .read = spi_chip_read,
1560 .voltage = {1650, 3600},
1561 },
1562
1563 {
1564 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001565 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001566 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001567 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001568 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001569 .total_size = 512,
1570 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001571 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001572 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001573 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001574 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001575 .block_erasers =
1576 {
1577 {
1578 .eraseblocks = { {4 * 1024, 128} },
1579 .block_erase = spi_block_erase_20,
1580 }, {
1581 .eraseblocks = { {32 * 1024, 16} },
1582 .block_erase = spi_block_erase_52,
1583 }, {
1584 .eraseblocks = { {64 * 1024, 8} },
1585 .block_erase = spi_block_erase_d8,
1586 }, {
1587 .eraseblocks = { {512 * 1024, 1} },
1588 .block_erase = spi_block_erase_60,
1589 }, {
1590 .eraseblocks = { {512 * 1024, 1} },
1591 .block_erase = spi_block_erase_c7,
1592 }
1593 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001594 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001595 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001596 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001597 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001598 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001599 },
1600
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001601 {
1602 .vendor = "Atmel",
1603 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001604 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001605 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001606 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001607 .total_size = 1024,
1608 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001609 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001610 .tested = TEST_UNTESTED,
1611 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001612 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001613 .block_erasers =
1614 {
1615 {
1616 .eraseblocks = { {4 * 1024, 256} },
1617 .block_erase = spi_block_erase_20,
1618 }, {
1619 .eraseblocks = { {32 * 1024, 32} },
1620 .block_erase = spi_block_erase_52,
1621 }, {
1622 .eraseblocks = { {64 * 1024, 16} },
1623 .block_erase = spi_block_erase_d8,
1624 }, {
1625 .eraseblocks = { {1024 * 1024, 1} },
1626 .block_erase = spi_block_erase_60,
1627 }, {
1628 .eraseblocks = { {1024 * 1024, 1} },
1629 .block_erase = spi_block_erase_c7,
1630 }
1631 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001632 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001633 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001634 .write = spi_chip_write_256,
1635 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001636 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001637 },
1638
1639 {
1640 .vendor = "Atmel",
1641 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001642 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001643 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001644 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001645 .total_size = 1024,
1646 .page_size = 256,
1647 .feature_bits = FEATURE_WRSR_WREN,
1648 .tested = TEST_UNTESTED,
1649 .probe = probe_spi_rdid,
1650 .probe_timing = TIMING_ZERO,
1651 .block_erasers =
1652 {
1653 {
1654 .eraseblocks = { {4 * 1024, 256} },
1655 .block_erase = spi_block_erase_20,
1656 }, {
1657 .eraseblocks = { {32 * 1024, 32} },
1658 .block_erase = spi_block_erase_52,
1659 }, {
1660 .eraseblocks = { {64 * 1024, 16} },
1661 .block_erase = spi_block_erase_d8,
1662 }, {
1663 .eraseblocks = { {1024 * 1024, 1} },
1664 .block_erase = spi_block_erase_60,
1665 }, {
1666 .eraseblocks = { {1024 * 1024, 1} },
1667 .block_erase = spi_block_erase_c7,
1668 }
1669 },
1670 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001671 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001672 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001673 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001674 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001675 },
1676
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001677 {
1678 .vendor = "Atmel",
1679 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001680 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001681 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001682 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001683 .total_size = 2048,
1684 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001685 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons8b5b9622018-09-30 19:13:15 +02001686 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001687 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001688 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001689 .block_erasers =
1690 {
1691 {
1692 .eraseblocks = { {4 * 1024, 512} },
1693 .block_erase = spi_block_erase_20,
1694 }, {
1695 .eraseblocks = { {32 * 1024, 64} },
1696 .block_erase = spi_block_erase_52,
1697 }, {
1698 .eraseblocks = { {64 * 1024, 32} },
1699 .block_erase = spi_block_erase_d8,
1700 }, {
1701 .eraseblocks = { {2 * 1024 * 1024, 1} },
1702 .block_erase = spi_block_erase_60,
1703 }, {
1704 .eraseblocks = { {2 * 1024 * 1024, 1} },
1705 .block_erase = spi_block_erase_c7,
1706 }
1707 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001708 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001709 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001710 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001711 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001712 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001713 },
1714
Alan Green86bf6ab2019-06-27 16:58:20 +10001715 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001716 {
1717 .vendor = "Atmel",
1718 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001719 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001720 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001721 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001722 .total_size = 4096,
1723 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001724 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001725 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001726 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001727 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001728 .block_erasers =
1729 {
1730 {
1731 .eraseblocks = { {4 * 1024, 1024} },
1732 .block_erase = spi_block_erase_20,
1733 }, {
1734 .eraseblocks = { {32 * 1024, 128} },
1735 .block_erase = spi_block_erase_52,
1736 }, {
1737 .eraseblocks = { {64 * 1024, 64} },
1738 .block_erase = spi_block_erase_d8,
1739 }, {
1740 .eraseblocks = { {4 * 1024 * 1024, 1} },
1741 .block_erase = spi_block_erase_60,
1742 }, {
1743 .eraseblocks = { {4 * 1024 * 1024, 1} },
1744 .block_erase = spi_block_erase_c7,
1745 }
1746 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001747 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001748 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001749 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001750 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001751 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001752 },
1753
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001754 {
1755 .vendor = "Atmel",
1756 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001757 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001758 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001759 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001760 .total_size = 4096,
1761 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001762 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1763 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001764 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001765 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001766 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001767 .block_erasers =
1768 {
1769 {
1770 .eraseblocks = { {4 * 1024, 1024} },
1771 .block_erase = spi_block_erase_20,
1772 }, {
1773 .eraseblocks = { {32 * 1024, 128} },
1774 .block_erase = spi_block_erase_52,
1775 }, {
1776 .eraseblocks = { {64 * 1024, 64} },
1777 .block_erase = spi_block_erase_d8,
1778 }, {
1779 .eraseblocks = { {4 * 1024 * 1024, 1} },
1780 .block_erase = spi_block_erase_60,
1781 }, {
1782 .eraseblocks = { {4 * 1024 * 1024, 1} },
1783 .block_erase = spi_block_erase_c7,
1784 }
1785 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001786 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001787 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001788 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001789 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001790 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001791 },
1792
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001793 {
1794 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001795 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001796 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001797 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001798 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001799 .total_size = 8192,
1800 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001801 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001802 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001803 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001804 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001805 .block_erasers =
1806 {
1807 {
1808 .eraseblocks = { {4 * 1024, 2048} },
1809 .block_erase = spi_block_erase_20,
1810 }, {
1811 .eraseblocks = { {32 * 1024, 256} },
1812 .block_erase = spi_block_erase_52,
1813 }, {
1814 .eraseblocks = { {64 * 1024, 128} },
1815 .block_erase = spi_block_erase_d8,
1816 }, {
1817 .eraseblocks = { {8 * 1024 * 1024, 1} },
1818 .block_erase = spi_block_erase_60,
1819 }, {
1820 .eraseblocks = { {8 * 1024 * 1024, 1} },
1821 .block_erase = spi_block_erase_c7,
1822 }
1823 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001824 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001825 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001826 .write = spi_chip_write_256,
1827 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001828 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001829 },
1830
1831 {
1832 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001833 .name = "AT25DL081",
1834 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001835 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001836 .model_id = ATMEL_AT25DF081,
1837 .total_size = 1024,
1838 .page_size = 256,
1839 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1840 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1841 .tested = TEST_UNTESTED,
1842 .probe = probe_spi_rdid,
1843 .probe_timing = TIMING_ZERO,
1844 .block_erasers =
1845 {
1846 {
1847 .eraseblocks = { {4 * 1024, 256} },
1848 .block_erase = spi_block_erase_20,
1849 }, {
1850 .eraseblocks = { {32 * 1024, 32} },
1851 .block_erase = spi_block_erase_52,
1852 }, {
1853 .eraseblocks = { {64 * 1024, 16} },
1854 .block_erase = spi_block_erase_d8,
1855 }, {
1856 .eraseblocks = { {1 * 1024 * 1024, 1} },
1857 .block_erase = spi_block_erase_60,
1858 }, {
1859 .eraseblocks = { {1 * 1024 * 1024, 1} },
1860 .block_erase = spi_block_erase_c7,
1861 }
1862 },
1863 .printlock = spi_prettyprint_status_register_at25df_sec,
1864 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1865 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1866 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1867 .voltage = {1650, 1950},
1868 },
1869
1870 {
1871 .vendor = "Atmel",
1872 .name = "AT25DL161",
1873 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001874 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001875 .model_id = ATMEL_AT25DL161,
1876 .total_size = 2048,
1877 .page_size = 256,
1878 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1880 .tested = TEST_UNTESTED,
1881 .probe = probe_spi_rdid,
1882 .probe_timing = TIMING_ZERO,
1883 .block_erasers =
1884 {
1885 {
1886 .eraseblocks = { {4 * 1024, 512} },
1887 .block_erase = spi_block_erase_20,
1888 }, {
1889 .eraseblocks = { {32 * 1024, 64} },
1890 .block_erase = spi_block_erase_52,
1891 }, {
1892 .eraseblocks = { {64 * 1024, 32} },
1893 .block_erase = spi_block_erase_d8,
1894 }, {
1895 .eraseblocks = { {2 * 1024 * 1024, 1} },
1896 .block_erase = spi_block_erase_60,
1897 }, {
1898 .eraseblocks = { {2 * 1024 * 1024, 1} },
1899 .block_erase = spi_block_erase_c7,
1900 }
1901 },
1902 .printlock = spi_prettyprint_status_register_at25df_sec,
1903 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1904 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1905 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1906 .voltage = {1650, 1950},
1907 },
1908
1909 {
1910 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001911 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001912 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001913 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001914 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001915 .total_size = 2048,
1916 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001917 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1918 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001919 .tested = TEST_UNTESTED,
1920 .probe = probe_spi_rdid,
1921 .probe_timing = TIMING_ZERO,
1922 .block_erasers =
1923 {
1924 {
1925 .eraseblocks = { {4 * 1024, 512} },
1926 .block_erase = spi_block_erase_20,
1927 }, {
1928 .eraseblocks = { {32 * 1024, 64} },
1929 .block_erase = spi_block_erase_52,
1930 }, {
1931 .eraseblocks = { {64 * 1024, 32} },
1932 .block_erase = spi_block_erase_d8,
1933 }, {
1934 .eraseblocks = { {2 * 1024 * 1024, 1} },
1935 .block_erase = spi_block_erase_60,
1936 }, {
1937 .eraseblocks = { {2 * 1024 * 1024, 1} },
1938 .block_erase = spi_block_erase_c7,
1939 }
1940 },
1941 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001942 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001943 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001944 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001945 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001946 },
1947
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001948 {
1949 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001950 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1951 * All other properties seem to be the same.*/
1952 .name = "AT25F1024(A)",
1953 .bustype = BUS_SPI,
1954 .manufacture_id = ATMEL_ID,
1955 .model_id = ATMEL_AT25F1024,
1956 .total_size = 128,
1957 .page_size = 256,
1958 .feature_bits = FEATURE_WRSR_WREN,
1959 .tested = TEST_OK_PREW,
1960 .probe = probe_spi_at25f,
1961 .probe_timing = TIMING_ZERO,
1962 .block_erasers =
1963 {
1964 {
1965 .eraseblocks = { {32 * 1024, 4} },
1966 .block_erase = spi_block_erase_52,
1967 }, {
1968 .eraseblocks = { {128 * 1024, 1} },
1969 .block_erase = spi_block_erase_62,
1970 }
1971 },
1972 .printlock = spi_prettyprint_status_register_at25f,
1973 .unlock = spi_disable_blockprotect_at25f,
1974 .write = spi_chip_write_256,
1975 .read = spi_chip_read,
1976 .voltage = {2700, 3600},
1977 },
1978
1979 {
1980 .vendor = "Atmel",
1981 .name = "AT25F2048",
1982 .bustype = BUS_SPI,
1983 .manufacture_id = ATMEL_ID,
1984 .model_id = ATMEL_AT25F2048,
1985 .total_size = 256,
1986 .page_size = 256,
1987 .feature_bits = FEATURE_WRSR_WREN,
1988 .tested = TEST_UNTESTED,
1989 .probe = probe_spi_at25f,
1990 .probe_timing = TIMING_ZERO,
1991 .block_erasers =
1992 {
1993 {
1994 .eraseblocks = { {64 * 1024, 4} },
1995 .block_erase = spi_block_erase_52,
1996 }, {
1997 .eraseblocks = { {256 * 1024, 1} },
1998 .block_erase = spi_block_erase_62,
1999 }
2000 },
2001 .printlock = spi_prettyprint_status_register_at25f,
2002 .unlock = spi_disable_blockprotect_at25f,
2003 .write = spi_chip_write_256,
2004 .read = spi_chip_read,
2005 .voltage = {2700, 3600},
2006 },
2007
2008 {
2009 .vendor = "Atmel",
2010 .name = "AT25F4096",
2011 .bustype = BUS_SPI,
2012 .manufacture_id = ATMEL_ID,
2013 .model_id = ATMEL_AT25F4096,
2014 .total_size = 512,
2015 .page_size = 256,
2016 .feature_bits = FEATURE_WRSR_WREN,
2017 .tested = TEST_OK_PREW,
2018 .probe = probe_spi_at25f,
2019 .probe_timing = TIMING_ZERO,
2020 .block_erasers =
2021 {
2022 {
2023 .eraseblocks = { {64 * 1024, 8} },
2024 .block_erase = spi_block_erase_52,
2025 }, {
2026 .eraseblocks = { {512 * 1024, 1} },
2027 .block_erase = spi_block_erase_62,
2028 }
2029 },
2030 .printlock = spi_prettyprint_status_register_at25f4096,
2031 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2032 .unlock = spi_disable_blockprotect_bp2_srwd,
2033 .write = spi_chip_write_256,
2034 .read = spi_chip_read,
2035 .voltage = {2700, 3600},
2036 },
2037
2038 {
2039 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002040 .name = "AT25F512",
2041 .bustype = BUS_SPI,
2042 .manufacture_id = ATMEL_ID,
2043 .model_id = ATMEL_AT25F512,
2044 .total_size = 64,
2045 .page_size = 256,
2046 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002047 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002048 .probe = probe_spi_at25f,
2049 .probe_timing = TIMING_ZERO,
2050 .block_erasers =
2051 {
2052 {
2053 .eraseblocks = { {32 * 1024, 2} },
2054 .block_erase = spi_block_erase_52,
2055 }, {
2056 .eraseblocks = { {64 * 1024, 1} },
2057 .block_erase = spi_block_erase_62,
2058 }
2059 },
2060 .printlock = spi_prettyprint_status_register_at25f,
2061 .unlock = spi_disable_blockprotect_at25f,
2062 .write = spi_chip_write_256,
2063 .read = spi_chip_read,
2064 .voltage = {2700, 3600},
2065 },
2066
2067 {
2068 .vendor = "Atmel",
2069 .name = "AT25F512A",
2070 .bustype = BUS_SPI,
2071 .manufacture_id = ATMEL_ID,
2072 .model_id = ATMEL_AT25F512A,
2073 .total_size = 64,
2074 .page_size = 128,
2075 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002076 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002077 .probe = probe_spi_at25f,
2078 .probe_timing = TIMING_ZERO,
2079 .block_erasers =
2080 {
2081 {
2082 .eraseblocks = { {32 * 1024, 2} },
2083 .block_erase = spi_block_erase_52,
2084 }, {
2085 .eraseblocks = { {64 * 1024, 1} },
2086 .block_erase = spi_block_erase_62,
2087 }
2088 },
2089 .printlock = spi_prettyprint_status_register_at25f512a,
2090 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2091 .unlock = spi_disable_blockprotect_at25f512a,
2092 .write = spi_chip_write_256,
2093 .read = spi_chip_read,
2094 .voltage = {2700, 3600},
2095 },
2096
2097 {
2098 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002099 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002100 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002101 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002102 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002103 .total_size = 64,
2104 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002105 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002107 .tested = TEST_UNTESTED,
2108 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002109 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002110 .block_erasers =
2111 {
2112 {
2113 .eraseblocks = { {4 * 1024, 16} },
2114 .block_erase = spi_block_erase_20,
2115 }, {
2116 .eraseblocks = { {32 * 1024, 2} },
2117 .block_erase = spi_block_erase_52,
2118 }, {
2119 .eraseblocks = { {32 * 1024, 2} },
2120 .block_erase = spi_block_erase_d8,
2121 }, {
2122 .eraseblocks = { {64 * 1024, 1} },
2123 .block_erase = spi_block_erase_60,
2124 }, {
2125 .eraseblocks = { {64 * 1024, 1} },
2126 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002127 }, {
2128 .eraseblocks = { {64 * 1024, 1} },
2129 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002130 }
2131 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002132 .printlock = spi_prettyprint_status_register_at25f512b,
2133 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002134 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002135 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002136 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002137 },
2138
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002139 {
2140 .vendor = "Atmel",
2141 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002142 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002143 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002144 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002145 .total_size = 128,
2146 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002147 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002148 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002149 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002150 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002151 .block_erasers =
2152 {
2153 {
2154 .eraseblocks = { {4 * 1024, 32} },
2155 .block_erase = spi_block_erase_20,
2156 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002157 .eraseblocks = { {4 * 1024, 32} },
2158 .block_erase = spi_block_erase_d7,
2159 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002160 .eraseblocks = { {32 * 1024, 4} },
2161 .block_erase = spi_block_erase_52,
2162 }, {
2163 .eraseblocks = { {32 * 1024, 4} },
2164 .block_erase = spi_block_erase_d8,
2165 }, {
2166 .eraseblocks = { {128 * 1024, 1} },
2167 .block_erase = spi_block_erase_60,
2168 }, {
2169 .eraseblocks = { {128 * 1024, 1} },
2170 .block_erase = spi_block_erase_c7,
2171 }
2172 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002173 .printlock = spi_prettyprint_status_register_at25fs010,
2174 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002175 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002176 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002177 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002178 },
2179
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002180 {
2181 .vendor = "Atmel",
2182 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002183 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002184 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002185 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002186 .total_size = 512,
2187 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002188 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002189 .tested = TEST_UNTESTED,
2190 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002191 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002192 .block_erasers =
2193 {
2194 {
2195 .eraseblocks = { {4 * 1024, 128} },
2196 .block_erase = spi_block_erase_20,
2197 }, {
2198 .eraseblocks = { {64 * 1024, 8} },
2199 .block_erase = spi_block_erase_52,
2200 }, {
2201 .eraseblocks = { {64 * 1024, 8} },
2202 .block_erase = spi_block_erase_d8,
2203 }, {
2204 .eraseblocks = { {512 * 1024, 1} },
2205 .block_erase = spi_block_erase_60,
2206 }, {
2207 .eraseblocks = { {512 * 1024, 1} },
2208 .block_erase = spi_block_erase_c7,
2209 }
2210 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002211 .printlock = spi_prettyprint_status_register_at25fs040,
2212 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002213 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002214 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002215 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002216 },
2217
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002218 {
2219 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002220 .name = "AT25SF041",
2221 .bustype = BUS_SPI,
2222 .manufacture_id = ATMEL_ID,
2223 .model_id = ATMEL_AT25SF041,
2224 .total_size = 512,
2225 .page_size = 256,
2226 .feature_bits = FEATURE_WRSR_WREN,
2227 .tested = TEST_OK_PREW,
2228 .probe = probe_spi_rdid,
2229 .probe_timing = TIMING_ZERO,
2230 .block_erasers =
2231 {
2232 {
2233 .eraseblocks = { {4 * 1024, 128} },
2234 .block_erase = spi_block_erase_20,
2235 }, {
2236 .eraseblocks = { {32 * 1024, 16} },
2237 .block_erase = spi_block_erase_52,
2238 }, {
2239 .eraseblocks = { {64 * 1024, 8} },
2240 .block_erase = spi_block_erase_d8,
2241 }, {
2242 .eraseblocks = { {512 * 1024, 1} },
2243 .block_erase = spi_block_erase_60,
2244 }, {
2245 .eraseblocks = { {512 * 1024, 1} },
2246 .block_erase = spi_block_erase_c7,
2247 }
2248 },
2249 .printlock = spi_prettyprint_status_register_plain,
2250 .unlock = spi_disable_blockprotect,
2251 .write = spi_chip_write_256,
2252 .read = spi_chip_read,
2253 .voltage = {2500, 3600},
2254 },
2255
2256 {
2257 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002258 .name = "AT25SF081",
2259 .bustype = BUS_SPI,
2260 .manufacture_id = ATMEL_ID,
2261 .model_id = ATMEL_AT25SF081,
2262 .total_size = 1024,
2263 .page_size = 256,
2264 .feature_bits = FEATURE_WRSR_WREN,
2265 .tested = TEST_OK_PREW,
2266 .probe = probe_spi_rdid,
2267 .probe_timing = TIMING_ZERO,
2268 .block_erasers =
2269 {
2270 {
2271 .eraseblocks = { {4 * 1024, 256} },
2272 .block_erase = spi_block_erase_20,
2273 }, {
2274 .eraseblocks = { {32 * 1024, 32} },
2275 .block_erase = spi_block_erase_52,
2276 }, {
2277 .eraseblocks = { {64 * 1024, 16} },
2278 .block_erase = spi_block_erase_d8,
2279 }, {
2280 .eraseblocks = { {1024 * 1024, 1} },
2281 .block_erase = spi_block_erase_60,
2282 }, {
2283 .eraseblocks = { {1024 * 1024, 1} },
2284 .block_erase = spi_block_erase_c7,
2285 }
2286 },
2287 .printlock = spi_prettyprint_status_register_plain,
2288 .unlock = spi_disable_blockprotect,
2289 .write = spi_chip_write_256,
2290 .read = spi_chip_read,
2291 .voltage = {2300, 3600},
2292 },
2293
2294 {
2295 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002296 .name = "AT25SF161",
2297 .bustype = BUS_SPI,
2298 .manufacture_id = ATMEL_ID,
2299 .model_id = ATMEL_AT25SF161,
2300 .total_size = 2048,
2301 .page_size = 256,
2302 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2303 .tested = TEST_OK_PREW,
2304 .probe = probe_spi_rdid,
2305 .probe_timing = TIMING_ZERO,
2306 .block_erasers =
2307 {
2308 {
2309 .eraseblocks = { {4 * 1024, 512} },
2310 .block_erase = spi_block_erase_20,
2311 }, {
2312 .eraseblocks = { {32 * 1024, 64} },
2313 .block_erase = spi_block_erase_52,
2314 }, {
2315 .eraseblocks = { {64 * 1024, 32} },
2316 .block_erase = spi_block_erase_d8,
2317 }, {
2318 .eraseblocks = { {2048 * 1024, 1} },
2319 .block_erase = spi_block_erase_60,
2320 }, {
2321 .eraseblocks = { {2048 * 1024, 1} },
2322 .block_erase = spi_block_erase_c7,
2323 }
2324 },
2325 .printlock = spi_prettyprint_status_register_plain,
2326 .unlock = spi_disable_blockprotect,
2327 .write = spi_chip_write_256,
2328 .read = spi_chip_read,
2329 .voltage = {2500, 3600},
2330 },
2331
2332 {
Alan Green57938f82019-06-27 15:06:43 +10002333 .vendor = "Atmel",
darkarnium41394382019-11-04 20:06:48 +00002334 .name = "AT25SF321",
2335 .bustype = BUS_SPI,
2336 .manufacture_id = ATMEL_ID,
2337 .model_id = ATMEL_AT25SF321,
2338 .total_size = 4096,
2339 .page_size = 256,
2340 .feature_bits = FEATURE_WRSR_WREN,
2341 .tested = TEST_OK_PR,
2342 .probe = probe_spi_rdid,
2343 .probe_timing = TIMING_ZERO,
2344 .block_erasers =
2345 {
2346 {
2347 .eraseblocks = { {4 * 1024, 1024} },
2348 .block_erase = spi_block_erase_20,
2349 }, {
2350 .eraseblocks = { {32 * 1024, 128} },
2351 .block_erase = spi_block_erase_52,
2352 }, {
2353 .eraseblocks = { {64 * 1024, 64} },
2354 .block_erase = spi_block_erase_d8,
2355 }, {
2356 .eraseblocks = { {4096 * 1024, 1} },
2357 .block_erase = spi_block_erase_60,
2358 }, {
2359 .eraseblocks = { {4096 * 1024, 1} },
2360 .block_erase = spi_block_erase_c7,
2361 }
2362 },
2363 .printlock = spi_prettyprint_status_register_plain,
2364 .unlock = spi_disable_blockprotect,
2365 .write = spi_chip_write_256,
2366 .read = spi_chip_read,
2367 .voltage = {2500, 3600},
2368 },
2369
2370 {
2371 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002372 .name = "AT25SL128A",
2373 .bustype = BUS_SPI,
2374 .manufacture_id = ATMEL_ID,
2375 .model_id = ATMEL_AT25SL128A,
2376 .total_size = 16384,
2377 .page_size = 256,
2378 /* supports SFDP */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Hal Martin49e23d22018-05-27 14:18:43 +02002380 .tested = TEST_OK_PREW,
2381 .probe = probe_spi_rdid,
2382 .probe_timing = TIMING_ZERO,
2383 .block_erasers =
2384 {
2385 {
2386 .eraseblocks = { {4 * 1024, 4096} },
2387 .block_erase = spi_block_erase_20,
2388 }, {
2389 .eraseblocks = { {32 * 1024, 512} },
2390 .block_erase = spi_block_erase_52,
2391 }, {
2392 .eraseblocks = { {64 * 1024, 256} },
2393 .block_erase = spi_block_erase_d8,
2394 }, {
2395 .eraseblocks = { {16 * 1024 * 1024, 1} },
2396 .block_erase = spi_block_erase_60,
2397 }, {
2398 .eraseblocks = { {16 * 1024 * 1024, 1} },
2399 .block_erase = spi_block_erase_c7,
2400 }
2401 },
2402 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2403 .unlock = spi_disable_blockprotect,
2404 .write = spi_chip_write_256,
2405 .read = spi_chip_read,
2406 .voltage = {1700, 2000},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002407 .reg_bits =
2408 {
2409 .srp = {STATUS1, 7, RW},
2410 .srl = {STATUS2, 0, RW},
2411 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
2412 .tb = {STATUS1, 5, RW},
2413 .sec = {STATUS1, 6, RW},
2414 .cmp = {STATUS2, 6, RW},
2415 },
2416 .decode_range = decode_range_spi25,
Hal Martin49e23d22018-05-27 14:18:43 +02002417 },
2418
2419 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002420 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002421 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002422 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002423 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002424 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002425 .total_size = 512,
2426 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002427 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002428 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002429 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002430 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002431 .block_erasers =
2432 {
2433 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002434 .eraseblocks = { {256, 2048} },
2435 .block_erase = spi_block_erase_81,
2436 }, {
2437 .eraseblocks = { {2 * 1024, 256} },
2438 .block_erase = spi_block_erase_50,
2439 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002440 .eraseblocks = { {4 * 1024, 128} },
2441 .block_erase = spi_block_erase_20,
2442 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002443 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002444 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002445 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002446 .write = spi_chip_write_1,
2447 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002448 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002449 },
2450
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002451 {
2452 .vendor = "Atmel",
2453 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002454 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002455 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002456 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002457 .total_size = 1024,
2458 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002459 .feature_bits = FEATURE_WRSR_WREN,
2460 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002461 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002462 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002463 .block_erasers =
2464 {
2465 {
2466 .eraseblocks = { {4 * 1024, 256} },
2467 .block_erase = spi_block_erase_20,
2468 }, {
2469 .eraseblocks = { {32 * 1024, 32} },
2470 .block_erase = spi_block_erase_52,
2471 }, {
2472 .eraseblocks = { {64 * 1024, 16} },
2473 .block_erase = spi_block_erase_d8,
2474 }, {
2475 .eraseblocks = { {1024 * 1024, 1} },
2476 .block_erase = spi_block_erase_60,
2477 }, {
2478 .eraseblocks = { {1024 * 1024, 1} },
2479 .block_erase = spi_block_erase_c7,
2480 }
2481 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002482 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002483 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002484 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002485 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002486 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002487 },
2488
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002489 {
2490 .vendor = "Atmel",
2491 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002492 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002493 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002494 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002495 .total_size = 2048,
2496 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002497 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002498 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002499 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002500 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002501 .block_erasers =
2502 {
2503 {
2504 .eraseblocks = { {4 * 1024, 512} },
2505 .block_erase = spi_block_erase_20,
2506 }, {
2507 .eraseblocks = { {32 * 1024, 64} },
2508 .block_erase = spi_block_erase_52,
2509 }, {
2510 .eraseblocks = { {64 * 1024, 32} },
2511 .block_erase = spi_block_erase_d8,
2512 }, {
2513 .eraseblocks = { {2 * 1024 * 1024, 1} },
2514 .block_erase = spi_block_erase_60,
2515 }, {
2516 .eraseblocks = { {2 * 1024 * 1024, 1} },
2517 .block_erase = spi_block_erase_c7,
2518 }
2519 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002520 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002521 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002522 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002523 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002524 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002525 },
2526
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002527 {
2528 .vendor = "Atmel",
2529 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002530 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002531 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002532 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002533 .total_size = 2048,
2534 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002535 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002536 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002537 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002538 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002539 .block_erasers =
2540 {
2541 {
2542 .eraseblocks = { {4 * 1024, 512} },
2543 .block_erase = spi_block_erase_20,
2544 }, {
2545 .eraseblocks = { {32 * 1024, 64} },
2546 .block_erase = spi_block_erase_52,
2547 }, {
2548 .eraseblocks = { {64 * 1024, 32} },
2549 .block_erase = spi_block_erase_d8,
2550 }, {
2551 .eraseblocks = { {2 * 1024 * 1024, 1} },
2552 .block_erase = spi_block_erase_60,
2553 }, {
2554 .eraseblocks = { {2 * 1024 * 1024, 1} },
2555 .block_erase = spi_block_erase_c7,
2556 }
2557 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002558 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002559 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002560 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002561 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002562 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002563 },
2564
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002565 {
2566 .vendor = "Atmel",
2567 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002568 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002569 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002570 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002571 .total_size = 512,
2572 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002573 .feature_bits = FEATURE_WRSR_WREN,
Alan Green908adf42019-07-03 15:34:06 +10002574 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002575 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002576 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002577 .block_erasers =
2578 {
2579 {
2580 .eraseblocks = { {4 * 1024, 128} },
2581 .block_erase = spi_block_erase_20,
2582 }, {
2583 .eraseblocks = { {32 * 1024, 16} },
2584 .block_erase = spi_block_erase_52,
2585 }, {
2586 .eraseblocks = { {64 * 1024, 8} },
2587 .block_erase = spi_block_erase_d8,
2588 }, {
2589 .eraseblocks = { {512 * 1024, 1} },
2590 .block_erase = spi_block_erase_60,
2591 }, {
2592 .eraseblocks = { {512 * 1024, 1} },
2593 .block_erase = spi_block_erase_c7,
2594 }
2595 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002596 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002597 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002598 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002599 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002600 },
2601
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002602 {
2603 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002604 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002605 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002606 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002607 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002608 .total_size = 128,
2609 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002610 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002611 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002612 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002613 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002614 .block_erasers =
2615 {
2616 {
2617 .eraseblocks = { {128 * 1024, 1} },
2618 .block_erase = erase_chip_block_jedec,
2619 }
2620 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002621 .write = write_jedec, /* FIXME */
2622 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002623 .voltage = {4500, 5500},
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002624 },
2625
2626 {
2627 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002628 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002629 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002630 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002631 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002632 .total_size = 256,
2633 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002634 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002635 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002636 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002637 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002638 .block_erasers =
2639 {
2640 {
2641 .eraseblocks = { {256 * 1024, 1} },
2642 .block_erase = erase_chip_block_jedec,
2643 }
2644 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002645 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002646 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002647 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002648 },
2649
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002650 {
2651 .vendor = "Atmel",
2652 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002653 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002654 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002655 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002656 .total_size = 512,
2657 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002658 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002659 .tested = TEST_UNTESTED,
2660 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002661 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002662 .block_erasers =
2663 {
2664 {
2665 .eraseblocks = { {512 * 1024, 1} },
2666 .block_erase = erase_chip_block_jedec,
2667 }
2668 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002669 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002670 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002671 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00002672 },
2673
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002674 {
2675 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002676 .name = "AT29C512",
2677 .bustype = BUS_PARALLEL,
2678 .manufacture_id = ATMEL_ID,
2679 .model_id = ATMEL_AT29C512,
2680 .total_size = 64,
2681 .page_size = 128,
2682 .feature_bits = FEATURE_LONG_RESET,
2683 .tested = TEST_OK_PREW,
2684 .probe = probe_jedec,
2685 .probe_timing = 10000, /* 10mS, Enter=Exec */
2686 .block_erasers =
2687 {
2688 {
2689 .eraseblocks = { {64 * 1024, 1} },
2690 .block_erase = erase_chip_block_jedec,
2691 }
2692 },
2693 .write = write_jedec,
2694 .read = read_memmapped,
2695 .voltage = {4500, 5500},
2696 },
2697
2698 {
2699 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002700 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002701 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002702 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002703 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002704 .total_size = 16896, /* No power of two sizes */
2705 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002706 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002707 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2708 .feature_bits = FEATURE_OTP,
2709 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002710 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002711 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002712 .block_erasers =
2713 {
2714 {
2715 .eraseblocks = {
2716 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2717 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2718 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2719 },
2720 .block_erase = spi_erase_at45cs_sector,
2721 }
2722 },
2723 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002724 .write = spi_write_at45db,
2725 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002726 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002727 .gran = write_gran_1056bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002728 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002729
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002730 {
2731 .vendor = "Atmel",
2732 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002733 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002734 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002735 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002736 .total_size = 128, /* or 132, determined from status register */
2737 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002738 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002739 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2740 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002741 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002742 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002743 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002744 .block_erasers =
2745 {
2746 {
2747 .eraseblocks = { {256, 512} },
2748 .block_erase = spi_erase_at45db_page,
2749 }, {
2750 .eraseblocks = { {8 * 256, 512/8} },
2751 .block_erase = spi_erase_at45db_block,
2752 }, {
2753 .eraseblocks = {
2754 {8 * 256, 1},
2755 {120 * 256, 1},
2756 {128 * 256, 3},
2757 },
2758 .block_erase = spi_erase_at45db_sector
2759 }, {
2760 .eraseblocks = { {128 * 1024, 1} },
2761 .block_erase = spi_erase_at45db_chip,
2762 }
2763 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002764 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002765 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002766 /* granularity will be set by the probing function. */
2767 .write = spi_write_at45db,
2768 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002769 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002770 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002771
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002772 {
2773 .vendor = "Atmel",
2774 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002775 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002776 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002777 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002778 .total_size = 256, /* or 264, determined from status register */
2779 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002780 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002781 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2782 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002783 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002784 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002785 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002786 .block_erasers =
2787 {
2788 {
2789 .eraseblocks = { {256, 1024} },
2790 .block_erase = spi_erase_at45db_page,
2791 }, {
2792 .eraseblocks = { {8 * 256, 1024/8} },
2793 .block_erase = spi_erase_at45db_block,
2794 }, {
2795 .eraseblocks = {
2796 {8 * 256, 1},
2797 {120 * 256, 1},
2798 {128 * 256, 7},
2799 },
2800 .block_erase = spi_erase_at45db_sector
2801 }, {
2802 .eraseblocks = { {256 * 1024, 1} },
2803 .block_erase = spi_erase_at45db_chip,
2804 }
2805 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002806 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002807 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002808 /* granularity will be set by the probing function. */
2809 .write = spi_write_at45db,
2810 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002811 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002812 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002813
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002814 {
2815 .vendor = "Atmel",
2816 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002817 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002818 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002819 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002820 .total_size = 512, /* or 528, determined from status register */
2821 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002822 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002823 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2824 .feature_bits = FEATURE_OTP,
2825 .tested = TEST_OK_PREW,
2826 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002827 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002828 .block_erasers =
2829 {
2830 {
2831 .eraseblocks = { {256, 2048} },
2832 .block_erase = spi_erase_at45db_page,
2833 }, {
2834 .eraseblocks = { {8 * 256, 2048/8} },
2835 .block_erase = spi_erase_at45db_block,
2836 }, {
2837 .eraseblocks = {
2838 {8 * 256, 1},
2839 {248 * 256, 1},
2840 {256 * 256, 7},
2841 },
2842 .block_erase = spi_erase_at45db_sector
2843 }, {
2844 .eraseblocks = { {512 * 1024, 1} },
2845 .block_erase = spi_erase_at45db_chip,
2846 }
2847 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002848 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002849 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002850 /* granularity will be set by the probing function. */
2851 .write = spi_write_at45db,
2852 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2853 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002854 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002855
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002856 {
2857 .vendor = "Atmel",
2858 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002859 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002860 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002861 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002862 .total_size = 1024, /* or 1056, determined from status register */
2863 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002864 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002865 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2866 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002867 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002868 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002869 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002870 .block_erasers =
2871 {
2872 {
2873 .eraseblocks = { {256, 4096} },
2874 .block_erase = spi_erase_at45db_page,
2875 }, {
2876 .eraseblocks = { {8 * 256, 4096/8} },
2877 .block_erase = spi_erase_at45db_block,
2878 }, {
2879 .eraseblocks = {
2880 {8 * 256, 1},
2881 {248 * 256, 1},
2882 {256 * 256, 15},
2883 },
2884 .block_erase = spi_erase_at45db_sector
2885 }, {
2886 .eraseblocks = { {1024 * 1024, 1} },
2887 .block_erase = spi_erase_at45db_chip,
2888 }
2889 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002890 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002891 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002892 /* granularity will be set by the probing function. */
2893 .write = spi_write_at45db,
2894 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002895 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002896 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002897
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002898 {
2899 .vendor = "Atmel",
2900 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002901 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002902 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002903 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002904 .total_size = 2048, /* or 2112, determined from status register */
2905 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002906 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002907 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2908 .feature_bits = FEATURE_OTP,
2909 .tested = TEST_OK_PREW,
2910 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002911 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002912 .block_erasers =
2913 {
2914 {
2915 .eraseblocks = { {512, 4096} },
2916 .block_erase = spi_erase_at45db_page,
2917 }, {
2918 .eraseblocks = { {8 * 512, 4096/8} },
2919 .block_erase = spi_erase_at45db_block,
2920 }, {
2921 .eraseblocks = {
2922 {8 * 512, 1},
2923 {248 * 512, 1},
2924 {256 * 512, 15},
2925 },
2926 .block_erase = spi_erase_at45db_sector
2927 }, {
2928 .eraseblocks = { {2048 * 1024, 1} },
2929 .block_erase = spi_erase_at45db_chip,
2930 }
2931 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002932 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002933 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002934 /* granularity will be set by the probing function. */
2935 .write = spi_write_at45db,
2936 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002937 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002938 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002939
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002940 {
2941 .vendor = "Atmel",
2942 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002943 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002944 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002945 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10002946 .total_size = 4224, /* No power of two sizes */
2947 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002948 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002949 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2950 .feature_bits = FEATURE_OTP,
2951 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002952 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002953 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002954 .block_erasers =
2955 {
2956 {
2957 .eraseblocks = { {528, 8192} },
2958 .block_erase = spi_erase_at45db_page,
2959 }, {
2960 .eraseblocks = { {8 * 528, 8192/8} },
2961 .block_erase = spi_erase_at45db_block,
2962 }, /* Although the datasheets describes sectors (which can be write protected)
2963 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00002964 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002965 .eraseblocks = {
2966 {8 * 528, 1},
2967 {120 * 528, 1},
2968 {128 * 528, 63},
2969 },
2970 .block_erase = spi_erase_at45db_sector
2971 }, */ {
2972 .eraseblocks = { {4224 * 1024, 1} },
2973 .block_erase = spi_erase_at45db_chip,
2974 }
2975 },
2976 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00002977 .write = spi_write_at45db,
2978 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002979 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002980 .gran = write_gran_528bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002981 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002982
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002983 {
2984 .vendor = "Atmel",
2985 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002986 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002987 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002988 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10002989 .total_size = 4096, /* or 4224, determined from status register */
2990 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002991 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002992 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00002993 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00002994 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002995 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002996 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002997 .block_erasers =
2998 {
2999 {
3000 .eraseblocks = { {512, 8192} },
3001 .block_erase = spi_erase_at45db_page,
3002 }, {
3003 .eraseblocks = { {8 * 512, 8192/8} },
3004 .block_erase = spi_erase_at45db_block,
3005 }, {
3006 .eraseblocks = {
3007 {8 * 512, 1},
3008 {120 * 512, 1},
3009 {128 * 512, 63},
3010 },
3011 .block_erase = spi_erase_at45db_sector
3012 }, {
3013 .eraseblocks = { {4096 * 1024, 1} },
3014 .block_erase = spi_erase_at45db_chip,
3015 }
3016 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003017 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003018 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003019 /* granularity will be set by the probing function. */
3020 .write = spi_write_at45db,
3021 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3022 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
3023 },
3024
3025 {
3026 .vendor = "Atmel",
3027 .name = "AT45DB321E",
3028 .bustype = BUS_SPI,
3029 .manufacture_id = ATMEL_ID,
3030 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003031 .total_size = 4096, /* or 4224, determined from status register */
3032 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003033 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3034 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3035 .feature_bits = FEATURE_OTP,
3036 .tested = TEST_UNTESTED,
3037 .probe = probe_spi_at45db,
3038 .probe_timing = TIMING_ZERO,
3039 .block_erasers =
3040 {
3041 {
3042 .eraseblocks = { {512, 8192} },
3043 .block_erase = spi_erase_at45db_page,
3044 }, {
3045 .eraseblocks = { {8 * 512, 8192/8} },
3046 .block_erase = spi_erase_at45db_block,
3047 }, {
3048 .eraseblocks = {
3049 {8 * 512, 1},
3050 {120 * 512, 1},
3051 {128 * 512, 63},
3052 },
3053 .block_erase = spi_erase_at45db_sector
3054 }, {
3055 .eraseblocks = { {4096 * 1024, 1} },
3056 .block_erase = spi_erase_at45db_chip,
3057 }
3058 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003059 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
Alan Greenc1863ca2019-06-27 15:08:03 +10003060 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003061 /* granularity will be set by the probing function. */
3062 .write = spi_write_at45db,
3063 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3064 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003065 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003066
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003067 {
3068 .vendor = "Atmel",
3069 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003070 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003071 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003072 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003073 .total_size = 8192, /* or 8448, determined from status register */
3074 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003075 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003076 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3077 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003078 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003079 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003080 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003081 .block_erasers =
3082 {
3083 {
3084 .eraseblocks = { {1024, 8192} },
3085 .block_erase = spi_erase_at45db_page,
3086 }, {
3087 .eraseblocks = { {8 * 1024, 8192/8} },
3088 .block_erase = spi_erase_at45db_block,
3089 }, {
3090 .eraseblocks = {
3091 {8 * 1024, 1},
3092 {248 * 1024, 1},
3093 {256 * 1024, 31},
3094 },
3095 .block_erase = spi_erase_at45db_sector
3096 }, {
3097 .eraseblocks = { {8192 * 1024, 1} },
3098 .block_erase = spi_erase_at45db_chip,
3099 }
3100 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003101 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003102 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003103 /* granularity will be set by the probing function. */
3104 .write = spi_write_at45db,
3105 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003106 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003107 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003108
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003109 {
3110 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10003111 .name = "AT49(H)F010",
3112 .bustype = BUS_PARALLEL,
3113 .manufacture_id = ATMEL_ID,
3114 .model_id = ATMEL_AT49F010,
3115 .total_size = 128,
3116 .page_size = 0, /* unused */
3117 .feature_bits = FEATURE_EITHER_RESET,
3118 .tested = TEST_OK_PREW,
3119 .probe = probe_jedec,
3120 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3121 .block_erasers =
3122 {
3123 {
3124 .eraseblocks = { {128 * 1024, 1} },
3125 .block_erase = erase_chip_block_jedec,
3126 }
3127 },
3128 .printlock = printlock_at49f,
3129 .write = write_jedec_1,
3130 .read = read_memmapped,
3131 .voltage = {4500, 5500},
3132 },
3133
3134 {
3135 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003136 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003137 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003138 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003139 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003140 .total_size = 64,
3141 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003142 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003143 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003144 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003145 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003146 .block_erasers =
3147 {
3148 {
3149 .eraseblocks = { {64 * 1024, 1} },
3150 .block_erase = erase_chip_block_jedec,
3151 }
3152 },
Sean Nelson35727f72010-01-28 23:55:12 +00003153 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003154 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003155 .voltage = {2700, 3600},
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003156 },
3157
3158 {
3159 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003160 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003161 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003162 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003163 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003164 .total_size = 256,
3165 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003166 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003167 .tested = TEST_UNTESTED,
3168 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003169 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003170 .block_erasers =
3171 {
3172 {
3173 .eraseblocks = {
3174 {16 * 1024, 1},
3175 {8 * 1024, 2},
3176 {96 * 1024, 1},
3177 {128 * 1024, 1},
3178 },
3179 .block_erase = erase_sector_jedec,
3180 }, {
3181 .eraseblocks = { {256 * 1024, 1} },
3182 .block_erase = erase_chip_block_jedec,
3183 }
3184 },
Sean Nelson35727f72010-01-28 23:55:12 +00003185 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003186 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003187 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003188 },
3189
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003190 {
3191 .vendor = "Atmel",
3192 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003193 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003194 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003195 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003196 .total_size = 256,
3197 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003198 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003199 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003200 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003201 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003202 .block_erasers =
3203 {
3204 {
3205 .eraseblocks = {
3206 {128 * 1024, 1},
3207 {96 * 1024, 1},
3208 {8 * 1024, 2},
3209 {16 * 1024, 1},
3210 },
3211 .block_erase = erase_sector_jedec,
3212 }, {
3213 .eraseblocks = { {256 * 1024, 1} },
3214 .block_erase = erase_chip_block_jedec,
3215 }
3216 },
Sean Nelson35727f72010-01-28 23:55:12 +00003217 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003218 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003219 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00003220 },
3221
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003222 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003223 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003224 .name = "AT49F020",
3225 .bustype = BUS_PARALLEL,
3226 .manufacture_id = ATMEL_ID,
3227 .model_id = ATMEL_AT49F020,
3228 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003229 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003230 .feature_bits = FEATURE_EITHER_RESET,
3231 .tested = TEST_OK_PRE,
3232 .probe = probe_jedec,
3233 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3234 .block_erasers =
3235 {
3236 {
3237 .eraseblocks = { {256 * 1024, 1} },
3238 .block_erase = erase_chip_block_jedec,
3239 }
3240 /* Chip features an optional permanent write protection
3241 * of the first 8 kB. The erase function is the same as
3242 * above, but 00000H to 01FFFH will not be erased.
3243 * FIXME: add another eraser when partial erasers are
3244 * supported.
3245 */
3246 },
3247 .printlock = printlock_at49f,
3248 .write = write_jedec_1,
3249 .read = read_memmapped,
3250 .voltage = {4500, 5500},
3251 },
3252
3253 {
3254 .vendor = "Atmel",
3255 .name = "AT49F040",
3256 .bustype = BUS_PARALLEL,
3257 .manufacture_id = ATMEL_ID,
3258 .model_id = ATMEL_AT49F040,
3259 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003260 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003261 .feature_bits = FEATURE_EITHER_RESET,
3262 .tested = TEST_UNTESTED,
3263 .probe = probe_jedec,
3264 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3265 .block_erasers =
3266 {
3267 {
3268 .eraseblocks = { {512 * 1024, 1} },
3269 .block_erase = erase_chip_block_jedec,
3270 }
3271 /* Chip features an optional permanent write protection
3272 * of the first 16 kB. The erase function is the same as
3273 * above, but 00000H to 03FFFH will not be erased.
3274 * FIXME: add another eraser when partial erasers are
3275 * supported.
3276 */
3277 },
3278 .printlock = printlock_at49f,
3279 .write = write_jedec_1,
3280 .read = read_memmapped,
3281 .voltage = {4500, 5500},
3282 },
3283
3284 {
3285 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003286 .name = "AT49F080",
3287 .bustype = BUS_PARALLEL,
3288 .manufacture_id = ATMEL_ID,
3289 .model_id = ATMEL_AT49F080,
3290 .total_size = 1024,
3291 .page_size = 0, /* unused */
3292 .feature_bits = FEATURE_EITHER_RESET,
3293 .tested = TEST_UNTESTED,
3294 .probe = probe_jedec,
3295 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3296 .block_erasers =
3297 {
3298 {
3299 .eraseblocks = { {1024 * 1024, 1} },
3300 .block_erase = erase_chip_block_jedec,
3301 }
3302 /* Chip features an optional permanent write protection
3303 * of the first 16 kB. The erase function is the same as
3304 * above, but 00000H to 03FFFH will not be erased.
3305 * FIXME: add another eraser when partial erasers are
3306 * supported.
3307 */
3308 },
3309 .printlock = printlock_at49f,
3310 .write = write_jedec_1,
3311 .read = read_memmapped,
3312 .voltage = {4500, 5500},
3313 },
3314
3315 {
3316 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3317 .vendor = "Atmel",
3318 .name = "AT49F080T",
3319 .bustype = BUS_PARALLEL,
3320 .manufacture_id = ATMEL_ID,
3321 .model_id = ATMEL_AT49F080T,
3322 .total_size = 1024,
3323 .page_size = 0, /* unused */
3324 .feature_bits = FEATURE_EITHER_RESET,
3325 .tested = TEST_UNTESTED,
3326 .probe = probe_jedec,
3327 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3328 .block_erasers =
3329 {
3330 {
3331 .eraseblocks = { {1024 * 1024, 1} },
3332 .block_erase = erase_chip_block_jedec,
3333 }
3334 /* Chip features an optional permanent write protection
3335 * of the first 16 kB. The erase function is the same as
3336 * above, but FC000H to FFFFFH will not be erased.
3337 * FIXME: add another eraser when partial erasers are
3338 * supported.
3339 */
3340 },
3341 .printlock = printlock_at49f,
3342 .write = write_jedec_1,
3343 .read = read_memmapped,
3344 .voltage = {4500, 5500},
3345 },
3346
3347 {
3348 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003349 .name = "AT49LH002",
3350 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3351 .manufacture_id = ATMEL_ID,
3352 .model_id = ATMEL_AT49LH002,
3353 .total_size = 256,
3354 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003355 .feature_bits = FEATURE_REGISTERMAP,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003356 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003357 .probe = probe_82802ab,
3358 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003359 .block_erasers =
3360 {
3361 {
3362 .eraseblocks = {
3363 {64 * 1024, 3},
3364 {32 * 1024, 1},
3365 {8 * 1024, 2},
3366 {16 * 1024, 1},
3367 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003368 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003369 }, {
3370 .eraseblocks = {
3371 {64 * 1024, 4},
3372 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003373 .block_erase = erase_block_82802ab,
3374 },
3375 },
3376 .printlock = printlock_regspace2_block_eraser_0,
3377 .unlock = unlock_regspace2_block_eraser_0,
3378 .write = write_82802ab,
3379 .read = read_memmapped,
3380 .voltage = {3000, 3600},
3381 },
3382
3383 {
3384 .vendor = "Atmel",
Stefan Tauner7de93932014-08-03 13:05:45 +00003385 .name = "AT49LH004",
3386 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3387 .manufacture_id = ATMEL_ID,
3388 .model_id = ATMEL_AT49LH004,
3389 .total_size = 512,
3390 .page_size = 0, /* unused */
3391 .feature_bits = FEATURE_REGISTERMAP,
3392 .tested = TEST_UNTESTED,
3393 .probe = probe_82802ab,
3394 .probe_timing = TIMING_ZERO,
3395 .block_erasers =
3396 {
3397 {
3398 .eraseblocks = {
3399 {64 * 1024, 7},
3400 {32 * 1024, 1},
3401 {8 * 1024, 2},
3402 {16 * 1024, 1},
3403 },
3404 .block_erase = erase_block_82802ab,
3405 }, {
3406 .eraseblocks = {
3407 {64 * 1024, 8},
3408 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003409 .block_erase = NULL, /* TODO: Implement. */
3410 },
3411 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003412 .printlock = printlock_regspace2_block_eraser_0,
3413 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003414 .write = write_82802ab,
3415 .read = read_memmapped,
3416 .voltage = {3000, 3600},
3417 },
3418
3419 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003420 .vendor = "Atmel",
3421 .name = "AT49LH00B4",
3422 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3423 .manufacture_id = ATMEL_ID,
3424 .model_id = ATMEL_AT49LH00B4,
3425 .total_size = 512,
Andrew Morganca081462011-09-13 22:05:44 +00003426 .page_size = 0, /* unused */
Alan Green1f9cc7d2019-07-01 11:10:45 +10003427 .feature_bits = FEATURE_REGISTERMAP,
3428 .tested = TEST_UNTESTED,
3429 .probe = probe_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003430 .probe_timing = TIMING_ZERO,
3431 .block_erasers =
3432 {
3433 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003434 .eraseblocks = {
3435 {8 * 1024, 2},
3436 {16 * 1024, 1},
3437 {32 * 1024, 1},
3438 {64 * 1024, 7},
3439 },
3440 .block_erase = NULL, /* TODO: Implement. */
3441 }, {
3442 .eraseblocks = {
3443 {64 * 1024, 8},
3444 },
3445 .block_erase = erase_block_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003446 },
3447 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003448 .printlock = printlock_regspace2_block_eraser_0,
3449 .unlock = unlock_regspace2_block_eraser_0,
3450 .write = write_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003451 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003452 .voltage = {3000, 3600},
Andrew Morganca081462011-09-13 22:05:44 +00003453 },
3454
3455 {
Angel Pons1ebda782021-04-20 21:39:11 +02003456 .vendor = "Boya/BoHong Microelectronics",
Christian Kudera475a7ee2021-04-20 22:50:01 +02003457 .name = "B.25D16A",
3458 .bustype = BUS_SPI,
3459 .manufacture_id = BOYA_BOHONG_ID,
3460 .model_id = BOYA_BOHONG_B_25D16A,
3461 .total_size = 2048,
3462 .page_size = 256,
3463 .feature_bits = FEATURE_WRSR_WREN,
3464 .tested = TEST_OK_PR,
3465 .probe = probe_spi_rdid,
3466 .probe_timing = TIMING_ZERO,
3467 .block_erasers =
3468 {
3469 {
3470 .eraseblocks = { {4 * 1024, 512} },
3471 .block_erase = spi_block_erase_20,
3472 }, {
3473 .eraseblocks = { {32 * 1024, 64} },
3474 .block_erase = spi_block_erase_52,
3475 }, {
3476 .eraseblocks = { {64 * 1024, 32} },
3477 .block_erase = spi_block_erase_d8,
3478 }, {
3479 .eraseblocks = { {2 * 1024 * 1024, 1} },
3480 .block_erase = spi_block_erase_60,
3481 }, {
3482 .eraseblocks = { {2 * 1024 * 1024, 1} },
3483 .block_erase = spi_block_erase_c7,
3484 }
3485 },
3486 .printlock = spi_prettyprint_status_register_bp2_srwd,
3487 .unlock = spi_disable_blockprotect_bp2_srwd,
3488 .write = spi_chip_write_256,
3489 .read = spi_chip_read,
3490 .voltage = {2700, 3600},
3491 },
3492
3493 {
3494 .vendor = "Boya/BoHong Microelectronics",
Angel Pons1ebda782021-04-20 21:39:11 +02003495 .name = "B.25Q128AS",
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003496 .bustype = BUS_SPI,
Angel Pons1ebda782021-04-20 21:39:11 +02003497 .manufacture_id = BOYA_BOHONG_ID,
3498 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003499 .total_size = 16384,
3500 .page_size = 256,
3501 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
3502 .tested = TEST_OK_PREW,
3503 .probe = probe_spi_rdid,
3504 .probe_timing = TIMING_ZERO,
3505 .block_erasers =
3506 {
3507 {
3508 .eraseblocks = { {4 * 1024, 4096} },
3509 .block_erase = spi_block_erase_20,
3510 }, {
3511 .eraseblocks = { {32 * 1024, 512} },
3512 .block_erase = spi_block_erase_52,
3513 }, {
3514 .eraseblocks = { {64 * 1024, 256} },
3515 .block_erase = spi_block_erase_d8,
3516 }, {
3517 .eraseblocks = { {16 * 1024 * 1024, 1} },
3518 .block_erase = spi_block_erase_60,
3519 }, {
3520 .eraseblocks = { {16 * 1024 * 1024, 1} },
3521 .block_erase = spi_block_erase_c7,
3522 }
3523 },
3524 .printlock = spi_prettyprint_status_register_plain,
3525 .unlock = spi_disable_blockprotect_at25fs040,
3526 .write = spi_chip_write_256,
3527 .read = spi_chip_read,
3528 .voltage = {2700, 3600},
3529 },
3530
3531 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003532 .vendor = "Bright",
3533 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003534 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003535 .manufacture_id = BRIGHT_ID,
3536 .model_id = BRIGHT_BM29F040,
3537 .total_size = 512,
3538 .page_size = 64 * 1024,
3539 .feature_bits = FEATURE_EITHER_RESET,
3540 .tested = TEST_OK_PR,
3541 .probe = probe_jedec,
3542 .probe_timing = TIMING_ZERO,
3543 .block_erasers =
3544 {
3545 {
3546 .eraseblocks = { {64 * 1024, 8} },
3547 .block_erase = erase_sector_jedec,
3548 }, {
3549 .eraseblocks = { {512 * 1024, 1} },
3550 .block_erase = erase_chip_block_jedec,
3551 },
3552 },
3553 .write = write_jedec_1,
3554 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003555 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00003556 },
3557
3558 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003559 .vendor = "Catalyst",
3560 .name = "CAT28F512",
3561 .bustype = BUS_PARALLEL,
3562 .manufacture_id = CATALYST_ID,
3563 .model_id = CATALYST_CAT28F512,
3564 .total_size = 64,
3565 .page_size = 0, /* unused */
3566 .feature_bits = 0,
Alan Green908adf42019-07-03 15:34:06 +10003567 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
Alan Green1f9cc7d2019-07-01 11:10:45 +10003568 .probe = probe_jedec, /* FIXME! */
3569 .probe_timing = TIMING_ZERO,
3570 .block_erasers =
3571 {
3572 {
3573 .eraseblocks = { {64 * 1024, 1} },
3574 .block_erase = NULL, /* TODO */
3575 },
3576 },
3577 .write = NULL, /* TODO */
3578 .read = read_memmapped,
3579 .voltage = {4500, 5500},
3580 },
3581
3582 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003583 .vendor = "ENE",
3584 .name = "KB9012 (EDI)",
3585 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003586 .total_size = 128,
3587 .page_size = 128,
3588 .feature_bits = FEATURE_ERASED_ZERO,
3589 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10003590 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003591 .probe = edi_probe_kb9012,
3592 .probe_timing = TIMING_ZERO,
3593 .block_erasers =
3594 {
3595 {
3596 .eraseblocks = { {128, 1024} },
3597 .block_erase = edi_chip_block_erase,
3598 },
3599 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003600 .write = edi_chip_write,
3601 .read = edi_chip_read,
3602 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003603 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003604 },
3605
3606 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003607 .vendor = "ESI",
3608 .name = "ES25P16",
3609 .bustype = BUS_SPI,
3610 .manufacture_id = EXCEL_ID_NOPREFIX,
3611 .model_id = EXCEL_ES25P16,
3612 .total_size = 2 * 1024,
3613 .page_size = 256,
3614 /* 256-byte parameter page separate from memory array:
3615 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3616 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003617 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003618 .probe = probe_spi_rdid,
3619 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003620 .block_erasers =
3621 {
3622 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003623 .eraseblocks = { {64 * 1024, 32} },
3624 .block_erase = spi_block_erase_d8,
Sean Nelson54596372010-01-09 05:30:14 +00003625 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003626 .eraseblocks = { {2 * 1024 * 1024, 1} },
3627 .block_erase = spi_block_erase_c7,
Sean Nelson54596372010-01-09 05:30:14 +00003628 }
3629 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003630 .printlock = spi_prettyprint_status_register_bp2_srwd,
3631 .unlock = spi_disable_blockprotect_bp2_srwd,
3632 .write = spi_chip_write_256,
3633 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3634 .voltage = {2700, 3600},
3635 },
3636
3637 {
3638 .vendor = "ESI",
3639 .name = "ES25P40",
3640 .bustype = BUS_SPI,
3641 .manufacture_id = EXCEL_ID_NOPREFIX,
3642 .model_id = EXCEL_ES25P40,
3643 .total_size = 512,
3644 .page_size = 256,
3645 /* 256-byte parameter page separate from memory array:
3646 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3647 .feature_bits = FEATURE_WRSR_WREN,
3648 .tested = TEST_UNTESTED,
3649 .probe = probe_spi_rdid,
3650 .probe_timing = TIMING_ZERO,
3651 .block_erasers =
3652 {
3653 {
3654 .eraseblocks = { {64 * 1024, 8} },
3655 .block_erase = spi_block_erase_d8,
3656 }, {
3657 .eraseblocks = { {512 * 1024, 1} },
3658 .block_erase = spi_block_erase_c7,
3659 }
3660 },
3661 .printlock = spi_prettyprint_status_register_bp2_srwd,
3662 .unlock = spi_disable_blockprotect_bp2_srwd,
3663 .write = spi_chip_write_256,
3664 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3665 .voltage = {2700, 3600},
3666 },
3667
3668 {
3669 .vendor = "ESI",
3670 .name = "ES25P80",
3671 .bustype = BUS_SPI,
3672 .manufacture_id = EXCEL_ID_NOPREFIX,
3673 .model_id = EXCEL_ES25P80,
3674 .total_size = 1024,
3675 .page_size = 256,
3676 /* 256-byte parameter page separate from memory array:
3677 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3678 .feature_bits = FEATURE_WRSR_WREN,
3679 .tested = TEST_UNTESTED,
3680 .probe = probe_spi_rdid,
3681 .probe_timing = TIMING_ZERO,
3682 .block_erasers =
3683 {
3684 {
3685 .eraseblocks = { {64 * 1024, 16} },
3686 .block_erase = spi_block_erase_d8,
3687 }, {
3688 .eraseblocks = { {1024 * 1024, 1} },
3689 .block_erase = spi_block_erase_c7,
3690 }
3691 },
3692 .printlock = spi_prettyprint_status_register_bp2_srwd,
3693 .unlock = spi_disable_blockprotect_bp2_srwd,
3694 .write = spi_chip_write_256,
3695 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3696 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00003697 },
3698
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003699 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003700 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003701 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003702 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003703 .manufacture_id = ESMT_ID,
3704 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003705 .total_size = 1024,
3706 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003707 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003708 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003709 .probe = probe_spi_rdid,
3710 .probe_timing = TIMING_ZERO,
3711 .block_erasers =
3712 {
3713 {
3714 .eraseblocks = { {4 * 1024, 256} },
3715 .block_erase = spi_block_erase_20,
3716 }, {
3717 .eraseblocks = { {64 * 1024, 16} },
3718 .block_erase = spi_block_erase_d8,
3719 }, {
3720 .eraseblocks = { {1024 * 1024, 1} },
3721 .block_erase = spi_block_erase_60,
3722 }, {
3723 .eraseblocks = { {1024 * 1024, 1} },
3724 .block_erase = spi_block_erase_c7,
3725 }
3726 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003727 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003728 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003729 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003730 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003731 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003732 },
3733
3734 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003735 .vendor = "ESMT",
3736 .name = "F25L32PA",
3737 .bustype = BUS_SPI,
3738 .manufacture_id = ESMT_ID,
3739 .model_id = ESMT_F25L32PA,
3740 .total_size = 4096,
3741 .page_size = 256,
3742 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3743 .tested = TEST_UNTESTED,
3744 .probe = probe_spi_rdid,
3745 .probe_timing = TIMING_ZERO,
3746 .block_erasers =
3747 {
3748 {
3749 .eraseblocks = { {4 * 1024, 1024} },
3750 .block_erase = spi_block_erase_20,
3751 }, {
3752 .eraseblocks = { {64 * 1024, 64} },
3753 .block_erase = spi_block_erase_d8,
3754 }, {
3755 .eraseblocks = { {4 * 1024 * 1024, 1} },
3756 .block_erase = spi_block_erase_60,
3757 }, {
3758 .eraseblocks = { {4 * 1024 * 1024, 1} },
3759 .block_erase = spi_block_erase_c7,
3760 }
3761 },
3762 .printlock = spi_prettyprint_status_register_bp2_bpl,
3763 .unlock = spi_disable_blockprotect,
3764 .write = spi_chip_write_256,
3765 .read = spi_chip_read,
3766 .voltage = {2700, 3600},
3767 },
3768
3769 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003770 .vendor = "ESMT",
3771 .name = "F49B002UA",
3772 .bustype = BUS_PARALLEL,
3773 .manufacture_id = ESMT_ID,
3774 .model_id = ESMT_F49B002UA,
3775 .total_size = 256,
3776 .page_size = 4096,
3777 .feature_bits = FEATURE_EITHER_RESET,
3778 .tested = TEST_UNTESTED,
3779 .probe = probe_jedec,
3780 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3781 .block_erasers =
3782 {
3783 {
3784 .eraseblocks = {
3785 {128 * 1024, 1},
3786 {96 * 1024, 1},
3787 {8 * 1024, 2},
3788 {16 * 1024, 1},
3789 },
3790 .block_erase = erase_sector_jedec,
3791 }, {
3792 .eraseblocks = { {256 * 1024, 1} },
3793 .block_erase = erase_chip_block_jedec,
3794 }
3795 },
3796 .write = write_jedec_1,
3797 .read = read_memmapped,
3798 .voltage = {4500, 5500},
3799 },
3800
3801 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003802 .vendor = "Eon",
3803 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003804 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003805 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003806 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003807 .total_size = 64,
3808 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003809 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003810 .tested = TEST_UNTESTED,
3811 .probe = probe_spi_rdid,
3812 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003813 .block_erasers =
3814 {
3815 {
3816 .eraseblocks = {
3817 {4 * 1024, 2},
3818 {8 * 1024, 1},
3819 {16 * 1024, 1},
3820 {32 * 1024, 1},
3821 },
3822 .block_erase = spi_block_erase_d8,
3823 }, {
3824 .eraseblocks = { {64 * 1024, 1} },
3825 .block_erase = spi_block_erase_c7,
3826 }
3827 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003828 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003829 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003830 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003831 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003832 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003833 },
3834
3835 {
3836 .vendor = "Eon",
3837 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003838 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003839 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003840 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003841 .total_size = 64,
3842 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003843 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003844 .tested = TEST_UNTESTED,
3845 .probe = probe_spi_rdid,
3846 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003847 .block_erasers =
3848 {
3849 {
3850 .eraseblocks = {
3851 {32 * 1024, 1},
3852 {16 * 1024, 1},
3853 {8 * 1024, 1},
3854 {4 * 1024, 2},
3855 },
3856 .block_erase = spi_block_erase_d8,
3857 }, {
3858 .eraseblocks = { {64 * 1024, 1} },
3859 .block_erase = spi_block_erase_c7,
3860 }
3861 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003862 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003863 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003864 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003865 .read = spi_chip_read, /* Fast read (0x0B) supported */
3866 .voltage = {2700, 3600},
3867 },
3868
3869 {
3870 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003871 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003872 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003873 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003874 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003875 .total_size = 128,
3876 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003877 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003878 .tested = TEST_UNTESTED,
3879 .probe = probe_spi_rdid,
3880 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003881 .block_erasers =
3882 {
3883 {
3884 .eraseblocks = {
3885 {4 * 1024, 2},
3886 {8 * 1024, 1},
3887 {16 * 1024, 1},
3888 {32 * 1024, 3},
3889 },
3890 .block_erase = spi_block_erase_d8,
3891 }, {
3892 .eraseblocks = { {128 * 1024, 1} },
3893 .block_erase = spi_block_erase_c7,
3894 }
3895 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003896 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003897 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003898 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003899 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003900 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003901 },
3902
3903 {
3904 .vendor = "Eon",
3905 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003906 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003907 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003908 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00003909 .total_size = 128,
3910 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003911 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00003912 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00003913 .probe = probe_spi_rdid,
3914 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003915 .block_erasers =
3916 {
3917 {
3918 .eraseblocks = {
3919 {32 * 1024, 3},
3920 {16 * 1024, 1},
3921 {8 * 1024, 1},
3922 {4 * 1024, 2},
3923 },
3924 .block_erase = spi_block_erase_d8,
3925 }, {
3926 .eraseblocks = { {128 * 1024, 1} },
3927 .block_erase = spi_block_erase_c7,
3928 }
3929 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003930 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003931 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003932 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003933 .read = spi_chip_read, /* Fast read (0x0B) supported */
3934 .voltage = {2700, 3600},
3935 },
3936
3937 {
3938 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003939 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003940 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003941 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003942 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003943 .total_size = 2048,
3944 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003945 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003946 .tested = TEST_UNTESTED,
3947 .probe = probe_spi_rdid,
3948 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003949 .block_erasers =
3950 {
3951 {
3952 .eraseblocks = {
3953 {4 * 1024, 2},
3954 {8 * 1024, 1},
3955 {16 * 1024, 1},
3956 {32 * 1024, 1},
3957 {64 * 1024, 31},
3958 },
3959 .block_erase = spi_block_erase_d8,
3960 }, {
3961 .eraseblocks = { {2 * 1024 * 1024, 1} },
3962 .block_erase = spi_block_erase_c7,
3963 }
3964 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003965 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003966 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003967 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003968 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003969 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003970 },
3971
3972 {
3973 .vendor = "Eon",
3974 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003975 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003976 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003977 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00003978 .total_size = 2048,
3979 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003980 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003981 .tested = TEST_UNTESTED,
3982 .probe = probe_spi_rdid,
3983 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003984 .block_erasers =
3985 {
3986 {
3987 .eraseblocks = {
3988 {64 * 1024, 31},
3989 {32 * 1024, 1},
3990 {16 * 1024, 1},
3991 {8 * 1024, 1},
3992 {4 * 1024, 2},
3993 },
3994 .block_erase = spi_block_erase_d8,
3995 }, {
3996 .eraseblocks = { {2 * 1024 * 1024, 1} },
3997 .block_erase = spi_block_erase_c7,
3998 }
3999 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004000 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004001 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004002 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004003 .read = spi_chip_read, /* Fast read (0x0B) supported */
4004 .voltage = {2700, 3600},
4005 },
4006
4007 {
4008 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004009 .name = "EN25B20",
Stefan Taunerb175af52015-01-24 15:06:27 +00004010 .bustype = BUS_SPI,
4011 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004012 .model_id = EON_EN25B20,
4013 .total_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004014 .page_size = 256,
4015 .feature_bits = FEATURE_WRSR_WREN,
4016 .tested = TEST_UNTESTED,
4017 .probe = probe_spi_rdid,
4018 .probe_timing = TIMING_ZERO,
4019 .block_erasers =
4020 {
4021 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004022 .eraseblocks = {
4023 {4 * 1024, 2},
4024 {8 * 1024, 1},
4025 {16 * 1024, 1},
4026 {32 * 1024, 1},
4027 {64 * 1024, 3}
4028 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004029 .block_erase = spi_block_erase_d8,
4030 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004031 .eraseblocks = { {256 * 1024, 1} },
4032 .block_erase = spi_block_erase_c7,
4033 }
4034 },
4035 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4036 .unlock = spi_disable_blockprotect,
4037 .write = spi_chip_write_256,
4038 .read = spi_chip_read, /* Fast read (0x0B) supported */
4039 .voltage = {2700, 3600},
4040 },
4041
4042 {
4043 .vendor = "Eon",
4044 .name = "EN25B20T",
4045 .bustype = BUS_SPI,
4046 .manufacture_id = EON_ID_NOPREFIX,
4047 .model_id = EON_EN25B20,
4048 .total_size = 256,
4049 .page_size = 256,
4050 .feature_bits = FEATURE_WRSR_WREN,
4051 .tested = TEST_UNTESTED,
4052 .probe = probe_spi_rdid,
4053 .probe_timing = TIMING_ZERO,
4054 .block_erasers =
4055 {
4056 {
4057 .eraseblocks = {
4058 {64 * 1024, 3},
4059 {32 * 1024, 1},
4060 {16 * 1024, 1},
4061 {8 * 1024, 1},
4062 {4 * 1024, 2},
4063 },
4064 .block_erase = spi_block_erase_d8,
4065 }, {
4066 .eraseblocks = { {256 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004067 .block_erase = spi_block_erase_c7,
4068 }
4069 },
4070 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4071 .unlock = spi_disable_blockprotect,
4072 .write = spi_chip_write_256,
4073 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004074 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004075 },
4076
4077 {
4078 .vendor = "Eon",
4079 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004080 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004081 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004082 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004083 .total_size = 4096,
4084 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004085 /* OTP: 512B total; enter 0x3A */
4086 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004087 .tested = TEST_UNTESTED,
4088 .probe = probe_spi_rdid,
4089 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004090 .block_erasers =
4091 {
4092 {
4093 .eraseblocks = {
4094 {4 * 1024, 2},
4095 {8 * 1024, 1},
4096 {16 * 1024, 1},
4097 {32 * 1024, 1},
4098 {64 * 1024, 63},
4099 },
4100 .block_erase = spi_block_erase_d8,
4101 }, {
4102 .eraseblocks = { {4 * 1024 * 1024, 1} },
4103 .block_erase = spi_block_erase_c7,
4104 }
4105 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004106 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004107 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004108 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004109 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004110 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004111 },
4112
4113 {
4114 .vendor = "Eon",
4115 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004116 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004117 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004118 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004119 .total_size = 4096,
4120 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004121 /* OTP: 512B total; enter 0x3A */
4122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004123 .tested = TEST_UNTESTED,
4124 .probe = probe_spi_rdid,
4125 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004126 .block_erasers =
4127 {
4128 {
4129 .eraseblocks = {
4130 {64 * 1024, 63},
4131 {32 * 1024, 1},
4132 {16 * 1024, 1},
4133 {8 * 1024, 1},
4134 {4 * 1024, 2},
4135 },
4136 .block_erase = spi_block_erase_d8,
4137 }, {
4138 .eraseblocks = { {4 * 1024 * 1024, 1} },
4139 .block_erase = spi_block_erase_c7,
4140 }
4141 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004142 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004143 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004144 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004145 .read = spi_chip_read, /* Fast read (0x0B) supported */
4146 .voltage = {2700, 3600},
4147 },
4148
4149 {
4150 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004151 .name = "EN25B40",
Stefan Taunerb175af52015-01-24 15:06:27 +00004152 .bustype = BUS_SPI,
4153 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004154 .model_id = EON_EN25B40,
4155 .total_size = 512,
Stefan Taunerb175af52015-01-24 15:06:27 +00004156 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004157 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004158 .tested = TEST_UNTESTED,
4159 .probe = probe_spi_rdid,
4160 .probe_timing = TIMING_ZERO,
4161 .block_erasers =
4162 {
4163 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004164 .eraseblocks = {
4165 {4 * 1024, 2},
4166 {8 * 1024, 1},
4167 {16 * 1024, 1},
4168 {32 * 1024, 1},
4169 {64 * 1024, 7}
4170 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004171 .block_erase = spi_block_erase_d8,
4172 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004173 .eraseblocks = { {512 * 1024, 1} },
4174 .block_erase = spi_block_erase_c7,
4175 }
4176 },
4177 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4178 .unlock = spi_disable_blockprotect,
4179 .write = spi_chip_write_256,
4180 .read = spi_chip_read, /* Fast read (0x0B) supported */
4181 .voltage = {2700, 3600},
4182 },
4183
4184 {
4185 .vendor = "Eon",
4186 .name = "EN25B40T",
4187 .bustype = BUS_SPI,
4188 .manufacture_id = EON_ID_NOPREFIX,
4189 .model_id = EON_EN25B40,
4190 .total_size = 512,
4191 .page_size = 256,
4192 .feature_bits = FEATURE_WRSR_WREN,
4193 .tested = TEST_UNTESTED,
4194 .probe = probe_spi_rdid,
4195 .probe_timing = TIMING_ZERO,
4196 .block_erasers =
4197 {
4198 {
4199 .eraseblocks = {
4200 {64 * 1024, 7},
4201 {32 * 1024, 1},
4202 {16 * 1024, 1},
4203 {8 * 1024, 1},
4204 {4 * 1024, 2},
4205 },
4206 .block_erase = spi_block_erase_d8,
4207 }, {
4208 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004209 .block_erase = spi_block_erase_c7,
4210 }
4211 },
4212 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4213 .unlock = spi_disable_blockprotect,
4214 .write = spi_chip_write_256,
4215 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004216 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004217 },
4218
4219 {
4220 .vendor = "Eon",
4221 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004222 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004223 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004224 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004225 .total_size = 8192,
4226 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004227 /* OTP: 512B total; enter 0x3A */
4228 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004229 .tested = TEST_UNTESTED,
4230 .probe = probe_spi_rdid,
4231 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004232 .block_erasers =
4233 {
4234 {
4235 .eraseblocks = {
4236 {4 * 1024, 2},
4237 {8 * 1024, 1},
4238 {16 * 1024, 1},
4239 {32 * 1024, 1},
4240 {64 * 1024, 127},
4241 },
4242 .block_erase = spi_block_erase_d8,
4243 }, {
4244 .eraseblocks = { {8 * 1024 * 1024, 1} },
4245 .block_erase = spi_block_erase_c7,
4246 }
4247 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004248 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004249 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004250 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004251 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004252 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004253 },
4254
4255 {
4256 .vendor = "Eon",
4257 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004258 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004259 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004260 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004261 .total_size = 8192,
4262 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004263 /* OTP: 512B total; enter 0x3A */
4264 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004265 .tested = TEST_UNTESTED,
4266 .probe = probe_spi_rdid,
4267 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004268 .block_erasers =
4269 {
4270 {
4271 .eraseblocks = {
4272 {64 * 1024, 127},
4273 {32 * 1024, 1},
4274 {16 * 1024, 1},
4275 {8 * 1024, 1},
4276 {4 * 1024, 2},
4277 },
4278 .block_erase = spi_block_erase_d8,
4279 }, {
4280 .eraseblocks = { {8 * 1024 * 1024, 1} },
4281 .block_erase = spi_block_erase_c7,
4282 }
4283 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004284 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004285 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004286 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004287 .read = spi_chip_read, /* Fast read (0x0B) supported */
4288 .voltage = {2700, 3600},
4289 },
4290
4291 {
4292 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004293 .name = "EN25B80",
Stefan Taunerb175af52015-01-24 15:06:27 +00004294 .bustype = BUS_SPI,
4295 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004296 .model_id = EON_EN25B80,
4297 .total_size = 1024,
Stefan Taunerb175af52015-01-24 15:06:27 +00004298 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004299 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004300 .tested = TEST_UNTESTED,
4301 .probe = probe_spi_rdid,
4302 .probe_timing = TIMING_ZERO,
4303 .block_erasers =
4304 {
4305 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004306 .eraseblocks = {
4307 {4 * 1024, 2},
4308 {8 * 1024, 1},
4309 {16 * 1024, 1},
4310 {32 * 1024, 1},
4311 {64 * 1024, 15}
4312 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004313 .block_erase = spi_block_erase_d8,
4314 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004315 .eraseblocks = { {1024 * 1024, 1} },
4316 .block_erase = spi_block_erase_c7,
4317 }
4318 },
4319 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4320 .unlock = spi_disable_blockprotect,
4321 .write = spi_chip_write_256,
4322 .read = spi_chip_read, /* Fast read (0x0B) supported */
4323 .voltage = {2700, 3600},
4324 },
4325
4326 {
4327 .vendor = "Eon",
4328 .name = "EN25B80T",
4329 .bustype = BUS_SPI,
4330 .manufacture_id = EON_ID_NOPREFIX,
4331 .model_id = EON_EN25B80,
4332 .total_size = 1024,
4333 .page_size = 256,
4334 .feature_bits = FEATURE_WRSR_WREN,
4335 .tested = TEST_UNTESTED,
4336 .probe = probe_spi_rdid,
4337 .probe_timing = TIMING_ZERO,
4338 .block_erasers =
4339 {
4340 {
4341 .eraseblocks = {
4342 {64 * 1024, 15},
4343 {32 * 1024, 1},
4344 {16 * 1024, 1},
4345 {8 * 1024, 1},
4346 {4 * 1024, 2},
4347 },
4348 .block_erase = spi_block_erase_d8,
4349 }, {
4350 .eraseblocks = { {1024 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004351 .block_erase = spi_block_erase_c7,
4352 }
4353 },
4354 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4355 .unlock = spi_disable_blockprotect,
4356 .write = spi_chip_write_256,
4357 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004358 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004359 },
4360
4361 {
4362 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004363 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004364 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004365 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004366 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004367 .total_size = 64,
4368 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004369 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004370 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004371 .probe = probe_spi_rdid,
4372 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004373 .block_erasers =
4374 {
4375 {
4376 .eraseblocks = { {4 * 1024, 16} },
4377 .block_erase = spi_block_erase_20,
4378 }, {
4379 .eraseblocks = { {32 * 1024, 2} },
4380 .block_erase = spi_block_erase_d8,
4381 }, {
4382 .eraseblocks = { {32 * 1024, 2} },
4383 .block_erase = spi_block_erase_52,
4384 }, {
4385 .eraseblocks = { {64 * 1024, 1} },
4386 .block_erase = spi_block_erase_60,
4387 }, {
4388 .eraseblocks = { {64 * 1024, 1} },
4389 .block_erase = spi_block_erase_c7,
4390 }
4391 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004392 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004393 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004394 .write = spi_chip_write_256,
4395 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004396 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004397 },
4398
4399 {
4400 .vendor = "Eon",
4401 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004402 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004403 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004404 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004405 .total_size = 128,
4406 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004407 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrowd173ed42021-09-29 09:28:07 +02004408 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004409 .probe = probe_spi_rdid,
4410 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004411 .block_erasers =
4412 {
4413 {
4414 .eraseblocks = { {4 * 1024, 32} },
4415 .block_erase = spi_block_erase_20,
4416 }, {
4417 .eraseblocks = { {32 * 1024, 4} },
4418 .block_erase = spi_block_erase_d8,
4419 }, {
4420 .eraseblocks = { {32 * 1024, 4} },
4421 .block_erase = spi_block_erase_52,
4422 }, {
4423 .eraseblocks = { {128 * 1024, 1} },
4424 .block_erase = spi_block_erase_60,
4425 }, {
4426 .eraseblocks = { {128 * 1024, 1} },
4427 .block_erase = spi_block_erase_c7,
4428 }
4429 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004430 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004431 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004432 .write = spi_chip_write_256,
4433 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004434 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004435 },
4436
4437 {
4438 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004439 .name = "EN25F16",
4440 .bustype = BUS_SPI,
4441 .manufacture_id = EON_ID_NOPREFIX,
4442 .model_id = EON_EN25F16,
4443 .total_size = 2048,
4444 .page_size = 256,
4445 .feature_bits = FEATURE_WRSR_WREN,
4446 .tested = TEST_OK_PREW,
4447 .probe = probe_spi_rdid,
4448 .probe_timing = TIMING_ZERO,
4449 .block_erasers =
4450 {
4451 {
4452 .eraseblocks = { {4 * 1024, 512} },
4453 .block_erase = spi_block_erase_20,
4454 }, {
4455 .eraseblocks = { {64 * 1024, 32} },
4456 .block_erase = spi_block_erase_d8,
4457 }, {
4458 .eraseblocks = { {2 * 1024 * 1024, 1} },
4459 .block_erase = spi_block_erase_60,
4460 }, {
4461 .eraseblocks = { {2 * 1024 * 1024, 1} },
4462 .block_erase = spi_block_erase_c7,
4463 }
4464 },
4465 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4466 .unlock = spi_disable_blockprotect,
4467 .write = spi_chip_write_256,
4468 .read = spi_chip_read,
4469 .voltage = {2700, 3600},
4470 },
4471
4472 {
4473 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004474 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004475 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004476 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004477 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004478 .total_size = 256,
4479 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004480 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004481 .tested = TEST_UNTESTED,
4482 .probe = probe_spi_rdid,
4483 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004484 .block_erasers =
4485 {
4486 {
4487 .eraseblocks = { {4 * 1024, 64} },
4488 .block_erase = spi_block_erase_20,
4489 }, {
4490 .eraseblocks = { {64 * 1024, 4} },
4491 .block_erase = spi_block_erase_d8,
4492 }, {
4493 .eraseblocks = { {64 * 1024, 4} },
4494 .block_erase = spi_block_erase_52,
4495 }, {
4496 .eraseblocks = { {256 * 1024, 1} },
4497 .block_erase = spi_block_erase_60,
4498 }, {
4499 .eraseblocks = { {256 * 1024, 1} },
4500 .block_erase = spi_block_erase_c7,
4501 }
4502 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004503 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004504 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004505 .write = spi_chip_write_256,
4506 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004507 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004508 },
4509
4510 {
4511 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004512 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004513 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004514 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004515 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004516 .total_size = 4096,
4517 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004518 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004519 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004520 .probe = probe_spi_rdid,
4521 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004522 .block_erasers =
4523 {
4524 {
4525 .eraseblocks = { {4 * 1024, 1024} },
4526 .block_erase = spi_block_erase_20,
4527 }, {
4528 .eraseblocks = { {64 * 1024, 64} },
4529 .block_erase = spi_block_erase_d8,
4530 }, {
4531 .eraseblocks = { {4 * 1024 * 1024, 1} },
4532 .block_erase = spi_block_erase_60,
4533 }, {
4534 .eraseblocks = { {4 * 1024 * 1024, 1} },
4535 .block_erase = spi_block_erase_c7,
4536 }
4537 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004538 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004539 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004540 .write = spi_chip_write_256,
4541 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004542 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004543 },
4544
4545 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004546 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004547 .name = "EN25F40",
4548 .bustype = BUS_SPI,
4549 .manufacture_id = EON_ID_NOPREFIX,
4550 .model_id = EON_EN25F40,
4551 .total_size = 512,
4552 .page_size = 256,
4553 .feature_bits = FEATURE_WRSR_WREN,
4554 .tested = TEST_OK_PREW,
4555 .probe = probe_spi_rdid,
4556 .probe_timing = TIMING_ZERO,
4557 .block_erasers =
4558 {
4559 {
4560 .eraseblocks = { {4 * 1024, 128} },
4561 .block_erase = spi_block_erase_20,
4562 }, {
4563 .eraseblocks = { {64 * 1024, 8} },
4564 .block_erase = spi_block_erase_d8,
4565 }, {
4566 .eraseblocks = { {512 * 1024, 1} },
4567 .block_erase = spi_block_erase_60,
4568 }, {
4569 .eraseblocks = { {512 * 1024, 1} },
4570 .block_erase = spi_block_erase_c7,
4571 },
4572 },
4573 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4574 .unlock = spi_disable_blockprotect,
4575 .write = spi_chip_write_256,
4576 .read = spi_chip_read,
4577 .voltage = {2700, 3600},
4578 },
4579
4580 {
4581 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004582 .name = "EN25F64",
4583 .bustype = BUS_SPI,
4584 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004585 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004586 .total_size = 8192,
4587 .page_size = 256,
4588 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004589 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004590 .probe = probe_spi_rdid,
4591 .probe_timing = TIMING_ZERO,
4592 .block_erasers =
4593 {
4594 {
4595 .eraseblocks = { {4 * 1024, 2048} },
4596 .block_erase = spi_block_erase_20,
4597 }, {
4598 .eraseblocks = { {64 * 1024, 128} },
4599 .block_erase = spi_block_erase_d8,
4600 }, {
4601 .eraseblocks = { {8 * 1024 * 1024, 1} },
4602 .block_erase = spi_block_erase_60,
4603 }, {
4604 .eraseblocks = { {8 * 1024 * 1024, 1} },
4605 .block_erase = spi_block_erase_c7,
4606 }
4607 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004608 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004609 .unlock = spi_disable_blockprotect,
4610 .write = spi_chip_write_256,
4611 .read = spi_chip_read,
4612 .voltage = {2700, 3600},
4613 },
4614
4615 {
4616 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004617 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004618 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004619 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004620 .model_id = EON_EN25F80,
David Hendricks6d715302011-07-24 22:21:57 +00004621 .total_size = 1024,
4622 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004623 .feature_bits = FEATURE_WRSR_WREN,
4624 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004625 .probe = probe_spi_rdid,
4626 .probe_timing = TIMING_ZERO,
4627 .block_erasers =
4628 {
4629 {
4630 .eraseblocks = { {4 * 1024, 256} },
4631 .block_erase = spi_block_erase_20,
4632 }, {
4633 .eraseblocks = { {64 * 1024, 16} },
4634 .block_erase = spi_block_erase_d8,
4635 }, {
4636 .eraseblocks = { {1024 * 1024, 1} },
4637 .block_erase = spi_block_erase_60,
4638 }, {
4639 .eraseblocks = { {1024 * 1024, 1} },
4640 .block_erase = spi_block_erase_c7,
4641 }
4642 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004643 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004644 .unlock = spi_disable_blockprotect,
4645 .write = spi_chip_write_256,
4646 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004647 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004648 },
4649
4650 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004651 .vendor = "Eon",
4652 .name = "EN25P05",
4653 .bustype = BUS_SPI,
4654 .manufacture_id = EON_ID_NOPREFIX,
4655 .model_id = EON_EN25B05,
4656 .total_size = 64,
4657 .page_size = 256,
4658 .feature_bits = FEATURE_WRSR_WREN,
4659 .tested = TEST_UNTESTED,
4660 .probe = probe_spi_rdid,
4661 .probe_timing = TIMING_ZERO,
4662 .block_erasers =
4663 {
4664 {
4665 .eraseblocks = {
4666 {32 * 1024, 2} },
4667 .block_erase = spi_block_erase_d8,
4668 }, {
4669 .eraseblocks = { {64 * 1024, 1} },
4670 .block_erase = spi_block_erase_c7,
4671 }
4672 },
4673 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4674 .unlock = spi_disable_blockprotect,
4675 .write = spi_chip_write_256,
4676 .read = spi_chip_read, /* Fast read (0x0B) supported */
4677 .voltage = {2700, 3600},
4678 },
4679
4680 {
4681 .vendor = "Eon",
4682 .name = "EN25P10",
4683 .bustype = BUS_SPI,
4684 .manufacture_id = EON_ID_NOPREFIX,
4685 .model_id = EON_EN25B10,
4686 .total_size = 128,
4687 .page_size = 256,
4688 .feature_bits = FEATURE_WRSR_WREN,
4689 .tested = TEST_UNTESTED,
4690 .probe = probe_spi_rdid,
4691 .probe_timing = TIMING_ZERO,
4692 .block_erasers =
4693 {
4694 {
4695 .eraseblocks = { {32 * 1024, 4} },
4696 .block_erase = spi_block_erase_d8,
4697 }, {
4698 .eraseblocks = { {128 * 1024, 1} },
4699 .block_erase = spi_block_erase_c7,
4700 }
4701 },
4702 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4703 .unlock = spi_disable_blockprotect,
4704 .write = spi_chip_write_256,
4705 .read = spi_chip_read, /* Fast read (0x0B) supported */
4706 .voltage = {2700, 3600},
4707 },
4708
4709 {
4710 .vendor = "Eon",
4711 .name = "EN25P16",
4712 .bustype = BUS_SPI,
4713 .manufacture_id = EON_ID_NOPREFIX,
4714 .model_id = EON_EN25B16,
4715 .total_size = 2048,
4716 .page_size = 256,
4717 .feature_bits = FEATURE_WRSR_WREN,
4718 .tested = TEST_UNTESTED,
4719 .probe = probe_spi_rdid,
4720 .probe_timing = TIMING_ZERO,
4721 .block_erasers =
4722 {
4723 {
4724 .eraseblocks = { {64 * 1024, 32} },
4725 .block_erase = spi_block_erase_d8,
4726 }, {
4727 .eraseblocks = { {2 * 1024 * 1024, 1} },
4728 .block_erase = spi_block_erase_c7,
4729 }
4730 },
4731 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4732 .unlock = spi_disable_blockprotect,
4733 .write = spi_chip_write_256,
4734 .read = spi_chip_read, /* Fast read (0x0B) supported */
4735 .voltage = {2700, 3600},
4736 },
4737
4738 {
4739 .vendor = "Eon",
4740 .name = "EN25P20",
4741 .bustype = BUS_SPI,
4742 .manufacture_id = EON_ID_NOPREFIX,
4743 .model_id = EON_EN25B20,
4744 .total_size = 256,
4745 .page_size = 256,
4746 .feature_bits = FEATURE_WRSR_WREN,
4747 .tested = TEST_UNTESTED,
4748 .probe = probe_spi_rdid,
4749 .probe_timing = TIMING_ZERO,
4750 .block_erasers =
4751 {
4752 {
4753 .eraseblocks = { {64 * 1024, 4} },
4754 .block_erase = spi_block_erase_d8,
4755 }, {
4756 .eraseblocks = { {256 * 1024, 1} },
4757 .block_erase = spi_block_erase_c7,
4758 }
4759 },
4760 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4761 .unlock = spi_disable_blockprotect,
4762 .write = spi_chip_write_256,
4763 .read = spi_chip_read, /* Fast read (0x0B) supported */
4764 .voltage = {2700, 3600},
4765 },
4766
4767 {
4768 .vendor = "Eon",
4769 .name = "EN25P32", /* Uniform version of EN25B32 */
4770 .bustype = BUS_SPI,
4771 .manufacture_id = EON_ID_NOPREFIX,
4772 .model_id = EON_EN25B32,
4773 .total_size = 4096,
4774 .page_size = 256,
4775 /* OTP: 512B total; enter 0x3A */
4776 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4777 .tested = TEST_UNTESTED,
4778 .probe = probe_spi_rdid,
4779 .probe_timing = TIMING_ZERO,
4780 .block_erasers =
4781 {
4782 {
4783 .eraseblocks = { {64 * 1024, 64} },
4784 .block_erase = spi_block_erase_d8,
4785 }, {
4786 .eraseblocks = { {4 * 1024 * 1024, 1} },
4787 .block_erase = spi_block_erase_c7,
4788 }
4789 },
4790 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4791 .unlock = spi_disable_blockprotect,
4792 .write = spi_chip_write_256,
4793 .read = spi_chip_read, /* Fast read (0x0B) supported */
4794 .voltage = {2700, 3600},
4795 },
4796
4797 {
4798 .vendor = "Eon",
4799 .name = "EN25P40",
4800 .bustype = BUS_SPI,
4801 .manufacture_id = EON_ID_NOPREFIX,
4802 .model_id = EON_EN25B40,
4803 .total_size = 512,
4804 .page_size = 256,
4805 .feature_bits = FEATURE_WRSR_WREN,
4806 .tested = TEST_UNTESTED,
4807 .probe = probe_spi_rdid,
4808 .probe_timing = TIMING_ZERO,
4809 .block_erasers =
4810 {
4811 {
4812 .eraseblocks = { {64 * 1024, 8} },
4813 .block_erase = spi_block_erase_d8,
4814 }, {
4815 .eraseblocks = { {512 * 1024, 1} },
4816 .block_erase = spi_block_erase_c7,
4817 }
4818 },
4819 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4820 .unlock = spi_disable_blockprotect,
4821 .write = spi_chip_write_256,
4822 .read = spi_chip_read, /* Fast read (0x0B) supported */
4823 .voltage = {2700, 3600},
4824 },
4825
4826 {
4827 .vendor = "Eon",
4828 .name = "EN25P64",
4829 .bustype = BUS_SPI,
4830 .manufacture_id = EON_ID_NOPREFIX,
4831 .model_id = EON_EN25B64,
4832 .total_size = 8192,
4833 .page_size = 256,
4834 /* OTP: 512B total; enter 0x3A */
4835 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4836 .tested = TEST_UNTESTED,
4837 .probe = probe_spi_rdid,
4838 .probe_timing = TIMING_ZERO,
4839 .block_erasers =
4840 {
4841 {
4842 .eraseblocks = { {64 * 1024, 128} },
4843 .block_erase = spi_block_erase_d8,
4844 }, {
4845 .eraseblocks = { {8 * 1024 * 1024, 1} },
4846 .block_erase = spi_block_erase_c7,
4847 }
4848 },
4849 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4850 .unlock = spi_disable_blockprotect,
4851 .write = spi_chip_write_256,
4852 .read = spi_chip_read, /* Fast read (0x0B) supported */
4853 .voltage = {2700, 3600},
4854 },
4855
4856 {
4857 .vendor = "Eon",
4858 .name = "EN25P80",
4859 .bustype = BUS_SPI,
4860 .manufacture_id = EON_ID_NOPREFIX,
4861 .model_id = EON_EN25B80,
4862 .total_size = 1024,
4863 .page_size = 256,
4864 .feature_bits = FEATURE_WRSR_WREN,
4865 .tested = TEST_UNTESTED,
4866 .probe = probe_spi_rdid,
4867 .probe_timing = TIMING_ZERO,
4868 .block_erasers =
4869 {
4870 {
4871 .eraseblocks = { {64 * 1024, 16} },
4872 .block_erase = spi_block_erase_d8,
4873 }, {
4874 .eraseblocks = { {1024 * 1024, 1} },
4875 .block_erase = spi_block_erase_c7,
4876 }
4877 },
4878 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4879 .unlock = spi_disable_blockprotect,
4880 .write = spi_chip_write_256,
4881 .read = spi_chip_read, /* Fast read (0x0B) supported */
4882 .voltage = {2700, 3600},
4883 },
4884
4885 {
4886 .vendor = "Eon",
4887 .name = "EN25Q128",
4888 .bustype = BUS_SPI,
4889 .manufacture_id = EON_ID_NOPREFIX,
4890 .model_id = EON_EN25Q128,
4891 .total_size = 16384,
4892 .page_size = 256,
4893 /* OTP: 512B total; enter 0x3A */
4894 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4895 .tested = TEST_OK_PREW,
4896 .probe = probe_spi_rdid,
4897 .probe_timing = TIMING_ZERO,
4898 .block_erasers =
4899 {
4900 {
4901 .eraseblocks = { {4 * 1024, 4096} },
4902 .block_erase = spi_block_erase_20,
4903 }, {
4904 .eraseblocks = { {64 * 1024, 256} },
4905 .block_erase = spi_block_erase_d8,
4906 }, {
4907 .eraseblocks = { {16 * 1024 * 1024, 1} },
4908 .block_erase = spi_block_erase_60,
4909 }, {
4910 .eraseblocks = { {16 * 1024 * 1024, 1} },
4911 .block_erase = spi_block_erase_c7,
4912 }
4913 },
4914 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4915 .unlock = spi_disable_blockprotect,
4916 .write = spi_chip_write_256,
4917 .read = spi_chip_read,
4918 },
4919
4920 {
David Hendricks6d715302011-07-24 22:21:57 +00004921 /* Note: EN25D16 is an evil twin which shares the model ID
4922 but has different write protection capabilities */
4923 .vendor = "Eon",
4924 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004925 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004926 .manufacture_id = EON_ID_NOPREFIX,
4927 .model_id = EON_EN25Q16,
4928 .total_size = 2048,
4929 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004930 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4931 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00004932 .tested = TEST_UNTESTED,
4933 .probe = probe_spi_rdid,
4934 .probe_timing = TIMING_ZERO,
4935 .block_erasers =
4936 {
4937 {
4938 .eraseblocks = { {4 * 1024, 512} },
4939 .block_erase = spi_block_erase_20,
4940 }, {
4941 .eraseblocks = { {64 * 1024, 32} },
4942 .block_erase = spi_block_erase_d8,
4943 }, {
4944 /* not supported by Q16 version */
4945 .eraseblocks = { {64 * 1024, 32} },
4946 .block_erase = spi_block_erase_52,
4947 }, {
4948 .eraseblocks = { {2 * 1024 * 1024, 1} },
4949 .block_erase = spi_block_erase_60,
4950 }, {
4951 .eraseblocks = { {2 * 1024 * 1024, 1} },
4952 .block_erase = spi_block_erase_c7,
4953 }
4954 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004955 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004956 .unlock = spi_disable_blockprotect,
4957 .write = spi_chip_write_256,
4958 .read = spi_chip_read,
4959 .voltage = {2700, 3600},
4960 },
4961
4962 {
4963 .vendor = "Eon",
4964 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004965 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004966 .manufacture_id = EON_ID_NOPREFIX,
4967 .model_id = EON_EN25Q32,
4968 .total_size = 4096,
4969 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00004970 /* OTP: 512B total; enter 0x3A */
4971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00004972 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004973 .probe = probe_spi_rdid,
4974 .probe_timing = TIMING_ZERO,
4975 .block_erasers =
4976 {
4977 {
4978 .eraseblocks = { {4 * 1024, 1024} },
4979 .block_erase = spi_block_erase_20,
4980 }, {
4981 .eraseblocks = { {64 * 1024, 64} },
4982 .block_erase = spi_block_erase_d8,
4983 }, {
4984 .eraseblocks = { {4 * 1024 * 1024, 1} },
4985 .block_erase = spi_block_erase_60,
4986 }, {
4987 .eraseblocks = { {4 * 1024 * 1024, 1} },
4988 .block_erase = spi_block_erase_c7,
4989 }
4990 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004991 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004992 .unlock = spi_disable_blockprotect,
4993 .write = spi_chip_write_256,
4994 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004995 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004996 },
4997
4998 {
4999 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005000 .name = "EN25Q40",
5001 .bustype = BUS_SPI,
5002 .manufacture_id = EON_ID_NOPREFIX,
5003 .model_id = EON_EN25Q40,
5004 .total_size = 512,
5005 .page_size = 256,
5006 /* OTP: 256B total; enter 0x3A */
5007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5008 .tested = TEST_UNTESTED,
5009 .probe = probe_spi_rdid,
5010 .probe_timing = TIMING_ZERO,
5011 .block_erasers =
5012 {
5013 {
5014 .eraseblocks = { {4 * 1024, 128} },
5015 .block_erase = spi_block_erase_20,
5016 }, {
5017 .eraseblocks = { {64 * 1024, 8} },
5018 .block_erase = spi_block_erase_d8,
5019 }, {
5020 .eraseblocks = { {512 * 1024, 1} },
5021 .block_erase = spi_block_erase_60,
5022 }, {
5023 .eraseblocks = { {512 * 1024, 1} },
5024 .block_erase = spi_block_erase_c7,
5025 }
5026 },
5027 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5028 .unlock = spi_disable_blockprotect,
5029 .write = spi_chip_write_256,
5030 .read = spi_chip_read,
5031 .voltage = {2700, 3600},
5032 },
5033
5034 {
5035 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00005036 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005037 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005038 .manufacture_id = EON_ID_NOPREFIX,
5039 .model_id = EON_EN25Q64,
5040 .total_size = 8192,
5041 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005042 /* OTP: 512B total; enter 0x3A */
5043 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005044 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005045 .probe = probe_spi_rdid,
5046 .probe_timing = TIMING_ZERO,
5047 .block_erasers =
5048 {
5049 {
5050 .eraseblocks = { {4 * 1024, 2048} },
5051 .block_erase = spi_block_erase_20,
5052 }, {
5053 .eraseblocks = { {64 * 1024, 128} },
5054 .block_erase = spi_block_erase_d8,
5055 }, {
5056 .eraseblocks = { {8 * 1024 * 1024, 1} },
5057 .block_erase = spi_block_erase_60,
5058 }, {
5059 .eraseblocks = { {8 * 1024 * 1024, 1} },
5060 .block_erase = spi_block_erase_c7,
5061 }
5062 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005063 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005064 .unlock = spi_disable_blockprotect,
5065 .write = spi_chip_write_256,
5066 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005067 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005068 },
5069
5070 {
5071 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005072 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005073 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005074 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005075 .model_id = EON_EN25Q80,
5076 .total_size = 1024,
5077 .page_size = 256,
5078 /* OTP: 256B total; enter 0x3A */
5079 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5080 .tested = TEST_UNTESTED,
5081 .probe = probe_spi_rdid,
5082 .probe_timing = TIMING_ZERO,
5083 .block_erasers =
5084 {
5085 {
5086 .eraseblocks = { {4 * 1024, 256} },
5087 .block_erase = spi_block_erase_20,
5088 }, {
5089 .eraseblocks = { {64 * 1024, 16} },
5090 .block_erase = spi_block_erase_d8,
5091 }, {
5092 .eraseblocks = { {1024 * 1024, 1} },
5093 .block_erase = spi_block_erase_60,
5094 }, {
5095 .eraseblocks = { {1024 * 1024, 1} },
5096 .block_erase = spi_block_erase_c7,
5097 }
5098 },
5099 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5100 .unlock = spi_disable_blockprotect,
5101 .write = spi_chip_write_256,
5102 .read = spi_chip_read,
5103 .voltage = {2700, 3600},
5104 },
5105
5106 {
5107 .vendor = "Eon",
5108 .name = "EN25QH128",
5109 .bustype = BUS_SPI,
5110 .manufacture_id = EON_ID_NOPREFIX,
5111 .model_id = EON_EN25QH128,
David Hendricks6d715302011-07-24 22:21:57 +00005112 .total_size = 16384,
5113 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005114 /* supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00005115 /* OTP: 512B total; enter 0x3A */
Alan Green1f9cc7d2019-07-01 11:10:45 +10005116 /* QPI enable 0x38, disable 0xFF */
5117 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Tim Chenbfe149a2020-07-06 14:59:21 +08005118 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005119 .probe = probe_spi_rdid,
5120 .probe_timing = TIMING_ZERO,
5121 .block_erasers =
5122 {
5123 {
5124 .eraseblocks = { {4 * 1024, 4096} },
5125 .block_erase = spi_block_erase_20,
5126 }, {
5127 .eraseblocks = { {64 * 1024, 256} },
5128 .block_erase = spi_block_erase_d8,
5129 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005130 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005131 .block_erase = spi_block_erase_60,
5132 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005133 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005134 .block_erase = spi_block_erase_c7,
5135 }
5136 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005137 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5138 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005139 .write = spi_chip_write_256,
5140 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005141 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005142 .reg_bits =
5143 {
5144 .srp = {STATUS1, 7, RW},
5145 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5146 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5147 },
5148 .decode_range = decode_range_spi25,
David Hendricks6d715302011-07-24 22:21:57 +00005149 },
5150
5151 {
5152 .vendor = "Eon",
5153 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005154 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005155 .manufacture_id = EON_ID_NOPREFIX,
5156 .model_id = EON_EN25QH16,
5157 .total_size = 2048,
5158 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005159 /* supports SFDP */
5160 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005161 /* QPI enable 0x38, disable 0xFF */
5162 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00005163 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005164 .probe = probe_spi_rdid,
5165 .probe_timing = TIMING_ZERO,
5166 .block_erasers =
5167 {
5168 {
5169 .eraseblocks = { {4 * 1024, 512} },
5170 .block_erase = spi_block_erase_20,
5171 }, {
5172 .eraseblocks = { {64 * 1024, 32} },
5173 .block_erase = spi_block_erase_d8,
5174 }, {
5175 .eraseblocks = { {1024 * 2048, 1} },
5176 .block_erase = spi_block_erase_60,
5177 }, {
5178 .eraseblocks = { {1024 * 2048, 1} },
5179 .block_erase = spi_block_erase_c7,
5180 }
5181 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005182 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005183 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005184 .write = spi_chip_write_256,
5185 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005186 .voltage = {2700, 3600},
5187 },
5188
5189 {
5190 .vendor = "Eon",
5191 .name = "EN25QH32",
5192 .bustype = BUS_SPI,
5193 .manufacture_id = EON_ID_NOPREFIX,
5194 .model_id = EON_EN25QH32,
5195 .total_size = 4096,
5196 .page_size = 256,
5197 /* supports SFDP */
5198 /* OTP: 512B total; enter 0x3A */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005199 /* QPI enable 0x38, disable 0xFF */
5200 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005201 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005202 .probe = probe_spi_rdid,
5203 .probe_timing = TIMING_ZERO,
5204 .block_erasers =
5205 {
5206 {
5207 .eraseblocks = { {4 * 1024, 1024} },
5208 .block_erase = spi_block_erase_20,
5209 }, {
5210 .eraseblocks = { {64 * 1024, 64} },
5211 .block_erase = spi_block_erase_d8,
5212 }, {
5213 .eraseblocks = { {1024 * 4096, 1} },
5214 .block_erase = spi_block_erase_60,
5215 }, {
5216 .eraseblocks = { {1024 * 4096, 1} },
5217 .block_erase = spi_block_erase_c7,
5218 }
5219 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005220 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005221 .unlock = spi_disable_blockprotect_bp3_srwd,
5222 .write = spi_chip_write_256,
5223 .read = spi_chip_read,
5224 .voltage = {2700, 3600},
5225 },
5226
5227 {
5228 .vendor = "Eon",
5229 .name = "EN25QH64",
5230 .bustype = BUS_SPI,
5231 .manufacture_id = EON_ID_NOPREFIX,
5232 .model_id = EON_EN25QH64,
5233 .total_size = 8192,
5234 .page_size = 256,
5235 /* supports SFDP */
5236 /* OTP: 512B total; enter 0x3A */
5237 /* QPI enable 0x38, disable 0xFF */
5238 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner23e10b82016-01-23 16:16:49 +00005239 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005240 .probe = probe_spi_rdid,
5241 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005242 .block_erasers =
5243 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005244 {
5245 .eraseblocks = { {4 * 1024, 2048} },
5246 .block_erase = spi_block_erase_20,
5247 }, {
5248 .eraseblocks = { {64 * 1024, 128} },
5249 .block_erase = spi_block_erase_d8,
5250 }, {
5251 .eraseblocks = { { 8192 * 1024, 1} },
5252 .block_erase = spi_block_erase_60,
5253 }, {
5254 .eraseblocks = { { 8192 * 1024, 1} },
5255 .block_erase = spi_block_erase_c7,
5256 }
5257 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005258 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005259 .unlock = spi_disable_blockprotect_bp3_srwd,
5260 .write = spi_chip_write_256,
5261 .read = spi_chip_read,
5262 .voltage = {2700, 3600},
5263 },
5264
5265 {
5266 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005267 .name = "EN25S10",
5268 .bustype = BUS_SPI,
5269 .manufacture_id = EON_ID_NOPREFIX,
5270 .model_id = EON_EN25S10,
5271 .total_size = 128,
5272 .page_size = 256,
5273 /* OTP: 256B total; enter 0x3A */
5274 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5275 .tested = TEST_UNTESTED,
5276 .probe = probe_spi_rdid,
5277 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005278 .block_erasers =
5279 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005280 {
5281 .eraseblocks = { {4 * 1024, 32} },
5282 .block_erase = spi_block_erase_20,
5283 }, {
5284 .eraseblocks = { {32 * 1024, 4} },
5285 .block_erase = spi_block_erase_52,
5286 }, {
5287 .eraseblocks = { {128 * 1024, 1} },
5288 .block_erase = spi_block_erase_60,
5289 }, {
5290 .eraseblocks = { {128 * 1024, 1} },
5291 .block_erase = spi_block_erase_c7,
5292 }
5293 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005294 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005295 .unlock = spi_disable_blockprotect,
5296 .write = spi_chip_write_256,
5297 .read = spi_chip_read,
5298 .voltage = {1650, 1950},
5299 },
5300
5301 {
5302 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005303 .name = "EN25S16",
5304 .bustype = BUS_SPI,
5305 .manufacture_id = EON_ID_NOPREFIX,
5306 .model_id = EON_EN25S16,
5307 .total_size = 2048,
5308 .page_size = 256,
5309 /* OTP: 512B total; enter 0x3A */
5310 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5311 .tested = TEST_UNTESTED,
5312 .probe = probe_spi_rdid,
5313 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005314 .block_erasers =
5315 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005316 {
5317 .eraseblocks = { {4 * 1024, 512} },
5318 .block_erase = spi_block_erase_20,
5319 }, {
5320 .eraseblocks = { {64 * 1024, 32} },
5321 .block_erase = spi_block_erase_52,
5322 }, {
5323 .eraseblocks = { {32 * 1024, 64} },
5324 .block_erase = spi_block_erase_d8,
5325 }, {
5326 .eraseblocks = { {2048 * 1024, 1} },
5327 .block_erase = spi_block_erase_60,
5328 }, {
5329 .eraseblocks = { {2048 * 1024, 1} },
5330 .block_erase = spi_block_erase_c7,
5331 }
5332 },
5333 .printlock = spi_prettyprint_status_register_en25s_wp,
5334 .unlock = spi_disable_blockprotect_bp3_srwd,
5335 .write = spi_chip_write_256,
5336 .read = spi_chip_read,
5337 .voltage = {1650, 1950},
5338 },
5339
5340 {
5341 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005342 .name = "EN25S20",
5343 .bustype = BUS_SPI,
5344 .manufacture_id = EON_ID_NOPREFIX,
5345 .model_id = EON_EN25S20,
5346 .total_size = 256,
5347 .page_size = 256,
5348 /* OTP: 256B total; enter 0x3A */
5349 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5350 .tested = TEST_UNTESTED,
5351 .probe = probe_spi_rdid,
5352 .probe_timing = TIMING_ZERO,
5353 .block_erasers =
5354 {
5355 {
5356 .eraseblocks = { {4 * 1024, 64} },
5357 .block_erase = spi_block_erase_20,
5358 }, {
5359 .eraseblocks = { {64 * 1024, 4} },
5360 .block_erase = spi_block_erase_d8,
5361 }, {
5362 .eraseblocks = { {256 * 1024, 1} },
5363 .block_erase = spi_block_erase_60,
5364 }, {
5365 .eraseblocks = { {256 * 1024, 1} },
5366 .block_erase = spi_block_erase_c7,
5367 }
5368 },
5369 .printlock = spi_prettyprint_status_register_bp2_srwd,
5370 .unlock = spi_disable_blockprotect,
5371 .write = spi_chip_write_256,
5372 .read = spi_chip_read,
5373 .voltage = {1650, 1950},
5374 },
5375
5376 {
5377 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005378 .name = "EN25S32",
5379 .bustype = BUS_SPI,
5380 .manufacture_id = EON_ID_NOPREFIX,
5381 .model_id = EON_EN25S32,
5382 .total_size = 4096,
5383 .page_size = 256,
5384 /* OTP: 512B total; enter 0x3A */
5385 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5386 .tested = TEST_UNTESTED,
5387 .probe = probe_spi_rdid,
5388 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005389 .block_erasers =
5390 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005391 {
5392 .eraseblocks = { {4 * 1024, 1024} },
5393 .block_erase = spi_block_erase_20,
5394 }, {
5395 .eraseblocks = { {32 * 1024, 128} },
5396 .block_erase = spi_block_erase_52,
5397 }, {
5398 .eraseblocks = { {64 * 1024, 64} },
5399 .block_erase = spi_block_erase_d8,
5400 }, {
5401 .eraseblocks = { {4096 * 1024, 1} },
5402 .block_erase = spi_block_erase_60,
5403 }, {
5404 .eraseblocks = { {4096 * 1024, 1} },
5405 .block_erase = spi_block_erase_c7,
5406 }
5407 },
5408 .printlock = spi_prettyprint_status_register_en25s_wp,
5409 .unlock = spi_disable_blockprotect_bp3_srwd,
5410 .write = spi_chip_write_256,
5411 .read = spi_chip_read,
5412 .voltage = {1650, 1950},
5413 },
5414
5415 {
5416 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005417 .name = "EN25S40",
5418 .bustype = BUS_SPI,
5419 .manufacture_id = EON_ID_NOPREFIX,
5420 .model_id = EON_EN25S40,
5421 .total_size = 512,
5422 .page_size = 256,
5423 /* OTP: 256B total; enter 0x3A */
5424 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5425 .tested = TEST_OK_PREW,
5426 .probe = probe_spi_rdid,
5427 .probe_timing = TIMING_ZERO,
5428 .block_erasers =
5429 {
5430 {
5431 .eraseblocks = { {4 * 1024, 128} },
5432 .block_erase = spi_block_erase_20,
5433 }, {
5434 .eraseblocks = { {64 * 1024, 8} },
5435 .block_erase = spi_block_erase_d8,
5436 }, {
5437 .eraseblocks = { {512 * 1024, 1} },
5438 .block_erase = spi_block_erase_60,
5439 }, {
5440 .eraseblocks = { {512 * 1024, 1} },
5441 .block_erase = spi_block_erase_c7,
5442 }
5443 },
5444 .printlock = spi_prettyprint_status_register_bp2_srwd,
5445 .unlock = spi_disable_blockprotect,
5446 .write = spi_chip_write_256,
5447 .read = spi_chip_read,
5448 .voltage = {1650, 1950},
5449 },
5450
5451 {
5452 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005453 .name = "EN25S64",
5454 .bustype = BUS_SPI,
5455 .manufacture_id = EON_ID_NOPREFIX,
5456 .model_id = EON_EN25S64,
5457 .total_size = 8192,
5458 .page_size = 256,
5459 /* OTP: 512B total; enter 0x3A */
5460 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Nikolai Artemievdf889fa2021-03-23 17:10:45 +11005461 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005462 .probe = probe_spi_rdid,
5463 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005464 .block_erasers =
5465 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005466 {
5467 .eraseblocks = { {4 * 1024, 2048} },
5468 .block_erase = spi_block_erase_20,
5469 }, {
5470 .eraseblocks = { {64 * 1024, 128} },
5471 .block_erase = spi_block_erase_d8,
5472 }, {
5473 .eraseblocks = { {8192 * 1024, 1} },
5474 .block_erase = spi_block_erase_60,
5475 }, {
5476 .eraseblocks = { {8192 * 1024, 1} },
5477 .block_erase = spi_block_erase_c7,
5478 }
5479 },
5480 .printlock = spi_prettyprint_status_register_en25s_wp,
5481 .unlock = spi_disable_blockprotect_bp3_srwd,
5482 .write = spi_chip_write_256,
5483 .read = spi_chip_read,
5484 .voltage = {1650, 1950},
5485 },
5486
5487 {
5488 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005489 .name = "EN25S80",
5490 .bustype = BUS_SPI,
5491 .manufacture_id = EON_ID_NOPREFIX,
5492 .model_id = EON_EN25S80,
5493 .total_size = 1024,
5494 .page_size = 256,
5495 /* OTP: 256B total; enter 0x3A */
5496 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5497 .tested = TEST_UNTESTED,
5498 .probe = probe_spi_rdid,
5499 .probe_timing = TIMING_ZERO,
Russ Dill3cd5a122010-03-05 08:44:11 +00005500 .block_erasers =
5501 {
5502 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005503 .eraseblocks = { {4 * 1024, 256} },
5504 .block_erase = spi_block_erase_20,
5505 }, {
5506 .eraseblocks = { {64 * 1024, 16} },
5507 .block_erase = spi_block_erase_d8,
5508 }, {
5509 .eraseblocks = { {1024 * 1024, 1} },
5510 .block_erase = spi_block_erase_60,
5511 }, {
5512 .eraseblocks = { {1024 * 1024, 1} },
5513 .block_erase = spi_block_erase_c7,
5514 }
Russ Dill3cd5a122010-03-05 08:44:11 +00005515 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005516 .printlock = spi_prettyprint_status_register_bp2_srwd,
5517 .unlock = spi_disable_blockprotect,
5518 .write = spi_chip_write_256,
5519 .read = spi_chip_read,
5520 .voltage = {1650, 1950},
Russ Dill3cd5a122010-03-05 08:44:11 +00005521 },
5522
5523 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005524 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005525 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005526 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005527 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005528 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005529 .total_size = 256,
5530 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005531 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Green4362e622019-08-26 15:02:12 +10005532 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005533 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005534 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005535 .block_erasers =
5536 {
5537 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005538 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005539 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005540 {8 * 1024, 2},
5541 {32 * 1024, 1},
5542 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005543 },
5544 .block_erase = erase_sector_jedec,
5545 }, {
5546 .eraseblocks = { {256 * 1024, 1} },
5547 .block_erase = erase_chip_block_jedec,
5548 },
5549 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005550 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005551 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005552 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005553 },
5554
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005555 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005556 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005557 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005558 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005559 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005560 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005561 .total_size = 256,
5562 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005563 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005564 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005565 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005566 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005567 .block_erasers =
5568 {
5569 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005570 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005571 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005572 {32 * 1024, 1},
5573 {8 * 1024, 2},
5574 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005575 },
5576 .block_erase = erase_sector_jedec,
5577 }, {
5578 .eraseblocks = { {256 * 1024, 1} },
5579 .block_erase = erase_chip_block_jedec,
5580 },
5581 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005582 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005583 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005584 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00005585 },
5586
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005587 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005588 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005589 .name = "EN29F010",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005590 .bustype = BUS_PARALLEL,
5591 .manufacture_id = EON_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005592 .model_id = EON_EN29F010,
5593 .total_size = 128,
5594 .page_size = 128,
5595 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5596 .tested = TEST_OK_PRE,
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005597 .probe = probe_jedec,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005598 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005599 .block_erasers =
5600 {
5601 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005602 .eraseblocks = { {16 * 1024, 8} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005603 .block_erase = erase_sector_jedec,
5604 },
5605 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005606 .eraseblocks = { {128 * 1024, 1} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005607 .block_erase = erase_chip_block_jedec,
5608 },
5609 },
5610 .write = write_jedec_1,
5611 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005612 .voltage = {4500, 5500},
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005613 },
5614
5615 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005616 .vendor = "Eon",
5617 .name = "EN29GL064(A)B",
5618 .bustype = BUS_PARALLEL,
5619 .manufacture_id = EON_ID,
5620 .model_id = EON_EN29GL064B,
5621 .total_size = 8192,
5622 .page_size = 128 * 1024, /* actual page size is 16 */
5623 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5624 .tested = TEST_UNTESTED,
5625 .probe = probe_jedec_29gl,
5626 .probe_timing = TIMING_ZERO,
5627 .block_erasers =
5628 {
5629 {
5630 .eraseblocks = {
5631 {8 * 1024, 8},
5632 {64 * 1024, 127},
5633 },
5634 .block_erase = erase_sector_jedec,
5635 }, {
5636 .eraseblocks = { {8 * 1024 * 1024, 1} },
5637 .block_erase = erase_chip_block_jedec,
5638 },
5639 },
5640 .write = write_jedec_1,
5641 .read = read_memmapped,
5642 .voltage = {2700, 3600},
5643 },
5644
5645 {
5646 .vendor = "Eon",
5647 .name = "EN29GL064(A)T",
5648 .bustype = BUS_PARALLEL,
5649 .manufacture_id = EON_ID,
5650 .model_id = EON_EN29GL064T,
5651 .total_size = 8192,
5652 .page_size = 128 * 1024, /* actual page size is 16 */
5653 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5654 .tested = TEST_UNTESTED,
5655 .probe = probe_jedec_29gl,
5656 .probe_timing = TIMING_ZERO,
5657 .block_erasers =
5658 {
5659 {
5660 .eraseblocks = {
5661 {64 * 1024, 127},
5662 {8 * 1024, 8},
5663 },
5664 .block_erase = erase_sector_jedec,
5665 }, {
5666 .eraseblocks = { {8 * 1024 * 1024, 1} },
5667 .block_erase = erase_chip_block_jedec,
5668 },
5669 },
5670 .write = write_jedec_1,
5671 .read = read_memmapped,
5672 .voltage = {2700, 3600},
5673 },
5674
5675 {
5676 .vendor = "Eon",
5677 .name = "EN29GL064H/L",
5678 .bustype = BUS_PARALLEL,
5679 .manufacture_id = EON_ID,
5680 .model_id = EON_EN29GL064HL,
5681 .total_size = 8192,
5682 .page_size = 128 * 1024, /* actual page size is 16 */
5683 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5684 .tested = TEST_UNTESTED,
5685 .probe = probe_jedec_29gl,
5686 .probe_timing = TIMING_ZERO,
5687 .block_erasers =
5688 {
5689 {
5690 .eraseblocks = { {64 * 1024, 128} },
5691 .block_erase = erase_sector_jedec,
5692 }, {
5693 .eraseblocks = { {8 * 1024 * 1024, 1} },
5694 .block_erase = erase_chip_block_jedec,
5695 },
5696 },
5697 .write = write_jedec_1,
5698 .read = read_memmapped,
5699 .voltage = {2700, 3600},
5700 },
5701
5702 {
5703 .vendor = "Eon",
5704 .name = "EN29GL128",
5705 .bustype = BUS_PARALLEL,
5706 .manufacture_id = EON_ID,
5707 .model_id = EON_EN29GL128HL,
5708 .total_size = 16384,
5709 .page_size = 128 * 1024, /* actual page size is 16 */
5710 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5711 .tested = TEST_UNTESTED,
5712 .probe = probe_jedec_29gl,
5713 .probe_timing = TIMING_ZERO,
5714 .block_erasers =
5715 {
5716 {
5717 .eraseblocks = { {128 * 1024, 128} },
5718 .block_erase = erase_sector_jedec,
5719 }, {
5720 .eraseblocks = { {16 * 1024 * 1024, 1} },
5721 .block_erase = erase_chip_block_jedec,
5722 },
5723 },
5724 .write = write_jedec_1,
5725 .read = read_memmapped,
5726 .voltage = {2700, 3600},
5727 },
5728
5729 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005730 .vendor = "Eon",
5731 .name = "EN29LV040(A)",
5732 .bustype = BUS_PARALLEL,
5733 .manufacture_id = EON_ID,
5734 .model_id = EON_EN29LV040,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005735 .total_size = 512,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005736 .page_size = 4 * 1024,
5737 .tested = TEST_OK_PREW,
5738 .probe = probe_jedec,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005739 .probe_timing = TIMING_ZERO,
5740 .block_erasers =
5741 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005742 {
5743 .eraseblocks = { {64 * 1024, 8} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005744 .block_erase = erase_sector_jedec,
5745 },
5746 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005747 .eraseblocks = { {512 * 1024, 1} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005748 .block_erase = erase_chip_block_jedec,
5749 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005750 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005751 .write = write_jedec_1,
5752 .read = read_memmapped,
5753 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005754 },
5755
5756 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005757 .vendor = "Eon",
5758 .name = "EN29LV640B",
5759 .bustype = BUS_PARALLEL,
5760 .manufacture_id = EON_ID,
5761 .model_id = EON_EN29LV640B,
5762 .total_size = 8192,
5763 .page_size = 8192,
5764 .feature_bits = FEATURE_ADDR_SHIFTED,
5765 .tested = TEST_OK_PREW,
5766 .probe = probe_en29lv640b,
5767 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005768 .block_erasers =
5769 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005770 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005771 .eraseblocks = {
5772 {8 * 1024, 8},
5773 {64 * 1024, 127},
5774 },
5775 .block_erase = erase_block_jedec,
Stefan Tauner0be072c2016-03-13 15:16:30 +00005776 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005777 .eraseblocks = { {8 * 1024 * 1024, 1} },
5778 .block_erase = erase_chip_block_jedec,
5779 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005780 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005781 .write = write_en29lv640b,
5782 .read = read_memmapped,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005783 .voltage = {2700, 3600},
5784 },
5785
5786 {
Jakob Petersson0cf3e122019-02-18 01:55:43 +01005787 .vendor = "Fudan",
5788 .name = "FM25F005",
5789 .bustype = BUS_SPI,
5790 .manufacture_id = FUDAN_ID_NOPREFIX,
5791 .model_id = FUDAN_FM25F005,
5792 .total_size = 64,
5793 .page_size = 256,
5794 /* OTP: 256B total; enter 0x3A */
5795 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5796 .tested = TEST_UNTESTED,
5797 .probe = probe_spi_rdid,
5798 .probe_timing = TIMING_ZERO,
5799 .block_erasers = {
5800 {
5801 .eraseblocks = { {4 * 1024, 16} },
5802 .block_erase = spi_block_erase_20,
5803 }, {
5804 .eraseblocks = { {32 * 1024, 2} },
5805 .block_erase = spi_block_erase_52,
5806 }, {
5807 .eraseblocks = { {64 * 1024, 1} },
5808 .block_erase = spi_block_erase_d8,
5809 }, {
5810 .eraseblocks = { {64 * 1024, 1} },
5811 .block_erase = spi_block_erase_60,
5812 }, {
5813 .eraseblocks = { {64 * 1024, 1} },
5814 .block_erase = spi_block_erase_c7,
5815 }
5816 },
5817 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5818 .unlock = spi_disable_blockprotect_bp2_srwd,
5819 .write = spi_chip_write_256,
5820 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5821 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5822 },
5823
5824 {
5825 .vendor = "Fudan",
5826 .name = "FM25F01",
5827 .bustype = BUS_SPI,
5828 .manufacture_id = FUDAN_ID_NOPREFIX,
5829 .model_id = FUDAN_FM25F01,
5830 .total_size = 128,
5831 .page_size = 256,
5832 /* OTP: 256B total; enter 0x3A */
5833 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5834 .tested = TEST_UNTESTED,
5835 .probe = probe_spi_rdid,
5836 .probe_timing = TIMING_ZERO,
5837 .block_erasers = {
5838 {
5839 .eraseblocks = { {4 * 1024, 32} },
5840 .block_erase = spi_block_erase_20,
5841 }, {
5842 .eraseblocks = { {32 * 1024, 4} },
5843 .block_erase = spi_block_erase_52,
5844 }, {
5845 .eraseblocks = { {64 * 1024, 2} },
5846 .block_erase = spi_block_erase_d8,
5847 }, {
5848 .eraseblocks = { {128 * 1024, 1} },
5849 .block_erase = spi_block_erase_60,
5850 }, {
5851 .eraseblocks = { {128 * 1024, 1} },
5852 .block_erase = spi_block_erase_c7,
5853 }
5854 },
5855 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5856 .unlock = spi_disable_blockprotect_bp2_srwd,
5857 .write = spi_chip_write_256,
5858 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5859 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5860 },
5861
5862 {
5863 .vendor = "Fudan",
5864 .name = "FM25F02(A)",
5865 .bustype = BUS_SPI,
5866 .manufacture_id = FUDAN_ID_NOPREFIX,
5867 .model_id = FUDAN_FM25F02,
5868 .total_size = 256,
5869 .page_size = 256,
5870 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
5871 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5872 .tested = TEST_UNTESTED,
5873 .probe = probe_spi_rdid,
5874 .probe_timing = TIMING_ZERO,
5875 .block_erasers = {
5876 {
5877 .eraseblocks = { {4 * 1024, 64} },
5878 .block_erase = spi_block_erase_20,
5879 }, {
5880 .eraseblocks = { {32 * 1024, 8} },
5881 .block_erase = spi_block_erase_52,
5882 }, {
5883 .eraseblocks = { {64 * 1024, 4} },
5884 .block_erase = spi_block_erase_d8,
5885 }, {
5886 .eraseblocks = { {1024 * 256, 1} },
5887 .block_erase = spi_block_erase_60,
5888 }, {
5889 .eraseblocks = { {1024 * 256, 1} },
5890 .block_erase = spi_block_erase_c7,
5891 },
5892 },
5893 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5894 .unlock = spi_disable_blockprotect_bp2_srwd,
5895 .write = spi_chip_write_256,
5896 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5897 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5898 },
5899
5900 {
5901 .vendor = "Fudan",
5902 .name = "FM25F04(A)",
5903 .bustype = BUS_SPI,
5904 .manufacture_id = FUDAN_ID_NOPREFIX,
5905 .model_id = FUDAN_FM25F04,
5906 .total_size = 512,
5907 .page_size = 256,
5908 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
5909 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5910 .tested = TEST_UNTESTED,
5911 .probe = probe_spi_rdid,
5912 .probe_timing = TIMING_ZERO,
5913 .block_erasers = {
5914 {
5915 .eraseblocks = { {4 * 1024, 128} },
5916 .block_erase = spi_block_erase_20,
5917 }, {
5918 .eraseblocks = { {32 * 1024, 16} },
5919 .block_erase = spi_block_erase_52,
5920 }, {
5921 .eraseblocks = { {64 * 1024, 8} },
5922 .block_erase = spi_block_erase_d8,
5923 }, {
5924 .eraseblocks = { {1024 * 512, 1} },
5925 .block_erase = spi_block_erase_60,
5926 }, {
5927 .eraseblocks = { {1024 * 512, 1} },
5928 .block_erase = spi_block_erase_c7,
5929 },
5930 },
5931 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5932 .unlock = spi_disable_blockprotect_bp2_srwd,
5933 .write = spi_chip_write_256,
5934 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5935 .voltage = {2700, 3600},
5936 },
5937
5938 {
5939 .vendor = "Fudan",
5940 .name = "FM25Q08",
5941 .bustype = BUS_SPI,
5942 .manufacture_id = FUDAN_ID_NOPREFIX,
5943 .model_id = FUDAN_FM25Q08,
5944 .total_size = 1024,
5945 .page_size = 256,
5946 /* supports SFDP */
5947 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
5948 /* QPI enable 0x38, disable 0xFF */
5949 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5950 .tested = TEST_UNTESTED,
5951 .probe = probe_spi_rdid,
5952 .probe_timing = TIMING_ZERO,
5953 .block_erasers = {
5954 {
5955 .eraseblocks = { {4 * 1024, 256} },
5956 .block_erase = spi_block_erase_20,
5957 }, {
5958 .eraseblocks = { {32 * 1024, 32} },
5959 .block_erase = spi_block_erase_52,
5960 }, {
5961 .eraseblocks = { {64 * 1024, 16} },
5962 .block_erase = spi_block_erase_d8,
5963 }, {
5964 .eraseblocks = { {1024 * 1024, 1} },
5965 .block_erase = spi_block_erase_60,
5966 }, {
5967 .eraseblocks = { {1024 * 1024, 1} },
5968 .block_erase = spi_block_erase_c7,
5969 },
5970 },
5971 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
5972 .unlock = spi_disable_blockprotect_bp2_srwd,
5973 .write = spi_chip_write_256,
5974 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5975 .voltage = {2700, 3600},
5976 },
5977
5978 {
5979 .vendor = "Fudan",
5980 .name = "FM25Q16",
5981 .bustype = BUS_SPI,
5982 .manufacture_id = FUDAN_ID_NOPREFIX,
5983 .model_id = FUDAN_FM25Q16,
5984 .total_size = 2048,
5985 .page_size = 256,
5986 /* supports SFDP */
5987 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
5988 /* QPI enable 0x38, disable 0xFF */
5989 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5990 .tested = TEST_UNTESTED,
5991 .probe = probe_spi_rdid,
5992 .probe_timing = TIMING_ZERO,
5993 .block_erasers = {
5994 {
5995 .eraseblocks = { {4 * 1024, 512} },
5996 .block_erase = spi_block_erase_20,
5997 }, {
5998 .eraseblocks = { {32 * 1024, 64} },
5999 .block_erase = spi_block_erase_52,
6000 }, {
6001 .eraseblocks = { {64 * 1024, 32} },
6002 .block_erase = spi_block_erase_d8,
6003 }, {
6004 .eraseblocks = { {2 * 1024 * 1024, 1} },
6005 .block_erase = spi_block_erase_60,
6006 }, {
6007 .eraseblocks = { {2 * 1024 * 1024, 1} },
6008 .block_erase = spi_block_erase_c7,
6009 }
6010 },
6011 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6012 .unlock = spi_disable_blockprotect_bp2_srwd,
6013 .write = spi_chip_write_256,
6014 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6015 .voltage = {2700, 3600},
6016 },
6017
6018 {
6019 .vendor = "Fudan",
6020 .name = "FM25Q32",
6021 .bustype = BUS_SPI,
6022 .manufacture_id = FUDAN_ID_NOPREFIX,
6023 .model_id = FUDAN_FM25Q32,
6024 .total_size = 4096,
6025 .page_size = 256,
6026 /* supports SFDP */
6027 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6028 /* QPI enable 0x38, disable 0xFF */
6029 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6030 .tested = TEST_UNTESTED,
6031 .probe = probe_spi_rdid,
6032 .probe_timing = TIMING_ZERO,
6033 .block_erasers = {
6034 {
6035 .eraseblocks = { {4 * 1024, 1024} },
6036 .block_erase = spi_block_erase_20,
6037 }, {
6038 .eraseblocks = { {32 * 1024, 128} },
6039 .block_erase = spi_block_erase_52,
6040 }, {
6041 .eraseblocks = { {64 * 1024, 64} },
6042 .block_erase = spi_block_erase_d8,
6043 }, {
6044 .eraseblocks = { {4 * 1024 * 1024, 1} },
6045 .block_erase = spi_block_erase_60,
6046 }, {
6047 .eraseblocks = { {4 * 1024 * 1024, 1} },
6048 .block_erase = spi_block_erase_c7,
6049 },
6050 },
6051 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6052 .unlock = spi_disable_blockprotect_bp2_srwd,
6053 .write = spi_chip_write_256,
6054 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6055 .voltage = {2700, 3600},
6056 },
6057
6058 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006059 .vendor = "Fujitsu",
6060 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006061 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006062 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006063 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006064 .total_size = 512,
6065 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006066 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006067 .tested = TEST_UNTESTED,
6068 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006069 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006070 .block_erasers =
6071 {
6072 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006073 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006074 {16 * 1024, 1},
6075 {8 * 1024, 2},
6076 {32 * 1024, 1},
6077 {64 * 1024, 7},
6078 },
Sean Nelson35727f72010-01-28 23:55:12 +00006079 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006080 }, {
6081 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006082 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006083 },
6084 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006085 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006086 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006087 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006088 },
6089
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006090 {
6091 .vendor = "Fujitsu",
6092 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006093 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006094 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006095 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006096 .total_size = 512,
6097 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006098 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006099 .tested = TEST_UNTESTED,
6100 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006101 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006102 .block_erasers =
6103 {
6104 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006105 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006106 {64 * 1024, 7},
6107 {32 * 1024, 1},
6108 {8 * 1024, 2},
6109 {16 * 1024, 1},
6110 },
Sean Nelson35727f72010-01-28 23:55:12 +00006111 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006112 }, {
6113 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006114 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006115 },
6116 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006117 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006118 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006119 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00006120 },
6121
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006122 {
Sean Nelson35727f72010-01-28 23:55:12 +00006123 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006124 .vendor = "Fujitsu",
6125 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006126 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006127 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006128 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006129 .total_size = 512,
6130 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006131 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00006132 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006133 .probe = probe_jedec,
6134 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006135 .block_erasers =
6136 {
6137 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006138 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006139 {16 * 1024, 1},
6140 {8 * 1024, 2},
6141 {32 * 1024, 1},
6142 {64 * 1024, 7},
6143 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006144 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006145 }, {
6146 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006147 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006148 },
6149 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006150 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006151 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006152 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00006153 },
6154
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006155 {
6156 .vendor = "Fujitsu",
6157 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006158 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006159 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006160 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006161 .total_size = 512,
6162 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006163 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006164 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006165 .probe = probe_jedec,
6166 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006167 .block_erasers =
6168 {
6169 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006170 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006171 {64 * 1024, 7},
6172 {32 * 1024, 1},
6173 {8 * 1024, 2},
6174 {16 * 1024, 1},
6175 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006176 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006177 }, {
6178 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006179 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006180 },
6181 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006182 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006183 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006184 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +00006185 },
6186
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006187 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006188 .vendor = "Fujitsu",
6189 .name = "MBM29LV160BE",
6190 .bustype = BUS_PARALLEL,
6191 .manufacture_id = FUJITSU_ID,
6192 .model_id = FUJITSU_MBM29LV160BE,
6193 .total_size = 2 * 1024,
6194 .page_size = 0,
6195 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6196 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006197 .probe = probe_jedec,
6198 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006199 .block_erasers =
6200 {
6201 {
6202 .eraseblocks = {
6203 {16 * 1024, 1},
6204 {8 * 1024, 2},
6205 {32 * 1024, 1},
6206 {64 * 1024, 31},
6207 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006208 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006209 }, {
6210 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006211 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006212 },
6213 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006214 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006215 .read = read_memmapped,
6216 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
6217 },
6218
6219 {
6220 .vendor = "Fujitsu",
6221 .name = "MBM29LV160TE",
6222 .bustype = BUS_PARALLEL,
6223 .manufacture_id = FUJITSU_ID,
6224 .model_id = FUJITSU_MBM29LV160TE,
6225 .total_size = 2 * 1024,
6226 .page_size = 0,
6227 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6228 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006229 .probe = probe_jedec,
6230 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006231 .block_erasers =
6232 {
6233 {
6234 .eraseblocks = {
6235 {64 * 1024, 31},
6236 {32 * 1024, 1},
6237 {8 * 1024, 2},
6238 {16 * 1024, 1},
6239 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006240 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006241 }, {
6242 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006243 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006244 },
6245 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006246 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006247 .read = read_memmapped,
6248 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
6249 },
6250
6251 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006252 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006253 .name = "GD25B128B/GD25Q128B",
Roman Titov95edc892015-04-03 21:29:04 +00006254 .bustype = BUS_SPI,
6255 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006256 .model_id = GIGADEVICE_GD25Q128,
6257 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006258 .page_size = 256,
6259 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6260 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006261 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006262 .probe = probe_spi_rdid,
6263 .probe_timing = TIMING_ZERO,
6264 .block_erasers =
6265 {
6266 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006267 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006268 .block_erase = spi_block_erase_20,
6269 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006270 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006271 .block_erase = spi_block_erase_52,
6272 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006273 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006274 .block_erase = spi_block_erase_d8,
6275 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006276 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006277 .block_erase = spi_block_erase_60,
6278 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006279 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006280 .block_erase = spi_block_erase_c7,
6281 }
6282 },
6283 .printlock = spi_prettyprint_status_register_bp4_srwd,
6284 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6285 .write = spi_chip_write_256,
6286 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green1f9cc7d2019-07-01 11:10:45 +10006287 .voltage = {2700, 3600},
Roman Titov95edc892015-04-03 21:29:04 +00006288 },
6289
6290 {
6291 .vendor = "GigaDevice",
Edward O'Callaghan981a3442021-06-22 11:16:55 +10006292 .name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
Roman Titov95edc892015-04-03 21:29:04 +00006293 .bustype = BUS_SPI,
6294 .manufacture_id = GIGADEVICE_ID,
Alan Green188127e2019-08-06 16:10:34 +10006295 .model_id = GIGADEVICE_GD25LQ128CD,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006296 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006297 .page_size = 256,
6298 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemiev9de3f872021-10-20 22:32:25 +11006299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT,
Alan Green813a7e22021-01-08 08:48:17 +11006300 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006301 .probe = probe_spi_rdid,
6302 .probe_timing = TIMING_ZERO,
6303 .block_erasers =
6304 {
6305 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006306 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006307 .block_erase = spi_block_erase_20,
6308 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006309 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006310 .block_erase = spi_block_erase_52,
6311 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006312 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006313 .block_erase = spi_block_erase_d8,
6314 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006315 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006316 .block_erase = spi_block_erase_60,
6317 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006318 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006319 .block_erase = spi_block_erase_c7,
6320 }
6321 },
6322 .printlock = spi_prettyprint_status_register_bp4_srwd,
6323 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6324 .write = spi_chip_write_256,
6325 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6326 .voltage = {1695, 1950},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006327 .reg_bits =
6328 {
6329 .srp = {STATUS1, 7, RW},
6330 .srl = {STATUS2, 0, RW},
6331 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6332 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6333 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6334 .cmp = {STATUS2, 6, RW},
6335 },
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006336 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006337 },
6338
6339 {
6340 .vendor = "GigaDevice",
6341 .name = "GD25LQ16",
6342 .bustype = BUS_SPI,
6343 .manufacture_id = GIGADEVICE_ID,
6344 .model_id = GIGADEVICE_GD25LQ16,
6345 .total_size = 2048,
6346 .page_size = 256,
6347 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6348 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6349 .tested = TEST_UNTESTED,
6350 .probe = probe_spi_rdid,
6351 .probe_timing = TIMING_ZERO,
6352 .block_erasers =
6353 {
6354 {
6355 .eraseblocks = { {4 * 1024, 512} },
6356 .block_erase = spi_block_erase_20,
6357 }, {
6358 .eraseblocks = { {32 * 1024, 64} },
6359 .block_erase = spi_block_erase_52,
6360 }, {
6361 .eraseblocks = { {64 * 1024, 32} },
6362 .block_erase = spi_block_erase_d8,
6363 }, {
6364 .eraseblocks = { {2 * 1024 * 1024, 1} },
6365 .block_erase = spi_block_erase_60,
6366 }, {
6367 .eraseblocks = { {2 * 1024 * 1024, 1} },
6368 .block_erase = spi_block_erase_c7,
6369 }
6370 },
6371 .printlock = spi_prettyprint_status_register_bp4_srwd,
6372 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6373 .write = spi_chip_write_256,
6374 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6375 .voltage = {1695, 1950},
6376 },
6377
6378 {
6379 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006380 .name = "GD25LQ32",
6381 .bustype = BUS_SPI,
6382 .manufacture_id = GIGADEVICE_ID,
6383 .model_id = GIGADEVICE_GD25LQ32,
6384 .total_size = 4096,
6385 .page_size = 256,
6386 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6387 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6388 .tested = TEST_OK_PREW,
6389 .probe = probe_spi_rdid,
6390 .probe_timing = TIMING_ZERO,
6391 .block_erasers =
6392 {
6393 {
6394 .eraseblocks = { {4 * 1024, 1024} },
6395 .block_erase = spi_block_erase_20,
6396 }, {
6397 .eraseblocks = { {32 * 1024, 128} },
6398 .block_erase = spi_block_erase_52,
6399 }, {
6400 .eraseblocks = { {64 * 1024, 64} },
6401 .block_erase = spi_block_erase_d8,
6402 }, {
6403 .eraseblocks = { {4 * 1024 * 1024, 1} },
6404 .block_erase = spi_block_erase_60,
6405 }, {
6406 .eraseblocks = { {4 * 1024 * 1024, 1} },
6407 .block_erase = spi_block_erase_c7,
6408 }
6409 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006410 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006411 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6412 .write = spi_chip_write_256,
Roman Titov95edc892015-04-03 21:29:04 +00006413 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6414 .voltage = {1695, 1950},
6415 },
6416
6417 {
6418 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006419 .name = "GD25LQ40",
6420 .bustype = BUS_SPI,
6421 .manufacture_id = GIGADEVICE_ID,
6422 .model_id = GIGADEVICE_GD25LQ40,
6423 .total_size = 512,
6424 .page_size = 256,
6425 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6426 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6427 .tested = TEST_UNTESTED,
6428 .probe = probe_spi_rdid,
6429 .probe_timing = TIMING_ZERO,
6430 .block_erasers =
6431 {
6432 {
6433 .eraseblocks = { {4 * 1024, 128} },
6434 .block_erase = spi_block_erase_20,
6435 }, {
6436 .eraseblocks = { {32 * 1024, 16} },
6437 .block_erase = spi_block_erase_52,
6438 }, {
6439 .eraseblocks = { {64 * 1024, 8} },
6440 .block_erase = spi_block_erase_d8,
6441 }, {
6442 .eraseblocks = { {512 * 1024, 1} },
6443 .block_erase = spi_block_erase_60,
6444 }, {
6445 .eraseblocks = { {512 * 1024, 1} },
6446 .block_erase = spi_block_erase_c7,
6447 }
6448 },
6449 .printlock = spi_prettyprint_status_register_bp4_srwd,
6450 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6451 .write = spi_chip_write_256,
6452 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6453 .voltage = {1695, 1950},
6454 },
6455
6456 {
6457 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00006458 .name = "GD25LQ64(B)",
6459 .bustype = BUS_SPI,
6460 .manufacture_id = GIGADEVICE_ID,
6461 .model_id = GIGADEVICE_GD25LQ64,
6462 .total_size = 8192,
6463 .page_size = 256,
6464 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006465 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT,
Stefan Tauner23e10b82016-01-23 16:16:49 +00006466 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006467 .probe = probe_spi_rdid,
6468 .probe_timing = TIMING_ZERO,
6469 .block_erasers =
6470 {
6471 {
6472 .eraseblocks = { {4 * 1024, 2048} },
6473 .block_erase = spi_block_erase_20,
6474 }, {
6475 .eraseblocks = { {32 * 1024, 256} },
6476 .block_erase = spi_block_erase_52,
6477 }, {
6478 .eraseblocks = { {64 * 1024, 128} },
6479 .block_erase = spi_block_erase_d8,
6480 }, {
6481 .eraseblocks = { {8 * 1024 * 1024, 1} },
6482 .block_erase = spi_block_erase_60,
6483 }, {
6484 .eraseblocks = { {8 * 1024 * 1024, 1} },
6485 .block_erase = spi_block_erase_c7,
6486 }
6487 },
6488 .printlock = spi_prettyprint_status_register_bp4_srwd,
6489 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6490 .write = spi_chip_write_256,
6491 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6492 .voltage = {1695, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006493 .reg_bits =
6494 {
6495 .srp = {STATUS1, 7, RW},
6496 .srl = {STATUS2, 0, RW},
6497 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6498 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6499 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6500 .cmp = {STATUS2, 6, RW},
6501 },
6502 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006503 },
6504
6505 {
6506 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006507 .name = "GD25LQ80",
Roman Titov95edc892015-04-03 21:29:04 +00006508 .bustype = BUS_SPI,
6509 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006510 .model_id = GIGADEVICE_GD25LQ80,
6511 .total_size = 1024,
Roman Titov95edc892015-04-03 21:29:04 +00006512 .page_size = 256,
6513 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6514 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6515 .tested = TEST_UNTESTED,
6516 .probe = probe_spi_rdid,
6517 .probe_timing = TIMING_ZERO,
6518 .block_erasers =
6519 {
6520 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006521 .eraseblocks = { {4 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006522 .block_erase = spi_block_erase_20,
6523 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006524 .eraseblocks = { {32 * 1024, 32} },
Roman Titov95edc892015-04-03 21:29:04 +00006525 .block_erase = spi_block_erase_52,
6526 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006527 .eraseblocks = { {64 * 1024, 16} },
Roman Titov95edc892015-04-03 21:29:04 +00006528 .block_erase = spi_block_erase_d8,
6529 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006530 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006531 .block_erase = spi_block_erase_60,
6532 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006533 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006534 .block_erase = spi_block_erase_c7,
6535 }
6536 },
6537 .printlock = spi_prettyprint_status_register_bp4_srwd,
6538 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6539 .write = spi_chip_write_256,
6540 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6541 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006542 },
6543
6544 {
6545 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006546 .name = "GD25Q10",
6547 .bustype = BUS_SPI,
6548 .manufacture_id = GIGADEVICE_ID,
6549 .model_id = GIGADEVICE_GD25Q10,
6550 .total_size = 128,
6551 .page_size = 256,
6552 .feature_bits = FEATURE_WRSR_WREN,
6553 .tested = TEST_UNTESTED,
6554 .probe = probe_spi_rdid,
6555 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006556 .block_erasers =
6557 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006558 {
6559 .eraseblocks = { {4 * 1024, 32} },
6560 .block_erase = spi_block_erase_20,
6561 }, {
6562 .eraseblocks = { {32 * 1024, 4} },
6563 .block_erase = spi_block_erase_52,
6564 }, {
6565 .eraseblocks = { {64 * 1024, 2} },
6566 .block_erase = spi_block_erase_d8,
6567 }, {
6568 .eraseblocks = { {128 * 1024, 1} },
6569 .block_erase = spi_block_erase_60,
6570 }, {
6571 .eraseblocks = { {128 * 1024, 1} },
6572 .block_erase = spi_block_erase_c7,
6573 }
6574 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006575 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006576 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6577 .write = spi_chip_write_256,
6578 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6579 .voltage = {2700, 3600},
6580 },
6581
6582 {
6583 .vendor = "GigaDevice",
Alan Green4f009122019-08-26 10:45:18 +10006584 .name = "GD25Q127C/GD25Q128C",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006585 .bustype = BUS_SPI,
6586 .manufacture_id = GIGADEVICE_ID,
6587 .model_id = GIGADEVICE_GD25Q128,
6588 .total_size = 16384,
6589 .page_size = 256,
6590 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6591 /* QPI: enable 0x38, disable 0xFF */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006592 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Angel Ponsbce364c2018-09-30 20:04:14 +02006593 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006594 .probe = probe_spi_rdid,
6595 .probe_timing = TIMING_ZERO,
6596 .block_erasers =
6597 {
6598 {
6599 .eraseblocks = { {4 * 1024, 4096} },
6600 .block_erase = spi_block_erase_20,
6601 }, {
6602 .eraseblocks = { {32 * 1024, 512} },
6603 .block_erase = spi_block_erase_52,
6604 }, {
6605 .eraseblocks = { {64 * 1024, 256} },
6606 .block_erase = spi_block_erase_d8,
6607 }, {
6608 .eraseblocks = { {16 * 1024 * 1024, 1} },
6609 .block_erase = spi_block_erase_60,
6610 }, {
6611 .eraseblocks = { {16 * 1024 * 1024, 1} },
6612 .block_erase = spi_block_erase_c7,
6613 }
6614 },
6615 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6616 .printlock = spi_prettyprint_status_register_bp4_srwd,
6617 .unlock = spi_disable_blockprotect_bp4_srwd,
6618 .write = spi_chip_write_256,
6619 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6620 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006621 .reg_bits =
6622 {
6623 .srp = {STATUS1, 7, RW},
6624 .srl = {STATUS2, 0, RW},
6625 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6626 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6627 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6628 .cmp = {STATUS2, 6, RW},
6629 },
6630 .decode_range = decode_range_spi25,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006631 },
6632
6633 {
6634 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006635 .name = "GD25Q16(B)",
6636 .bustype = BUS_SPI,
6637 .manufacture_id = GIGADEVICE_ID,
6638 .model_id = GIGADEVICE_GD25Q16,
6639 .total_size = 2048,
6640 .page_size = 256,
6641 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
6642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6643 .tested = TEST_OK_PREW,
6644 .probe = probe_spi_rdid,
6645 .probe_timing = TIMING_ZERO,
6646 .block_erasers =
6647 {
6648 {
6649 .eraseblocks = { {4 * 1024, 512} },
6650 .block_erase = spi_block_erase_20,
6651 }, {
6652 .eraseblocks = { {32 * 1024, 64} },
6653 .block_erase = spi_block_erase_52,
6654 }, {
6655 .eraseblocks = { {64 * 1024, 32} },
6656 .block_erase = spi_block_erase_d8,
6657 }, {
6658 .eraseblocks = { {2 * 1024 * 1024, 1} },
6659 .block_erase = spi_block_erase_60,
6660 }, {
6661 .eraseblocks = { {2 * 1024 * 1024, 1} },
6662 .block_erase = spi_block_erase_c7,
6663 }
6664 },
6665 .printlock = spi_prettyprint_status_register_bp4_srwd,
6666 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6667 .write = spi_chip_write_256,
6668 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6669 .voltage = {2700, 3600},
6670 },
6671
6672 {
6673 .vendor = "GigaDevice",
6674 .name = "GD25Q20(B)",
6675 .bustype = BUS_SPI,
6676 .manufacture_id = GIGADEVICE_ID,
6677 .model_id = GIGADEVICE_GD25Q20,
6678 .total_size = 256,
6679 .page_size = 256,
6680 .feature_bits = FEATURE_WRSR_WREN,
6681 .tested = TEST_OK_PREW,
6682 .probe = probe_spi_rdid,
6683 .probe_timing = TIMING_ZERO,
6684 .block_erasers =
6685 {
6686 {
6687 .eraseblocks = { {4 * 1024, 64} },
6688 .block_erase = spi_block_erase_20,
6689 }, {
6690 .eraseblocks = { {32 * 1024, 8} },
6691 .block_erase = spi_block_erase_52,
6692 }, {
6693 .eraseblocks = { {64 * 1024, 4} },
6694 .block_erase = spi_block_erase_d8,
6695 }, {
6696 .eraseblocks = { {256 * 1024, 1} },
6697 .block_erase = spi_block_erase_60,
6698 }, {
6699 .eraseblocks = { {256 * 1024, 1} },
6700 .block_erase = spi_block_erase_c7,
6701 }
6702 },
6703 .printlock = spi_prettyprint_status_register_bp4_srwd,
6704 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6705 .write = spi_chip_write_256,
6706 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6707 .voltage = {2700, 3600},
6708 },
6709
6710 {
6711 .vendor = "GigaDevice",
Alan Green86fc9cf2019-08-26 15:02:12 +10006712 .name = "GD25Q256D",
6713 .bustype = BUS_SPI,
6714 .manufacture_id = GIGADEVICE_ID,
6715 .model_id = GIGADEVICE_GD25Q256D,
6716 .total_size = 32768,
6717 .page_size = 256,
Nikolai Artemiev9de3f872021-10-20 22:32:25 +11006718 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN |
6719 FEATURE_WRSR_EXT | FEATURE_WRSR2,
Nikolai Artemieve64ef6d2021-03-23 17:15:40 +11006720 .tested = TEST_OK_PREW,
Alan Green86fc9cf2019-08-26 15:02:12 +10006721 .probe = probe_spi_rdid,
6722 .probe_timing = TIMING_ZERO,
6723 .block_erasers =
6724 {
6725 {
6726 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber5374dc32019-10-04 16:16:15 +02006727 .block_erase = spi_block_erase_21,
6728 }, {
6729 .eraseblocks = { {4 * 1024, 8192} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006730 .block_erase = spi_block_erase_20,
6731 }, {
6732 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber5374dc32019-10-04 16:16:15 +02006733 .block_erase = spi_block_erase_5c,
6734 }, {
6735 .eraseblocks = { {32 * 1024, 1024} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006736 .block_erase = spi_block_erase_52,
6737 }, {
6738 .eraseblocks = { {64 * 1024, 512} },
Nico Huber5374dc32019-10-04 16:16:15 +02006739 .block_erase = spi_block_erase_dc,
6740 }, {
6741 .eraseblocks = { {64 * 1024, 512} },
Alan Green86fc9cf2019-08-26 15:02:12 +10006742 .block_erase = spi_block_erase_d8,
6743 }, {
6744 .eraseblocks = { {32 * 1024 * 1024, 1} },
6745 .block_erase = spi_block_erase_60,
6746 }, {
6747 .eraseblocks = { {32 * 1024 * 1024, 1} },
6748 .block_erase = spi_block_erase_c7,
6749 }
6750 },
6751 .printlock = spi_prettyprint_status_register_bp3_srwd,
6752 .unlock = spi_disable_blockprotect,
6753 .write = spi_chip_write_256,
6754 .read = spi_chip_read,
6755 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006756 .reg_bits =
6757 {
6758 .srp = {STATUS1, 7, RW},
6759 .srl = {STATUS2, 6, RW},
6760 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
6761 .tb = {STATUS1, 6, RW},
6762 },
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006763 .decode_range = decode_range_spi25,
Alan Green86fc9cf2019-08-26 15:02:12 +10006764 },
6765
6766 {
6767 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006768 .name = "GD25Q32(B)",
6769 .bustype = BUS_SPI,
6770 .manufacture_id = GIGADEVICE_ID,
6771 .model_id = GIGADEVICE_GD25Q32,
6772 .total_size = 4096,
6773 .page_size = 256,
6774 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemiev9de3f872021-10-20 22:32:25 +11006775 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006776 .tested = TEST_OK_PREW,
6777 .probe = probe_spi_rdid,
6778 .probe_timing = TIMING_ZERO,
6779 .block_erasers =
6780 {
6781 {
6782 .eraseblocks = { {4 * 1024, 1024} },
6783 .block_erase = spi_block_erase_20,
6784 }, {
6785 .eraseblocks = { {32 * 1024, 128} },
6786 .block_erase = spi_block_erase_52,
6787 }, {
6788 .eraseblocks = { {64 * 1024, 64} },
6789 .block_erase = spi_block_erase_d8,
6790 }, {
6791 .eraseblocks = { {4 * 1024 * 1024, 1} },
6792 .block_erase = spi_block_erase_60,
6793 }, {
6794 .eraseblocks = { {4 * 1024 * 1024, 1} },
6795 .block_erase = spi_block_erase_c7,
6796 }
6797 },
6798 .printlock = spi_prettyprint_status_register_bp4_srwd,
6799 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6800 .write = spi_chip_write_256,
6801 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6802 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006803 .reg_bits =
6804 {
6805 .srp = {STATUS1, 7, RW},
6806 .srl = {STATUS2, 0, RW},
6807 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6808 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6809 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6810 .cmp = {STATUS2, 6, RW},
6811 },
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006812 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006813 },
6814
6815 {
6816 .vendor = "GigaDevice",
6817 .name = "GD25Q40(B)",
6818 .bustype = BUS_SPI,
6819 .manufacture_id = GIGADEVICE_ID,
6820 .model_id = GIGADEVICE_GD25Q40,
6821 .total_size = 512,
6822 .page_size = 256,
6823 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrow551664c2022-03-09 16:09:08 +01006824 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006825 .probe = probe_spi_rdid,
6826 .probe_timing = TIMING_ZERO,
6827 .block_erasers =
6828 {
6829 {
6830 .eraseblocks = { {4 * 1024, 128} },
6831 .block_erase = spi_block_erase_20,
6832 }, {
6833 .eraseblocks = { {32 * 1024, 16} },
6834 .block_erase = spi_block_erase_52,
6835 }, {
6836 .eraseblocks = { {64 * 1024, 8} },
6837 .block_erase = spi_block_erase_d8,
6838 }, {
6839 .eraseblocks = { {512 * 1024, 1} },
6840 .block_erase = spi_block_erase_60,
6841 }, {
6842 .eraseblocks = { {512 * 1024, 1} },
6843 .block_erase = spi_block_erase_c7,
6844 }
6845 },
6846 .printlock = spi_prettyprint_status_register_bp4_srwd,
6847 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6848 .write = spi_chip_write_256,
6849 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6850 .voltage = {2700, 3600},
6851 },
6852
6853 {
6854 .vendor = "GigaDevice",
6855 .name = "GD25Q512",
6856 .bustype = BUS_SPI,
6857 .manufacture_id = GIGADEVICE_ID,
6858 .model_id = GIGADEVICE_GD25Q512,
6859 .total_size = 64,
6860 .page_size = 256,
6861 .feature_bits = FEATURE_WRSR_WREN,
6862 .tested = TEST_OK_PREW,
6863 .probe = probe_spi_rdid,
6864 .probe_timing = TIMING_ZERO,
6865 .block_erasers =
6866 {
6867 {
6868 .eraseblocks = { {4 * 1024, 16} },
6869 .block_erase = spi_block_erase_20,
6870 }, {
6871 .eraseblocks = { {32 * 1024, 2} },
6872 .block_erase = spi_block_erase_52,
6873 }, {
6874 .eraseblocks = { {64 * 1024, 1} },
6875 .block_erase = spi_block_erase_60,
6876 }, {
6877 .eraseblocks = { {64 * 1024, 1} },
6878 .block_erase = spi_block_erase_c7,
6879 }
6880 },
6881 .printlock = spi_prettyprint_status_register_bp4_srwd,
6882 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6883 .write = spi_chip_write_256,
6884 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6885 .voltage = {2700, 3600},
6886 },
6887
6888 {
6889 .vendor = "GigaDevice",
6890 .name = "GD25Q64(B)",
6891 .bustype = BUS_SPI,
6892 .manufacture_id = GIGADEVICE_ID,
6893 .model_id = GIGADEVICE_GD25Q64,
6894 .total_size = 8192,
6895 .page_size = 256,
6896 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006898 .tested = TEST_OK_PREW,
6899 .probe = probe_spi_rdid,
6900 .probe_timing = TIMING_ZERO,
6901 .block_erasers =
6902 {
6903 {
6904 .eraseblocks = { {4 * 1024, 2048} },
6905 .block_erase = spi_block_erase_20,
6906 }, {
6907 .eraseblocks = { {32 * 1024, 256} },
6908 .block_erase = spi_block_erase_52,
6909 }, {
6910 .eraseblocks = { {64 * 1024, 128} },
6911 .block_erase = spi_block_erase_d8,
6912 }, {
6913 .eraseblocks = { {8 * 1024 * 1024, 1} },
6914 .block_erase = spi_block_erase_60,
6915 }, {
6916 .eraseblocks = { {8 * 1024 * 1024, 1} },
6917 .block_erase = spi_block_erase_c7,
6918 }
6919 },
6920 .printlock = spi_prettyprint_status_register_bp4_srwd,
6921 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6922 .write = spi_chip_write_256,
6923 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6924 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006925 .reg_bits =
6926 {
6927 .srp = {STATUS1, 7, RW},
6928 .srl = {STATUS2, 0, RW},
6929 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6930 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6931 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6932 .cmp = {STATUS2, 6, RW},
6933 },
6934 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006935 },
6936
6937 {
6938 .vendor = "GigaDevice",
6939 .name = "GD25Q80(B)",
6940 .bustype = BUS_SPI,
6941 .manufacture_id = GIGADEVICE_ID,
6942 .model_id = GIGADEVICE_GD25Q80,
6943 .total_size = 1024,
6944 .page_size = 256,
6945 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
6946 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6947 .tested = TEST_OK_PREW,
6948 .probe = probe_spi_rdid,
6949 .probe_timing = TIMING_ZERO,
6950 .block_erasers =
6951 {
6952 {
6953 .eraseblocks = { {4 * 1024, 256} },
6954 .block_erase = spi_block_erase_20,
6955 }, {
6956 .eraseblocks = { {32 * 1024, 32} },
6957 .block_erase = spi_block_erase_52,
6958 }, {
6959 .eraseblocks = { {64 * 1024, 16} },
6960 .block_erase = spi_block_erase_d8,
6961 }, {
6962 .eraseblocks = { {1024 * 1024, 1} },
6963 .block_erase = spi_block_erase_60,
6964 }, {
6965 .eraseblocks = { {1024 * 1024, 1} },
6966 .block_erase = spi_block_erase_c7,
6967 }
6968 },
6969 .printlock = spi_prettyprint_status_register_bp4_srwd,
6970 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6971 .write = spi_chip_write_256,
6972 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6973 .voltage = {2700, 3600},
6974 },
6975
6976 {
6977 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006978 .name = "GD25T80",
6979 .bustype = BUS_SPI,
6980 .manufacture_id = GIGADEVICE_ID,
6981 .model_id = GIGADEVICE_GD25T80,
6982 .total_size = 1024,
6983 .page_size = 256,
6984 /* OTP: 256B total; enter 0x3A */
6985 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6986 .tested = TEST_UNTESTED,
6987 .probe = probe_spi_rdid,
6988 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006989 .block_erasers =
6990 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006991 {
6992 .eraseblocks = { {4 * 1024, 256} },
6993 .block_erase = spi_block_erase_20,
6994 }, {
6995 .eraseblocks = { {64 * 1024, 16} },
6996 .block_erase = spi_block_erase_52,
6997 }, {
6998 .eraseblocks = { {64 * 1024, 16} },
6999 .block_erase = spi_block_erase_d8,
7000 }, {
7001 .eraseblocks = { {1024 * 1024, 1} },
7002 .block_erase = spi_block_erase_60,
7003 }, {
7004 .eraseblocks = { {1024 * 1024, 1} },
7005 .block_erase = spi_block_erase_c7,
7006 }
7007 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00007008 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007009 .unlock = spi_disable_blockprotect,
7010 .write = spi_chip_write_256,
7011 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00007012 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007013 },
7014
7015 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007016 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007017 .name = "GD25VQ16C",
7018 .bustype = BUS_SPI,
7019 .manufacture_id = GIGADEVICE_ID,
7020 .model_id = GIGADEVICE_GD25VQ16C,
7021 .total_size = 2 * 1024,
7022 .page_size = 256,
7023 /* Supports SFDP */
7024 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7025 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7026 .tested = TEST_UNTESTED,
7027 .probe = probe_spi_rdid,
7028 .probe_timing = TIMING_ZERO,
7029 .block_erasers =
7030 {
7031 {
7032 .eraseblocks = { { 4 * 1024, 512} },
7033 .block_erase = spi_block_erase_20,
7034 }, {
7035 .eraseblocks = { { 32 * 1024, 64} },
7036 .block_erase = spi_block_erase_52,
7037 }, {
7038 .eraseblocks = { { 64 * 1024, 32} },
7039 .block_erase = spi_block_erase_d8,
7040 }, {
7041 .eraseblocks = { {2 * 1024 * 1024, 1} },
7042 .block_erase = spi_block_erase_60,
7043 }, {
7044 .eraseblocks = { {2 * 1024 * 1024, 1} },
7045 .block_erase = spi_block_erase_c7,
7046 }
7047 },
7048 .printlock = spi_prettyprint_status_register_bp4_srwd,
7049 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7050 .write = spi_chip_write_256,
7051 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7052 .voltage = {2300, 3600},
7053 },
7054
7055 {
7056 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007057 .name = "GD25VQ21B",
7058 .bustype = BUS_SPI,
7059 .manufacture_id = GIGADEVICE_ID,
7060 .model_id = GIGADEVICE_GD25VQ21B,
7061 .total_size = 256,
7062 .page_size = 256,
7063 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
7064 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7065 .tested = TEST_UNTESTED,
7066 .probe = probe_spi_rdid,
7067 .probe_timing = TIMING_ZERO,
7068 .block_erasers =
7069 {
7070 {
7071 .eraseblocks = { { 4 * 1024, 64} },
7072 .block_erase = spi_block_erase_20,
7073 }, {
7074 .eraseblocks = { { 32 * 1024, 8} },
7075 .block_erase = spi_block_erase_52,
7076 }, {
7077 .eraseblocks = { { 64 * 1024, 4} },
7078 .block_erase = spi_block_erase_d8,
7079 }, {
7080 .eraseblocks = { {256 * 1024, 1} },
7081 .block_erase = spi_block_erase_60,
7082 }, {
7083 .eraseblocks = { {256 * 1024, 1} },
7084 .block_erase = spi_block_erase_c7,
7085 }
7086 },
7087 .printlock = spi_prettyprint_status_register_bp4_srwd,
7088 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7089 .write = spi_chip_write_256,
7090 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7091 .voltage = {2300, 3600},
7092 },
7093
7094 {
7095 .vendor = "GigaDevice",
7096 .name = "GD25VQ40C",
7097 .bustype = BUS_SPI,
7098 .manufacture_id = GIGADEVICE_ID,
7099 .model_id = GIGADEVICE_GD25VQ41B,
7100 .total_size = 512,
7101 .page_size = 256,
7102 /* Supports SFDP */
7103 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7105 .tested = TEST_UNTESTED,
7106 .probe = probe_spi_rdid,
7107 .probe_timing = TIMING_ZERO,
7108 .block_erasers =
7109 {
7110 {
7111 .eraseblocks = { { 4 * 1024, 128} },
7112 .block_erase = spi_block_erase_20,
7113 }, {
7114 .eraseblocks = { { 32 * 1024, 16} },
7115 .block_erase = spi_block_erase_52,
7116 }, {
7117 .eraseblocks = { { 64 * 1024, 8} },
7118 .block_erase = spi_block_erase_d8,
7119 }, {
7120 .eraseblocks = { {512 * 1024, 1} },
7121 .block_erase = spi_block_erase_60,
7122 }, {
7123 .eraseblocks = { {512 * 1024, 1} },
7124 .block_erase = spi_block_erase_c7,
7125 }
7126 },
7127 .printlock = spi_prettyprint_status_register_bp4_srwd,
7128 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7129 .write = spi_chip_write_256,
7130 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7131 .voltage = {2300, 3600},
7132 },
7133
7134 {
7135 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007136 .name = "GD25VQ41B",
7137 .bustype = BUS_SPI,
7138 .manufacture_id = GIGADEVICE_ID,
7139 .model_id = GIGADEVICE_GD25VQ41B,
7140 .total_size = 512,
7141 .page_size = 256,
7142 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
7143 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007144 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007145 .probe = probe_spi_rdid,
7146 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007147 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007148 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00007149 {
7150 .eraseblocks = { { 4 * 1024, 128} },
7151 .block_erase = spi_block_erase_20,
7152 }, {
7153 .eraseblocks = { { 32 * 1024, 16} },
7154 .block_erase = spi_block_erase_52,
7155 }, {
7156 .eraseblocks = { { 64 * 1024, 8} },
7157 .block_erase = spi_block_erase_d8,
7158 }, {
7159 .eraseblocks = { {512 * 1024, 1} },
7160 .block_erase = spi_block_erase_60,
7161 }, {
7162 .eraseblocks = { {512 * 1024, 1} },
7163 .block_erase = spi_block_erase_c7,
7164 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007165 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007166 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007167 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7168 .write = spi_chip_write_256,
7169 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7170 .voltage = {2300, 3600},
7171 },
7172
7173 {
7174 .vendor = "GigaDevice",
7175 .name = "GD25VQ80C",
7176 .bustype = BUS_SPI,
7177 .manufacture_id = GIGADEVICE_ID,
7178 .model_id = GIGADEVICE_GD25VQ80C,
7179 .total_size = 1024,
7180 .page_size = 256,
7181 /* Supports SFDP */
7182 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7183 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7184 .tested = TEST_UNTESTED,
7185 .probe = probe_spi_rdid,
7186 .probe_timing = TIMING_ZERO,
7187 .block_erasers =
7188 {
7189 {
7190 .eraseblocks = { { 4 * 1024, 256} },
7191 .block_erase = spi_block_erase_20,
7192 }, {
7193 .eraseblocks = { { 32 * 1024, 32} },
7194 .block_erase = spi_block_erase_52,
7195 }, {
7196 .eraseblocks = { { 64 * 1024, 16} },
7197 .block_erase = spi_block_erase_d8,
7198 }, {
7199 .eraseblocks = { {1024 * 1024, 1} },
7200 .block_erase = spi_block_erase_60,
7201 }, {
7202 .eraseblocks = { {1024 * 1024, 1} },
7203 .block_erase = spi_block_erase_c7,
7204 }
7205 },
7206 .printlock = spi_prettyprint_status_register_bp4_srwd,
7207 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7208 .write = spi_chip_write_256,
7209 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7210 .voltage = {2300, 3600},
7211 },
7212
7213 {
Dino Li3214f582020-03-25 17:39:53 +08007214 .vendor = "GigaDevice",
7215 .name = "GD25WQ80E",
7216 .bustype = BUS_SPI,
7217 .manufacture_id = GIGADEVICE_ID,
7218 .model_id = GIGADEVICE_GD25WQ80E,
7219 .total_size = 1024,
7220 .page_size = 256,
7221 .feature_bits = FEATURE_WRSR_WREN,
7222 .tested = TEST_OK_PREW,
7223 .probe = probe_spi_rdid,
7224 .probe_timing = TIMING_ZERO,
7225 .block_erasers =
7226 {
7227 {
7228 .eraseblocks = { {4 * 1024, 256} },
7229 .block_erase = spi_block_erase_20,
7230 }, {
7231 .eraseblocks = { {32 * 1024, 32} },
7232 .block_erase = spi_block_erase_52,
7233 }, {
7234 .eraseblocks = { {64 * 1024, 16} },
7235 .block_erase = spi_block_erase_d8,
7236 }, {
7237 .eraseblocks = { {1 * 1024 * 1024, 1} },
7238 .block_erase = spi_block_erase_60,
7239 }, {
7240 .eraseblocks = { {1 * 1024 * 1024, 1} },
7241 .block_erase = spi_block_erase_c7,
7242 }
7243 },
7244 .printlock = spi_prettyprint_status_register_bp4_srwd,
7245 .unlock = spi_disable_blockprotect_bp4_srwd,
7246 .write = spi_chip_write_256,
7247 .read = spi_chip_read,
7248 .voltage = {1650, 3600},
7249 },
7250
7251 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007252 .vendor = "Hyundai",
7253 .name = "HY29F002B",
7254 .bustype = BUS_PARALLEL,
7255 .manufacture_id = HYUNDAI_ID,
7256 .model_id = HYUNDAI_HY29F002B,
7257 .total_size = 256,
7258 .page_size = 256 * 1024,
7259 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007260 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007261 .probe = probe_jedec,
7262 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007263 .block_erasers =
7264 {
7265 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007266 .eraseblocks = {
7267 {16 * 1024, 1},
7268 {8 * 1024, 2},
7269 {32 * 1024, 1},
7270 {64 * 1024, 3},
7271 },
7272 .block_erase = erase_sector_jedec,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007273 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007274 .eraseblocks = { {256 * 1024, 1} },
7275 .block_erase = erase_chip_block_jedec,
7276 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007277 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007278 .write = write_jedec_1,
7279 .read = read_memmapped,
7280 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007281 },
7282
7283 {
David Borgc96a8bd2010-06-21 16:12:22 +00007284 .vendor = "Hyundai",
7285 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007286 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00007287 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007288 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00007289 .total_size = 256,
7290 .page_size = 256 * 1024,
7291 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007292 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00007293 .probe = probe_jedec,
7294 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7295 .block_erasers =
7296 {
7297 {
7298 .eraseblocks = {
7299 {64 * 1024, 3},
7300 {32 * 1024, 1},
7301 {8 * 1024, 2},
7302 {16 * 1024, 1},
7303 },
7304 .block_erase = erase_sector_jedec,
7305 }, {
7306 .eraseblocks = { {256 * 1024, 1} },
7307 .block_erase = erase_chip_block_jedec,
7308 },
7309 },
7310 .write = write_jedec_1,
7311 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007312 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
David Borgc96a8bd2010-06-21 16:12:22 +00007313 },
7314
7315 {
7316 .vendor = "Hyundai",
Joshua Roysf1324e02010-09-16 00:51:51 +00007317 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007318 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007319 .manufacture_id = HYUNDAI_ID,
7320 .model_id = HYUNDAI_HY29F040A,
7321 .total_size = 512,
7322 .page_size = 64 * 1024,
7323 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7324 .tested = TEST_UNTESTED,
7325 .probe = probe_jedec,
7326 .probe_timing = TIMING_ZERO,
7327 .block_erasers =
7328 {
7329 {
7330 .eraseblocks = { {64 * 1024, 8} },
7331 .block_erase = erase_sector_jedec,
7332 }, {
7333 .eraseblocks = { {512 * 1024, 1} },
7334 .block_erase = erase_chip_block_jedec,
7335 },
7336 },
7337 .write = write_jedec_1,
7338 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007339 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00007340 },
7341
7342 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007343 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007344 .name = "IS25LP064",
7345 .bustype = BUS_SPI,
7346 .manufacture_id = ISSI_ID_SPI,
7347 .model_id = ISSI_IS25LP064,
7348 .total_size = 8192,
7349 .page_size = 256,
7350 /* OTP: 1024B total; read 0x48; write 0x42 */
7351 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Simon Buhrow9bf829d2021-10-20 17:09:09 +02007352 .tested = TEST_OK_PREW,
Angel Pons2ef47f32018-09-30 16:47:30 +02007353 .probe = probe_spi_rdid,
7354 .probe_timing = TIMING_ZERO,
7355 .block_erasers =
7356 {
7357 {
7358 .eraseblocks = { {4 * 1024, 2048} },
7359 .block_erase = spi_block_erase_20,
7360 }, {
7361 .eraseblocks = { {4 * 1024, 2048} },
7362 .block_erase = spi_block_erase_d7,
7363 }, {
7364 .eraseblocks = { {32 * 1024, 256} },
7365 .block_erase = spi_block_erase_52,
7366 }, {
7367 .eraseblocks = { {64 * 1024, 128} },
7368 .block_erase = spi_block_erase_d8,
7369 }, {
7370 .eraseblocks = { {8 * 1024 * 1024, 1} },
7371 .block_erase = spi_block_erase_60,
7372 }, {
7373 .eraseblocks = { {8 * 1024 * 1024, 1} },
7374 .block_erase = spi_block_erase_c7,
7375 }
7376 },
7377 .unlock = spi_disable_blockprotect,
7378 .write = spi_chip_write_256,
7379 .read = spi_chip_read,
7380 .voltage = {2300, 3600},
7381 },
7382
7383 {
7384 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007385 .name = "IS25LP128",
7386 .bustype = BUS_SPI,
7387 .manufacture_id = ISSI_ID_SPI,
7388 .model_id = ISSI_IS25LP128,
7389 .total_size = 16384,
7390 .page_size = 256,
7391 /* OTP: 1024B total; read 0x48; write 0x42 */
7392 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7393 .tested = TEST_OK_PREW,
7394 .probe = probe_spi_rdid,
7395 .probe_timing = TIMING_ZERO,
7396 .block_erasers =
7397 {
7398 {
7399 .eraseblocks = { {4 * 1024, 4096} },
7400 .block_erase = spi_block_erase_20,
7401 }, {
7402 .eraseblocks = { {4 * 1024, 4096} },
7403 .block_erase = spi_block_erase_d7,
7404 }, {
7405 .eraseblocks = { {32 * 1024, 512} },
7406 .block_erase = spi_block_erase_52,
7407 }, {
7408 .eraseblocks = { {64 * 1024, 256} },
7409 .block_erase = spi_block_erase_d8,
7410 }, {
7411 .eraseblocks = { {16 * 1024 * 1024, 1} },
7412 .block_erase = spi_block_erase_60,
7413 }, {
7414 .eraseblocks = { {16 * 1024 * 1024, 1} },
7415 .block_erase = spi_block_erase_c7,
7416 }
7417 },
7418 .unlock = spi_disable_blockprotect,
7419 .write = spi_chip_write_256,
7420 .read = spi_chip_read,
7421 .voltage = {2300, 3600},
7422 },
7423
7424 {
7425 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007426 .name = "IS25LP256",
7427 .bustype = BUS_SPI,
7428 .manufacture_id = ISSI_ID_SPI,
7429 .model_id = ISSI_IS25LP256,
7430 .total_size = 32768,
7431 .page_size = 256,
7432 /* supports SFDP */
7433 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7434 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7436 .tested = TEST_OK_PREW,
7437 .probe = probe_spi_rdid,
7438 .probe_timing = TIMING_ZERO,
7439 .block_erasers =
7440 {
7441 {
7442 .eraseblocks = { {4 * 1024, 8192} },
7443 .block_erase = spi_block_erase_21,
7444 }, {
7445 .eraseblocks = { {4 * 1024, 8192} },
7446 .block_erase = spi_block_erase_20,
7447 /* could also use spi_block_erase_d7 */
7448 }, {
7449 .eraseblocks = { {32 * 1024, 1024} },
7450 .block_erase = spi_block_erase_5c,
7451 }, {
7452 .eraseblocks = { {32 * 1024, 1024} },
7453 .block_erase = spi_block_erase_52,
7454 }, {
7455 .eraseblocks = { {64 * 1024, 512} },
7456 .block_erase = spi_block_erase_dc,
7457 }, {
7458 .eraseblocks = { {64 * 1024, 512} },
7459 .block_erase = spi_block_erase_d8,
7460 }, {
7461 .eraseblocks = { {32 * 1024 * 1024, 1} },
7462 .block_erase = spi_block_erase_60,
7463 }, {
7464 .eraseblocks = { {32 * 1024 * 1024, 1} },
7465 .block_erase = spi_block_erase_c7,
7466 }
7467 },
7468 .unlock = spi_disable_blockprotect,
7469 .write = spi_chip_write_256,
7470 .read = spi_chip_read,
7471 .voltage = {2300, 3600},
7472 },
7473
7474 {
7475 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007476 .name = "IS25WP032",
7477 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007478 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007479 .model_id = ISSI_IS25WP032,
7480 .total_size = 4096,
7481 .page_size = 256,
7482 /* OTP: 1024B total; read 0x48; write 0x42 */
7483 /* QPI enable 0x35, disable 0xF5 */
7484 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7485 .tested = TEST_UNTESTED,
7486 .probe = probe_spi_rdid,
7487 .probe_timing = TIMING_ZERO,
7488 .block_erasers =
7489 {
7490 {
7491 .eraseblocks = { {4 * 1024, 1024} },
7492 .block_erase = spi_block_erase_20,
7493 }, {
7494 .eraseblocks = { {4 * 1024, 1024} },
7495 .block_erase = spi_block_erase_d7,
7496 }, {
7497 .eraseblocks = { {32 * 1024, 128} },
7498 .block_erase = spi_block_erase_52,
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_60,
7505 }, {
7506 .eraseblocks = { {4 * 1024 * 1024, 1} },
7507 .block_erase = spi_block_erase_c7,
7508 }
7509 },
7510 .unlock = spi_disable_blockprotect,
7511 .write = spi_chip_write_256,
7512 .read = spi_chip_read,
7513 .voltage = {1650, 1950},
7514 },
7515
7516 {
7517 .vendor = "ISSI",
7518 .name = "IS25WP064",
7519 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007520 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007521 .model_id = ISSI_IS25WP064,
7522 .total_size = 8192,
7523 .page_size = 256,
7524 /* OTP: 1024B total; read 0x48; write 0x42 */
7525 /* QPI enable 0x35, disable 0xF5 */
7526 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7527 .tested = TEST_OK_PREW,
7528 .probe = probe_spi_rdid,
7529 .probe_timing = TIMING_ZERO,
7530 .block_erasers =
7531 {
7532 {
7533 .eraseblocks = { {4 * 1024, 2048} },
7534 .block_erase = spi_block_erase_20,
7535 }, {
7536 .eraseblocks = { {4 * 1024, 2048} },
7537 .block_erase = spi_block_erase_d7,
7538 }, {
7539 .eraseblocks = { {32 * 1024, 256} },
7540 .block_erase = spi_block_erase_52,
7541 }, {
7542 .eraseblocks = { {64 * 1024, 128} },
7543 .block_erase = spi_block_erase_d8,
7544 }, {
7545 .eraseblocks = { {8 * 1024 * 1024, 1} },
7546 .block_erase = spi_block_erase_60,
7547 }, {
7548 .eraseblocks = { {8 * 1024 * 1024, 1} },
7549 .block_erase = spi_block_erase_c7,
7550 }
7551 },
7552 .unlock = spi_disable_blockprotect,
7553 .write = spi_chip_write_256,
7554 .read = spi_chip_read,
7555 .voltage = {1650, 1950},
7556 },
7557
7558 {
7559 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007560 .name = "IS25WP128",
7561 .bustype = BUS_SPI,
7562 .manufacture_id = ISSI_ID_SPI,
7563 .model_id = ISSI_IS25WP128,
7564 .total_size = 16384,
7565 .page_size = 256,
7566 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huberb27b8d12018-10-02 20:46:21 +02007567 /* QPI enable 0x35, disable 0xF5 */
7568 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks3083ed92017-05-02 13:25:56 -07007569 .tested = TEST_OK_PREW,
7570 .probe = probe_spi_rdid,
7571 .probe_timing = TIMING_ZERO,
7572 .block_erasers =
7573 {
7574 {
7575 .eraseblocks = { {4 * 1024, 4096} },
7576 .block_erase = spi_block_erase_20,
7577 }, {
7578 .eraseblocks = { {4 * 1024, 4096} },
7579 .block_erase = spi_block_erase_d7,
7580 }, {
7581 .eraseblocks = { {32 * 1024, 512} },
7582 .block_erase = spi_block_erase_52,
7583 }, {
7584 .eraseblocks = { {64 * 1024, 256} },
7585 .block_erase = spi_block_erase_d8,
7586 }, {
7587 .eraseblocks = { {16 * 1024 * 1024, 1} },
7588 .block_erase = spi_block_erase_60,
7589 }, {
7590 .eraseblocks = { {16 * 1024 * 1024, 1} },
7591 .block_erase = spi_block_erase_c7,
7592 }
7593 },
7594 .unlock = spi_disable_blockprotect,
7595 .write = spi_chip_write_256,
7596 .read = spi_chip_read,
7597 .voltage = {1650, 1950},
7598 },
7599
7600 {
7601 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007602 .name = "IS25WP256",
7603 .bustype = BUS_SPI,
7604 .manufacture_id = ISSI_ID_SPI,
7605 .model_id = ISSI_IS25WP256,
7606 .total_size = 32768,
7607 .page_size = 256,
7608 /* supports SFDP */
7609 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7610 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7611 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7612 .tested = TEST_OK_PREW,
7613 .probe = probe_spi_rdid,
7614 .probe_timing = TIMING_ZERO,
7615 .block_erasers =
7616 {
7617 {
7618 .eraseblocks = { {4 * 1024, 8192} },
7619 .block_erase = spi_block_erase_21,
7620 }, {
7621 .eraseblocks = { {4 * 1024, 8192} },
7622 .block_erase = spi_block_erase_20,
7623 /* could also use spi_block_erase_d7 */
7624 }, {
7625 .eraseblocks = { {32 * 1024, 1024} },
7626 .block_erase = spi_block_erase_5c,
7627 }, {
7628 .eraseblocks = { {32 * 1024, 1024} },
7629 .block_erase = spi_block_erase_52,
7630 }, {
7631 .eraseblocks = { {64 * 1024, 512} },
7632 .block_erase = spi_block_erase_dc,
7633 }, {
7634 .eraseblocks = { {64 * 1024, 512} },
7635 .block_erase = spi_block_erase_d8,
7636 }, {
7637 .eraseblocks = { {32 * 1024 * 1024, 1} },
7638 .block_erase = spi_block_erase_60,
7639 }, {
7640 .eraseblocks = { {32 * 1024 * 1024, 1} },
7641 .block_erase = spi_block_erase_c7,
7642 }
7643 },
7644 .unlock = spi_disable_blockprotect,
7645 .write = spi_chip_write_256,
7646 .read = spi_chip_read,
7647 .voltage = {1650, 1950},
7648 },
7649
7650 {
7651 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007652 .name = "IS29GL064B",
7653 .bustype = BUS_PARALLEL,
7654 .manufacture_id = ISSI_ID,
7655 .model_id = ISSI_PMC_IS29GL064B,
7656 .total_size = 8192,
7657 .page_size = 128 * 1024, /* actual page size is 16 */
7658 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7659 .tested = TEST_UNTESTED,
7660 .probe = probe_jedec_29gl,
7661 .probe_timing = TIMING_ZERO,
7662 .block_erasers =
7663 {
7664 {
7665 .eraseblocks = {
7666 {8 * 1024, 8},
7667 {64 * 1024, 127},
7668 },
7669 .block_erase = erase_sector_jedec,
7670 }, {
7671 .eraseblocks = { {8 * 1024 * 1024, 1} },
7672 .block_erase = erase_chip_block_jedec,
7673 },
7674 },
7675 .write = write_jedec_1,
7676 .read = read_memmapped,
7677 .voltage = {2700, 3600},
7678 },
7679
7680 {
7681 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007682 .name = "IS29GL064H/L",
7683 .bustype = BUS_PARALLEL,
7684 .manufacture_id = ISSI_ID,
7685 .model_id = ISSI_PMC_IS29GL064HL,
7686 .total_size = 8192,
7687 .page_size = 128 * 1024, /* actual page size is 16 */
7688 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7689 .tested = TEST_UNTESTED,
7690 .probe = probe_jedec_29gl,
7691 .probe_timing = TIMING_ZERO,
7692 .block_erasers =
7693 {
7694 {
7695 .eraseblocks = { {64 * 1024, 128} },
7696 .block_erase = erase_sector_jedec,
7697 }, {
7698 .eraseblocks = { {8 * 1024 * 1024, 1} },
7699 .block_erase = erase_chip_block_jedec,
7700 },
7701 },
7702 .write = write_jedec_1,
7703 .read = read_memmapped,
7704 .voltage = {2700, 3600},
7705 },
7706
7707 {
7708 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007709 .name = "IS29GL064T",
7710 .bustype = BUS_PARALLEL,
7711 .manufacture_id = ISSI_ID,
7712 .model_id = ISSI_PMC_IS29GL064T,
7713 .total_size = 8192,
7714 .page_size = 128 * 1024, /* actual page size is 16 */
7715 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7716 .tested = TEST_UNTESTED,
7717 .probe = probe_jedec_29gl,
7718 .probe_timing = TIMING_ZERO,
7719 .block_erasers =
7720 {
7721 {
7722 .eraseblocks = {
7723 {64 * 1024, 127},
7724 {8 * 1024, 8},
7725 },
7726 .block_erase = erase_sector_jedec,
7727 }, {
7728 .eraseblocks = { {8 * 1024 * 1024, 1} },
7729 .block_erase = erase_chip_block_jedec,
7730 },
7731 },
7732 .write = write_jedec_1,
7733 .read = read_memmapped,
7734 .voltage = {2700, 3600},
7735 },
7736
7737 {
7738 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007739 .name = "IS29GL128H/L",
7740 .bustype = BUS_PARALLEL,
7741 .manufacture_id = ISSI_ID,
7742 .model_id = ISSI_PMC_IS29GL128HL,
7743 .total_size = 16384,
7744 .page_size = 128 * 1024, /* actual page size is 16 */
7745 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7746 .tested = TEST_UNTESTED,
7747 .probe = probe_jedec_29gl,
7748 .probe_timing = TIMING_ZERO,
7749 .block_erasers =
7750 {
7751 {
7752 .eraseblocks = { {128 * 1024, 128} },
7753 .block_erase = erase_sector_jedec,
7754 }, {
7755 .eraseblocks = { {16 * 1024 * 1024, 1} },
7756 .block_erase = erase_chip_block_jedec,
7757 },
7758 },
7759 .write = write_jedec_1,
7760 .read = read_memmapped,
7761 .voltage = {2700, 3600},
7762 },
7763
7764 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007765 .vendor = "Intel",
7766 .name = "25F160S33B8",
7767 .bustype = BUS_SPI,
7768 .manufacture_id = INTEL_ID,
7769 .model_id = INTEL_25F160S33B8,
7770 .total_size = 2048,
7771 .page_size = 256,
7772 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7773 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7774 .tested = TEST_UNTESTED,
7775 .probe = probe_spi_rdid,
7776 .probe_timing = TIMING_ZERO,
7777 .block_erasers =
7778 {
7779 {
7780 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7781 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7782 * have no effect on the memory contents, but sets a flag in the SR.
7783 .eraseblocks = {
7784 {8 * 1024, 8},
7785 {64 * 1024, 31} // inaccessible
7786 },
7787 .block_erase = spi_block_erase_40,
7788 }, { */
7789 .eraseblocks = { {64 * 1024, 32} },
7790 .block_erase = spi_block_erase_d8,
7791 }, {
7792 .eraseblocks = { {2 * 1024 * 1024, 1} },
7793 .block_erase = spi_block_erase_c7,
7794 }
7795 },
7796 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7797 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7798 .write = spi_chip_write_256,
7799 .read = spi_chip_read, /* also fast read 0x0B */
7800 .voltage = {2700, 3600},
7801 },
7802
7803 {
7804 .vendor = "Intel",
7805 .name = "25F160S33T8",
7806 .bustype = BUS_SPI,
7807 .manufacture_id = INTEL_ID,
7808 .model_id = INTEL_25F160S33T8,
7809 .total_size = 2048,
7810 .page_size = 256,
7811 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7813 .tested = TEST_UNTESTED,
7814 .probe = probe_spi_rdid,
7815 .probe_timing = TIMING_ZERO,
7816 .block_erasers =
7817 {
7818 {
7819 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7820 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7821 * have no effect on the memory contents, but sets a flag in the SR.
7822 .eraseblocks = {
7823 {64 * 1024, 31}, // inaccessible
7824 {8 * 1024, 8}
7825 },
7826 .block_erase = spi_block_erase_40,
7827 }, { */
7828 .eraseblocks = { {64 * 1024, 32} },
7829 .block_erase = spi_block_erase_d8,
7830 }, {
7831 .eraseblocks = { {2 * 1024 * 1024, 1} },
7832 .block_erase = spi_block_erase_c7,
7833 }
7834 },
7835 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7836 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7837 .write = spi_chip_write_256,
7838 .read = spi_chip_read, /* also fast read 0x0B */
7839 .voltage = {2700, 3600},
7840 },
7841
7842 {
7843 .vendor = "Intel",
7844 .name = "25F320S33B8",
7845 .bustype = BUS_SPI,
7846 .manufacture_id = INTEL_ID,
7847 .model_id = INTEL_25F320S33B8,
7848 .total_size = 4096,
7849 .page_size = 256,
7850 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7852 .tested = TEST_UNTESTED,
7853 .probe = probe_spi_rdid,
7854 .probe_timing = TIMING_ZERO,
7855 .block_erasers =
7856 {
7857 {
7858 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7859 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7860 * have no effect on the memory contents, but sets a flag in the SR.
7861 .eraseblocks = {
7862 {8 * 1024, 8},
7863 {64 * 1024, 63} // inaccessible
7864 },
7865 .block_erase = spi_block_erase_40,
7866 }, { */
7867 .eraseblocks = { {64 * 1024, 64} },
7868 .block_erase = spi_block_erase_d8,
7869 }, {
7870 .eraseblocks = { {4 * 1024 * 1024, 1} },
7871 .block_erase = spi_block_erase_c7,
7872 }
7873 },
7874 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7875 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7876 .write = spi_chip_write_256,
7877 .read = spi_chip_read, /* also fast read 0x0B */
7878 .voltage = {2700, 3600},
7879 },
7880
7881 {
7882 .vendor = "Intel",
7883 .name = "25F320S33T8",
7884 .bustype = BUS_SPI,
7885 .manufacture_id = INTEL_ID,
7886 .model_id = INTEL_25F320S33T8,
7887 .total_size = 4096,
7888 .page_size = 256,
7889 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7890 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7891 .tested = TEST_UNTESTED,
7892 .probe = probe_spi_rdid,
7893 .probe_timing = TIMING_ZERO,
7894 .block_erasers =
7895 {
7896 {
7897 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7898 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7899 * have no effect on the memory contents, but sets a flag in the SR.
7900 .eraseblocks = {
7901 {64 * 1024, 63}, // inaccessible
7902 {8 * 1024, 8}
7903 },
7904 .block_erase = spi_block_erase_40,
7905 }, { */
7906 .eraseblocks = { {64 * 1024, 64} },
7907 .block_erase = spi_block_erase_d8,
7908 }, {
7909 .eraseblocks = { {4 * 1024 * 1024, 1} },
7910 .block_erase = spi_block_erase_c7,
7911 }
7912 },
7913 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7914 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7915 .write = spi_chip_write_256,
7916 .read = spi_chip_read, /* also fast read 0x0B */
7917 .voltage = {2700, 3600},
7918 },
7919
7920 {
7921 .vendor = "Intel",
7922 .name = "25F640S33B8",
7923 .bustype = BUS_SPI,
7924 .manufacture_id = INTEL_ID,
7925 .model_id = INTEL_25F640S33B8,
7926 .total_size = 8192,
7927 .page_size = 256,
7928 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7929 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02007930 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007931 .probe = probe_spi_rdid,
7932 .probe_timing = TIMING_ZERO,
7933 .block_erasers =
7934 {
7935 {
7936 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7937 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7938 * have no effect on the memory contents, but sets a flag in the SR.
7939 .eraseblocks = {
7940 {8 * 1024, 8},
7941 {64 * 1024, 127} // inaccessible
7942 },
7943 .block_erase = spi_block_erase_40,
7944 }, { */
7945 .eraseblocks = { {64 * 1024, 128} },
7946 .block_erase = spi_block_erase_d8,
7947 }, {
7948 .eraseblocks = { {8 * 1024 * 1024, 1} },
7949 .block_erase = spi_block_erase_c7,
7950 }
7951 },
7952 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7953 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7954 .write = spi_chip_write_256,
7955 .read = spi_chip_read, /* also fast read 0x0B */
7956 .voltage = {2700, 3600},
7957 },
7958
7959 {
7960 .vendor = "Intel",
7961 .name = "25F640S33T8",
7962 .bustype = BUS_SPI,
7963 .manufacture_id = INTEL_ID,
7964 .model_id = INTEL_25F640S33T8,
7965 .total_size = 8192,
7966 .page_size = 256,
7967 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7968 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7969 .tested = TEST_UNTESTED,
7970 .probe = probe_spi_rdid,
7971 .probe_timing = TIMING_ZERO,
7972 .block_erasers =
7973 {
7974 {
7975 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7976 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7977 * have no effect on the memory contents, but sets a flag in the SR.
7978 .eraseblocks = {
7979 {64 * 1024, 127}, // inaccessible
7980 {8 * 1024, 8}
7981 },
7982 .block_erase = spi_block_erase_40,
7983 }, { */
7984 .eraseblocks = { {64 * 1024, 128} },
7985 .block_erase = spi_block_erase_d8,
7986 }, {
7987 .eraseblocks = { {8 * 1024 * 1024, 1} },
7988 .block_erase = spi_block_erase_c7,
7989 }
7990 },
7991 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7992 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7993 .write = spi_chip_write_256,
7994 .read = spi_chip_read, /* also fast read 0x0B */
7995 .voltage = {2700, 3600},
7996 },
7997
7998 {
7999 .vendor = "Intel",
8000 .name = "28F001BN/BX-B",
8001 .bustype = BUS_PARALLEL,
8002 .manufacture_id = INTEL_ID,
8003 .model_id = INTEL_28F001B,
8004 .total_size = 128,
8005 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8006 .tested = TEST_UNTESTED,
8007 .probe = probe_jedec,
8008 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8009 .block_erasers =
8010 {
8011 {
8012 .eraseblocks = {
8013 {8 * 1024, 1},
8014 {4 * 1024, 2},
8015 {112 * 1024, 1},
8016 },
8017 .block_erase = erase_block_82802ab,
8018 },
8019 },
8020 .write = write_82802ab,
8021 .read = read_memmapped,
8022 .voltage = {4500, 5500},
8023 },
8024
8025 {
8026 .vendor = "Intel",
8027 .name = "28F001BN/BX-T",
8028 .bustype = BUS_PARALLEL,
8029 .manufacture_id = INTEL_ID,
8030 .model_id = INTEL_28F001T,
8031 .total_size = 128,
8032 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
8033 .tested = TEST_OK_PREW,
8034 .probe = probe_jedec,
8035 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8036 .block_erasers =
8037 {
8038 {
8039 .eraseblocks = {
8040 {112 * 1024, 1},
8041 {4 * 1024, 2},
8042 {8 * 1024, 1},
8043 },
8044 .block_erase = erase_block_82802ab,
8045 },
8046 },
8047 .write = write_82802ab,
8048 .read = read_memmapped,
8049 .voltage = {4500, 5500},
8050 },
8051
8052 {
8053 .vendor = "Intel",
8054 .name = "28F002BC/BL/BV/BX-T",
8055 .bustype = BUS_PARALLEL,
8056 .manufacture_id = INTEL_ID,
8057 .model_id = INTEL_28F002T,
8058 .total_size = 256,
8059 .page_size = 256 * 1024,
8060 .tested = TEST_OK_PRE,
8061 .probe = probe_82802ab,
8062 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8063 .block_erasers =
8064 {
8065 {
8066 .eraseblocks = {
8067 {128 * 1024, 1},
8068 {96 * 1024, 1},
8069 {8 * 1024, 2},
8070 {16 * 1024, 1},
8071 },
8072 .block_erase = erase_block_82802ab,
8073 },
8074 },
8075 .write = write_82802ab,
8076 .read = read_memmapped,
8077 },
8078
8079 {
8080 .vendor = "Intel",
8081 .name = "28F004B5/BE/BV/BX-B",
8082 .bustype = BUS_PARALLEL,
8083 .manufacture_id = INTEL_ID,
8084 .model_id = INTEL_28F004B,
8085 .total_size = 512,
8086 .page_size = 128 * 1024, /* maximal block size */
8087 .tested = TEST_UNTESTED,
8088 .probe = probe_82802ab,
8089 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8090 .block_erasers =
8091 {
8092 {
8093 .eraseblocks = {
8094 {16 * 1024, 1},
8095 {8 * 1024, 2},
8096 {96 * 1024, 1},
8097 {128 * 1024, 3},
8098 },
8099 .block_erase = erase_block_82802ab,
8100 },
8101 },
8102 .write = write_82802ab,
8103 .read = read_memmapped,
8104 },
8105
8106 {
8107 .vendor = "Intel",
8108 .name = "28F004B5/BE/BV/BX-T",
8109 .bustype = BUS_PARALLEL,
8110 .manufacture_id = INTEL_ID,
8111 .model_id = INTEL_28F004T,
8112 .total_size = 512,
8113 .page_size = 128 * 1024, /* maximal block size */
8114 .tested = TEST_UNTESTED,
8115 .probe = probe_82802ab,
8116 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8117 .block_erasers =
8118 {
8119 {
8120 .eraseblocks = {
8121 {128 * 1024, 3},
8122 {96 * 1024, 1},
8123 {8 * 1024, 2},
8124 {16 * 1024, 1},
8125 },
8126 .block_erase = erase_block_82802ab,
8127 },
8128 },
8129 .write = write_82802ab,
8130 .read = read_memmapped,
8131 },
8132
8133 {
8134 .vendor = "Intel",
8135 .name = "28F008S3/S5/SC",
8136 .bustype = BUS_PARALLEL,
8137 .manufacture_id = INTEL_ID,
8138 .model_id = INTEL_28F004S3,
8139 .total_size = 512,
8140 .page_size = 256,
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 = { {64 * 1024, 8} },
8148 .block_erase = erase_block_82802ab,
8149 },
8150 },
8151 .unlock = unlock_28f004s5,
8152 .write = write_82802ab,
8153 .read = read_memmapped,
8154 },
8155
8156 {
8157 .vendor = "Intel",
8158 .name = "28F400BV/BX/CE/CV-B",
8159 .bustype = BUS_PARALLEL,
8160 .manufacture_id = INTEL_ID,
8161 .model_id = INTEL_28F400B,
8162 .total_size = 512,
8163 .page_size = 128 * 1024, /* maximal block size */
8164 .feature_bits = FEATURE_ADDR_SHIFTED,
8165 .tested = TEST_UNTESTED,
8166 .probe = probe_82802ab,
8167 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8168 .block_erasers =
8169 {
8170 {
8171 .eraseblocks = {
8172 {16 * 1024, 1},
8173 {8 * 1024, 2},
8174 {96 * 1024, 1},
8175 {128 * 1024, 3},
8176 },
8177 .block_erase = erase_block_82802ab,
8178 },
8179 },
8180 .write = write_82802ab,
8181 .read = read_memmapped,
8182 },
8183
8184 {
8185 .vendor = "Intel",
8186 .name = "28F400BV/BX/CE/CV-T",
8187 .bustype = BUS_PARALLEL,
8188 .manufacture_id = INTEL_ID,
8189 .model_id = INTEL_28F400T,
8190 .total_size = 512,
8191 .page_size = 128 * 1024, /* maximal block size */
8192 .feature_bits = FEATURE_ADDR_SHIFTED,
8193 .tested = TEST_UNTESTED,
8194 .probe = probe_82802ab,
8195 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8196 .block_erasers =
8197 {
8198 {
8199 .eraseblocks = {
8200 {128 * 1024, 3},
8201 {96 * 1024, 1},
8202 {8 * 1024, 2},
8203 {16 * 1024, 1},
8204 },
8205 .block_erase = erase_block_82802ab,
8206 },
8207 },
8208 .write = write_82802ab,
8209 .read = read_memmapped,
8210 },
8211
8212 {
8213 .vendor = "Intel",
8214 .name = "82802AB",
8215 .bustype = BUS_FWH,
8216 .manufacture_id = INTEL_ID,
8217 .model_id = INTEL_82802AB,
8218 .total_size = 512,
8219 .page_size = 64 * 1024,
8220 .feature_bits = FEATURE_REGISTERMAP,
Alan Green88552572019-07-24 13:56:06 +10008221 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008222 .probe = probe_82802ab,
8223 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8224 .block_erasers =
8225 {
8226 {
8227 .eraseblocks = { {64 * 1024, 8} },
8228 .block_erase = erase_block_82802ab,
8229 },
8230 },
8231 .unlock = unlock_regspace2_uniform_64k,
8232 .write = write_82802ab,
8233 .read = read_memmapped,
8234 .voltage = {3000, 3600},
8235 },
8236
8237 {
8238 .vendor = "Intel",
8239 .name = "82802AC",
8240 .bustype = BUS_FWH,
8241 .manufacture_id = INTEL_ID,
8242 .model_id = INTEL_82802AC,
8243 .total_size = 1024,
8244 .page_size = 64 * 1024,
8245 .feature_bits = FEATURE_REGISTERMAP,
8246 .tested = TEST_OK_PR,
8247 .probe = probe_82802ab,
8248 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8249 .block_erasers =
8250 {
8251 {
8252 .eraseblocks = { {64 * 1024, 16} },
8253 .block_erase = erase_block_82802ab,
8254 },
8255 },
8256 .unlock = unlock_regspace2_uniform_64k,
8257 .write = write_82802ab,
8258 .read = read_memmapped,
8259 .voltage = {3000, 3600},
8260 },
8261
8262 {
8263 .vendor = "Macronix",
8264 .name = "MX23L12854",
8265 .bustype = BUS_SPI,
8266 .manufacture_id = MACRONIX_ID,
8267 .model_id = MACRONIX_MX23L12854,
8268 .total_size = 16384,
8269 .page_size = 256,
8270 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8271 .probe = probe_spi_rdid,
8272 .probe_timing = TIMING_ZERO,
8273 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8274 .read = spi_chip_read, /* Fast read (0x0B) supported */
8275 .voltage = {3000, 3600},
8276 },
8277
8278 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008279 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008280 .name = "MX23L1654",
8281 .bustype = BUS_SPI,
8282 .manufacture_id = MACRONIX_ID,
8283 .model_id = MACRONIX_MX23L1654,
8284 .total_size = 2048,
8285 .page_size = 256,
8286 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8287 .probe = probe_spi_rdid,
8288 .probe_timing = TIMING_ZERO,
8289 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8290 .read = spi_chip_read, /* Fast read (0x0B) supported */
8291 .voltage = {3000, 3600},
8292 },
8293
8294 {
8295 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008296 .name = "MX23L3254",
8297 .bustype = BUS_SPI,
8298 .manufacture_id = MACRONIX_ID,
8299 .model_id = MACRONIX_MX23L3254,
8300 .total_size = 4096,
8301 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00008302 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008303 .probe = probe_spi_rdid,
8304 .probe_timing = TIMING_ZERO,
8305 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8306 .read = spi_chip_read, /* Fast read (0x0B) supported */
8307 .voltage = {3000, 3600},
8308 },
8309
8310 {
8311 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008312 .name = "MX23L6454",
8313 .bustype = BUS_SPI,
8314 .manufacture_id = MACRONIX_ID,
8315 .model_id = MACRONIX_MX23L6454,
8316 .total_size = 8192,
8317 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008318 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00008319 .probe = probe_spi_rdid,
8320 .probe_timing = TIMING_ZERO,
8321 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8322 .read = spi_chip_read, /* Fast read (0x0B) supported */
8323 .voltage = {3000, 3600},
8324 },
8325
8326 {
8327 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00008328 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008329 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008330 .manufacture_id = MACRONIX_ID,
8331 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008332 .total_size = 128,
8333 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008334 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00008335 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00008336 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008337 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008338 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008339 .block_erasers =
8340 {
8341 {
8342 .eraseblocks = { {4 * 1024, 32} },
8343 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008344 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008345 .eraseblocks = { {64 * 1024, 2} },
8346 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008347 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008348 .eraseblocks = { {128 * 1024, 1} },
8349 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008350 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008351 .eraseblocks = { {128 * 1024, 1} },
8352 .block_erase = spi_block_erase_c7,
8353 },
8354 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008355 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008356 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008357 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008358 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008359 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008360 },
8361
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008362 {
8363 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008364 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008365 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008366 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008367 .model_id = MACRONIX_MX25L12805D,
8368 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008369 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008370 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8371 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008372 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008373 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008374 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008375 .block_erasers =
8376 {
8377 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008378 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008379 .block_erase = spi_block_erase_20,
8380 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008381 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008382 .block_erase = spi_block_erase_d8,
8383 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008384 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008385 .block_erase = spi_block_erase_60,
8386 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008387 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008388 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008389 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008390 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008391 .printlock = spi_prettyprint_status_register_bp3_srwd,
8392 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008393 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008394 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008395 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008396 },
8397
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008398 {
8399 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08008400 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008401 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008402 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008403 .model_id = MACRONIX_MX25L12805D,
8404 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008405 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08008406 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10008407 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner8179be52011-06-04 13:13:34 +00008408 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008409 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008410 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008411 .block_erasers =
8412 {
8413 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008414 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008415 .block_erase = spi_block_erase_20,
8416 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008417 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008418 .block_erase = spi_block_erase_52,
8419 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008420 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008421 .block_erase = spi_block_erase_d8,
8422 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008423 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008424 .block_erase = spi_block_erase_60,
8425 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008426 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008427 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008428 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008429 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008430 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8431 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8432 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008433 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008434 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008435 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008436 },
8437
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008438 {
8439 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008440 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008441 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008442 .manufacture_id = MACRONIX_ID,
8443 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008444 .total_size = 2048,
8445 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008446 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00008447 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008448 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008449 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008450 .block_erasers =
8451 {
8452 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008453 .eraseblocks = { {64 * 1024, 32} },
8454 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008455 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008456 .eraseblocks = { {64 * 1024, 32} },
8457 .block_erase = spi_block_erase_d8,
8458 }, {
8459 .eraseblocks = { {2 * 1024 * 1024, 1} },
8460 .block_erase = spi_block_erase_60,
8461 }, {
8462 .eraseblocks = { {2 * 1024 * 1024, 1} },
8463 .block_erase = spi_block_erase_c7,
8464 },
8465 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008466 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00008467 .unlock = spi_disable_blockprotect,
8468 .write = spi_chip_write_256,
8469 .read = spi_chip_read, /* Fast read (0x0B) supported */
8470 .voltage = {2700, 3600},
8471 },
8472
8473 {
8474 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008475 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008476 .bustype = BUS_SPI,
8477 .manufacture_id = MACRONIX_ID,
8478 .model_id = MACRONIX_MX25L1605,
8479 .total_size = 2048,
8480 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008481 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008482 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8483 .tested = TEST_OK_PREW,
8484 .probe = probe_spi_rdid,
8485 .probe_timing = TIMING_ZERO,
8486 .block_erasers =
8487 {
8488 {
8489 .eraseblocks = { {4 * 1024, 512} },
8490 .block_erase = spi_block_erase_20,
8491 }, {
8492 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008493 .block_erase = spi_block_erase_52,
8494 }, {
8495 .eraseblocks = { {64 * 1024, 32} },
8496 .block_erase = spi_block_erase_d8,
8497 }, {
8498 .eraseblocks = { {2 * 1024 * 1024, 1} },
8499 .block_erase = spi_block_erase_60,
8500 }, {
8501 .eraseblocks = { {2 * 1024 * 1024, 1} },
8502 .block_erase = spi_block_erase_c7,
8503 },
8504 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008505 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008506 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008507 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008508 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008509 .voltage = {2700, 3600},
8510 },
8511
8512 {
8513 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008514 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008515 .bustype = BUS_SPI,
8516 .manufacture_id = MACRONIX_ID,
8517 .model_id = MACRONIX_MX25L1605,
8518 .total_size = 2048,
8519 .page_size = 256,
8520 .feature_bits = FEATURE_WRSR_WREN,
8521 .tested = TEST_OK_PREW,
8522 .probe = probe_spi_rdid,
8523 .probe_timing = TIMING_ZERO,
8524 .block_erasers =
8525 {
8526 {
8527 .eraseblocks = { {4 * 1024, 512} },
8528 .block_erase = spi_block_erase_20,
8529 }, {
8530 .eraseblocks = { {64 * 1024, 32} },
8531 .block_erase = spi_block_erase_d8,
8532 }, {
8533 .eraseblocks = { {2 * 1024 * 1024, 1} },
8534 .block_erase = spi_block_erase_60,
8535 }, {
8536 .eraseblocks = { {2 * 1024 * 1024, 1} },
8537 .block_erase = spi_block_erase_c7,
8538 },
8539 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008540 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008541 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008542 .write = spi_chip_write_256,
8543 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008544 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008545 },
8546
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008547 {
8548 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008549 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008550 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008551 .manufacture_id = MACRONIX_ID,
8552 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008553 .total_size = 2048,
8554 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008555 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8556 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Ponsc2054872021-01-15 18:57:32 +01008557 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008558 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008559 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008560 .block_erasers =
8561 {
8562 {
8563 .eraseblocks = { {4 * 1024, 512} },
8564 .block_erase = spi_block_erase_20,
8565 }, {
8566 .eraseblocks = { {64 * 1024, 32} },
8567 .block_erase = spi_block_erase_d8,
8568 }, {
8569 .eraseblocks = { {2 * 1024 * 1024, 1} },
8570 .block_erase = spi_block_erase_60,
8571 }, {
8572 .eraseblocks = { {2 * 1024 * 1024, 1} },
8573 .block_erase = spi_block_erase_c7,
8574 }
8575 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008576 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008577 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008578 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008579 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008580 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008581 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00008582
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008583 {
8584 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00008585 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008586 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008587 .manufacture_id = MACRONIX_ID,
8588 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008589 .total_size = 2048,
8590 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008591 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8592 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008593 .tested = TEST_UNTESTED,
8594 .probe = probe_spi_rdid,
8595 .probe_timing = TIMING_ZERO,
8596 .block_erasers =
8597 {
8598 {
8599 .eraseblocks = { {4 * 1024, 512} },
8600 .block_erase = spi_block_erase_20,
8601 }, {
8602 .eraseblocks = { {64 * 1024, 32} },
8603 .block_erase = spi_block_erase_d8,
8604 }, {
8605 .eraseblocks = { {2 * 1024 * 1024, 1} },
8606 .block_erase = spi_block_erase_60,
8607 }, {
8608 .eraseblocks = { {2 * 1024 * 1024, 1} },
8609 .block_erase = spi_block_erase_c7,
8610 }
8611 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008612 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008613 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008614 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008615 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008616 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00008617 },
8618
8619 {
8620 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008621 .name = "MX25L2005(C)/MX25L2006E",
8622 .bustype = BUS_SPI,
8623 .manufacture_id = MACRONIX_ID,
8624 .model_id = MACRONIX_MX25L2005,
8625 .total_size = 256,
8626 .page_size = 256,
8627 .feature_bits = FEATURE_WRSR_WREN,
8628 .tested = TEST_OK_PREW,
8629 .probe = probe_spi_rdid,
8630 .probe_timing = TIMING_ZERO,
8631 .block_erasers =
8632 {
8633 {
8634 .eraseblocks = { {4 * 1024, 64} },
8635 .block_erase = spi_block_erase_20,
8636 }, {
8637 .eraseblocks = { {64 * 1024, 4} },
8638 .block_erase = spi_block_erase_52,
8639 }, {
8640 .eraseblocks = { {64 * 1024, 4} },
8641 .block_erase = spi_block_erase_d8,
8642 }, {
8643 .eraseblocks = { {256 * 1024, 1} },
8644 .block_erase = spi_block_erase_60,
8645 }, {
8646 .eraseblocks = { {256 * 1024, 1} },
8647 .block_erase = spi_block_erase_c7,
8648 },
8649 },
8650 .printlock = spi_prettyprint_status_register_bp1_srwd,
8651 .unlock = spi_disable_blockprotect,
8652 .write = spi_chip_write_256,
8653 .read = spi_chip_read, /* Fast read (0x0B) supported */
8654 .voltage = {2700, 3600},
8655 },
8656
8657 {
8658 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10008659 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008660 .bustype = BUS_SPI,
8661 .manufacture_id = MACRONIX_ID,
8662 .model_id = MACRONIX_MX25L25635F,
8663 .total_size = 32768,
8664 .page_size = 256,
8665 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8666 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8667 .tested = TEST_OK_PREW,
8668 .probe = probe_spi_rdid,
8669 .probe_timing = TIMING_ZERO,
8670 .block_erasers =
8671 {
8672 {
8673 .eraseblocks = { {4 * 1024, 8192} },
8674 .block_erase = spi_block_erase_21,
8675 }, {
8676 .eraseblocks = { {4 * 1024, 8192} },
8677 .block_erase = spi_block_erase_20,
8678 }, {
8679 .eraseblocks = { {32 * 1024, 1024} },
8680 .block_erase = spi_block_erase_5c,
8681 }, {
8682 .eraseblocks = { {32 * 1024, 1024} },
8683 .block_erase = spi_block_erase_52,
8684 }, {
8685 .eraseblocks = { {64 * 1024, 512} },
8686 .block_erase = spi_block_erase_dc,
8687 }, {
8688 .eraseblocks = { {64 * 1024, 512} },
8689 .block_erase = spi_block_erase_d8,
8690 }, {
8691 .eraseblocks = { {32 * 1024 * 1024, 1} },
8692 .block_erase = spi_block_erase_60,
8693 }, {
8694 .eraseblocks = { {32 * 1024 * 1024, 1} },
8695 .block_erase = spi_block_erase_c7,
8696 }
8697 },
8698 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8699 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8700 .unlock = spi_disable_blockprotect_bp3_srwd,
8701 .write = spi_chip_write_256,
8702 .read = spi_chip_read, /* Fast read (0x0B) supported */
8703 .voltage = {2700, 3600},
8704 },
8705
8706 {
8707 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00008708 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008709 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008710 .manufacture_id = MACRONIX_ID,
8711 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008712 .total_size = 4096,
8713 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008714 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00008715 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008716 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008717 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008718 .block_erasers =
8719 {
8720 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008721 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008722 .block_erase = spi_block_erase_20,
8723 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008724 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008725 .block_erase = spi_block_erase_d8,
8726 }, {
8727 .eraseblocks = { {4 * 1024 * 1024, 1} },
8728 .block_erase = spi_block_erase_60,
8729 }, {
8730 .eraseblocks = { {4 * 1024 * 1024, 1} },
8731 .block_erase = spi_block_erase_c7,
8732 },
8733 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008734 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008735 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008736 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008737 .read = spi_chip_read, /* Fast read (0x0B) supported */
8738 .voltage = {2700, 3600},
8739 },
8740
8741 {
8742 .vendor = "Macronix",
8743 .name = "MX25L3205D/MX25L3208D",
8744 .bustype = BUS_SPI,
8745 .manufacture_id = MACRONIX_ID,
8746 .model_id = MACRONIX_MX25L3205,
8747 .total_size = 4096,
8748 .page_size = 256,
8749 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8750 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8751 .tested = TEST_OK_PREW,
8752 .probe = probe_spi_rdid,
8753 .probe_timing = TIMING_ZERO,
8754 .block_erasers =
8755 {
8756 {
8757 .eraseblocks = { {4 * 1024, 1024} },
8758 .block_erase = spi_block_erase_20,
8759 }, {
8760 .eraseblocks = { {64 * 1024, 64} },
8761 .block_erase = spi_block_erase_d8,
8762 }, {
8763 .eraseblocks = { {4 * 1024 * 1024, 1} },
8764 .block_erase = spi_block_erase_60,
8765 }, {
8766 .eraseblocks = { {4 * 1024 * 1024, 1} },
8767 .block_erase = spi_block_erase_c7,
8768 },
8769 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008770 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008771 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008772 .write = spi_chip_write_256,
8773 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8774 .voltage = {2700, 3600},
8775 },
8776
8777 {
8778 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008779 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008780 .bustype = BUS_SPI,
8781 .manufacture_id = MACRONIX_ID,
8782 .model_id = MACRONIX_MX25L3205,
8783 .total_size = 4096,
8784 .page_size = 256,
8785 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8786 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8787 .tested = TEST_OK_PREW,
8788 .probe = probe_spi_rdid,
8789 .probe_timing = TIMING_ZERO,
8790 .block_erasers =
8791 {
8792 {
8793 .eraseblocks = { {4 * 1024, 1024} },
8794 .block_erase = spi_block_erase_20,
8795 }, {
8796 .eraseblocks = { {64 * 1024, 64} },
8797 .block_erase = spi_block_erase_d8,
8798 }, {
8799 .eraseblocks = { {64 * 1024, 64} },
8800 .block_erase = spi_block_erase_52,
8801 }, {
8802 .eraseblocks = { {4 * 1024 * 1024, 1} },
8803 .block_erase = spi_block_erase_60,
8804 }, {
8805 .eraseblocks = { {4 * 1024 * 1024, 1} },
8806 .block_erase = spi_block_erase_c7,
8807 },
8808 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008809 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008810 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008811 .write = spi_chip_write_256,
8812 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008813 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008814 },
8815
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008816 {
8817 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008818 .name = "MX25L3235D",
8819 .bustype = BUS_SPI,
8820 .manufacture_id = MACRONIX_ID,
8821 .model_id = MACRONIX_MX25L3235D,
8822 .total_size = 4096,
8823 .page_size = 256,
8824 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
8825 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8826 .tested = TEST_UNTESTED,
8827 .probe = probe_spi_rdid,
8828 .probe_timing = TIMING_ZERO,
8829 .block_erasers =
8830 {
8831 {
8832 .eraseblocks = { {4 * 1024, 1024} },
8833 .block_erase = spi_block_erase_20,
8834 }, {
8835 .eraseblocks = { {64 * 1024, 64} },
8836 .block_erase = spi_block_erase_d8,
8837 }, {
8838 .eraseblocks = { {4 * 1024 * 1024, 1} },
8839 .block_erase = spi_block_erase_60,
8840 }, {
8841 .eraseblocks = { {4 * 1024 * 1024, 1} },
8842 .block_erase = spi_block_erase_c7,
8843 }
8844 },
8845 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8846 .unlock = spi_disable_blockprotect_bp3_srwd,
8847 .write = spi_chip_write_256,
8848 .read = spi_chip_read,
8849 .voltage = {2700, 3600},
8850 },
8851
8852 {
8853 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02008854 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008855 .bustype = BUS_SPI,
8856 .manufacture_id = MACRONIX_ID,
8857 .model_id = MACRONIX_MX25L3205,
8858 .total_size = 4096,
8859 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02008860 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008861 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008862 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008863 .probe = probe_spi_rdid,
8864 .probe_timing = TIMING_ZERO,
8865 .block_erasers =
8866 {
8867 {
8868 .eraseblocks = { {4 * 1024, 1024} },
8869 .block_erase = spi_block_erase_20,
8870 }, {
8871 .eraseblocks = { {32 * 1024, 128} },
8872 .block_erase = spi_block_erase_52,
8873 }, {
8874 .eraseblocks = { {64 * 1024, 64} },
8875 .block_erase = spi_block_erase_d8,
8876 }, {
8877 .eraseblocks = { {4 * 1024 * 1024, 1} },
8878 .block_erase = spi_block_erase_60,
8879 }, {
8880 .eraseblocks = { {4 * 1024 * 1024, 1} },
8881 .block_erase = spi_block_erase_c7,
8882 },
8883 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008884 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008885 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008886 .write = spi_chip_write_256,
8887 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Nico Huberb6683e02021-04-21 13:04:29 +02008888 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008889 },
8890
8891 {
8892 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008893 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008894 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008895 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008896 .model_id = MACRONIX_MX25L4005,
8897 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008898 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008899 .feature_bits = FEATURE_WRSR_WREN,
8900 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008901 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008902 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008903 .block_erasers =
8904 {
8905 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008906 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00008907 .block_erase = spi_block_erase_20,
8908 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008909 .eraseblocks = { {64 * 1024, 8} },
8910 .block_erase = spi_block_erase_52,
8911 }, {
8912 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00008913 .block_erase = spi_block_erase_d8,
8914 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008915 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00008916 .block_erase = spi_block_erase_60,
8917 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008918 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00008919 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008920 },
Sean Nelson54596372010-01-09 05:30:14 +00008921 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008922 .printlock = spi_prettyprint_status_register_bp2_srwd,
8923 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008924 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008925 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008926 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008927 },
8928
8929 {
8930 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008931 .name = "MX25L512(E)/MX25V512(C)",
8932 .bustype = BUS_SPI,
8933 .manufacture_id = MACRONIX_ID,
8934 .model_id = MACRONIX_MX25L512,
8935 .total_size = 64,
8936 .page_size = 256,
8937 /* MX25L512E supports SFDP */
8938 .feature_bits = FEATURE_WRSR_WREN,
8939 .tested = TEST_OK_PREW,
8940 .probe = probe_spi_rdid,
8941 .probe_timing = TIMING_ZERO,
8942 .block_erasers =
8943 {
8944 {
8945 .eraseblocks = { {4 * 1024, 16} },
8946 .block_erase = spi_block_erase_20,
8947 }, {
8948 .eraseblocks = { {64 * 1024, 1} },
8949 .block_erase = spi_block_erase_52,
8950 }, {
8951 .eraseblocks = { {64 * 1024, 1} },
8952 .block_erase = spi_block_erase_d8,
8953 }, {
8954 .eraseblocks = { {64 * 1024, 1} },
8955 .block_erase = spi_block_erase_60,
8956 }, {
8957 .eraseblocks = { {64 * 1024, 1} },
8958 .block_erase = spi_block_erase_c7,
8959 },
8960 },
8961 .printlock = spi_prettyprint_status_register_bp1_srwd,
8962 .unlock = spi_disable_blockprotect,
8963 .write = spi_chip_write_256,
8964 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
8965 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
8966 },
8967
8968 {
8969 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02008970 .name = "MX25L5121E",
8971 .bustype = BUS_SPI,
8972 .manufacture_id = MACRONIX_ID,
8973 .model_id = MACRONIX_MX25L5121E,
8974 .total_size = 64,
8975 .page_size = 32,
8976 .feature_bits = FEATURE_WRSR_WREN,
8977 .tested = TEST_OK_PREW,
8978 .probe = probe_spi_rdid,
8979 .probe_timing = TIMING_ZERO,
8980 .block_erasers =
8981 {
8982 {
8983 .eraseblocks = { {4 * 1024, 16} },
8984 .block_erase = spi_block_erase_20,
8985 }, {
8986 .eraseblocks = { {64 * 1024, 1} },
8987 .block_erase = spi_block_erase_52,
8988 }, {
8989 .eraseblocks = { {64 * 1024, 1} },
8990 .block_erase = spi_block_erase_d8,
8991 }, {
8992 .eraseblocks = { {64 * 1024, 1} },
8993 .block_erase = spi_block_erase_60,
8994 }, {
8995 .eraseblocks = { {64 * 1024, 1} },
8996 .block_erase = spi_block_erase_c7,
8997 },
8998 },
8999 .printlock = spi_prettyprint_status_register_bp1_srwd,
9000 .unlock = spi_disable_blockprotect,
9001 .write = spi_chip_write_256,
9002 .read = spi_chip_read, /* Fast read (0x0B) supported */
9003 .voltage = {2700, 3600},
9004 },
9005
9006 {
9007 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009008 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009009 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009010 .manufacture_id = MACRONIX_ID,
9011 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009012 .total_size = 8192,
9013 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009014 /* Has an additional 512B EEPROM sector */
9015 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00009016 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009017 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009018 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009019 .block_erasers =
9020 {
9021 {
9022 .eraseblocks = { {64 * 1024, 128} },
9023 .block_erase = spi_block_erase_20,
9024 }, {
9025 .eraseblocks = { {64 * 1024, 128} },
9026 .block_erase = spi_block_erase_d8,
9027 }, {
9028 .eraseblocks = { {8 * 1024 * 1024, 1} },
9029 .block_erase = spi_block_erase_60,
9030 }, {
9031 .eraseblocks = { {8 * 1024 * 1024, 1} },
9032 .block_erase = spi_block_erase_c7,
9033 }
9034 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009035 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009036 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009037 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009038 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009039 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009040 },
9041
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009042 {
9043 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009044 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00009045 .bustype = BUS_SPI,
9046 .manufacture_id = MACRONIX_ID,
9047 .model_id = MACRONIX_MX25L6405,
9048 .total_size = 8192,
9049 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009050 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009051 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9052 .tested = TEST_OK_PREW,
9053 .probe = probe_spi_rdid,
9054 .probe_timing = TIMING_ZERO,
9055 .block_erasers =
9056 {
9057 {
9058 .eraseblocks = { {4 * 1024, 2048} },
9059 .block_erase = spi_block_erase_20,
9060 }, {
9061 .eraseblocks = { {64 * 1024, 128} },
9062 .block_erase = spi_block_erase_d8,
9063 }, {
9064 .eraseblocks = { {8 * 1024 * 1024, 1} },
9065 .block_erase = spi_block_erase_60,
9066 }, {
9067 .eraseblocks = { {8 * 1024 * 1024, 1} },
9068 .block_erase = spi_block_erase_c7,
9069 }
9070 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009071 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009072 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009073 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009074 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00009075 .voltage = {2700, 3600},
9076 },
9077
9078 {
9079 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009080 .name = "MX25L6406E/MX25L6408E",
9081 .bustype = BUS_SPI,
9082 .manufacture_id = MACRONIX_ID,
9083 .model_id = MACRONIX_MX25L6405,
9084 .total_size = 8192,
9085 .page_size = 256,
9086 /* MX25L6406E supports SFDP */
9087 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
9088 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9089 .tested = TEST_OK_PREW,
9090 .probe = probe_spi_rdid,
9091 .probe_timing = TIMING_ZERO,
9092 .block_erasers =
9093 {
9094 {
9095 .eraseblocks = { {4 * 1024, 2048} },
9096 .block_erase = spi_block_erase_20,
9097 }, {
9098 .eraseblocks = { {64 * 1024, 128} },
9099 .block_erase = spi_block_erase_52,
9100 }, {
9101 .eraseblocks = { {64 * 1024, 128} },
9102 .block_erase = spi_block_erase_d8,
9103 }, {
9104 .eraseblocks = { {8 * 1024 * 1024, 1} },
9105 .block_erase = spi_block_erase_60,
9106 }, {
9107 .eraseblocks = { {8 * 1024 * 1024, 1} },
9108 .block_erase = spi_block_erase_c7,
9109 }
9110 },
9111 .printlock = spi_prettyprint_status_register_bp3_srwd,
9112 .unlock = spi_disable_blockprotect_bp3_srwd,
9113 .write = spi_chip_write_256,
9114 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
9115 .voltage = {2700, 3600},
9116 },
9117
9118 {
9119 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01009120 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00009121 .bustype = BUS_SPI,
9122 .manufacture_id = MACRONIX_ID,
9123 .model_id = MACRONIX_MX25L6405,
9124 .total_size = 8192,
9125 .page_size = 256,
9126 /* supports SFDP */
9127 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9128 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9129 .tested = TEST_OK_PREW,
9130 .probe = probe_spi_rdid,
9131 .probe_timing = TIMING_ZERO,
9132 .block_erasers =
9133 {
9134 {
9135 .eraseblocks = { {4 * 1024, 2048} },
9136 .block_erase = spi_block_erase_20,
9137 }, {
9138 .eraseblocks = { {32 * 1024, 256} },
9139 .block_erase = spi_block_erase_52,
9140 }, {
9141 .eraseblocks = { {64 * 1024, 128} },
9142 .block_erase = spi_block_erase_d8,
9143 }, {
9144 .eraseblocks = { {8 * 1024 * 1024, 1} },
9145 .block_erase = spi_block_erase_60,
9146 }, {
9147 .eraseblocks = { {8 * 1024 * 1024, 1} },
9148 .block_erase = spi_block_erase_c7,
9149 }
9150 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009151 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009152 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009153 .write = spi_chip_write_256,
9154 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9155 .voltage = {2700, 3600},
9156 },
9157
9158 {
9159 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009160 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009161 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009162 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009163 .model_id = MACRONIX_MX25L6495F,
9164 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009165 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009166 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009167 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009168 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009169 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009170 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009171 .block_erasers =
9172 {
9173 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009174 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +00009175 .block_erase = spi_block_erase_20,
9176 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009177 .eraseblocks = { {64 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00009178 .block_erase = spi_block_erase_d8,
9179 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009180 .eraseblocks = { {32 * 1024, 256} },
9181 .block_erase = spi_block_erase_52,
9182 }, {
9183 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009184 .block_erase = spi_block_erase_60,
9185 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009186 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009187 .block_erase = spi_block_erase_c7,
9188 }
9189 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009190 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009191 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009192 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009193 .voltage = {2700, 3600},
9194 },
9195
9196 {
9197 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009198 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +00009199 .bustype = BUS_SPI,
9200 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009201 .model_id = MACRONIX_MX25L8005,
9202 .total_size = 1024,
9203 .page_size = 256,
9204 /* MX25L8006E, MX25L8008E support SFDP */
9205 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
9206 .feature_bits = FEATURE_WRSR_WREN,
9207 .tested = TEST_OK_PREW,
9208 .probe = probe_spi_rdid,
9209 .probe_timing = TIMING_ZERO,
9210 .block_erasers =
9211 {
9212 {
9213 .eraseblocks = { {4 * 1024, 256} },
9214 .block_erase = spi_block_erase_20,
9215 }, {
9216 .eraseblocks = { {64 * 1024, 16} },
9217 .block_erase = spi_block_erase_52,
9218 }, {
9219 .eraseblocks = { {64 * 1024, 16} },
9220 .block_erase = spi_block_erase_d8,
9221 }, {
9222 .eraseblocks = { {1024 * 1024, 1} },
9223 .block_erase = spi_block_erase_60,
9224 }, {
9225 .eraseblocks = { {1024 * 1024, 1} },
9226 .block_erase = spi_block_erase_c7,
9227 },
9228 },
9229 .printlock = spi_prettyprint_status_register_bp2_srwd,
9230 .unlock = spi_disable_blockprotect,
9231 .write = spi_chip_write_256,
9232 .read = spi_chip_read, /* Fast read (0x0B) supported */
9233 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9234 },
9235
9236 {
9237 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +09009238 .name = "MX25R3235F",
9239 .bustype = BUS_SPI,
9240 .manufacture_id = MACRONIX_ID,
9241 .model_id = MACRONIX_MX25R3235F,
9242 .total_size = 4096,
9243 .page_size = 256,
9244 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9245 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9246 .tested = TEST_OK_PREW,
9247 .probe = probe_spi_rdid,
9248 .probe_timing = TIMING_ZERO,
9249 .block_erasers =
9250 {
9251 {
9252 .eraseblocks = { {4 * 1024, 1024} },
9253 .block_erase = spi_block_erase_20,
9254 }, {
9255 .eraseblocks = { {64 * 1024, 64} },
9256 .block_erase = spi_block_erase_d8,
9257 }, {
9258 .eraseblocks = { {32 * 1024, 128} },
9259 .block_erase = spi_block_erase_52,
9260 }, {
9261 .eraseblocks = { {4 * 1024 * 1024, 1} },
9262 .block_erase = spi_block_erase_60,
9263 }, {
9264 .eraseblocks = { {4 * 1024 * 1024, 1} },
9265 .block_erase = spi_block_erase_c7,
9266 }
9267 },
9268 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit 6 is quad enable */
9269 .unlock = spi_disable_blockprotect_bp3_srwd,
9270 .write = spi_chip_write_256,
9271 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9272 .voltage = {1650, 3600},
9273 },
9274
9275 {
9276 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009277 .name = "MX25R6435F",
9278 .bustype = BUS_SPI,
9279 .manufacture_id = MACRONIX_ID,
9280 .model_id = MACRONIX_MX25R6435F,
9281 .total_size = 8192,
9282 .page_size = 256,
9283 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9284 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9285 .tested = TEST_OK_PREW,
9286 .probe = probe_spi_rdid,
9287 .probe_timing = TIMING_ZERO,
9288 .block_erasers =
9289 {
9290 {
9291 .eraseblocks = { {4 * 1024, 2048} },
9292 .block_erase = spi_block_erase_20,
9293 }, {
9294 .eraseblocks = { {64 * 1024, 128} },
9295 .block_erase = spi_block_erase_d8,
9296 }, {
9297 .eraseblocks = { {32 * 1024, 256} },
9298 .block_erase = spi_block_erase_52,
9299 }, {
9300 .eraseblocks = { {8 * 1024 * 1024, 1} },
9301 .block_erase = spi_block_erase_60,
9302 }, {
9303 .eraseblocks = { {8 * 1024 * 1024, 1} },
9304 .block_erase = spi_block_erase_c7,
9305 }
9306 },
9307 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9308 .unlock = spi_disable_blockprotect_bp3_srwd,
9309 .write = spi_chip_write_256,
9310 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9311 .voltage = {1650, 3600},
9312 },
9313
9314 {
9315 .vendor = "Macronix",
9316 .name = "MX25U12835F",
9317 .bustype = BUS_SPI,
9318 .manufacture_id = MACRONIX_ID,
9319 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009320 .total_size = 16384,
9321 .page_size = 256,
9322 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009323 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009324 .tested = TEST_OK_PREW,
9325 .probe = probe_spi_rdid,
9326 .probe_timing = TIMING_ZERO,
9327 .block_erasers =
9328 {
9329 {
9330 .eraseblocks = { {4 * 1024, 4096} },
9331 .block_erase = spi_block_erase_20,
9332 }, {
9333 .eraseblocks = { {32 * 1024, 512} },
9334 .block_erase = spi_block_erase_52,
9335 }, {
9336 .eraseblocks = { {64 * 1024, 256} },
9337 .block_erase = spi_block_erase_d8,
9338 }, {
9339 .eraseblocks = { {16 * 1024 * 1024, 1} },
9340 .block_erase = spi_block_erase_60,
9341 }, {
9342 .eraseblocks = { {16 * 1024 * 1024, 1} },
9343 .block_erase = spi_block_erase_c7,
9344 }
9345 },
Angel Ponsf112e242018-09-30 20:14:17 +02009346 /* TODO: security register */
9347 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9348 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009349 .write = spi_chip_write_256, /* Multi I/O supported */
Angel Ponsf112e242018-09-30 20:14:17 +02009350 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9351 .voltage = {1650, 2000},
9352 },
9353
9354 {
9355 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00009356 .name = "MX25U1635E",
9357 .bustype = BUS_SPI,
9358 .manufacture_id = MACRONIX_ID,
9359 .model_id = MACRONIX_MX25U1635E,
9360 .total_size = 2048,
9361 .page_size = 256,
9362 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9363 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9364 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009365 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00009366 .probe = probe_spi_rdid,
9367 .probe_timing = TIMING_ZERO,
9368 .block_erasers =
9369 {
9370 {
9371 .eraseblocks = { {4 * 1024, 512} },
9372 .block_erase = spi_block_erase_20,
9373 }, {
9374 .eraseblocks = { {32 * 1024, 64} },
9375 .block_erase = spi_block_erase_52,
9376 }, {
9377 .eraseblocks = { {64 * 1024, 32} },
9378 .block_erase = spi_block_erase_d8,
9379 }, {
9380 .eraseblocks = { {2 * 1024 * 1024, 1} },
9381 .block_erase = spi_block_erase_60,
9382 }, {
9383 .eraseblocks = { {2 * 1024 * 1024, 1} },
9384 .block_erase = spi_block_erase_c7,
9385 }
9386 },
9387 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00009388 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009389 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00009390 .write = spi_chip_write_256,
9391 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9392 .voltage = {1650, 2000},
9393 },
9394
9395 {
9396 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07009397 .name = "MX25U25635F",
9398 .bustype = BUS_SPI,
9399 .manufacture_id = MACRONIX_ID,
9400 .model_id = MACRONIX_MX25U25635F,
9401 .total_size = 32768,
9402 .page_size = 256,
9403 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9404 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
Nikolai Artemiev148254b2021-03-23 17:21:10 +11009405 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009406 .probe = probe_spi_rdid,
9407 .probe_timing = TIMING_ZERO,
9408 .block_erasers =
9409 {
9410 {
9411 .eraseblocks = { {4 * 1024, 8192} },
9412 .block_erase = spi_block_erase_21,
9413 }, {
9414 .eraseblocks = { {4 * 1024, 8192} },
9415 .block_erase = spi_block_erase_20,
9416 }, {
9417 .eraseblocks = { {32 * 1024, 1024} },
9418 .block_erase = spi_block_erase_5c,
9419 }, {
9420 .eraseblocks = { {32 * 1024, 1024} },
9421 .block_erase = spi_block_erase_52,
9422 }, {
9423 .eraseblocks = { {64 * 1024, 512} },
9424 .block_erase = spi_block_erase_dc,
9425 }, {
9426 .eraseblocks = { {64 * 1024, 512} },
9427 .block_erase = spi_block_erase_d8,
9428 }, {
9429 .eraseblocks = { {32 * 1024 * 1024, 1} },
9430 .block_erase = spi_block_erase_60,
9431 }, {
9432 .eraseblocks = { {32 * 1024 * 1024, 1} },
9433 .block_erase = spi_block_erase_c7,
9434 }
9435 },
9436 /* TODO: security register */
9437 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9438 .unlock = spi_disable_blockprotect_bp3_srwd,
9439 .write = spi_chip_write_256, /* Multi I/O supported */
9440 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9441 .voltage = {1650, 2000},
9442 },
9443
9444 {
9445 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009446 .name = "MX25U3235E/F",
9447 .bustype = BUS_SPI,
9448 .manufacture_id = MACRONIX_ID,
9449 .model_id = MACRONIX_MX25U3235E,
9450 .total_size = 4096,
9451 .page_size = 256,
9452 /* F model supports SFDP */
9453 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9454 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9455 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9456 .tested = TEST_OK_PREW,
9457 .probe = probe_spi_rdid,
9458 .probe_timing = TIMING_ZERO,
9459 .block_erasers =
9460 {
9461 {
9462 .eraseblocks = { {4 * 1024, 1024} },
9463 .block_erase = spi_block_erase_20,
9464 }, {
9465 .eraseblocks = { {32 * 1024, 128} },
9466 .block_erase = spi_block_erase_52,
9467 }, {
9468 .eraseblocks = { {64 * 1024, 64} },
9469 .block_erase = spi_block_erase_d8,
9470 }, {
9471 .eraseblocks = { {4 * 1024 * 1024, 1} },
9472 .block_erase = spi_block_erase_60,
9473 }, {
9474 .eraseblocks = { {4 * 1024 * 1024, 1} },
9475 .block_erase = spi_block_erase_c7,
9476 }
9477 },
9478 /* TODO: security register */
9479 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9480 .unlock = spi_disable_blockprotect_bp3_srwd,
9481 .write = spi_chip_write_256,
9482 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9483 .voltage = {1650, 2000},
9484 },
9485
9486 {
9487 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +01009488 .name = "MX25U51245G",
9489 .bustype = BUS_SPI,
9490 .manufacture_id = MACRONIX_ID,
9491 .model_id = MACRONIX_MX25U51245G,
9492 .total_size = 65536,
9493 .page_size = 256,
9494 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
9495 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
9496 .tested = TEST_OK_PREW,
9497 .probe = probe_spi_rdid,
9498 .probe_timing = TIMING_ZERO,
9499 .block_erasers =
9500 {
9501 {
9502 .eraseblocks = { {4 * 1024, 16384} },
9503 .block_erase = spi_block_erase_21,
9504 }, {
9505 .eraseblocks = { {4 * 1024, 16384} },
9506 .block_erase = spi_block_erase_20,
9507 }, {
9508 .eraseblocks = { {32 * 1024, 2048} },
9509 .block_erase = spi_block_erase_5c,
9510 }, {
9511 .eraseblocks = { {32 * 1024, 2048} },
9512 .block_erase = spi_block_erase_52,
9513 }, {
9514 .eraseblocks = { {64 * 1024, 1024} },
9515 .block_erase = spi_block_erase_dc,
9516 }, {
9517 .eraseblocks = { {64 * 1024, 1024} },
9518 .block_erase = spi_block_erase_d8,
9519 }, {
9520 .eraseblocks = { {64 * 1024 * 1024, 1} },
9521 .block_erase = spi_block_erase_60,
9522 }, {
9523 .eraseblocks = { {64 * 1024 * 1024, 1} },
9524 .block_erase = spi_block_erase_c7,
9525 }
9526 },
9527 /* TODO: security register */
9528 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9529 .unlock = spi_disable_blockprotect_bp3_srwd,
9530 .write = spi_chip_write_256, /* Multi I/O supported */
9531 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9532 .voltage = {1650, 2000},
9533 },
9534
9535 {
9536 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009537 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009538 .bustype = BUS_SPI,
9539 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009540 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009541 .total_size = 8192,
9542 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009543 /* F model supports SFDP */
9544 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9545 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9546 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009547 .tested = TEST_OK_PREW,
9548 .probe = probe_spi_rdid,
9549 .probe_timing = TIMING_ZERO,
9550 .block_erasers =
9551 {
9552 {
9553 .eraseblocks = { {4 * 1024, 2048} },
9554 .block_erase = spi_block_erase_20,
9555 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009556 .eraseblocks = { {32 * 1024, 256} },
9557 .block_erase = spi_block_erase_52,
9558 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009559 .eraseblocks = { {64 * 1024, 128} },
9560 .block_erase = spi_block_erase_d8,
9561 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009562 .eraseblocks = { {8 * 1024 * 1024, 1} },
9563 .block_erase = spi_block_erase_60,
9564 }, {
9565 .eraseblocks = { {8 * 1024 * 1024, 1} },
9566 .block_erase = spi_block_erase_c7,
9567 }
9568 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009569 /* TODO: security register */
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009570 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9571 .unlock = spi_disable_blockprotect_bp3_srwd,
9572 .write = spi_chip_write_256,
9573 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009574 .voltage = {1650, 2000},
9575 },
9576
9577 {
9578 .vendor = "Macronix",
9579 .name = "MX25U8032E",
9580 .bustype = BUS_SPI,
9581 .manufacture_id = MACRONIX_ID,
9582 .model_id = MACRONIX_MX25U8032E,
9583 .total_size = 1024,
9584 .page_size = 256,
9585 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9587 .tested = TEST_OK_PREW,
9588 .probe = probe_spi_rdid,
9589 .probe_timing = TIMING_ZERO,
9590 .block_erasers =
9591 {
9592 {
9593 .eraseblocks = { {4 * 1024, 256} },
9594 .block_erase = spi_block_erase_20,
9595 }, {
9596 .eraseblocks = { {32 * 1024, 32} },
9597 .block_erase = spi_block_erase_52,
9598 }, {
9599 .eraseblocks = { {64 * 1024, 16} },
9600 .block_erase = spi_block_erase_d8,
9601 }, {
9602 .eraseblocks = { {1024 * 1024, 1} },
9603 .block_erase = spi_block_erase_60,
9604 }, {
9605 .eraseblocks = { {1024 * 1024, 1} },
9606 .block_erase = spi_block_erase_c7,
9607 }
9608 },
9609 /* TODO: security register */
9610 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9611 .unlock = spi_disable_blockprotect_bp3_srwd,
9612 .write = spi_chip_write_256,
9613 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9614 .voltage = {1650, 2000},
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009615 },
9616
9617 {
9618 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00009619 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009620 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009621 .manufacture_id = MACRONIX_ID,
9622 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009623 .total_size = 128,
9624 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009625 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9626 .tested = TEST_UNTESTED,
9627 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009628 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009629 .block_erasers =
9630 {
9631 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009632 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009633 {8 * 1024, 1},
9634 {4 * 1024, 2},
9635 {8 * 1024, 2},
9636 {32 * 1024, 1},
9637 {64 * 1024, 1},
9638 },
Sean Nelson35727f72010-01-28 23:55:12 +00009639 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009640 }, {
9641 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009642 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009643 }
9644 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009645 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009646 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009647 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009648 },
9649
9650 {
9651 .vendor = "Macronix",
9652 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009653 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009654 .manufacture_id = MACRONIX_ID,
9655 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009656 .total_size = 128,
9657 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009658 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00009659 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009660 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009661 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009662 .block_erasers =
9663 {
9664 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009665 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009666 {64 * 1024, 1},
9667 {32 * 1024, 1},
9668 {8 * 1024, 2},
9669 {4 * 1024, 2},
9670 {8 * 1024, 1},
9671 },
Sean Nelson35727f72010-01-28 23:55:12 +00009672 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009673 }, {
9674 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009675 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009676 }
9677 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009678 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009679 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009680 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009681 },
9682
9683 {
9684 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009685 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009686 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009687 .manufacture_id = MACRONIX_ID,
9688 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009689 .total_size = 256,
9690 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009691 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009692 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009693 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009694 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009695 .block_erasers =
9696 {
9697 {
9698 .eraseblocks = {
9699 {16 * 1024, 1},
9700 {8 * 1024, 2},
9701 {32 * 1024, 1},
9702 {64 * 1024, 3},
9703 },
Sean Nelson35727f72010-01-28 23:55:12 +00009704 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009705 }, {
9706 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009707 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009708 },
9709 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009710 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009711 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009712 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009713 },
9714
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009715 {
9716 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009717 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009718 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009719 .manufacture_id = MACRONIX_ID,
9720 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009721 .total_size = 256,
9722 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009723 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009724 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009725 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009726 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009727 .block_erasers =
9728 {
9729 {
9730 .eraseblocks = {
9731 {64 * 1024, 3},
9732 {32 * 1024, 1},
9733 {8 * 1024, 2},
9734 {16 * 1024, 1},
9735 },
Sean Nelson35727f72010-01-28 23:55:12 +00009736 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009737 }, {
9738 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009739 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009740 },
9741 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009742 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009743 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009744 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009745 },
9746
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009747 {
9748 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00009749 .name = "MX29F022(N)B",
9750 .bustype = BUS_PARALLEL,
9751 .manufacture_id = MACRONIX_ID,
9752 .model_id = MACRONIX_MX29F022B,
9753 .total_size = 256,
9754 .page_size = 0, /* unused */
9755 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9756 .tested = TEST_UNTESTED,
9757 .probe = probe_jedec,
9758 .probe_timing = TIMING_ZERO,
9759 .block_erasers =
9760 {
9761 {
9762 .eraseblocks = {
9763 {16 * 1024, 1},
9764 {8 * 1024, 2},
9765 {32 * 1024, 1},
9766 {64 * 1024, 3},
9767 },
9768 .block_erase = erase_sector_jedec,
9769 }, {
9770 .eraseblocks = { {256 * 1024, 1} },
9771 .block_erase = erase_chip_block_jedec,
9772 }
9773 },
9774 .write = write_jedec_1,
9775 .read = read_memmapped,
9776 .voltage = {4500, 5500},
9777 },
9778
9779 {
9780 .vendor = "Macronix",
9781 .name = "MX29F022(N)T",
9782 .bustype = BUS_PARALLEL,
9783 .manufacture_id = MACRONIX_ID,
9784 .model_id = MACRONIX_MX29F022T,
9785 .total_size = 256,
9786 .page_size = 0, /* unused */
9787 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9788 .tested = TEST_OK_PREW,
9789 .probe = probe_jedec,
9790 .probe_timing = TIMING_ZERO,
9791 .block_erasers =
9792 {
9793 {
9794 .eraseblocks = {
9795 {64 * 1024, 3},
9796 {32 * 1024, 1},
9797 {8 * 1024, 2},
9798 {16 * 1024, 1},
9799 },
9800 .block_erase = erase_sector_jedec,
9801 }, {
9802 .eraseblocks = { {256 * 1024, 1} },
9803 .block_erase = erase_chip_block_jedec,
9804 }
9805 },
9806 .write = write_jedec_1,
9807 .read = read_memmapped,
9808 .voltage = {4500, 5500},
9809 },
9810
9811 {
9812 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00009813 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009814 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00009815 .manufacture_id = MACRONIX_ID,
9816 .model_id = MACRONIX_MX29F040,
9817 .total_size = 512,
9818 .page_size = 64 * 1024,
9819 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9820 .tested = TEST_UNTESTED,
9821 .probe = probe_jedec,
9822 .probe_timing = TIMING_ZERO,
9823 .block_erasers =
9824 {
9825 {
9826 .eraseblocks = { {64 * 1024, 8} },
9827 .block_erase = erase_sector_jedec,
9828 }, {
9829 .eraseblocks = { {512 * 1024, 1} },
9830 .block_erase = erase_chip_block_jedec,
9831 },
9832 },
9833 .write = write_jedec_1,
9834 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009835 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00009836 },
9837
9838 {
9839 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009840 .name = "MX29GL128F",
9841 .bustype = BUS_PARALLEL,
9842 .manufacture_id = MACRONIX_ID,
9843 .model_id = MACRONIX_MX29GL128F,
9844 .total_size = 16384,
9845 .page_size = 128 * 1024, /* actual page size is 16 */
9846 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9847 .tested = TEST_UNTESTED,
9848 .probe = probe_jedec_29gl,
9849 .probe_timing = TIMING_ZERO,
9850 .block_erasers =
9851 {
9852 {
9853 .eraseblocks = { {128 * 1024, 128} },
9854 .block_erase = erase_sector_jedec,
9855 }, {
9856 .eraseblocks = { {16 * 1024 * 1024, 1} },
9857 .block_erase = erase_chip_block_jedec,
9858 },
9859 },
9860 .write = write_jedec_1,
9861 .read = read_memmapped,
9862 .voltage = {2700, 3600},
9863 },
9864
9865 {
9866 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009867 .name = "MX29GL320EB",
9868 .bustype = BUS_PARALLEL,
9869 .manufacture_id = MACRONIX_ID,
9870 .model_id = MACRONIX_MX29GL320EB,
9871 .total_size = 4096,
9872 .page_size = 128 * 1024, /* actual page size is 16 */
9873 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9874 .tested = TEST_UNTESTED,
9875 .probe = probe_jedec_29gl,
9876 .probe_timing = TIMING_ZERO,
9877 .block_erasers =
9878 {
9879 {
9880 .eraseblocks = {
9881 {8 * 1024, 8},
9882 {64 * 1024, 63},
9883 },
9884 .block_erase = erase_sector_jedec,
9885 }, {
9886 .eraseblocks = { {4 * 1024 * 1024, 1} },
9887 .block_erase = erase_chip_block_jedec,
9888 },
9889 },
9890 .write = write_jedec_1,
9891 .read = read_memmapped,
9892 .voltage = {2700, 3600},
9893 },
9894
9895 {
9896 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009897 .name = "MX29GL320EH/L",
9898 .bustype = BUS_PARALLEL,
9899 .manufacture_id = MACRONIX_ID,
9900 .model_id = MACRONIX_MX29GL320EHL,
9901 .total_size = 4096,
9902 .page_size = 128 * 1024, /* actual page size is 16 */
9903 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9904 .tested = TEST_UNTESTED,
9905 .probe = probe_jedec_29gl,
9906 .probe_timing = TIMING_ZERO,
9907 .block_erasers =
9908 {
9909 {
9910 .eraseblocks = { {64 * 1024, 64} },
9911 .block_erase = erase_sector_jedec,
9912 }, {
9913 .eraseblocks = { {4 * 1024 * 1024, 1} },
9914 .block_erase = erase_chip_block_jedec,
9915 },
9916 },
9917 .write = write_jedec_1,
9918 .read = read_memmapped,
9919 .voltage = {2700, 3600},
9920 },
9921
9922 {
9923 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009924 .name = "MX29GL320ET",
9925 .bustype = BUS_PARALLEL,
9926 .manufacture_id = MACRONIX_ID,
9927 .model_id = MACRONIX_MX29GL320ET,
9928 .total_size = 4096,
9929 .page_size = 128 * 1024, /* actual page size is 16 */
9930 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9931 .tested = TEST_UNTESTED,
9932 .probe = probe_jedec_29gl,
9933 .probe_timing = TIMING_ZERO,
9934 .block_erasers =
9935 {
9936 {
9937 .eraseblocks = {
9938 {64 * 1024, 63},
9939 {8 * 1024, 8},
9940 },
9941 .block_erase = erase_sector_jedec,
9942 }, {
9943 .eraseblocks = { {4 * 1024 * 1024, 1} },
9944 .block_erase = erase_chip_block_jedec,
9945 },
9946 },
9947 .write = write_jedec_1,
9948 .read = read_memmapped,
9949 .voltage = {2700, 3600},
9950 },
9951
9952 {
9953 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009954 .name = "MX29GL640EB",
9955 .bustype = BUS_PARALLEL,
9956 .manufacture_id = MACRONIX_ID,
9957 .model_id = MACRONIX_MX29GL640EB,
9958 .total_size = 8192,
9959 .page_size = 128 * 1024, /* actual page size is 16 */
9960 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9961 .tested = TEST_UNTESTED,
9962 .probe = probe_jedec_29gl,
9963 .probe_timing = TIMING_ZERO,
9964 .block_erasers =
9965 {
9966 {
9967 .eraseblocks = {
9968 {8 * 1024, 8},
9969 {64 * 1024, 127},
9970 },
9971 .block_erase = erase_sector_jedec,
9972 }, {
9973 .eraseblocks = { {8 * 1024 * 1024, 1} },
9974 .block_erase = erase_chip_block_jedec,
9975 },
9976 },
9977 .write = write_jedec_1,
9978 .read = read_memmapped,
9979 .voltage = {2700, 3600},
9980 },
9981
9982 {
9983 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009984 .name = "MX29GL640EH/L",
9985 .bustype = BUS_PARALLEL,
9986 .manufacture_id = MACRONIX_ID,
9987 .model_id = MACRONIX_MX29GL640EHL,
9988 .total_size = 8192,
9989 .page_size = 128 * 1024, /* actual page size is 16 */
9990 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9991 .tested = TEST_UNTESTED,
9992 .probe = probe_jedec_29gl,
9993 .probe_timing = TIMING_ZERO,
9994 .block_erasers =
9995 {
9996 {
9997 .eraseblocks = { {64 * 1024, 128} },
9998 .block_erase = erase_sector_jedec,
9999 }, {
10000 .eraseblocks = { {8 * 1024 * 1024, 1} },
10001 .block_erase = erase_chip_block_jedec,
10002 },
10003 },
10004 .write = write_jedec_1,
10005 .read = read_memmapped,
10006 .voltage = {2700, 3600},
10007 },
10008
10009 {
10010 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010011 .name = "MX29GL640ET",
10012 .bustype = BUS_PARALLEL,
10013 .manufacture_id = MACRONIX_ID,
10014 .model_id = MACRONIX_MX29GL640ET,
10015 .total_size = 8192,
10016 .page_size = 128 * 1024, /* actual page size is 16 */
10017 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10018 .tested = TEST_UNTESTED,
10019 .probe = probe_jedec_29gl,
10020 .probe_timing = TIMING_ZERO,
10021 .block_erasers =
10022 {
10023 {
10024 .eraseblocks = {
10025 {64 * 1024, 127},
10026 {8 * 1024, 8},
10027 },
10028 .block_erase = erase_sector_jedec,
10029 }, {
10030 .eraseblocks = { {8 * 1024 * 1024, 1} },
10031 .block_erase = erase_chip_block_jedec,
10032 },
10033 },
10034 .write = write_jedec_1,
10035 .read = read_memmapped,
10036 .voltage = {2700, 3600},
10037 },
10038
10039 {
10040 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000010041 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010042 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010043 .manufacture_id = MACRONIX_ID,
10044 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010045 .total_size = 512,
10046 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010047 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10048 .tested = TEST_UNTESTED,
10049 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010050 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010051 .block_erasers =
10052 {
10053 {
Stefan Tauner6697f712014-08-06 15:09:15 +000010054 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000010055 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010056 }, {
10057 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010058 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010059 },
10060 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010061 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010062 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010063 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000010064 },
10065
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010066 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010067 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020010068 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010069 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010070 .manufacture_id = MACRONIX_ID,
10071 .model_id = MACRONIX_MX66L51235F,
10072 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010073 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010074 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10075 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010076 .tested = TEST_OK_PREW,
10077 .probe = probe_spi_rdid,
10078 .probe_timing = TIMING_ZERO,
10079 .block_erasers =
10080 {
10081 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010082 .eraseblocks = { {4 * 1024, 16384} },
10083 .block_erase = spi_block_erase_21,
10084 }, {
10085 .eraseblocks = { {4 * 1024, 16384} },
10086 .block_erase = spi_block_erase_20,
10087 }, {
10088 .eraseblocks = { {32 * 1024, 2048} },
10089 .block_erase = spi_block_erase_5c,
10090 }, {
10091 .eraseblocks = { {32 * 1024, 2048} },
10092 .block_erase = spi_block_erase_52,
10093 }, {
10094 .eraseblocks = { {64 * 1024, 1024} },
10095 .block_erase = spi_block_erase_dc,
10096 }, {
10097 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010098 .block_erase = spi_block_erase_d8,
10099 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010100 .eraseblocks = { {64 * 1024 * 1024, 1} },
10101 .block_erase = spi_block_erase_60,
10102 }, {
10103 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010104 .block_erase = spi_block_erase_c7,
10105 }
10106 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010107 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10108 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010109 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010110 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010111 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010112 .voltage = {2700, 3600},
10113 },
10114
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010115 {
10116 .vendor = "Macronix",
10117 .name = "MX66L1G45G",
10118 .bustype = BUS_SPI,
10119 .manufacture_id = MACRONIX_ID,
10120 .model_id = MACRONIX_MX66L1G45G,
10121 .total_size = 131072,
10122 .page_size = 256,
10123 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10124 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
10125 .tested = TEST_OK_PREW,
10126 .probe = probe_spi_rdid,
10127 .probe_timing = TIMING_ZERO,
10128 .block_erasers =
10129 {
10130 {
10131 .eraseblocks = { {4 * 1024, 32768} },
10132 .block_erase = spi_block_erase_21,
10133 }, {
10134 .eraseblocks = { {4 * 1024, 32768} },
10135 .block_erase = spi_block_erase_20,
10136 }, {
10137 .eraseblocks = { {32 * 1024, 4096} },
10138 .block_erase = spi_block_erase_5c,
10139 }, {
10140 .eraseblocks = { {32 * 1024, 4096} },
10141 .block_erase = spi_block_erase_52,
10142 }, {
10143 .eraseblocks = { {64 * 1024, 2048} },
10144 .block_erase = spi_block_erase_dc,
10145 }, {
10146 .eraseblocks = { {64 * 1024, 2048} },
10147 .block_erase = spi_block_erase_d8,
10148 }, {
10149 .eraseblocks = { {128 * 1024 * 1024, 1} },
10150 .block_erase = spi_block_erase_60,
10151 }, {
10152 .eraseblocks = { {128 * 1024 * 1024, 1} },
10153 .block_erase = spi_block_erase_c7,
10154 }
10155 },
10156 /* TODO: security register and SBLK/SBULK, configuration register */
10157 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10158 .unlock = spi_disable_blockprotect_bp3_srwd,
10159 .write = spi_chip_write_256,
10160 .read = spi_chip_read, /* Fast read (0x0B) supported */
10161 .voltage = {2700, 3600},
10162 },
10163
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010164 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10165 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10166 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10167 * only is successful if RDID does not work.
10168 */
10169 {
10170 .vendor = "Micron/Numonyx/ST",
10171 .name = "M25P05",
10172 .bustype = BUS_SPI,
10173 .manufacture_id = 0, /* Not used. */
10174 .model_id = ST_M25P05_RES,
10175 .total_size = 64,
10176 .page_size = 256,
10177 .feature_bits = FEATURE_WRSR_WREN,
10178 .tested = TEST_UNTESTED,
10179 .probe = probe_spi_res1,
10180 .probe_timing = TIMING_ZERO,
10181 .block_erasers =
10182 {
10183 {
10184 .eraseblocks = { {32 * 1024, 2} },
10185 .block_erase = spi_block_erase_d8,
10186 }, {
10187 .eraseblocks = { {64 * 1024, 1} },
10188 .block_erase = spi_block_erase_c7,
10189 }
10190 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010191 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010192 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010193 .write = spi_chip_write_1, /* 128 */
10194 .read = spi_chip_read,
10195 .voltage = {2700, 3600},
10196 },
10197
10198 {
10199 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010200 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010201 .bustype = BUS_SPI,
10202 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010203 .model_id = ST_M25P05A,
10204 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010205 .page_size = 256,
10206 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010207 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010208 .probe = probe_spi_rdid,
10209 .probe_timing = TIMING_ZERO,
10210 .block_erasers =
10211 {
10212 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010213 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010214 .block_erase = spi_block_erase_d8,
10215 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010216 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010217 .block_erase = spi_block_erase_c7,
10218 }
10219 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010220 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010221 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010222 .write = spi_chip_write_256,
10223 .read = spi_chip_read,
10224 .voltage = {2700, 3600},
10225 },
10226
10227 /* The ST M25P10 has the same problem as the M25P05. */
10228 {
10229 .vendor = "Micron/Numonyx/ST",
10230 .name = "M25P10",
10231 .bustype = BUS_SPI,
10232 .manufacture_id = 0, /* Not used. */
10233 .model_id = ST_M25P10_RES,
10234 .total_size = 128,
10235 .page_size = 256,
10236 .feature_bits = FEATURE_WRSR_WREN,
10237 .tested = TEST_UNTESTED,
10238 .probe = probe_spi_res1,
10239 .probe_timing = TIMING_ZERO,
10240 .block_erasers =
10241 {
10242 {
10243 .eraseblocks = { {32 * 1024, 4} },
10244 .block_erase = spi_block_erase_d8,
10245 }, {
10246 .eraseblocks = { {128 * 1024, 1} },
10247 .block_erase = spi_block_erase_c7,
10248 }
10249 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010250 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010251 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010252 .write = spi_chip_write_1, /* 128 */
10253 .read = spi_chip_read,
10254 .voltage = {2700, 3600},
10255 },
10256
10257 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010258 .vendor = "Micron/Numonyx/ST",
10259 .name = "M25P10-A",
10260 .bustype = BUS_SPI,
10261 .manufacture_id = ST_ID,
10262 .model_id = ST_M25P10A,
10263 .total_size = 128,
10264 .page_size = 256,
10265 .feature_bits = FEATURE_WRSR_WREN,
10266 .tested = TEST_OK_PREW,
10267 .probe = probe_spi_rdid,
10268 .probe_timing = TIMING_ZERO,
10269 .block_erasers =
10270 {
10271 {
10272 .eraseblocks = { {32 * 1024, 4} },
10273 .block_erase = spi_block_erase_d8,
10274 }, {
10275 .eraseblocks = { {128 * 1024, 1} },
10276 .block_erase = spi_block_erase_c7,
10277 }
10278 },
10279 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10280 .unlock = spi_disable_blockprotect_bp3_srwd,
10281 .write = spi_chip_write_256,
10282 .read = spi_chip_read,
10283 .voltage = {2700, 3600},
10284 },
10285
10286 {
10287 .vendor = "Micron/Numonyx/ST",
10288 .name = "M25P128",
10289 .bustype = BUS_SPI,
10290 .manufacture_id = ST_ID,
10291 .model_id = ST_M25P128,
10292 .total_size = 16384,
10293 .page_size = 256,
10294 .feature_bits = FEATURE_WRSR_WREN,
10295 .tested = TEST_OK_PREW,
10296 .probe = probe_spi_rdid,
10297 .probe_timing = TIMING_ZERO,
10298 .block_erasers =
10299 {
10300 {
10301 .eraseblocks = { {256 * 1024, 64} },
10302 .block_erase = spi_block_erase_d8,
10303 }, {
10304 .eraseblocks = { {16 * 1024 * 1024, 1} },
10305 .block_erase = spi_block_erase_c7,
10306 }
10307 },
10308 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10309 .unlock = spi_disable_blockprotect_bp3_srwd,
10310 .write = spi_chip_write_256,
10311 .read = spi_chip_read,
10312 .voltage = {2700, 3600},
10313 },
10314
10315 {
10316 .vendor = "Micron/Numonyx/ST",
10317 .name = "M25P16",
10318 .bustype = BUS_SPI,
10319 .manufacture_id = ST_ID,
10320 .model_id = ST_M25P16,
10321 .total_size = 2048,
10322 .page_size = 256,
10323 .feature_bits = FEATURE_WRSR_WREN,
10324 .tested = TEST_OK_PREW,
10325 .probe = probe_spi_rdid,
10326 .probe_timing = TIMING_ZERO,
10327 .block_erasers =
10328 {
10329 {
10330 .eraseblocks = { {64 * 1024, 32} },
10331 .block_erase = spi_block_erase_d8,
10332 }, {
10333 .eraseblocks = { {2 * 1024 * 1024, 1} },
10334 .block_erase = spi_block_erase_c7,
10335 }
10336 },
10337 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10338 .unlock = spi_disable_blockprotect_bp3_srwd,
10339 .write = spi_chip_write_256,
10340 .read = spi_chip_read,
10341 .voltage = {2700, 3600},
10342 },
10343
10344 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010345 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10346 .name = "M25P20",
10347 .bustype = BUS_SPI,
10348 .manufacture_id = ST_ID,
10349 .model_id = ST_M25P20,
10350 .total_size = 256,
10351 .page_size = 256,
10352 .feature_bits = FEATURE_WRSR_WREN,
10353 .tested = TEST_UNTESTED,
10354 .probe = probe_spi_rdid,
10355 .probe_timing = TIMING_ZERO,
10356 .block_erasers =
10357 {
10358 {
10359 .eraseblocks = { {64 * 1024, 4} },
10360 .block_erase = spi_block_erase_d8,
10361 }, {
10362 .eraseblocks = { {256 * 1024, 1} },
10363 .block_erase = spi_block_erase_c7,
10364 }
10365 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010366 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010367 .unlock = spi_disable_blockprotect,
10368 .write = spi_chip_write_256,
10369 .read = spi_chip_read, /* Fast read (0x0B) supported */
10370 .voltage = {2700, 3600},
10371 },
10372
10373 {
10374 .vendor = "Micron/Numonyx/ST",
10375 .name = "M25P20-old",
10376 .bustype = BUS_SPI,
10377 .manufacture_id = 0, /* Not used. */
10378 .model_id = ST_M25P20_RES,
10379 .total_size = 256,
10380 .page_size = 256,
10381 .feature_bits = FEATURE_WRSR_WREN,
10382 .tested = TEST_OK_PREW,
10383 .probe = probe_spi_res1,
10384 .probe_timing = TIMING_ZERO,
10385 .block_erasers =
10386 {
10387 {
10388 .eraseblocks = { {64 * 1024, 4} },
10389 .block_erase = spi_block_erase_d8,
10390 }, {
10391 .eraseblocks = { {256 * 1024, 1} },
10392 .block_erase = spi_block_erase_c7,
10393 }
10394 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010395 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010396 .unlock = spi_disable_blockprotect,
10397 .write = spi_chip_write_256,
10398 .read = spi_chip_read, /* Fast read (0x0B) supported */
10399 .voltage = {2700, 3600},
10400 },
10401
10402 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010403 .vendor = "Micron/Numonyx/ST",
10404 .name = "M25P32",
10405 .bustype = BUS_SPI,
10406 .manufacture_id = ST_ID,
10407 .model_id = ST_M25P32,
10408 .total_size = 4096,
10409 .page_size = 256,
10410 .feature_bits = FEATURE_WRSR_WREN,
10411 .tested = TEST_OK_PREW,
10412 .probe = probe_spi_rdid,
10413 .probe_timing = TIMING_ZERO,
10414 .block_erasers =
10415 {
10416 {
10417 .eraseblocks = { {64 * 1024, 64} },
10418 .block_erase = spi_block_erase_d8,
10419 }, {
10420 .eraseblocks = { {4 * 1024 * 1024, 1} },
10421 .block_erase = spi_block_erase_c7,
10422 }
10423 },
10424 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10425 .unlock = spi_disable_blockprotect_bp3_srwd,
10426 .write = spi_chip_write_256,
10427 .read = spi_chip_read,
10428 .voltage = {2700, 3600},
10429 },
10430
10431 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010432 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10433 .name = "M25P40",
10434 .bustype = BUS_SPI,
10435 .manufacture_id = ST_ID,
10436 .model_id = ST_M25P40,
10437 .total_size = 512,
10438 .page_size = 256,
10439 .feature_bits = FEATURE_WRSR_WREN,
10440 .tested = TEST_OK_PREW,
10441 .probe = probe_spi_rdid,
10442 .probe_timing = TIMING_ZERO,
10443 .block_erasers =
10444 {
10445 {
10446 .eraseblocks = { {64 * 1024, 8} },
10447 .block_erase = spi_block_erase_d8,
10448 }, {
10449 .eraseblocks = { {512 * 1024, 1} },
10450 .block_erase = spi_block_erase_c7,
10451 }
10452 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010453 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010454 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010455 .write = spi_chip_write_256,
10456 .read = spi_chip_read,
10457 .voltage = {2700, 3600},
10458 },
10459
10460 {
10461 .vendor = "Micron/Numonyx/ST",
10462 .name = "M25P40-old",
10463 .bustype = BUS_SPI,
10464 .manufacture_id = 0, /* Not used. */
10465 .model_id = ST_M25P40_RES,
10466 .total_size = 512,
10467 .page_size = 256,
10468 .feature_bits = FEATURE_WRSR_WREN,
10469 .tested = TEST_UNTESTED,
10470 .probe = probe_spi_res1,
10471 .probe_timing = TIMING_ZERO,
10472 .block_erasers =
10473 {
10474 {
10475 .eraseblocks = { {64 * 1024, 8} },
10476 .block_erase = spi_block_erase_d8,
10477 }, {
10478 .eraseblocks = { {512 * 1024, 1} },
10479 .block_erase = spi_block_erase_c7,
10480 }
10481 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010482 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010483 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010484 .write = spi_chip_write_256,
10485 .read = spi_chip_read,
10486 },
10487
10488 {
10489 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010490 .name = "M25P64",
10491 .bustype = BUS_SPI,
10492 .manufacture_id = ST_ID,
10493 .model_id = ST_M25P64,
10494 .total_size = 8192,
10495 .page_size = 256,
10496 .feature_bits = FEATURE_WRSR_WREN,
10497 .tested = TEST_OK_PREW,
10498 .probe = probe_spi_rdid,
10499 .probe_timing = TIMING_ZERO,
10500 .block_erasers =
10501 {
10502 {
10503 .eraseblocks = { {64 * 1024, 128} },
10504 .block_erase = spi_block_erase_d8,
10505 }, {
10506 .eraseblocks = { {8 * 1024 * 1024, 1} },
10507 .block_erase = spi_block_erase_c7,
10508 }
10509 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010510 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010511 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010512 .write = spi_chip_write_256,
10513 .read = spi_chip_read,
10514 .voltage = {2700, 3600},
10515 },
10516
10517 {
10518 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010519 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010520 .bustype = BUS_SPI,
10521 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010522 .model_id = ST_M25P80,
10523 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010524 .page_size = 256,
10525 .feature_bits = FEATURE_WRSR_WREN,
10526 .tested = TEST_OK_PREW,
10527 .probe = probe_spi_rdid,
10528 .probe_timing = TIMING_ZERO,
10529 .block_erasers =
10530 {
10531 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010532 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010533 .block_erase = spi_block_erase_d8,
10534 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010535 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010536 .block_erase = spi_block_erase_c7,
10537 }
10538 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010539 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010540 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010541 .write = spi_chip_write_256,
10542 .read = spi_chip_read,
10543 .voltage = {2700, 3600},
10544 },
10545
10546 {
10547 .vendor = "Micron/Numonyx/ST",
10548 .name = "M25PE10",
10549 .bustype = BUS_SPI,
10550 .manufacture_id = ST_ID,
10551 .model_id = ST_M25PE10,
10552 .total_size = 128,
10553 .page_size = 256,
10554 .feature_bits = FEATURE_WRSR_WREN,
10555 .tested = TEST_UNTESTED,
10556 .probe = probe_spi_rdid,
10557 .probe_timing = TIMING_ZERO,
10558 .block_erasers =
10559 {
10560 {
10561 .eraseblocks = { {4 * 1024, 32} },
10562 .block_erase = spi_block_erase_20,
10563 }, {
10564 .eraseblocks = { {64 * 1024, 2} },
10565 .block_erase = spi_block_erase_d8,
10566 }, {
10567 .eraseblocks = { {128 * 1024, 1} },
10568 .block_erase = spi_block_erase_c7,
10569 }
10570 },
10571 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10572 .unlock = spi_disable_blockprotect,
10573 .write = spi_chip_write_256,
10574 .read = spi_chip_read,
10575 .voltage = {2700, 3600},
10576 },
10577
10578 {
10579 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010580 .name = "M25PE16",
10581 .bustype = BUS_SPI,
10582 .manufacture_id = ST_ID,
10583 .model_id = ST_M25PE16,
10584 .total_size = 2048,
10585 .page_size = 256,
10586 .feature_bits = FEATURE_WRSR_WREN,
10587 .tested = TEST_UNTESTED,
10588 .probe = probe_spi_rdid,
10589 .probe_timing = TIMING_ZERO,
10590 .block_erasers =
10591 {
10592 {
10593 .eraseblocks = { {4 * 1024, 512} },
10594 .block_erase = spi_block_erase_20,
10595 }, {
10596 .eraseblocks = { {64 * 1024, 32} },
10597 .block_erase = spi_block_erase_d8,
10598 }, {
10599 .eraseblocks = { {2 * 1024 * 1024, 1} },
10600 .block_erase = spi_block_erase_c7,
10601 }
10602 },
10603 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10604 .unlock = spi_disable_blockprotect,
10605 .write = spi_chip_write_256,
10606 .read = spi_chip_read,
10607 .voltage = {2700, 3600},
10608 },
10609
10610 {
10611 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010612 .name = "M25PE20",
10613 .bustype = BUS_SPI,
10614 .manufacture_id = ST_ID,
10615 .model_id = ST_M25PE20,
10616 .total_size = 256,
10617 .page_size = 256,
10618 .feature_bits = FEATURE_WRSR_WREN,
10619 .tested = TEST_UNTESTED,
10620 .probe = probe_spi_rdid,
10621 .probe_timing = TIMING_ZERO,
10622 .block_erasers =
10623 {
10624 {
10625 .eraseblocks = { {4 * 1024, 64} },
10626 .block_erase = spi_block_erase_20,
10627 }, {
10628 .eraseblocks = { {64 * 1024, 4} },
10629 .block_erase = spi_block_erase_d8,
10630 }, {
10631 .eraseblocks = { {256 * 1024, 1} },
10632 .block_erase = spi_block_erase_c7,
10633 }
10634 },
10635 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10636 .unlock = spi_disable_blockprotect,
10637 .write = spi_chip_write_256,
10638 .read = spi_chip_read,
10639 .voltage = {2700, 3600},
10640 },
10641
10642 {
10643 .vendor = "Micron/Numonyx/ST",
10644 .name = "M25PE40",
10645 .bustype = BUS_SPI,
10646 .manufacture_id = ST_ID,
10647 .model_id = ST_M25PE40,
10648 .total_size = 512,
10649 .page_size = 256,
10650 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010651 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010652 .probe = probe_spi_rdid,
10653 .probe_timing = TIMING_ZERO,
10654 .block_erasers =
10655 {
10656 {
10657 .eraseblocks = { {4 * 1024, 128} },
10658 .block_erase = spi_block_erase_20,
10659 }, {
10660 .eraseblocks = { {64 * 1024, 8} },
10661 .block_erase = spi_block_erase_d8,
10662 }, {
10663 .eraseblocks = { {512 * 1024, 1} },
10664 .block_erase = spi_block_erase_c7,
10665 }
10666 },
10667 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10668 .unlock = spi_disable_blockprotect,
10669 .write = spi_chip_write_256,
10670 .read = spi_chip_read,
10671 .voltage = {2700, 3600},
10672 },
10673
10674 {
10675 .vendor = "Micron/Numonyx/ST",
10676 .name = "M25PE80",
10677 .bustype = BUS_SPI,
10678 .manufacture_id = ST_ID,
10679 .model_id = ST_M25PE80,
10680 .total_size = 1024,
10681 .page_size = 256,
10682 .feature_bits = FEATURE_WRSR_WREN,
10683 .tested = TEST_OK_PREW,
10684 .probe = probe_spi_rdid,
10685 .probe_timing = TIMING_ZERO,
10686 .block_erasers =
10687 {
10688 {
10689 .eraseblocks = { {4 * 1024, 256} },
10690 .block_erase = spi_block_erase_20,
10691 }, {
10692 .eraseblocks = { {64 * 1024, 16} },
10693 .block_erase = spi_block_erase_d8,
10694 }, {
10695 .eraseblocks = { {1024 * 1024, 1} },
10696 .block_erase = spi_block_erase_c7,
10697 }
10698 },
10699 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10700 .unlock = spi_disable_blockprotect,
10701 .write = spi_chip_write_256,
10702 .read = spi_chip_read,
10703 .voltage = {2700, 3600},
10704 },
10705
10706 {
10707 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010708 .name = "M25PX16",
10709 .bustype = BUS_SPI,
10710 .manufacture_id = ST_ID,
10711 .model_id = ST_M25PX16,
10712 .total_size = 2048,
10713 .page_size = 256,
10714 /* OTP: 64B total; read 0x4B; write 0x42 */
10715 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10716 .tested = TEST_OK_PREW,
10717 .probe = probe_spi_rdid,
10718 .probe_timing = TIMING_ZERO,
10719 .block_erasers =
10720 {
10721 {
10722 .eraseblocks = { { 4 * 1024, 512 } },
10723 .block_erase = spi_block_erase_20,
10724 }, {
10725 .eraseblocks = { {64 * 1024, 32} },
10726 .block_erase = spi_block_erase_d8,
10727 }, {
10728 .eraseblocks = { {2 * 1024 * 1024, 1} },
10729 .block_erase = spi_block_erase_c7,
10730 }
10731 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010732 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010733 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10734 .write = spi_chip_write_256,
10735 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010736 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010737 },
10738
10739 {
10740 .vendor = "Micron/Numonyx/ST",
10741 .name = "M25PX32",
10742 .bustype = BUS_SPI,
10743 .manufacture_id = ST_ID,
10744 .model_id = ST_M25PX32,
10745 .total_size = 4096,
10746 .page_size = 256,
10747 /* OTP: 64B total; read 0x4B; write 0x42 */
10748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10749 .tested = TEST_OK_PRE,
10750 .probe = probe_spi_rdid,
10751 .probe_timing = TIMING_ZERO,
10752 .block_erasers =
10753 {
10754 {
10755 .eraseblocks = { { 4 * 1024, 1024 } },
10756 .block_erase = spi_block_erase_20,
10757 }, {
10758 .eraseblocks = { {64 * 1024, 64} },
10759 .block_erase = spi_block_erase_d8,
10760 }, {
10761 .eraseblocks = { {4 * 1024 * 1024, 1} },
10762 .block_erase = spi_block_erase_c7,
10763 }
10764 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010765 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010766 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10767 .write = spi_chip_write_256,
10768 .read = spi_chip_read,
10769 .voltage = {2700, 3600},
10770 },
10771
10772 {
10773 .vendor = "Micron/Numonyx/ST",
10774 .name = "M25PX64",
10775 .bustype = BUS_SPI,
10776 .manufacture_id = ST_ID,
10777 .model_id = ST_M25PX64,
10778 .total_size = 8192,
10779 .page_size = 256,
10780 /* OTP: 64B total; read 0x4B; write 0x42 */
10781 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010782 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010783 .probe = probe_spi_rdid,
10784 .probe_timing = TIMING_ZERO,
10785 .block_erasers =
10786 {
10787 {
10788 .eraseblocks = { { 4 * 1024, 2048 } },
10789 .block_erase = spi_block_erase_20,
10790 }, {
10791 .eraseblocks = { {64 * 1024, 128} },
10792 .block_erase = spi_block_erase_d8,
10793 }, {
10794 .eraseblocks = { {8 * 1024 * 1024, 1} },
10795 .block_erase = spi_block_erase_c7,
10796 }
10797 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010798 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010799 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10800 .write = spi_chip_write_256,
10801 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010802 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010803 },
10804
10805 {
10806 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010807 .name = "M25PX80",
10808 .bustype = BUS_SPI,
10809 .manufacture_id = ST_ID,
10810 .model_id = ST_M25PX80,
10811 .total_size = 1024,
10812 .page_size = 256,
10813 /* OTP: 64B total; read 0x4B, write 0x42 */
10814 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10815 .tested = TEST_OK_PREW,
10816 .probe = probe_spi_rdid,
10817 .probe_timing = TIMING_ZERO,
10818 .block_erasers =
10819 {
10820 {
10821 .eraseblocks = { { 4 * 1024, 256 } },
10822 .block_erase = spi_block_erase_20,
10823 }, {
10824 .eraseblocks = { {64 * 1024, 16} },
10825 .block_erase = spi_block_erase_d8,
10826 }, {
10827 .eraseblocks = { {1024 * 1024, 1} },
10828 .block_erase = spi_block_erase_c7,
10829 }
10830 },
10831 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10832 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10833 .write = spi_chip_write_256,
10834 .read = spi_chip_read,
10835 .voltage = {2700, 3600},
10836 },
10837
10838 {
10839 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010840 .name = "M45PE10",
10841 .bustype = BUS_SPI,
10842 .manufacture_id = ST_ID,
10843 .model_id = ST_M45PE10,
10844 .total_size = 128,
10845 .page_size = 256,
10846 .tested = TEST_UNTESTED,
10847 .probe = probe_spi_rdid,
10848 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010849 .block_erasers =
10850 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010851 {
10852 .eraseblocks = { {256, 512} },
10853 .block_erase = spi_block_erase_db,
10854 }, {
10855 .eraseblocks = { {64 * 1024, 2} },
10856 .block_erase = spi_block_erase_d8,
10857 }
10858 },
10859 .printlock = spi_prettyprint_status_register_default_welwip,
10860 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10861 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10862 .read = spi_chip_read, /* Fast read (0x0B) supported */
10863 .voltage = {2700, 3600},
10864 },
10865
10866 {
10867 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010868 .name = "M45PE16",
10869 .bustype = BUS_SPI,
10870 .manufacture_id = ST_ID,
10871 .model_id = ST_M45PE16,
10872 .total_size = 2048,
10873 .page_size = 256,
10874 .tested = TEST_UNTESTED,
10875 .probe = probe_spi_rdid,
10876 .probe_timing = TIMING_ZERO,
10877 .block_erasers =
10878 {
10879 {
10880 .eraseblocks = { {256, 8192} },
10881 .block_erase = spi_block_erase_db,
10882 }, {
10883 .eraseblocks = { {64 * 1024, 32} },
10884 .block_erase = spi_block_erase_d8,
10885 }
10886 },
10887 .printlock = spi_prettyprint_status_register_default_welwip,
10888 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10889 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10890 .read = spi_chip_read, /* Fast read (0x0B) supported */
10891 .voltage = {2700, 3600},
10892 },
10893
10894 {
10895 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010896 .name = "M45PE20",
10897 .bustype = BUS_SPI,
10898 .manufacture_id = ST_ID,
10899 .model_id = ST_M45PE20,
10900 .total_size = 256,
10901 .page_size = 256,
10902 .tested = TEST_UNTESTED,
10903 .probe = probe_spi_rdid,
10904 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010905 .block_erasers =
10906 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010907 {
10908 .eraseblocks = { {256, 1024} },
10909 .block_erase = spi_block_erase_db,
10910 }, {
10911 .eraseblocks = { {64 * 1024, 4} },
10912 .block_erase = spi_block_erase_d8,
10913 }
10914 },
10915 .printlock = spi_prettyprint_status_register_default_welwip,
10916 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10917 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10918 .read = spi_chip_read, /* Fast read (0x0B) supported */
10919 .voltage = {2700, 3600},
10920 },
10921
10922 {
10923 .vendor = "Micron/Numonyx/ST",
10924 .name = "M45PE40",
10925 .bustype = BUS_SPI,
10926 .manufacture_id = ST_ID,
10927 .model_id = ST_M45PE40,
10928 .total_size = 512,
10929 .page_size = 256,
10930 .tested = TEST_UNTESTED,
10931 .probe = probe_spi_rdid,
10932 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010933 .block_erasers =
10934 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010935 {
10936 .eraseblocks = { {256, 2048} },
10937 .block_erase = spi_block_erase_db,
10938 }, {
10939 .eraseblocks = { {64 * 1024, 8} },
10940 .block_erase = spi_block_erase_d8,
10941 }
10942 },
10943 .printlock = spi_prettyprint_status_register_default_welwip,
10944 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000010945 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010946 .read = spi_chip_read, /* Fast read (0x0B) supported */
10947 .voltage = {2700, 3600},
10948 },
10949
10950 {
10951 .vendor = "Micron/Numonyx/ST",
10952 .name = "M45PE80",
10953 .bustype = BUS_SPI,
10954 .manufacture_id = ST_ID,
10955 .model_id = ST_M45PE80,
10956 .total_size = 1024,
10957 .page_size = 256,
10958 .tested = TEST_UNTESTED,
10959 .probe = probe_spi_rdid,
10960 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010961 .block_erasers =
10962 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010963 {
10964 .eraseblocks = { {256, 4096} },
10965 .block_erase = spi_block_erase_db,
10966 }, {
10967 .eraseblocks = { {64 * 1024, 16} },
10968 .block_erase = spi_block_erase_d8,
10969 }
10970 },
10971 .printlock = spi_prettyprint_status_register_default_welwip,
10972 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10973 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10974 .read = spi_chip_read, /* Fast read (0x0B) supported */
10975 .voltage = {2700, 3600},
10976 },
10977
10978 {
10979 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070010980 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10981 .bustype = BUS_SPI,
10982 .manufacture_id = ST_ID,
10983 .model_id = ST_N25Q00A__1G,
10984 .total_size = 131072,
10985 .page_size = 256,
10986 /* supports SFDP */
10987 /* OTP: 64B total; read 0x4B, write 0x42 */
10988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10989 .tested = TEST_UNTESTED,
10990 .probe = probe_spi_rdid,
10991 .probe_timing = TIMING_ZERO,
10992 .block_erasers =
10993 {
10994 {
10995 .eraseblocks = { {4 * 1024, 32768} },
10996 .block_erase = spi_block_erase_21,
10997 }, {
10998 .eraseblocks = { {4 * 1024, 32768} },
10999 .block_erase = spi_block_erase_20,
11000 }, {
11001 .eraseblocks = { {64 * 1024, 2048} },
11002 .block_erase = spi_block_erase_dc,
11003 }, {
11004 .eraseblocks = { {64 * 1024, 2048} },
11005 .block_erase = spi_block_erase_d8,
11006 }, {
11007 .eraseblocks = { {32768 * 1024, 4} },
11008 .block_erase = spi_block_erase_c4,
11009 }
11010 },
11011 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11012 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11013 .write = spi_chip_write_256, /* Multi I/O supported */
11014 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11015 .voltage = {1700, 2000},
11016 },
11017
11018 {
11019 .vendor = "Micron/Numonyx/ST",
11020 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11021 .bustype = BUS_SPI,
11022 .manufacture_id = ST_ID,
11023 .model_id = ST_N25Q00A__3G,
11024 .total_size = 131072,
11025 .page_size = 256,
11026 /* supports SFDP */
11027 /* OTP: 64B total; read 0x4B, write 0x42 */
11028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11029 .tested = TEST_UNTESTED,
11030 .probe = probe_spi_rdid,
11031 .probe_timing = TIMING_ZERO,
11032 .block_erasers =
11033 {
11034 {
11035 .eraseblocks = { {4 * 1024, 32768} },
11036 .block_erase = spi_block_erase_21,
11037 }, {
11038 .eraseblocks = { {4 * 1024, 32768} },
11039 .block_erase = spi_block_erase_20,
11040 }, {
11041 .eraseblocks = { {64 * 1024, 2048} },
11042 .block_erase = spi_block_erase_dc,
11043 }, {
11044 .eraseblocks = { {64 * 1024, 2048} },
11045 .block_erase = spi_block_erase_d8,
11046 }, {
11047 .eraseblocks = { {32768 * 1024, 4} },
11048 .block_erase = spi_block_erase_c4,
11049 }
11050 },
11051 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11052 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11053 .write = spi_chip_write_256, /* Multi I/O supported */
11054 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11055 .voltage = {2700, 3600},
11056 },
11057
11058 {
11059 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011060 .name = "N25Q016",
11061 .bustype = BUS_SPI,
11062 .manufacture_id = ST_ID,
11063 .model_id = ST_N25Q016__1E,
11064 .total_size = 2048,
11065 .page_size = 256,
11066 /* supports SFDP */
11067 /* OTP: 64B total; read 0x4B, write 0x42 */
11068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11069 .tested = TEST_UNTESTED,
11070 .probe = probe_spi_rdid,
11071 .probe_timing = TIMING_ZERO,
11072 .block_erasers =
11073 {
11074 {
11075 .eraseblocks = { {4 * 1024, 512} },
11076 .block_erase = spi_block_erase_20,
11077 }, {
11078 .eraseblocks = { {32 * 1024, 64} },
11079 .block_erase = spi_block_erase_52,
11080 }, {
11081 .eraseblocks = { {64 * 1024, 32} },
11082 .block_erase = spi_block_erase_d8,
11083 }, {
11084 .eraseblocks = { {2 * 1024 * 1024, 1} },
11085 .block_erase = spi_block_erase_c7,
11086 }
11087 },
11088 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11089 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11090 .write = spi_chip_write_256, /* Multi I/O supported */
11091 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11092 .voltage = {1700, 2000},
11093 },
11094
11095 {
11096 .vendor = "Micron/Numonyx/ST",
11097 .name = "N25Q032..1E",
11098 .bustype = BUS_SPI,
11099 .manufacture_id = ST_ID,
11100 .model_id = ST_N25Q032__1E,
11101 .total_size = 4096,
11102 .page_size = 256,
11103 /* supports SFDP */
11104 /* OTP: 64B total; read 0x4B, write 0x42 */
11105 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11106 .tested = TEST_UNTESTED,
11107 .probe = probe_spi_rdid,
11108 .probe_timing = TIMING_ZERO,
11109 .block_erasers =
11110 {
11111 {
11112 .eraseblocks = { {4 * 1024, 1024} },
11113 .block_erase = spi_block_erase_20,
11114 }, {
11115 .eraseblocks = { {64 * 1024, 64} },
11116 .block_erase = spi_block_erase_d8,
11117 }, {
11118 .eraseblocks = { {4 * 1024 * 1024, 1} },
11119 .block_erase = spi_block_erase_c7,
11120 }
11121 },
11122 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11123 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11124 .write = spi_chip_write_256, /* Multi I/O supported */
11125 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11126 .voltage = {1700, 2000},
11127 },
11128
11129 {
11130 .vendor = "Micron/Numonyx/ST",
11131 .name = "N25Q032..3E",
11132 .bustype = BUS_SPI,
11133 .manufacture_id = ST_ID,
11134 .model_id = ST_N25Q032__3E,
11135 .total_size = 4096,
11136 .page_size = 256,
11137 /* supports SFDP */
11138 /* OTP: 64B total; read 0x4B, write 0x42 */
11139 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11140 .tested = TEST_OK_PREW,
11141 .probe = probe_spi_rdid,
11142 .probe_timing = TIMING_ZERO,
11143 .block_erasers =
11144 {
11145 {
11146 .eraseblocks = { {4 * 1024, 1024} },
11147 .block_erase = spi_block_erase_20,
11148 }, {
11149 .eraseblocks = { {64 * 1024, 64} },
11150 .block_erase = spi_block_erase_d8,
11151 }, {
11152 .eraseblocks = { {4 * 1024 * 1024, 1} },
11153 .block_erase = spi_block_erase_c7,
11154 }
11155 },
11156 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11157 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11158 .write = spi_chip_write_256, /* Multi I/O supported */
11159 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11160 .voltage = {2700, 3600},
11161 },
11162
11163 {
11164 .vendor = "Micron/Numonyx/ST",
11165 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11166 .bustype = BUS_SPI,
11167 .manufacture_id = ST_ID,
11168 .model_id = ST_N25Q064__1E,
11169 .total_size = 8192,
11170 .page_size = 256,
11171 /* supports SFDP */
11172 /* OTP: 64B total; read 0x4B, write 0x42 */
11173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011174 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011175 .probe = probe_spi_rdid,
11176 .probe_timing = TIMING_ZERO,
11177 .block_erasers =
11178 {
11179 {
11180 .eraseblocks = { {4 * 1024, 2048 } },
11181 .block_erase = spi_block_erase_20,
11182 }, {
11183 .eraseblocks = { {64 * 1024, 128} },
11184 .block_erase = spi_block_erase_d8,
11185 }, {
11186 .eraseblocks = { {8 * 1024 * 1024, 1} },
11187 .block_erase = spi_block_erase_c7,
11188 }
11189 },
11190 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11191 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11192 .write = spi_chip_write_256, /* Multi I/O supported */
11193 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11194 .voltage = {1700, 2000},
11195 },
11196
11197 {
11198 .vendor = "Micron/Numonyx/ST",
11199 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11200 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011201 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011202 .model_id = ST_N25Q064__3E,
11203 .total_size = 8192,
11204 .page_size = 256,
11205 /* supports SFDP */
11206 /* OTP: 64B total; read 0x4B, write 0x42 */
11207 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11208 .tested = TEST_OK_PREW,
11209 .probe = probe_spi_rdid,
11210 .probe_timing = TIMING_ZERO,
11211 .block_erasers =
11212 {
11213 {
11214 .eraseblocks = { {4 * 1024, 2048 } },
11215 .block_erase = spi_block_erase_20,
11216 }, {
11217 .eraseblocks = { {64 * 1024, 128} },
11218 .block_erase = spi_block_erase_d8,
11219 }, {
11220 .eraseblocks = { {8 * 1024 * 1024, 1} },
11221 .block_erase = spi_block_erase_c7,
11222 }
11223 },
11224 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11225 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11226 .write = spi_chip_write_256, /* Multi I/O supported */
11227 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11228 .voltage = {2700, 3600},
11229 },
11230
11231 {
11232 .vendor = "Micron/Numonyx/ST",
11233 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11234 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011235 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011236 .model_id = ST_N25Q128__1E,
11237 .total_size = 16384,
11238 .page_size = 256,
11239 /* supports SFDP */
11240 /* OTP: 64B total; read 0x4B, write 0x42 */
11241 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011242 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011243 .probe = probe_spi_rdid,
11244 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011245 .block_erasers =
11246 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011247 {
11248 .eraseblocks = { {4 * 1024, 4096 } },
11249 .block_erase = spi_block_erase_20,
11250 }, {
11251 .eraseblocks = { {64 * 1024, 256} },
11252 .block_erase = spi_block_erase_d8,
11253 }, {
11254 .eraseblocks = { {16384 * 1024, 1} },
11255 .block_erase = spi_block_erase_c7,
11256 }
11257 },
11258 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11259 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11260 .write = spi_chip_write_256, /* Multi I/O supported */
11261 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11262 .voltage = {1700, 2000},
11263 },
11264
11265 {
11266 .vendor = "Micron/Numonyx/ST",
11267 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11268 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011269 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011270 .model_id = ST_N25Q128__3E,
11271 .total_size = 16384,
11272 .page_size = 256,
11273 /* supports SFDP */
11274 /* OTP: 64B total; read 0x4B, write 0x42 */
11275 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11276 .tested = TEST_OK_PREW,
11277 .probe = probe_spi_rdid,
11278 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011279 .block_erasers =
11280 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011281 {
11282 .eraseblocks = { {4 * 1024, 4096 } },
11283 .block_erase = spi_block_erase_20,
11284 }, {
11285 .eraseblocks = { {64 * 1024, 256} },
11286 .block_erase = spi_block_erase_d8,
11287 }, {
11288 .eraseblocks = { {16384 * 1024, 1} },
11289 .block_erase = spi_block_erase_c7,
11290 }
11291 },
11292 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11293 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11294 .write = spi_chip_write_256, /* Multi I/O supported */
11295 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11296 .voltage = {2700, 3600},
11297 },
11298
11299 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011300 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011301 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11302 .bustype = BUS_SPI,
11303 .manufacture_id = ST_ID,
11304 .model_id = ST_N25Q256__1E,
11305 .total_size = 32768,
11306 .page_size = 256,
11307 /* supports SFDP */
11308 /* OTP: 64B total; read 0x4B, write 0x42 */
11309 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11310 .tested = TEST_UNTESTED,
11311 .probe = probe_spi_rdid,
11312 .probe_timing = TIMING_ZERO,
11313 .block_erasers =
11314 {
11315 {
11316 .eraseblocks = { {4 * 1024, 8192} },
11317 .block_erase = spi_block_erase_21,
11318 }, {
11319 .eraseblocks = { {4 * 1024, 8192} },
11320 .block_erase = spi_block_erase_20,
11321 }, {
11322 .eraseblocks = { {64 * 1024, 512} },
11323 .block_erase = spi_block_erase_dc,
11324 }, {
11325 .eraseblocks = { {64 * 1024, 512} },
11326 .block_erase = spi_block_erase_d8,
11327 }, {
11328 .eraseblocks = { {32768 * 1024, 1} },
11329 .block_erase = spi_block_erase_c7,
11330 }
11331 },
11332 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11333 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11334 .write = spi_chip_write_256, /* Multi I/O supported */
11335 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11336 .voltage = {1700, 2000},
11337 },
11338
11339 {
11340 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011341 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11342 .bustype = BUS_SPI,
11343 .manufacture_id = ST_ID,
11344 .model_id = ST_N25Q256__3E,
11345 .total_size = 32768,
11346 .page_size = 256,
11347 /* supports SFDP */
11348 /* OTP: 64B total; read 0x4B, write 0x42 */
11349 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11350 .tested = TEST_UNTESTED,
11351 .probe = probe_spi_rdid,
11352 .probe_timing = TIMING_ZERO,
11353 .block_erasers =
11354 {
11355 {
11356 .eraseblocks = { {4 * 1024, 8192} },
11357 .block_erase = spi_block_erase_21,
11358 }, {
11359 .eraseblocks = { {4 * 1024, 8192} },
11360 .block_erase = spi_block_erase_20,
11361 }, {
11362 .eraseblocks = { {64 * 1024, 512} },
11363 .block_erase = spi_block_erase_dc,
11364 }, {
11365 .eraseblocks = { {64 * 1024, 512} },
11366 .block_erase = spi_block_erase_d8,
11367 }, {
11368 .eraseblocks = { {32768 * 1024, 1} },
11369 .block_erase = spi_block_erase_c7,
11370 }
11371 },
11372 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11373 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11374 .write = spi_chip_write_256, /* Multi I/O supported */
11375 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11376 .voltage = {2700, 3600},
11377 },
11378
11379 {
11380 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011381 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011382 .bustype = BUS_SPI,
11383 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011384 .model_id = ST_N25Q512__1G,
11385 .total_size = 65536,
11386 .page_size = 256,
11387 /* supports SFDP */
11388 /* OTP: 64B total; read 0x4B, write 0x42 */
11389 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11390 .tested = TEST_UNTESTED,
11391 .probe = probe_spi_rdid,
11392 .probe_timing = TIMING_ZERO,
11393 .block_erasers =
11394 {
11395 {
11396 .eraseblocks = { {4 * 1024, 16384} },
11397 .block_erase = spi_block_erase_21,
11398 }, {
11399 .eraseblocks = { {4 * 1024, 16384} },
11400 .block_erase = spi_block_erase_20,
11401 }, {
11402 .eraseblocks = { {64 * 1024, 1024} },
11403 .block_erase = spi_block_erase_dc,
11404 }, {
11405 .eraseblocks = { {64 * 1024, 1024} },
11406 .block_erase = spi_block_erase_d8,
11407 }, {
11408 .eraseblocks = { {32768 * 1024, 2} },
11409 .block_erase = spi_block_erase_c4,
11410 }
11411 },
11412 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11413 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11414 .write = spi_chip_write_256, /* Multi I/O supported */
11415 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11416 .voltage = {1700, 2000},
11417 },
11418
11419 {
11420 .vendor = "Micron/Numonyx/ST",
11421 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11422 .bustype = BUS_SPI,
11423 .manufacture_id = ST_ID,
11424 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011425 .total_size = 65536,
11426 .page_size = 256,
11427 /* supports SFDP */
11428 /* OTP: 64B total; read 0x4B, write 0x42 */
11429 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11430 .tested = TEST_OK_PREW,
11431 .probe = probe_spi_rdid,
11432 .probe_timing = TIMING_ZERO,
11433 .block_erasers =
11434 {
11435 {
11436 .eraseblocks = { {4 * 1024, 16384} },
11437 .block_erase = spi_block_erase_21,
11438 }, {
11439 .eraseblocks = { {4 * 1024, 16384} },
11440 .block_erase = spi_block_erase_20,
11441 }, {
11442 .eraseblocks = { {64 * 1024, 1024} },
11443 .block_erase = spi_block_erase_dc,
11444 }, {
11445 .eraseblocks = { {64 * 1024, 1024} },
11446 .block_erase = spi_block_erase_d8,
11447 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070011448 .eraseblocks = { {32768 * 1024, 2} },
11449 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011450 }
11451 },
11452 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11453 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11454 .write = spi_chip_write_256, /* Multi I/O supported */
11455 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11456 .voltage = {2700, 3600},
11457 },
11458
11459 {
Ed Swierk199ab392017-07-03 13:33:44 -070011460 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011461 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11462 .bustype = BUS_SPI,
11463 .manufacture_id = ST_ID,
11464 .model_id = ST_N25Q00A__3G,
11465 .total_size = 131072,
11466 .page_size = 256,
11467 /* supports SFDP */
11468 /* OTP: 64B total; read 0x4B, write 0x42 */
11469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11470 .tested = TEST_OK_PREW,
11471 .probe = probe_spi_rdid,
11472 .probe_timing = TIMING_ZERO,
11473 .block_erasers =
11474 {
11475 {
11476 .eraseblocks = { {4 * 1024, 32768} },
11477 .block_erase = spi_block_erase_21,
11478 }, {
11479 .eraseblocks = { {4 * 1024, 32768} },
11480 .block_erase = spi_block_erase_20,
11481 }, {
11482 .eraseblocks = { {32 * 1024, 4096} },
11483 .block_erase = spi_block_erase_5c,
11484 }, {
11485 .eraseblocks = { {32 * 1024, 4096} },
11486 .block_erase = spi_block_erase_52,
11487 }, {
11488 .eraseblocks = { {64 * 1024, 2048} },
11489 .block_erase = spi_block_erase_dc,
11490 }, {
11491 .eraseblocks = { {64 * 1024, 2048} },
11492 .block_erase = spi_block_erase_d8,
11493 }, {
11494 .eraseblocks = { {65536 * 1024, 2} },
11495 .block_erase = spi_block_erase_c4,
11496 }
11497 },
11498 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11499 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11500 .write = spi_chip_write_256, /* Multi I/O supported */
11501 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11502 .voltage = {2700, 3600},
11503 },
11504
11505 {
11506 .vendor = "Micron",
11507 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11508 .bustype = BUS_SPI,
11509 .manufacture_id = ST_ID,
11510 .model_id = ST_N25Q00A__1G,
11511 .total_size = 131072,
11512 .page_size = 256,
11513 /* supports SFDP */
11514 /* OTP: 64B total; read 0x4B, write 0x42 */
11515 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11516 .tested = TEST_UNTESTED,
11517 .probe = probe_spi_rdid,
11518 .probe_timing = TIMING_ZERO,
11519 .block_erasers =
11520 {
11521 {
11522 .eraseblocks = { {4 * 1024, 32768} },
11523 .block_erase = spi_block_erase_21,
11524 }, {
11525 .eraseblocks = { {4 * 1024, 32768} },
11526 .block_erase = spi_block_erase_20,
11527 }, {
11528 .eraseblocks = { {32 * 1024, 4096} },
11529 .block_erase = spi_block_erase_5c,
11530 }, {
11531 .eraseblocks = { {32 * 1024, 4096} },
11532 .block_erase = spi_block_erase_52,
11533 }, {
11534 .eraseblocks = { {64 * 1024, 2048} },
11535 .block_erase = spi_block_erase_dc,
11536 }, {
11537 .eraseblocks = { {64 * 1024, 2048} },
11538 .block_erase = spi_block_erase_d8,
11539 }, {
11540 .eraseblocks = { {65536 * 1024, 2} },
11541 .block_erase = spi_block_erase_c4,
11542 }
11543 },
11544 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11545 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11546 .write = spi_chip_write_256, /* Multi I/O supported */
11547 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11548 .voltage = {1700, 2000},
11549 },
11550
11551 {
11552 .vendor = "Micron",
11553 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11554 .bustype = BUS_SPI,
11555 .manufacture_id = ST_ID,
11556 .model_id = ST_MT25QL02G,
11557 .total_size = 262144,
11558 .page_size = 256,
11559 /* supports SFDP */
11560 /* OTP: 64B total; read 0x4B, write 0x42 */
11561 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11562 .tested = TEST_UNTESTED,
11563 .probe = probe_spi_rdid,
11564 .probe_timing = TIMING_ZERO,
11565 .block_erasers =
11566 {
11567 {
11568 .eraseblocks = { {4 * 1024, 65536} },
11569 .block_erase = spi_block_erase_21,
11570 }, {
11571 .eraseblocks = { {4 * 1024, 65536} },
11572 .block_erase = spi_block_erase_20,
11573 }, {
11574 .eraseblocks = { {32 * 1024, 8192} },
11575 .block_erase = spi_block_erase_5c,
11576 }, {
11577 .eraseblocks = { {32 * 1024, 8192} },
11578 .block_erase = spi_block_erase_52,
11579 }, {
11580 .eraseblocks = { {64 * 1024, 4096} },
11581 .block_erase = spi_block_erase_dc,
11582 }, {
11583 .eraseblocks = { {64 * 1024, 4096} },
11584 .block_erase = spi_block_erase_d8,
11585 }, {
11586 .eraseblocks = { {65536 * 1024, 4} },
11587 .block_erase = spi_block_erase_c4,
11588 }
11589 },
11590 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11591 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11592 .write = spi_chip_write_256, /* Multi I/O supported */
11593 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11594 .voltage = {2700, 3600},
11595 },
11596
11597 {
11598 .vendor = "Micron",
11599 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11600 .bustype = BUS_SPI,
11601 .manufacture_id = ST_ID,
11602 .model_id = ST_MT25QU02G,
11603 .total_size = 262144,
11604 .page_size = 256,
11605 /* supports SFDP */
11606 /* OTP: 64B total; read 0x4B, write 0x42 */
11607 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11608 .tested = TEST_UNTESTED,
11609 .probe = probe_spi_rdid,
11610 .probe_timing = TIMING_ZERO,
11611 .block_erasers =
11612 {
11613 {
11614 .eraseblocks = { {4 * 1024, 65536} },
11615 .block_erase = spi_block_erase_21,
11616 }, {
11617 .eraseblocks = { {4 * 1024, 65536} },
11618 .block_erase = spi_block_erase_20,
11619 }, {
11620 .eraseblocks = { {32 * 1024, 8192} },
11621 .block_erase = spi_block_erase_5c,
11622 }, {
11623 .eraseblocks = { {32 * 1024, 8192} },
11624 .block_erase = spi_block_erase_52,
11625 }, {
11626 .eraseblocks = { {64 * 1024, 4096} },
11627 .block_erase = spi_block_erase_dc,
11628 }, {
11629 .eraseblocks = { {64 * 1024, 4096} },
11630 .block_erase = spi_block_erase_d8,
11631 }, {
11632 .eraseblocks = { {65536 * 1024, 4} },
11633 .block_erase = spi_block_erase_c4,
11634 }
11635 },
11636 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11637 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11638 .write = spi_chip_write_256, /* Multi I/O supported */
11639 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11640 .voltage = {1700, 2000},
11641 },
11642
11643 {
11644 .vendor = "Micron",
11645 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11646 .bustype = BUS_SPI,
11647 .manufacture_id = ST_ID,
11648 .model_id = ST_N25Q128__1E,
11649 .total_size = 16384,
11650 .page_size = 256,
11651 /* supports SFDP */
11652 /* OTP: 64B total; read 0x4B, write 0x42 */
11653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11654 .tested = TEST_UNTESTED,
11655 .probe = probe_spi_rdid,
11656 .probe_timing = TIMING_ZERO,
11657 .block_erasers =
11658 {
11659 {
11660 .eraseblocks = { {4 * 1024, 4096} },
11661 .block_erase = spi_block_erase_20,
11662 }, {
11663 .eraseblocks = { {32 * 1024, 512} },
11664 .block_erase = spi_block_erase_52,
11665 }, {
11666 .eraseblocks = { {64 * 1024, 256} },
11667 .block_erase = spi_block_erase_d8,
11668 }, {
11669 .eraseblocks = { {16384 * 1024, 1} },
11670 .block_erase = spi_block_erase_c7,
11671 }, {
11672 .eraseblocks = { {16384 * 1024, 1} },
11673 .block_erase = spi_block_erase_60,
11674 }
11675 },
11676 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11677 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11678 .write = spi_chip_write_256, /* Multi I/O supported */
11679 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11680 .voltage = {1700, 2000},
11681 },
11682
11683 {
11684 .vendor = "Micron",
11685 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11686 .bustype = BUS_SPI,
11687 .manufacture_id = ST_ID,
11688 .model_id = ST_N25Q128__3E,
11689 .total_size = 16384,
11690 .page_size = 256,
11691 /* supports SFDP */
11692 /* OTP: 64B total; read 0x4B, write 0x42 */
11693 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11694 .tested = TEST_UNTESTED,
11695 .probe = probe_spi_rdid,
11696 .probe_timing = TIMING_ZERO,
11697 .block_erasers =
11698 {
11699 {
11700 .eraseblocks = { {4 * 1024, 4096} },
11701 .block_erase = spi_block_erase_20,
11702 }, {
11703 .eraseblocks = { {32 * 1024, 512} },
11704 .block_erase = spi_block_erase_52,
11705 }, {
11706 .eraseblocks = { {64 * 1024, 256} },
11707 .block_erase = spi_block_erase_d8,
11708 }, {
11709 .eraseblocks = { {16384 * 1024, 1} },
11710 .block_erase = spi_block_erase_c7,
11711 }, {
11712 .eraseblocks = { {16384 * 1024, 1} },
11713 .block_erase = spi_block_erase_60,
11714 }
11715 },
11716 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11717 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11718 .write = spi_chip_write_256, /* Multi I/O supported */
11719 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11720 .voltage = {2700, 3600},
11721 },
11722
11723 {
11724 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011725 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070011726 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011727 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070011728 .model_id = ST_N25Q256__3E,
11729 .total_size = 32768,
11730 .page_size = 256,
11731 /* supports SFDP */
11732 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010011733 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010011734 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070011735 .probe = probe_spi_rdid,
11736 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011737 .block_erasers =
11738 {
Ed Swierk199ab392017-07-03 13:33:44 -070011739 {
11740 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011741 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070011742 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011743 .eraseblocks = { {4 * 1024, 8192} },
11744 .block_erase = spi_block_erase_20,
11745 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070011746 .eraseblocks = { {32 * 1024, 1024} },
11747 .block_erase = spi_block_erase_5c,
11748 }, {
11749 .eraseblocks = { {32 * 1024, 1024} },
11750 .block_erase = spi_block_erase_52,
11751 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011752 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011753 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070011754 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011755 .eraseblocks = { {64 * 1024, 512} },
11756 .block_erase = spi_block_erase_d8,
11757 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011758 .eraseblocks = { {32768 * 1024, 1} },
11759 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070011760 }, {
11761 .eraseblocks = { {32768 * 1024, 1} },
11762 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070011763 }
11764 },
11765 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11766 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11767 .write = spi_chip_write_256, /* Multi I/O supported */
11768 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11769 .voltage = {2700, 3600},
11770 },
11771
11772 {
11773 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011774 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11775 .bustype = BUS_SPI,
11776 .manufacture_id = ST_ID,
11777 .model_id = ST_N25Q256__1E,
11778 .total_size = 32768,
11779 .page_size = 256,
11780 /* supports SFDP */
11781 /* OTP: 64B total; read 0x4B, write 0x42 */
11782 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11783 .tested = TEST_UNTESTED,
11784 .probe = probe_spi_rdid,
11785 .probe_timing = TIMING_ZERO,
11786 .block_erasers =
11787 {
11788 {
11789 .eraseblocks = { {4 * 1024, 8192} },
11790 .block_erase = spi_block_erase_21,
11791 }, {
11792 .eraseblocks = { {4 * 1024, 8192} },
11793 .block_erase = spi_block_erase_20,
11794 }, {
11795 .eraseblocks = { {32 * 1024, 1024} },
11796 .block_erase = spi_block_erase_5c,
11797 }, {
11798 .eraseblocks = { {32 * 1024, 1024} },
11799 .block_erase = spi_block_erase_52,
11800 }, {
11801 .eraseblocks = { {64 * 1024, 512} },
11802 .block_erase = spi_block_erase_dc,
11803 }, {
11804 .eraseblocks = { {64 * 1024, 512} },
11805 .block_erase = spi_block_erase_d8,
11806 }, {
11807 .eraseblocks = { {32768 * 1024, 1} },
11808 .block_erase = spi_block_erase_c7,
11809 }, {
11810 .eraseblocks = { {32768 * 1024, 1} },
11811 .block_erase = spi_block_erase_60,
11812 }
11813 },
11814 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11815 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11816 .write = spi_chip_write_256, /* Multi I/O supported */
11817 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11818 .voltage = {1700, 2000},
11819 },
11820
11821 {
11822 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011823 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070011824 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011825 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011826 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070011827 .total_size = 65536,
11828 .page_size = 256,
11829 /* supports SFDP */
11830 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010011831 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020011832 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070011833 .probe = probe_spi_rdid,
11834 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011835 .block_erasers =
11836 {
Ed Swierk199ab392017-07-03 13:33:44 -070011837 {
11838 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011839 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070011840 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011841 .eraseblocks = { {4 * 1024, 16384} },
11842 .block_erase = spi_block_erase_20,
11843 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070011844 .eraseblocks = { {32 * 1024, 2048} },
11845 .block_erase = spi_block_erase_5c,
11846 }, {
11847 .eraseblocks = { {32 * 1024, 2048} },
11848 .block_erase = spi_block_erase_52,
11849 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011850 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011851 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070011852 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011853 .eraseblocks = { {64 * 1024, 1024} },
11854 .block_erase = spi_block_erase_d8,
11855 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011856 .eraseblocks = { {65536 * 1024, 1} },
11857 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070011858 }, {
11859 .eraseblocks = { {65536 * 1024, 1} },
11860 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070011861 }
11862 },
11863 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11864 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11865 .write = spi_chip_write_256, /* Multi I/O supported */
11866 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11867 .voltage = {2700, 3600},
11868 },
11869
11870 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011871 .vendor = "Micron",
11872 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11873 .bustype = BUS_SPI,
11874 .manufacture_id = ST_ID,
11875 .model_id = ST_N25Q512__1G,
11876 .total_size = 65536,
11877 .page_size = 256,
11878 /* supports SFDP */
11879 /* OTP: 64B total; read 0x4B, write 0x42 */
11880 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11881 .tested = TEST_OK_PREW,
11882 .probe = probe_spi_rdid,
11883 .probe_timing = TIMING_ZERO,
11884 .block_erasers =
11885 {
11886 {
11887 .eraseblocks = { {4 * 1024, 16384} },
11888 .block_erase = spi_block_erase_21,
11889 }, {
11890 .eraseblocks = { {4 * 1024, 16384} },
11891 .block_erase = spi_block_erase_20,
11892 }, {
11893 .eraseblocks = { {32 * 1024, 2048} },
11894 .block_erase = spi_block_erase_5c,
11895 }, {
11896 .eraseblocks = { {32 * 1024, 2048} },
11897 .block_erase = spi_block_erase_52,
11898 }, {
11899 .eraseblocks = { {64 * 1024, 1024} },
11900 .block_erase = spi_block_erase_dc,
11901 }, {
11902 .eraseblocks = { {64 * 1024, 1024} },
11903 .block_erase = spi_block_erase_d8,
11904 }, {
11905 .eraseblocks = { {65536 * 1024, 1} },
11906 .block_erase = spi_block_erase_c7,
11907 }, {
11908 .eraseblocks = { {65536 * 1024, 1} },
11909 .block_erase = spi_block_erase_60,
11910 }
11911 },
11912 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11913 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11914 .write = spi_chip_write_256, /* Multi I/O supported */
11915 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11916 .voltage = {1700, 2000},
11917 },
11918
11919 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011920 .vendor = "MoselVitelic",
11921 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011922 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011923 .manufacture_id = SYNCMOS_MVC_ID,
11924 .model_id = MVC_V29C51000B,
11925 .total_size = 64,
11926 .page_size = 512,
11927 .feature_bits = FEATURE_EITHER_RESET,
11928 .tested = TEST_UNTESTED,
11929 .probe = probe_jedec,
11930 .probe_timing = TIMING_ZERO,
11931 .block_erasers =
11932 {
11933 {
11934 .eraseblocks = { {512, 128} },
11935 .block_erase = erase_sector_jedec,
11936 }, {
11937 .eraseblocks = { {64 * 1024, 1} },
11938 .block_erase = erase_chip_block_jedec,
11939 },
11940 },
11941 .write = write_jedec_1,
11942 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011943 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011944 },
11945
11946 {
11947 .vendor = "MoselVitelic",
11948 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011949 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011950 .manufacture_id = SYNCMOS_MVC_ID,
11951 .model_id = MVC_V29C51000T,
11952 .total_size = 64,
11953 .page_size = 512,
11954 .feature_bits = FEATURE_EITHER_RESET,
11955 .tested = TEST_UNTESTED,
11956 .probe = probe_jedec,
11957 .probe_timing = TIMING_ZERO,
11958 .block_erasers =
11959 {
11960 {
11961 .eraseblocks = { {512, 128} },
11962 .block_erase = erase_sector_jedec,
11963 }, {
11964 .eraseblocks = { {64 * 1024, 1} },
11965 .block_erase = erase_chip_block_jedec,
11966 },
11967 },
11968 .write = write_jedec_1,
11969 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011970 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011971 },
11972
11973 {
11974 .vendor = "MoselVitelic",
11975 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011976 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011977 .manufacture_id = SYNCMOS_MVC_ID,
11978 .model_id = MVC_V29C51400B,
11979 .total_size = 512,
11980 .page_size = 1024,
11981 .feature_bits = FEATURE_EITHER_RESET,
11982 .tested = TEST_UNTESTED,
11983 .probe = probe_jedec,
11984 .probe_timing = TIMING_ZERO,
11985 .block_erasers =
11986 {
11987 {
11988 .eraseblocks = { {1024, 512} },
11989 .block_erase = erase_sector_jedec,
11990 }, {
11991 .eraseblocks = { {512 * 1024, 1} },
11992 .block_erase = erase_chip_block_jedec,
11993 },
11994 },
11995 .write = write_jedec_1,
11996 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011997 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011998 },
11999
12000 {
12001 .vendor = "MoselVitelic",
12002 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012003 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012004 .manufacture_id = SYNCMOS_MVC_ID,
12005 .model_id = MVC_V29C51400T,
12006 .total_size = 512,
12007 .page_size = 1024,
12008 .feature_bits = FEATURE_EITHER_RESET,
12009 .tested = TEST_UNTESTED,
12010 .probe = probe_jedec,
12011 .probe_timing = TIMING_ZERO,
12012 .block_erasers =
12013 {
12014 {
12015 .eraseblocks = { {1024, 512} },
12016 .block_erase = erase_sector_jedec,
12017 }, {
12018 .eraseblocks = { {512 * 1024, 1} },
12019 .block_erase = erase_chip_block_jedec,
12020 },
12021 },
12022 .write = write_jedec_1,
12023 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012024 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012025 },
12026
12027 {
12028 .vendor = "MoselVitelic",
12029 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012030 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012031 .manufacture_id = SYNCMOS_MVC_ID,
12032 .model_id = MVC_V29LC51000,
12033 .total_size = 64,
12034 .page_size = 512,
12035 .feature_bits = FEATURE_EITHER_RESET,
12036 .tested = TEST_UNTESTED,
12037 .probe = probe_jedec,
12038 .probe_timing = TIMING_ZERO,
12039 .block_erasers =
12040 {
12041 {
12042 .eraseblocks = { {512, 128} },
12043 .block_erase = erase_sector_jedec,
12044 }, {
12045 .eraseblocks = { {64 * 1024, 1} },
12046 .block_erase = erase_chip_block_jedec,
12047 },
12048 },
12049 .write = write_jedec_1,
12050 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012051 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012052 },
12053
12054 {
12055 .vendor = "MoselVitelic",
12056 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012057 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012058 .manufacture_id = SYNCMOS_MVC_ID,
12059 .model_id = MVC_V29LC51001,
12060 .total_size = 128,
12061 .page_size = 512,
12062 .feature_bits = FEATURE_EITHER_RESET,
12063 .tested = TEST_UNTESTED,
12064 .probe = probe_jedec,
12065 .probe_timing = TIMING_ZERO,
12066 .block_erasers =
12067 {
12068 {
12069 .eraseblocks = { {512, 256} },
12070 .block_erase = erase_sector_jedec,
12071 }, {
12072 .eraseblocks = { {128 * 1024, 1} },
12073 .block_erase = erase_chip_block_jedec,
12074 },
12075 },
12076 .write = write_jedec_1,
12077 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012078 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012079 },
12080
12081 {
12082 .vendor = "MoselVitelic",
12083 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012084 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012085 .manufacture_id = SYNCMOS_MVC_ID,
12086 .model_id = MVC_V29LC51002,
12087 .total_size = 256,
12088 .page_size = 512,
12089 .feature_bits = FEATURE_EITHER_RESET,
12090 .tested = TEST_UNTESTED,
12091 .probe = probe_jedec,
12092 .probe_timing = TIMING_ZERO,
12093 .block_erasers =
12094 {
12095 {
12096 .eraseblocks = { {512, 512} },
12097 .block_erase = erase_sector_jedec,
12098 }, {
12099 .eraseblocks = { {256 * 1024, 1} },
12100 .block_erase = erase_chip_block_jedec,
12101 },
12102 },
12103 .write = write_jedec_1,
12104 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012105 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012106 },
12107
12108 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012109 .vendor = "Nantronics",
12110 .name = "N25S10",
12111 .bustype = BUS_SPI,
12112 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12113 .model_id = NANTRONICS_N25S10,
12114 .total_size = 128,
12115 .page_size = 256,
12116 .feature_bits = FEATURE_WRSR_WREN,
12117 .tested = TEST_UNTESTED,
12118 .probe = probe_spi_rdid,
12119 .probe_timing = TIMING_ZERO,
12120 .block_erasers =
12121 {
12122 {
12123 .eraseblocks = { {4 * 1024, 32} },
12124 .block_erase = spi_block_erase_20,
12125 }, {
12126 .eraseblocks = { {4 * 1024, 32} },
12127 .block_erase = spi_block_erase_d7,
12128 }, {
12129 .eraseblocks = { {32 * 1024, 4} },
12130 .block_erase = spi_block_erase_52,
12131 }, {
12132 .eraseblocks = { {64 * 1024, 2} },
12133 .block_erase = spi_block_erase_d8,
12134 }, {
12135 .eraseblocks = { {128 * 1024, 1} },
12136 .block_erase = spi_block_erase_60,
12137 }, {
12138 .eraseblocks = { {128 * 1024, 1} },
12139 .block_erase = spi_block_erase_c7,
12140 }
12141 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012142 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012143 .unlock = spi_disable_blockprotect_bp3_srwd,
12144 .write = spi_chip_write_256,
12145 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12146 .voltage = {2700, 3600},
12147 },
12148
12149 {
12150 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012151 .name = "N25S16",
12152 .bustype = BUS_SPI,
12153 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12154 .model_id = NANTRONICS_N25S16,
12155 .total_size = 2048,
12156 .page_size = 256,
12157 .feature_bits = FEATURE_WRSR_WREN,
12158 .tested = TEST_UNTESTED,
12159 .probe = probe_spi_rdid,
12160 .probe_timing = TIMING_ZERO,
12161 .block_erasers =
12162 {
12163 {
12164 .eraseblocks = { {4 * 1024, 512} },
12165 .block_erase = spi_block_erase_20,
12166 }, {
12167 .eraseblocks = { {64 * 1024, 32} },
12168 .block_erase = spi_block_erase_d8,
12169 }, {
12170 .eraseblocks = { {2048 * 1024, 1} },
12171 .block_erase = spi_block_erase_60,
12172 }, {
12173 .eraseblocks = { {2048 * 1024, 1} },
12174 .block_erase = spi_block_erase_c7,
12175 }
12176 },
12177 .printlock = spi_prettyprint_status_register_bp3_srwd,
12178 .unlock = spi_disable_blockprotect_bp3_srwd,
12179 .write = spi_chip_write_256,
12180 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12181 .voltage = {2700, 3600},
12182 },
12183
12184 {
12185 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012186 .name = "N25S20",
12187 .bustype = BUS_SPI,
12188 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12189 .model_id = NANTRONICS_N25S20,
12190 .total_size = 256,
12191 .page_size = 256,
12192 .feature_bits = FEATURE_WRSR_WREN,
12193 .tested = TEST_UNTESTED,
12194 .probe = probe_spi_rdid,
12195 .probe_timing = TIMING_ZERO,
12196 .block_erasers =
12197 {
12198 {
12199 .eraseblocks = { {4 * 1024, 64} },
12200 .block_erase = spi_block_erase_20,
12201 }, {
12202 .eraseblocks = { {4 * 1024, 64} },
12203 .block_erase = spi_block_erase_d7,
12204 }, {
12205 .eraseblocks = { {32 * 1024, 8} },
12206 .block_erase = spi_block_erase_52,
12207 }, {
12208 .eraseblocks = { {64 * 1024, 4} },
12209 .block_erase = spi_block_erase_d8,
12210 }, {
12211 .eraseblocks = { {256 * 1024, 1} },
12212 .block_erase = spi_block_erase_60,
12213 }, {
12214 .eraseblocks = { {256 * 1024, 1} },
12215 .block_erase = spi_block_erase_c7,
12216 }
12217 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012218 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012219 .unlock = spi_disable_blockprotect_bp3_srwd,
12220 .write = spi_chip_write_256,
12221 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12222 .voltage = {2700, 3600},
12223 },
12224
12225 {
12226 .vendor = "Nantronics",
12227 .name = "N25S40",
12228 .bustype = BUS_SPI,
12229 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12230 .model_id = NANTRONICS_N25S40,
12231 .total_size = 512,
12232 .page_size = 256,
12233 .feature_bits = FEATURE_WRSR_WREN,
12234 .tested = TEST_UNTESTED,
12235 .probe = probe_spi_rdid,
12236 .probe_timing = TIMING_ZERO,
12237 .block_erasers =
12238 {
12239 {
12240 .eraseblocks = { {4 * 1024, 128} },
12241 .block_erase = spi_block_erase_20,
12242 }, {
12243 .eraseblocks = { {4 * 1024, 128} },
12244 .block_erase = spi_block_erase_d7,
12245 }, {
12246 .eraseblocks = { {32 * 1024, 16} },
12247 .block_erase = spi_block_erase_52,
12248 }, {
12249 .eraseblocks = { {64 * 1024, 8} },
12250 .block_erase = spi_block_erase_d8,
12251 }, {
12252 .eraseblocks = { {512 * 1024, 1} },
12253 .block_erase = spi_block_erase_60,
12254 }, {
12255 .eraseblocks = { {512 * 1024, 1} },
12256 .block_erase = spi_block_erase_c7,
12257 }
12258 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012259 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012260 .unlock = spi_disable_blockprotect_bp3_srwd,
12261 .write = spi_chip_write_256,
12262 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12263 .voltage = {2700, 3600},
12264 },
12265
12266 {
12267 .vendor = "Nantronics",
12268 .name = "N25S80",
12269 .bustype = BUS_SPI,
12270 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12271 .model_id = NANTRONICS_N25S80,
12272 .total_size = 1024,
12273 .page_size = 256,
12274 .feature_bits = FEATURE_WRSR_WREN,
12275 .tested = TEST_UNTESTED,
12276 .probe = probe_spi_rdid,
12277 .probe_timing = TIMING_ZERO,
12278 .block_erasers =
12279 {
12280 {
12281 .eraseblocks = { {4 * 1024, 256} },
12282 .block_erase = spi_block_erase_20,
12283 }, {
12284 .eraseblocks = { {32 * 1024, 32} },
12285 .block_erase = spi_block_erase_52,
12286 }, {
12287 .eraseblocks = { {64 * 1024, 16} },
12288 .block_erase = spi_block_erase_d8,
12289 }, {
12290 .eraseblocks = { {1024 * 1024, 1} },
12291 .block_erase = spi_block_erase_60,
12292 }, {
12293 .eraseblocks = { {1024 * 1024, 1} },
12294 .block_erase = spi_block_erase_c7,
12295 }
12296 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012297 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012298 .unlock = spi_disable_blockprotect_bp3_srwd,
12299 .write = spi_chip_write_256,
12300 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12301 .voltage = {2700, 3600},
12302 },
12303
12304 {
Stefan Taunerf4451612013-04-19 01:59:15 +000012305 .vendor = "PMC",
12306 .name = "Pm25LD010(C)",
12307 .bustype = BUS_SPI,
12308 .manufacture_id = PMC_ID,
12309 .model_id = PMC_PM25LD010,
12310 .total_size = 128,
12311 .page_size = 256,
12312 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012313 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012314 .probe = probe_spi_rdid,
12315 .probe_timing = TIMING_ZERO,
12316 .block_erasers =
12317 {
12318 {
12319 .eraseblocks = { {4 * 1024, 32} },
12320 .block_erase = spi_block_erase_20,
12321 }, {
12322 .eraseblocks = { {4 * 1024, 32} },
12323 .block_erase = spi_block_erase_d7,
12324 }, {
12325 .eraseblocks = { {32 * 1024, 4} },
12326 .block_erase = spi_block_erase_d8,
12327 }, {
12328 .eraseblocks = { {128 * 1024, 1} },
12329 .block_erase = spi_block_erase_60,
12330 }, {
12331 .eraseblocks = { {128 * 1024, 1} },
12332 .block_erase = spi_block_erase_c7,
12333 }
12334 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012335 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012336 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12337 .write = spi_chip_write_256,
12338 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12339 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
12340 },
12341
12342 {
12343 .vendor = "PMC",
12344 .name = "Pm25LD020(C)",
12345 .bustype = BUS_SPI,
12346 .manufacture_id = PMC_ID,
12347 .model_id = PMC_PM25LD020,
12348 .total_size = 256,
12349 .page_size = 256,
12350 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020012351 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012352 .probe = probe_spi_rdid,
12353 .probe_timing = TIMING_ZERO,
12354 .block_erasers =
12355 {
12356 {
12357 .eraseblocks = { {4 * 1024, 64} },
12358 .block_erase = spi_block_erase_20,
12359 }, {
12360 .eraseblocks = { {4 * 1024, 64} },
12361 .block_erase = spi_block_erase_d7,
12362 }, {
12363 .eraseblocks = { {64 * 1024, 4} },
12364 .block_erase = spi_block_erase_d8,
12365 }, {
12366 .eraseblocks = { {256 * 1024, 1} },
12367 .block_erase = spi_block_erase_60,
12368 }, {
12369 .eraseblocks = { {256 * 1024, 1} },
12370 .block_erase = spi_block_erase_c7,
12371 }
12372 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012373 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012374 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12375 .write = spi_chip_write_256,
12376 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12377 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
12378 },
12379
12380 {
12381 .vendor = "PMC",
12382 .name = "Pm25LD040(C)",
12383 .bustype = BUS_SPI,
12384 .manufacture_id = PMC_ID,
12385 .model_id = PMC_PM25LV040,
12386 .total_size = 512,
12387 .page_size = 256,
12388 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020012389 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012390 .probe = probe_spi_rdid,
12391 .probe_timing = TIMING_ZERO,
12392 .block_erasers =
12393 {
12394 {
12395 .eraseblocks = { {4 * 1024, 128} },
12396 .block_erase = spi_block_erase_20,
12397 }, {
12398 .eraseblocks = { {4 * 1024, 128} },
12399 .block_erase = spi_block_erase_d7,
12400 }, {
12401 .eraseblocks = { {64 * 1024, 8} },
12402 .block_erase = spi_block_erase_d8,
12403 }, {
12404 .eraseblocks = { {512 * 1024, 1} },
12405 .block_erase = spi_block_erase_60,
12406 }, {
12407 .eraseblocks = { {512 * 1024, 1} },
12408 .block_erase = spi_block_erase_c7,
12409 }
12410 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012411 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012412 .unlock = spi_disable_blockprotect,
12413 .write = spi_chip_write_256,
12414 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12415 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
12416 },
12417
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012418 {
12419 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012420 .name = "Pm25LD256C",
12421 .bustype = BUS_SPI,
12422 .manufacture_id = PMC_ID,
12423 .model_id = PMC_PM25LD256C,
12424 .total_size = 32,
12425 .page_size = 256,
12426 .feature_bits = FEATURE_WRSR_WREN,
12427 .tested = TEST_UNTESTED,
12428 .probe = probe_spi_rdid,
12429 .probe_timing = TIMING_ZERO,
12430 .block_erasers =
12431 {
12432 {
12433 .eraseblocks = { {4 * 1024, 8} },
12434 .block_erase = spi_block_erase_20,
12435 }, {
12436 .eraseblocks = { {4 * 1024, 8} },
12437 .block_erase = spi_block_erase_d7,
12438 }, {
12439 .eraseblocks = { {32 * 1024, 1} },
12440 .block_erase = spi_block_erase_d8,
12441 }, {
12442 .eraseblocks = { {32 * 1024, 1} },
12443 .block_erase = spi_block_erase_60,
12444 }, {
12445 .eraseblocks = { {32 * 1024, 1} },
12446 .block_erase = spi_block_erase_c7,
12447 }
12448 },
12449 .printlock = spi_prettyprint_status_register_bp2_srwd,
12450 .unlock = spi_disable_blockprotect,
12451 .write = spi_chip_write_256,
12452 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12453 .voltage = {2700, 3600},
12454 },
12455
12456 {
12457 .vendor = "PMC",
12458 .name = "Pm25LD512(C)",
12459 .bustype = BUS_SPI,
12460 .manufacture_id = PMC_ID,
12461 .model_id = PMC_PM25LD512,
12462 .total_size = 64,
12463 .page_size = 256,
12464 .feature_bits = FEATURE_WRSR_WREN,
12465 .tested = TEST_OK_PREW,
12466 .probe = probe_spi_rdid,
12467 .probe_timing = TIMING_ZERO,
12468 .block_erasers =
12469 {
12470 {
12471 .eraseblocks = { {4 * 1024, 16} },
12472 .block_erase = spi_block_erase_20,
12473 }, {
12474 .eraseblocks = { {4 * 1024, 16} },
12475 .block_erase = spi_block_erase_d7,
12476 }, {
12477 .eraseblocks = { {32 * 1024, 2} },
12478 .block_erase = spi_block_erase_d8,
12479 }, {
12480 .eraseblocks = { {64 * 1024, 1} },
12481 .block_erase = spi_block_erase_60,
12482 }, {
12483 .eraseblocks = { {64 * 1024, 1} },
12484 .block_erase = spi_block_erase_c7,
12485 }
12486 },
12487 .printlock = spi_prettyprint_status_register_bp2_srwd,
12488 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12489 .write = spi_chip_write_256,
12490 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12491 .voltage = {2300, 3600},
12492 },
12493
12494 {
12495 .vendor = "PMC",
12496 .name = "Pm25LQ016",
12497 .bustype = BUS_SPI,
12498 .manufacture_id = PMC_ID,
12499 .model_id = PMC_PM25LQ016,
12500 .total_size = 2048,
12501 .page_size = 256,
12502 /* OTP: 256B total; read 0x4B, write 0xB1 */
12503 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12504 .tested = TEST_UNTESTED,
12505 .probe = probe_spi_rdid,
12506 .probe_timing = TIMING_ZERO,
12507 .block_erasers =
12508 {
12509 {
12510 .eraseblocks = { {4 * 1024, 512} },
12511 .block_erase = spi_block_erase_20,
12512 }, {
12513 .eraseblocks = { {4 * 1024, 512} },
12514 .block_erase = spi_block_erase_d7,
12515 }, {
12516 .eraseblocks = { {64 * 1024, 32} },
12517 .block_erase = spi_block_erase_d8,
12518 }, {
12519 .eraseblocks = { {2048 * 1024, 1} },
12520 .block_erase = spi_block_erase_60,
12521 }, {
12522 .eraseblocks = { {2048 * 1024, 1} },
12523 .block_erase = spi_block_erase_c7,
12524 }
12525 },
12526 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12527 .unlock = spi_disable_blockprotect_bp3_srwd,
12528 .write = spi_chip_write_256,
12529 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12530 .voltage = {2300, 3600},
12531 },
12532
12533 {
12534 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012535 .name = "Pm25LQ020",
12536 .bustype = BUS_SPI,
12537 .manufacture_id = PMC_ID,
12538 .model_id = PMC_PM25LQ020,
12539 .total_size = 256,
12540 .page_size = 256,
12541 /* OTP: 256B total; read 0x4B, write 0xB1 */
12542 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12543 .tested = TEST_UNTESTED,
12544 .probe = probe_spi_rdid,
12545 .probe_timing = TIMING_ZERO,
12546 .block_erasers =
12547 {
12548 {
12549 .eraseblocks = { {4 * 1024, 64} },
12550 .block_erase = spi_block_erase_20,
12551 }, {
12552 .eraseblocks = { {4 * 1024, 64} },
12553 .block_erase = spi_block_erase_d7,
12554 }, {
12555 .eraseblocks = { {64 * 1024, 4} },
12556 .block_erase = spi_block_erase_d8,
12557 }, {
12558 .eraseblocks = { {256 * 1024, 1} },
12559 .block_erase = spi_block_erase_60,
12560 }, {
12561 .eraseblocks = { {256 * 1024, 1} },
12562 .block_erase = spi_block_erase_c7,
12563 }
12564 },
12565 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12566 .unlock = spi_disable_blockprotect_bp3_srwd,
12567 .write = spi_chip_write_256,
12568 .read = spi_chip_read,
12569 .voltage = {2300, 3600},
12570 },
12571
12572 {
12573 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012574 .name = "Pm25LQ032C",
12575 .bustype = BUS_SPI,
12576 .manufacture_id = PMC_ID,
12577 .model_id = PMC_PM25LQ032C,
12578 .total_size = 4096,
12579 .page_size = 256,
12580 /* OTP: 64B total; read 0x4B, write 0xB1 */
12581 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12582 .tested = TEST_OK_PREW,
12583 .probe = probe_spi_rdid,
12584 .probe_timing = TIMING_ZERO,
12585 .block_erasers =
12586 {
12587 {
12588 .eraseblocks = { {4 * 1024, 1024} },
12589 .block_erase = spi_block_erase_20,
12590 }, {
12591 .eraseblocks = { {4 * 1024, 1024} },
12592 .block_erase = spi_block_erase_d7,
12593 }, {
12594 .eraseblocks = { {64 * 1024, 64} },
12595 .block_erase = spi_block_erase_d8,
12596 }, {
12597 .eraseblocks = { {4096 * 1024, 1} },
12598 .block_erase = spi_block_erase_60,
12599 }, {
12600 .eraseblocks = { {4096 * 1024, 1} },
12601 .block_erase = spi_block_erase_c7,
12602 }
12603 },
12604 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12605 .unlock = spi_disable_blockprotect_bp3_srwd,
12606 .write = spi_chip_write_256,
12607 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12608 .voltage = {2700, 3600},
12609 },
12610
12611 {
12612 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012613 .name = "Pm25LQ040",
12614 .bustype = BUS_SPI,
12615 .manufacture_id = PMC_ID,
12616 .model_id = PMC_PM25LQ040,
12617 .total_size = 512,
12618 .page_size = 256,
12619 /* OTP: 256B total; read 0x4B, write 0xB1 */
12620 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12621 .tested = TEST_UNTESTED,
12622 .probe = probe_spi_rdid,
12623 .probe_timing = TIMING_ZERO,
12624 .block_erasers =
12625 {
12626 {
12627 .eraseblocks = { {4 * 1024, 128} },
12628 .block_erase = spi_block_erase_20,
12629 }, {
12630 .eraseblocks = { {4 * 1024, 128} },
12631 .block_erase = spi_block_erase_d7,
12632 }, {
12633 .eraseblocks = { {64 * 1024, 8} },
12634 .block_erase = spi_block_erase_d8,
12635 }, {
12636 .eraseblocks = { {512 * 1024, 1} },
12637 .block_erase = spi_block_erase_60,
12638 }, {
12639 .eraseblocks = { {512 * 1024, 1} },
12640 .block_erase = spi_block_erase_c7,
12641 }
12642 },
12643 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12644 .unlock = spi_disable_blockprotect_bp3_srwd,
12645 .write = spi_chip_write_256,
12646 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12647 .voltage = {2300, 3600},
12648 },
12649
12650 {
12651 .vendor = "PMC",
12652 .name = "Pm25LQ080",
12653 .bustype = BUS_SPI,
12654 .manufacture_id = PMC_ID,
12655 .model_id = PMC_PM25LQ080,
12656 .total_size = 1024,
12657 .page_size = 256,
12658 /* OTP: 64B total; read 0x4B, write 0xB1 */
12659 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12660 .tested = TEST_UNTESTED,
12661 .probe = probe_spi_rdid,
12662 .probe_timing = TIMING_ZERO,
12663 .block_erasers =
12664 {
12665 {
12666 .eraseblocks = { {4 * 1024, 256} },
12667 .block_erase = spi_block_erase_20,
12668 }, {
12669 .eraseblocks = { {4 * 1024, 256} },
12670 .block_erase = spi_block_erase_d7,
12671 }, {
12672 .eraseblocks = { {64 * 1024, 16} },
12673 .block_erase = spi_block_erase_d8,
12674 }, {
12675 .eraseblocks = { {1024 * 1024, 1} },
12676 .block_erase = spi_block_erase_60,
12677 }, {
12678 .eraseblocks = { {1024 * 1024, 1} },
12679 .block_erase = spi_block_erase_c7,
12680 }
12681 },
12682 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12683 .unlock = spi_disable_blockprotect_bp3_srwd,
12684 .write = spi_chip_write_256,
12685 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12686 .voltage = {2300, 3600},
12687 },
12688
12689 {
12690 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012691 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012692 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000012693 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012694 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012695 .total_size = 128,
12696 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012697 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000012698 .tested = TEST_OK_PREW,
12699 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012700 .probe_timing = TIMING_ZERO,
12701 .block_erasers =
12702 {
12703 {
12704 .eraseblocks = { {4 * 1024, 32} },
12705 .block_erase = spi_block_erase_d7,
12706 }, {
12707 .eraseblocks = { {32 * 1024, 4} },
12708 .block_erase = spi_block_erase_d8,
12709 }, {
12710 .eraseblocks = { {128 * 1024, 1} },
12711 .block_erase = spi_block_erase_c7,
12712 }
12713 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012714 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012715 .unlock = spi_disable_blockprotect,
12716 .write = spi_chip_write_256,
12717 .read = spi_chip_read, /* Fast read (0x0B) supported */
12718 .voltage = {2700, 3600},
12719 },
12720
12721 {
12722 .vendor = "PMC",
12723 .name = "Pm25LV010A",
12724 .bustype = BUS_SPI,
12725 .manufacture_id = PMC_ID,
12726 .model_id = PMC_PM25LV010,
12727 .total_size = 128,
12728 .page_size = 256,
12729 .feature_bits = FEATURE_WRSR_WREN,
12730 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012731 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012732 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012733 .block_erasers =
12734 {
12735 {
12736 .eraseblocks = { {4 * 1024, 32} },
12737 .block_erase = spi_block_erase_d7,
12738 }, {
12739 .eraseblocks = { {32 * 1024, 4} },
12740 .block_erase = spi_block_erase_d8,
12741 }, {
12742 .eraseblocks = { {128 * 1024, 1} },
12743 .block_erase = spi_block_erase_c7,
12744 }
12745 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012746 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012747 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012748 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012749 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000012750 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012751 },
12752
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012753 {
12754 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012755 .name = "Pm25LV016B",
12756 .bustype = BUS_SPI,
12757 .manufacture_id = PMC_ID,
12758 .model_id = PMC_PM25LV016B,
12759 .total_size = 2048,
12760 .page_size = 256,
12761 .feature_bits = FEATURE_WRSR_WREN,
12762 .tested = TEST_UNTESTED,
12763 .probe = probe_spi_rdid,
12764 .probe_timing = TIMING_ZERO,
12765 .block_erasers =
12766 {
12767 {
12768 .eraseblocks = { {4 * 1024, 512} },
12769 .block_erase = spi_block_erase_d7,
12770 }, {
12771 .eraseblocks = { {4 * 1024, 512} },
12772 .block_erase = spi_block_erase_20,
12773 }, {
12774 .eraseblocks = { {64 * 1024, 32} },
12775 .block_erase = spi_block_erase_d8,
12776 }, {
12777 .eraseblocks = { {2 * 1024 * 1024, 1} },
12778 .block_erase = spi_block_erase_60,
12779 }, {
12780 .eraseblocks = { {2 * 1024 * 1024, 1} },
12781 .block_erase = spi_block_erase_c7,
12782 }
12783 },
12784 .printlock = spi_prettyprint_status_register_bp2_srwd,
12785 .unlock = spi_disable_blockprotect,
12786 .write = spi_chip_write_256,
12787 .read = spi_chip_read, /* Fast read (0x0B) supported */
12788 .voltage = {2700, 3600},
12789 },
12790
12791 {
12792 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012793 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012794 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012795 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012796 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012797 .total_size = 256,
12798 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012799 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012800 .tested = TEST_UNTESTED,
12801 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012802 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012803 .block_erasers =
12804 {
12805 {
12806 .eraseblocks = { {4 * 1024, 64} },
12807 .block_erase = spi_block_erase_d7,
12808 }, {
12809 .eraseblocks = { {64 * 1024, 4} },
12810 .block_erase = spi_block_erase_d8,
12811 }, {
12812 .eraseblocks = { {256 * 1024, 1} },
12813 .block_erase = spi_block_erase_c7,
12814 }
12815 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012816 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012817 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012818 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012819 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012820 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012821 },
12822
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012823 {
12824 .vendor = "PMC",
12825 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012826 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012827 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012828 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012829 .total_size = 512,
12830 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012831 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000012832 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012833 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012834 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012835 .block_erasers =
12836 {
12837 {
12838 .eraseblocks = { {4 * 1024, 128} },
12839 .block_erase = spi_block_erase_d7,
12840 }, {
12841 .eraseblocks = { {64 * 1024, 8} },
12842 .block_erase = spi_block_erase_d8,
12843 }, {
12844 .eraseblocks = { {512 * 1024, 1} },
12845 .block_erase = spi_block_erase_c7,
12846 }
12847 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012848 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012849 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012850 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012851 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012852 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012853 },
12854
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012855 {
12856 .vendor = "PMC",
12857 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012858 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012859 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012860 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012861 .total_size = 1024,
12862 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012863 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012864 .tested = TEST_UNTESTED,
12865 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012866 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012867 .block_erasers =
12868 {
12869 {
12870 .eraseblocks = { {4 * 1024, 256} },
12871 .block_erase = spi_block_erase_d7,
12872 }, {
12873 .eraseblocks = { {4 * 1024, 256} },
12874 .block_erase = spi_block_erase_20,
12875 }, {
12876 .eraseblocks = { {64 * 1024, 16} },
12877 .block_erase = spi_block_erase_d8,
12878 }, {
12879 .eraseblocks = { {1024 * 1024, 1} },
12880 .block_erase = spi_block_erase_60,
12881 }, {
12882 .eraseblocks = { {1024 * 1024, 1} },
12883 .block_erase = spi_block_erase_c7,
12884 }
12885 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012886 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012887 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012888 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012889 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012890 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012891 },
12892
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012893 {
12894 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012895 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012896 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100012897 .manufacture_id = PMC_ID_NOPREFIX,
12898 .model_id = PMC_PM25LV512,
12899 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012900 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012901 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100012902 .tested = TEST_OK_PREW,
12903 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012904 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012905 .block_erasers =
12906 {
12907 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012908 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000012909 .block_erase = spi_block_erase_d7,
12910 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012911 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000012912 .block_erase = spi_block_erase_d8,
12913 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012914 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000012915 .block_erase = spi_block_erase_c7,
12916 }
12917 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100012918 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012919 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012920 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012921 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000012922 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012923 },
12924
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012925 {
12926 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000012927 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012928 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012929 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012930 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012931 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000012932 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012933 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012934 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012935 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012936 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000012937 .block_erasers =
12938 {
12939 {
12940 .eraseblocks = {
12941 {16 * 1024, 1},
12942 {8 * 1024, 2},
12943 {96 * 1024, 1},
12944 {128 * 1024, 1},
12945 },
Sean Nelson35727f72010-01-28 23:55:12 +000012946 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000012947 }, {
12948 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000012949 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000012950 },
12951 },
Sean Nelson35727f72010-01-28 23:55:12 +000012952 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012953 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012954 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012955 },
12956
12957 {
12958 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012959 .name = "Pm29F002T",
12960 .bustype = BUS_PARALLEL,
12961 .manufacture_id = PMC_ID_NOPREFIX,
12962 .model_id = PMC_PM29F002T,
12963 .total_size = 256,
12964 .page_size = 8 * 1024,
12965 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12966 .tested = TEST_OK_PREW,
12967 .probe = probe_jedec,
12968 .probe_timing = TIMING_FIXME,
12969 .block_erasers =
12970 {
12971 {
12972 .eraseblocks = {
12973 {128 * 1024, 1},
12974 {96 * 1024, 1},
12975 {8 * 1024, 2},
12976 {16 * 1024, 1},
12977 },
12978 .block_erase = erase_sector_jedec,
12979 }, {
12980 .eraseblocks = { {256 * 1024, 1} },
12981 .block_erase = erase_chip_block_jedec,
12982 },
12983 },
12984 .write = write_jedec_1,
12985 .read = read_memmapped,
12986 .voltage = {4500, 5500},
12987 },
12988
12989 {
12990 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012991 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012992 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012993 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012994 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012995 .total_size = 128,
12996 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012997 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012998 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012999 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013000 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000013001 .block_erasers =
13002 {
13003 {
13004 .eraseblocks = { {4 * 1024, 32} },
13005 .block_erase = erase_sector_jedec,
13006 }, {
13007 .eraseblocks = { {64 * 1024, 2} },
13008 .block_erase = erase_block_jedec,
13009 }, {
13010 .eraseblocks = { {128 * 1024, 1} },
13011 .block_erase = erase_chip_block_jedec,
13012 }
13013 },
Sean Nelson35727f72010-01-28 23:55:12 +000013014 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013015 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013016 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013017 },
13018
13019 {
13020 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013021 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013022 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013023 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013024 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013025 .total_size = 256,
13026 .page_size = 4096,
13027 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13028 .tested = TEST_UNTESTED,
13029 .probe = probe_jedec,
13030 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013031 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013032 {
13033 {
13034 .eraseblocks = { {4 * 1024, 64} },
13035 .block_erase = erase_sector_jedec,
13036 }, {
13037 .eraseblocks = { {64 * 1024, 4} },
13038 .block_erase = erase_block_jedec,
13039 }, {
13040 .eraseblocks = { {256 * 1024, 1} },
13041 .block_erase = erase_chip_block_jedec,
13042 }
13043 },
13044 .write = write_jedec_1,
13045 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013046 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013047 },
13048
13049 {
13050 .vendor = "PMC",
13051 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013052 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013053 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013054 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013055 .total_size = 512,
13056 .page_size = 4096,
13057 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013058 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013059 .probe = probe_jedec,
13060 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013061 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013062 {
13063 {
13064 .eraseblocks = { {4 * 1024, 128} },
13065 .block_erase = erase_sector_jedec,
13066 }, {
13067 .eraseblocks = { {64 * 1024, 8} },
13068 .block_erase = erase_block_jedec,
13069 }, {
13070 .eraseblocks = { {512 * 1024, 1} },
13071 .block_erase = erase_chip_block_jedec,
13072 }
13073 },
13074 .write = write_jedec_1,
13075 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013076 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013077 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013078
13079 {
13080 .vendor = "PMC",
13081 .name = "Pm39LV512",
13082 .bustype = BUS_PARALLEL,
13083 .manufacture_id = PMC_ID_NOPREFIX,
13084 .model_id = PMC_PM39LV512,
13085 .total_size = 64,
13086 .page_size = 4096,
13087 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13088 .tested = TEST_OK_PREW,
13089 .probe = probe_jedec,
13090 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13091 .block_erasers =
13092 {
13093 {
13094 .eraseblocks = { {4 * 1024, 16} },
13095 .block_erase = erase_sector_jedec,
13096 }, {
13097 .eraseblocks = { {64 * 1024, 1} },
13098 .block_erase = erase_block_jedec,
13099 }, {
13100 .eraseblocks = { {64 * 1024, 1} },
13101 .block_erase = erase_chip_block_jedec,
13102 }
13103 },
13104 .write = write_jedec_1,
13105 .read = read_memmapped,
13106 .voltage = {2700, 3600},
13107 },
13108
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013109 {
13110 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013111 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013112 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013113 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013114 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013115 .total_size = 256,
13116 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013117 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013118 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013119 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013120 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000013121 .block_erasers =
13122 {
13123 {
13124 .eraseblocks = { {4 * 1024, 64} },
13125 .block_erase = erase_sector_jedec,
13126 }, {
13127 .eraseblocks = { {16 * 1024, 16} },
13128 .block_erase = erase_block_jedec,
13129 }, {
13130 .eraseblocks = { {256 * 1024, 1} },
13131 .block_erase = erase_chip_block_jedec,
13132 }
13133 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013134 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000013135 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013136 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013137 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013138 },
13139
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013140 {
13141 .vendor = "PMC",
13142 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013143 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013144 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013145 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013146 .total_size = 512,
13147 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013148 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013149 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013150 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013151 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013152 .block_erasers =
13153 {
13154 {
13155 .eraseblocks = { {4 * 1024, 128} },
13156 .block_erase = erase_sector_jedec,
13157 }, {
13158 .eraseblocks = { {64 * 1024, 8} },
13159 .block_erase = erase_block_jedec,
13160 }, {
13161 .eraseblocks = { {512 * 1024, 1} },
13162 .block_erase = erase_chip_block_jedec,
13163 }
13164 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013165 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000013166 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013167 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013168 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013169 },
13170
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013171 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013172 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013173 .name = "SST25LF020A",
13174 .bustype = BUS_SPI,
13175 .manufacture_id = SST_ID,
13176 .model_id = SST_SST25VF020_REMS,
13177 .total_size = 256,
13178 .page_size = 256,
13179 .feature_bits = FEATURE_WRSR_EWSR,
13180 .tested = TEST_OK_PREW,
13181 .probe = probe_spi_rems,
13182 .probe_timing = TIMING_ZERO,
13183 .block_erasers =
13184 {
13185 {
13186 .eraseblocks = { {4 * 1024, 64} },
13187 .block_erase = spi_block_erase_20,
13188 }, {
13189 .eraseblocks = { {32 * 1024, 8} },
13190 .block_erase = spi_block_erase_52,
13191 }, {
13192 .eraseblocks = { {256 * 1024, 1} },
13193 .block_erase = spi_block_erase_60,
13194 },
13195 },
13196 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13197 .unlock = spi_disable_blockprotect,
13198 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13199 .read = spi_chip_read, /* Fast read (0x0B) supported */
13200 .voltage = {2700, 3600},
13201 },
13202
13203 {
13204 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013205 .name = "SST25LF040A",
13206 .bustype = BUS_SPI,
13207 .manufacture_id = SST_ID,
13208 .model_id = SST_SST25VF040_REMS,
13209 .total_size = 512,
13210 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013211 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013212 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013213 .probe = probe_spi_res2,
13214 .probe_timing = TIMING_ZERO,
13215 .block_erasers =
13216 {
13217 {
13218 .eraseblocks = { {4 * 1024, 128} },
13219 .block_erase = spi_block_erase_20,
13220 }, {
13221 .eraseblocks = { {32 * 1024, 16} },
13222 .block_erase = spi_block_erase_52,
13223 }, {
13224 .eraseblocks = { {512 * 1024, 1} },
13225 .block_erase = spi_block_erase_60,
13226 },
13227 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013228 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013229 .unlock = spi_disable_blockprotect,
13230 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13231 .read = spi_chip_read,
13232 .voltage = {3000, 3600},
13233 },
13234
13235 {
13236 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013237 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013238 .bustype = BUS_SPI,
13239 .manufacture_id = SST_ID,
13240 .model_id = SST_SST25VF080_REMS,
13241 .total_size = 1024,
13242 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013243 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013244 .tested = TEST_UNTESTED,
13245 .probe = probe_spi_res2,
13246 .probe_timing = TIMING_ZERO,
13247 .block_erasers =
13248 {
13249 {
13250 .eraseblocks = { {4 * 1024, 256} },
13251 .block_erase = spi_block_erase_20,
13252 }, {
13253 .eraseblocks = { {32 * 1024, 32} },
13254 .block_erase = spi_block_erase_52,
13255 }, {
13256 .eraseblocks = { {1024 * 1024, 1} },
13257 .block_erase = spi_block_erase_60,
13258 },
13259 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013260 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013261 .unlock = spi_disable_blockprotect,
13262 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13263 .read = spi_chip_read,
13264 .voltage = {3000, 3600},
13265 },
13266
13267 {
13268 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013269 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013270 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013271 .manufacture_id = SST_ID,
13272 .model_id = SST_SST25VF010_REMS,
13273 .total_size = 128,
13274 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013275 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000013276 .tested = TEST_OK_PREW,
13277 .probe = probe_spi_rems,
13278 .probe_timing = TIMING_ZERO,
13279 .block_erasers =
13280 {
13281 {
13282 .eraseblocks = { {4 * 1024, 32} },
13283 .block_erase = spi_block_erase_20,
13284 }, {
13285 .eraseblocks = { {32 * 1024, 4} },
13286 .block_erase = spi_block_erase_52,
13287 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000013288 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013289 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013290 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000013291 .eraseblocks = { {128 * 1024, 1} },
13292 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000013293 }, {
13294 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013295 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013296 },
13297 },
13298 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13299 .unlock = spi_disable_blockprotect,
13300 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013301 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013302 .voltage = {2700, 3600},
13303 },
13304
13305 {
13306 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013307 .name = "SST25VF016B",
13308 .bustype = BUS_SPI,
13309 .manufacture_id = SST_ID,
13310 .model_id = SST_SST25VF016B,
13311 .total_size = 2048,
13312 .page_size = 256,
13313 .feature_bits = FEATURE_WRSR_EITHER,
13314 .tested = TEST_OK_PREW,
13315 .probe = probe_spi_rdid,
13316 .probe_timing = TIMING_ZERO,
13317 .block_erasers =
13318 {
13319 {
13320 .eraseblocks = { {4 * 1024, 512} },
13321 .block_erase = spi_block_erase_20,
13322 }, {
13323 .eraseblocks = { {32 * 1024, 64} },
13324 .block_erase = spi_block_erase_52,
13325 }, {
13326 .eraseblocks = { {64 * 1024, 32} },
13327 .block_erase = spi_block_erase_d8,
13328 }, {
13329 .eraseblocks = { {2 * 1024 * 1024, 1} },
13330 .block_erase = spi_block_erase_60,
13331 }, {
13332 .eraseblocks = { {2 * 1024 * 1024, 1} },
13333 .block_erase = spi_block_erase_c7,
13334 },
13335 },
13336 .printlock = spi_prettyprint_status_register_sst25vf016,
13337 .unlock = spi_disable_blockprotect,
13338 .write = spi_aai_write,
13339 .read = spi_chip_read,
13340 .voltage = {2700, 3600},
13341 },
13342
13343 {
13344 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013345 .name = "SST25VF020",
13346 .bustype = BUS_SPI,
13347 .manufacture_id = SST_ID,
13348 .model_id = SST_SST25VF020_REMS,
13349 .total_size = 256,
13350 .page_size = 256,
13351 .feature_bits = FEATURE_WRSR_EWSR,
13352 .tested = TEST_UNTESTED,
13353 .probe = probe_spi_rems,
13354 .probe_timing = TIMING_ZERO,
13355 .block_erasers =
13356 {
13357 {
13358 .eraseblocks = { {4 * 1024, 64} },
13359 .block_erase = spi_block_erase_20,
13360 }, {
13361 .eraseblocks = { {32 * 1024, 8} },
13362 .block_erase = spi_block_erase_52,
13363 }, {
13364 .eraseblocks = { {256 * 1024, 1} },
13365 .block_erase = spi_block_erase_60,
13366 },
13367 },
13368 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13369 .unlock = spi_disable_blockprotect,
13370 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13371 .read = spi_chip_read, /* only */
13372 .voltage = {2700, 3600},
13373 },
13374
13375 {
13376 .vendor = "SST",
13377 .name = "SST25VF020B",
13378 .bustype = BUS_SPI,
13379 .manufacture_id = SST_ID,
13380 .model_id = SST_SST25VF020B,
13381 .total_size = 256,
13382 .page_size = 256,
13383 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013384 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000013385 .probe = probe_spi_rdid,
13386 .probe_timing = TIMING_ZERO,
13387 .block_erasers =
13388 {
13389 {
13390 .eraseblocks = { {4 * 1024, 64} },
13391 .block_erase = spi_block_erase_20,
13392 }, {
13393 .eraseblocks = { {32 * 1024, 8} },
13394 .block_erase = spi_block_erase_52,
13395 }, {
13396 .eraseblocks = { {64 * 1024, 4} },
13397 .block_erase = spi_block_erase_d8,
13398 }, {
13399 .eraseblocks = { {256 * 1024, 1} },
13400 .block_erase = spi_block_erase_60,
13401 }, {
13402 .eraseblocks = { {256 * 1024, 1} },
13403 .block_erase = spi_block_erase_c7,
13404 },
13405 },
13406 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13407 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13408 .write = spi_aai_write, /* AAI supported (0xAD) */
13409 .read = spi_chip_read, /* Fast read (0x0B) supported */
13410 .voltage = {2700, 3600},
13411 },
13412
13413 {
13414 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013415 .name = "SST25VF032B",
13416 .bustype = BUS_SPI,
13417 .manufacture_id = SST_ID,
13418 .model_id = SST_SST25VF032B,
13419 .total_size = 4096,
13420 .page_size = 256,
13421 .feature_bits = FEATURE_WRSR_EWSR,
13422 .tested = TEST_OK_PREW,
13423 .probe = probe_spi_rdid,
13424 .probe_timing = TIMING_ZERO,
13425 .block_erasers =
13426 {
13427 {
13428 .eraseblocks = { {4 * 1024, 1024} },
13429 .block_erase = spi_block_erase_20,
13430 }, {
13431 .eraseblocks = { {32 * 1024, 128} },
13432 .block_erase = spi_block_erase_52,
13433 }, {
13434 .eraseblocks = { {64 * 1024, 64} },
13435 .block_erase = spi_block_erase_d8,
13436 }, {
13437 .eraseblocks = { {4 * 1024 * 1024, 1} },
13438 .block_erase = spi_block_erase_60,
13439 }, {
13440 .eraseblocks = { {4 * 1024 * 1024, 1} },
13441 .block_erase = spi_block_erase_c7,
13442 },
13443 },
13444 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13445 .unlock = spi_disable_blockprotect,
13446 .write = spi_aai_write,
13447 .read = spi_chip_read,
13448 .voltage = {2700, 3600},
13449 },
13450
13451 {
13452 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013453 .name = "SST25VF040",
13454 .bustype = BUS_SPI,
13455 .manufacture_id = SST_ID,
13456 .model_id = SST_SST25VF040_REMS,
13457 .total_size = 512,
13458 .page_size = 256,
13459 .feature_bits = FEATURE_WRSR_EWSR,
13460 .tested = TEST_OK_PR,
13461 .probe = probe_spi_rems,
13462 .probe_timing = TIMING_ZERO,
13463 .block_erasers =
13464 {
13465 {
13466 .eraseblocks = { {4 * 1024, 128} },
13467 .block_erase = spi_block_erase_20,
13468 }, {
13469 .eraseblocks = { {32 * 1024, 16} },
13470 .block_erase = spi_block_erase_52,
13471 }, {
13472 .eraseblocks = { {512 * 1024, 1} },
13473 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000013474 },
13475 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013476 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000013477 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000013478 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13479 .read = spi_chip_read,
13480 .voltage = {2700, 3600},
13481 },
13482
13483 {
13484 .vendor = "SST",
13485 .name = "SST25VF040B",
13486 .bustype = BUS_SPI,
13487 .manufacture_id = SST_ID,
13488 .model_id = SST_SST25VF040B,
13489 .total_size = 512,
13490 .page_size = 256,
13491 .feature_bits = FEATURE_WRSR_EWSR,
13492 .tested = TEST_OK_PREW,
13493 .probe = probe_spi_rdid,
13494 .probe_timing = TIMING_ZERO,
13495 .block_erasers =
13496 {
13497 {
13498 .eraseblocks = { {4 * 1024, 128} },
13499 .block_erase = spi_block_erase_20,
13500 }, {
13501 .eraseblocks = { {32 * 1024, 16} },
13502 .block_erase = spi_block_erase_52,
13503 }, {
13504 .eraseblocks = { {64 * 1024, 8} },
13505 .block_erase = spi_block_erase_d8,
13506 }, {
13507 .eraseblocks = { {512 * 1024, 1} },
13508 .block_erase = spi_block_erase_60,
13509 }, {
13510 .eraseblocks = { {512 * 1024, 1} },
13511 .block_erase = spi_block_erase_c7,
13512 },
13513 },
13514 .printlock = spi_prettyprint_status_register_sst25vf040b,
13515 .unlock = spi_disable_blockprotect,
13516 .write = spi_aai_write, /* AAI supported (0xAD) */
13517 .read = spi_chip_read, /* Fast read (0x0B) supported */
13518 .voltage = {2700, 3600},
13519 },
13520
13521 {
13522 .vendor = "SST",
13523 .name = "SST25VF040B.REMS",
13524 .bustype = BUS_SPI,
13525 .manufacture_id = SST_ID,
13526 .model_id = SST_SST25VF040B_REMS,
13527 .total_size = 512,
13528 .page_size = 256,
13529 .feature_bits = FEATURE_WRSR_EWSR,
13530 .tested = TEST_OK_PREW,
13531 .probe = probe_spi_rems,
13532 .probe_timing = TIMING_ZERO,
13533 .block_erasers =
13534 {
13535 {
13536 .eraseblocks = { {4 * 1024, 128} },
13537 .block_erase = spi_block_erase_20,
13538 }, {
13539 .eraseblocks = { {32 * 1024, 16} },
13540 .block_erase = spi_block_erase_52,
13541 }, {
13542 .eraseblocks = { {64 * 1024, 8} },
13543 .block_erase = spi_block_erase_d8,
13544 }, {
13545 .eraseblocks = { {512 * 1024, 1} },
13546 .block_erase = spi_block_erase_60,
13547 }, {
13548 .eraseblocks = { {512 * 1024, 1} },
13549 .block_erase = spi_block_erase_c7,
13550 },
13551 },
13552 .printlock = spi_prettyprint_status_register_sst25vf040b,
13553 .unlock = spi_disable_blockprotect,
13554 .write = spi_aai_write,
13555 .read = spi_chip_read,
13556 .voltage = {2700, 3600},
13557 },
13558
13559 {
13560 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013561 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000013562 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013563 .manufacture_id = SST_ID,
13564 .model_id = SST_SST25VF064C,
13565 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013566 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013567 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013568 .tested = TEST_OK_PREW,
13569 .probe = probe_spi_rdid,
13570 .probe_timing = TIMING_ZERO,
13571 .block_erasers =
13572 {
13573 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013574 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013575 .block_erase = spi_block_erase_20,
13576 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013577 .eraseblocks = { {32 * 1024, 256} },
13578 .block_erase = spi_block_erase_52,
13579 }, {
13580 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013581 .block_erase = spi_block_erase_d8,
13582 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013583 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013584 .block_erase = spi_block_erase_60,
13585 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013586 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013587 .block_erase = spi_block_erase_c7,
13588 },
13589 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013590 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13591 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013592 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013593 .read = spi_chip_read,
13594 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000013595 },
13596
13597 {
13598 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013599 .name = "SST25VF080B",
13600 .bustype = BUS_SPI,
13601 .manufacture_id = SST_ID,
13602 .model_id = SST_SST25VF080B,
13603 .total_size = 1024,
13604 .page_size = 256,
13605 .feature_bits = FEATURE_WRSR_EWSR,
13606 .tested = TEST_OK_PREW,
13607 .probe = probe_spi_rdid,
13608 .probe_timing = TIMING_ZERO,
13609 .block_erasers =
13610 {
13611 {
13612 .eraseblocks = { {4 * 1024, 256} },
13613 .block_erase = spi_block_erase_20,
13614 }, {
13615 .eraseblocks = { {32 * 1024, 32} },
13616 .block_erase = spi_block_erase_52,
13617 }, {
13618 .eraseblocks = { {64 * 1024, 16} },
13619 .block_erase = spi_block_erase_d8,
13620 }, {
13621 .eraseblocks = { {1024 * 1024, 1} },
13622 .block_erase = spi_block_erase_60,
13623 }, {
13624 .eraseblocks = { {1024 * 1024, 1} },
13625 .block_erase = spi_block_erase_c7,
13626 },
13627 },
13628 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13629 .unlock = spi_disable_blockprotect,
13630 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000013631 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013632 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000013633 },
13634
13635 {
13636 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013637 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013638 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013639 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013640 .model_id = SST_SST25VF512_REMS,
13641 .total_size = 64,
13642 .page_size = 256,
13643 .feature_bits = FEATURE_WRSR_EWSR,
13644 .tested = TEST_OK_PREW,
13645 .probe = probe_spi_rems,
13646 .probe_timing = TIMING_ZERO,
13647 .block_erasers =
13648 {
13649 {
13650 .eraseblocks = { {4 * 1024, 16} },
13651 .block_erase = spi_block_erase_20,
13652 }, {
13653 .eraseblocks = { {32 * 1024, 2} },
13654 .block_erase = spi_block_erase_52,
13655 }, {
13656 .eraseblocks = { {32 * 1024, 2} },
13657 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
13658 }, {
13659 .eraseblocks = { {64 * 1024, 1} },
13660 .block_erase = spi_block_erase_60,
13661 }, {
13662 .eraseblocks = { {64 * 1024, 1} },
13663 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
13664 },
13665 },
13666 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13667 .unlock = spi_disable_blockprotect,
13668 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13669 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
13670 .voltage = {2700, 3600},
13671 },
13672
13673 {
13674 .vendor = "SST",
13675 .name = "SST25WF010",
13676 .bustype = BUS_SPI,
13677 .manufacture_id = SST_ID,
13678 .model_id = SST_SST25WF010,
13679 .total_size = 128,
13680 .page_size = 256,
13681 .feature_bits = FEATURE_WRSR_EITHER,
13682 .tested = TEST_UNTESTED,
13683 .probe = probe_spi_rdid,
13684 .probe_timing = TIMING_ZERO,
13685 .block_erasers =
13686 {
13687 {
13688 .eraseblocks = { {4 * 1024, 32} },
13689 .block_erase = spi_block_erase_20,
13690 }, {
13691 .eraseblocks = { {32 * 1024, 4} },
13692 .block_erase = spi_block_erase_52,
13693 }, {
13694 .eraseblocks = { {1024 * 128, 1} },
13695 .block_erase = spi_block_erase_60,
13696 }, {
13697 .eraseblocks = { {1024 * 128, 1} },
13698 .block_erase = spi_block_erase_c7,
13699 },
13700 },
13701 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13702 .unlock = spi_disable_blockprotect_bp2_srwd,
13703 .write = spi_aai_write,
13704 .read = spi_chip_read, /* Fast read (0x0B) supported */
13705 .voltage = {1650, 1950},
13706 },
13707
13708 {
13709 .vendor = "SST",
13710 .name = "SST25WF020",
13711 .bustype = BUS_SPI,
13712 .manufacture_id = SST_ID,
13713 .model_id = SST_SST25WF020,
13714 .total_size = 256,
13715 .page_size = 256,
13716 .feature_bits = FEATURE_WRSR_EITHER,
13717 .tested = TEST_UNTESTED,
13718 .probe = probe_spi_rdid,
13719 .probe_timing = TIMING_ZERO,
13720 .block_erasers =
13721 {
13722 {
13723 .eraseblocks = { {4 * 1024, 64} },
13724 .block_erase = spi_block_erase_20,
13725 }, {
13726 .eraseblocks = { {32 * 1024, 8} },
13727 .block_erase = spi_block_erase_52,
13728 }, {
13729 .eraseblocks = { {64 * 1024, 4} },
13730 .block_erase = spi_block_erase_d8,
13731 }, {
13732 .eraseblocks = { {1024 * 256, 1} },
13733 .block_erase = spi_block_erase_60,
13734 }, {
13735 .eraseblocks = { {1024 * 256, 1} },
13736 .block_erase = spi_block_erase_c7,
13737 },
13738 },
13739 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13740 .unlock = spi_disable_blockprotect_bp2_srwd,
13741 .write = spi_aai_write,
13742 .read = spi_chip_read, /* Fast read (0x0B) supported */
13743 .voltage = {1650, 1950},
13744 },
13745
13746 {
13747 .vendor = "SST",
13748 .name = "SST25WF020A",
13749 .bustype = BUS_SPI,
13750 .manufacture_id = SANYO_ID, /* See flashchips.h */
13751 .model_id = SST_SST25WF020A,
13752 .total_size = 256,
13753 .page_size = 256,
13754 .feature_bits = FEATURE_WRSR_WREN,
13755 .tested = TEST_UNTESTED,
13756 .probe = probe_spi_rdid,
13757 .probe_timing = TIMING_ZERO,
13758 .block_erasers =
13759 {
13760 {
13761 .eraseblocks = { {4 * 1024, 64} },
13762 .block_erase = spi_block_erase_20,
13763 }, {
13764 .eraseblocks = { {64 * 1024, 4} },
13765 .block_erase = spi_block_erase_d8,
13766 }, {
13767 .eraseblocks = { {256 * 1024, 1} },
13768 .block_erase = spi_block_erase_60,
13769 }, {
13770 .eraseblocks = { {256 * 1024, 1} },
13771 .block_erase = spi_block_erase_c7,
13772 },
13773 },
13774 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13775 .unlock = spi_disable_blockprotect_bp2_srwd,
13776 .write = spi_chip_write_256,
13777 .read = spi_chip_read, /* Fast read (0x0B) supported */
13778 .voltage = {1650, 1950},
13779 },
13780
13781 {
13782 .vendor = "SST",
13783 .name = "SST25WF040",
13784 .bustype = BUS_SPI,
13785 .manufacture_id = SST_ID,
13786 .model_id = SST_SST25WF040,
13787 .total_size = 512,
13788 .page_size = 256,
13789 .feature_bits = FEATURE_WRSR_EITHER,
13790 .tested = TEST_UNTESTED,
13791 .probe = probe_spi_rdid,
13792 .probe_timing = TIMING_ZERO,
13793 .block_erasers =
13794 {
13795 {
13796 .eraseblocks = { {4 * 1024, 128} },
13797 .block_erase = spi_block_erase_20,
13798 }, {
13799 .eraseblocks = { {32 * 1024, 16} },
13800 .block_erase = spi_block_erase_52,
13801 }, {
13802 .eraseblocks = { {64 * 1024, 8} },
13803 .block_erase = spi_block_erase_d8,
13804 }, {
13805 .eraseblocks = { {1024 * 512, 1} },
13806 .block_erase = spi_block_erase_60,
13807 }, {
13808 .eraseblocks = { {1024 * 512, 1} },
13809 .block_erase = spi_block_erase_c7,
13810 },
13811 },
13812 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13813 .unlock = spi_disable_blockprotect_bp2_srwd,
13814 .write = spi_aai_write,
13815 .read = spi_chip_read, /* Fast read (0x0B) supported */
13816 .voltage = {1650, 1950},
13817 },
13818
13819 {
13820 .vendor = "SST",
13821 .name = "SST25WF040B",
13822 .bustype = BUS_SPI,
13823 .manufacture_id = SANYO_ID, /* See flashchips.h */
13824 .model_id = SST_SST25WF040B,
13825 .total_size = 512,
13826 .page_size = 256,
13827 .feature_bits = FEATURE_WRSR_WREN,
13828 .tested = TEST_UNTESTED,
13829 .probe = probe_spi_rdid,
13830 .probe_timing = TIMING_ZERO,
13831 .block_erasers =
13832 {
13833 {
13834 .eraseblocks = { {4 * 1024, 128} },
13835 .block_erase = spi_block_erase_20,
13836 }, {
13837 .eraseblocks = { {64 * 1024, 8} },
13838 .block_erase = spi_block_erase_d8,
13839 }, {
13840 .eraseblocks = { {512 * 1024, 1} },
13841 .block_erase = spi_block_erase_60,
13842 }, {
13843 .eraseblocks = { {512 * 1024, 1} },
13844 .block_erase = spi_block_erase_c7,
13845 },
13846 },
13847 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13848 .unlock = spi_disable_blockprotect_bp2_srwd,
13849 .write = spi_chip_write_256,
13850 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13851 .voltage = {1650, 1950},
13852 },
13853
13854 {
13855 .vendor = "SST",
13856 .name = "SST25WF080",
13857 .bustype = BUS_SPI,
13858 .manufacture_id = SST_ID,
13859 .model_id = SST_SST25WF080,
13860 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013861 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013862 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000013863 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013864 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013865 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013866 .block_erasers =
13867 {
13868 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013869 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013870 .block_erase = spi_block_erase_20,
13871 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013872 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013873 .block_erase = spi_block_erase_52,
13874 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013875 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013876 .block_erase = spi_block_erase_d8,
13877 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013878 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013879 .block_erase = spi_block_erase_60,
13880 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013881 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013882 .block_erase = spi_block_erase_c7,
13883 },
13884 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013885 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13886 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000013887 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013888 .read = spi_chip_read, /* Fast read (0x0B) supported */
13889 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000013890 },
13891
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013892 {
13893 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013894 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013895 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013896 .manufacture_id = SANYO_ID, /* See flashchips.h */
13897 .model_id = SST_SST25WF080B,
13898 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013899 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013900 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000013901 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013902 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013903 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013904 .block_erasers =
13905 {
13906 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013907 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013908 .block_erase = spi_block_erase_20,
13909 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013910 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013911 .block_erase = spi_block_erase_d8,
13912 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013913 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013914 .block_erase = spi_block_erase_60,
13915 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013916 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013917 .block_erase = spi_block_erase_c7,
13918 },
13919 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013920 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13921 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000013922 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013923 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13924 .voltage = {1650, 1950},
13925 },
13926
13927 {
13928 .vendor = "SST",
13929 .name = "SST25WF512",
13930 .bustype = BUS_SPI,
13931 .manufacture_id = SST_ID,
13932 .model_id = SST_SST25WF512,
13933 .total_size = 64,
13934 .page_size = 256,
13935 .feature_bits = FEATURE_WRSR_EITHER,
13936 .tested = TEST_UNTESTED,
13937 .probe = probe_spi_rdid,
13938 .probe_timing = TIMING_ZERO,
13939 .block_erasers =
13940 {
13941 {
13942 .eraseblocks = { {4 * 1024, 16} },
13943 .block_erase = spi_block_erase_20,
13944 }, {
13945 .eraseblocks = { {32 * 1024, 2} },
13946 .block_erase = spi_block_erase_52,
13947 }, {
13948 .eraseblocks = { {1024 * 64, 1} },
13949 .block_erase = spi_block_erase_60,
13950 }, {
13951 .eraseblocks = { {1024 * 64, 1} },
13952 .block_erase = spi_block_erase_c7,
13953 },
13954 },
13955 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13956 .unlock = spi_disable_blockprotect_bp2_srwd,
13957 .write = spi_aai_write,
13958 .read = spi_chip_read, /* Fast read (0x0B) supported */
13959 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013960 },
13961
13962 {
13963 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070013964 .name = "SST26VF016B(A)",
13965 .bustype = BUS_SPI,
13966 .manufacture_id = SST_ID,
13967 .model_id = SST_SST26VF016B,
13968 .total_size = 2048,
13969 .page_size = 256,
13970 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13971 .tested = TEST_OK_PREW,
13972 .probe = probe_spi_rdid,
13973 .probe_timing = TIMING_ZERO,
13974 .block_erasers =
13975 {
13976 {
13977 .eraseblocks = { {4 * 1024, 512} },
13978 .block_erase = spi_block_erase_20,
13979 }, {
13980 .eraseblocks = {
13981 {8 * 1024, 4},
13982 {32 * 1024, 1},
13983 {64 * 1024, 30},
13984 {32 * 1024, 1},
13985 {8 * 1024, 4},
13986 },
13987 .block_erase = spi_block_erase_d8,
13988 }, {
13989 .eraseblocks = { {2 * 1024 * 1024, 1} },
13990 .block_erase = spi_block_erase_c7,
13991 },
13992 },
13993 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13994 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13995 .write = spi_chip_write_256, /* Multi I/O supported */
13996 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13997 .voltage = {2700, 3600},
13998 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100013999
Wei Hu25584de2018-04-30 14:02:08 -070014000 {
14001 .vendor = "SST",
14002 .name = "SST26VF032B(A)",
14003 .bustype = BUS_SPI,
14004 .manufacture_id = SST_ID,
14005 .model_id = SST_SST26VF032B,
14006 .total_size = 4096,
14007 .page_size = 256,
14008 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14009 .tested = TEST_UNTESTED,
14010 .probe = probe_spi_rdid,
14011 .probe_timing = TIMING_ZERO,
14012 .block_erasers =
14013 {
14014 {
14015 .eraseblocks = { {4 * 1024, 1024} },
14016 .block_erase = spi_block_erase_20,
14017 }, {
14018 .eraseblocks = {
14019 {8 * 1024, 4},
14020 {32 * 1024, 1},
14021 {64 * 1024, 62},
14022 {32 * 1024, 1},
14023 {8 * 1024, 4},
14024 },
14025 .block_erase = spi_block_erase_d8,
14026 }, {
14027 .eraseblocks = { {4 * 1024 * 1024, 1} },
14028 .block_erase = spi_block_erase_c7,
14029 },
14030 },
14031 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14032 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14033 .write = spi_chip_write_256, /* Multi I/O supported */
14034 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14035 .voltage = {2700, 3600},
14036 },
14037
Wei Hu25584de2018-04-30 14:02:08 -070014038 {
14039 .vendor = "SST",
14040 .name = "SST26VF064B(A)",
14041 .bustype = BUS_SPI,
14042 .manufacture_id = SST_ID,
14043 .model_id = SST_SST26VF064B,
14044 .total_size = 8192,
14045 .page_size = 256,
14046 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14047 .tested = TEST_OK_PREW,
14048 .probe = probe_spi_rdid,
14049 .probe_timing = TIMING_ZERO,
14050 .block_erasers =
14051 {
14052 {
14053 .eraseblocks = { {4 * 1024, 2048} },
14054 .block_erase = spi_block_erase_20,
14055 }, {
14056 .eraseblocks = {
14057 {8 * 1024, 4},
14058 {32 * 1024, 1},
14059 {64 * 1024, 126},
14060 {32 * 1024, 1},
14061 {8 * 1024, 4},
14062 },
14063 .block_erase = spi_block_erase_d8,
14064 }, {
14065 .eraseblocks = { {8 * 1024 * 1024, 1} },
14066 .block_erase = spi_block_erase_c7,
14067 },
14068 },
14069 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14070 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14071 .write = spi_chip_write_256, /* Multi I/O supported */
14072 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14073 .voltage = {2700, 3600},
14074 },
14075
14076 {
14077 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014078 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014079 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014080 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014081 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014082 .total_size = 512,
14083 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000014084 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014085 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014086 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014087 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014088 .block_erasers =
14089 {
14090 {
14091 .eraseblocks = { {128, 4096} },
14092 .block_erase = erase_sector_28sf040,
14093 }, {
14094 .eraseblocks = { {512 * 1024, 1} },
14095 .block_erase = erase_chip_28sf040,
14096 }
14097 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014098 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014099 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014100 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014101 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014102 },
14103
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014104 {
14105 .vendor = "SST",
14106 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014107 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014108 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014109 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014110 .total_size = 128,
14111 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014112 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014113 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014114 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014115 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014116 .block_erasers =
14117 {
14118 {
14119 .eraseblocks = { {128 * 1024, 1} },
14120 .block_erase = erase_chip_block_jedec,
14121 }
14122 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014123 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014124 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014125 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014126 },
14127
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014128 {
14129 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014130 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014131 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014132 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014133 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014134 .total_size = 256,
14135 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014136 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014137 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014138 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014139 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014140 .block_erasers =
14141 {
14142 {
14143 .eraseblocks = { {256 * 1024, 1} },
14144 .block_erase = erase_chip_block_jedec,
14145 }
14146 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014147 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014148 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014149 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014150 },
14151
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014152 {
14153 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014154 .name = "SST29LE010",
14155 .bustype = BUS_PARALLEL,
14156 .manufacture_id = SST_ID,
14157 .model_id = SST_SST29LE010,
14158 .total_size = 128,
14159 .page_size = 128,
14160 .feature_bits = FEATURE_LONG_RESET,
14161 .tested = TEST_UNTESTED,
14162 .probe = probe_jedec,
14163 .probe_timing = 10,
14164 .block_erasers =
14165 {
14166 {
14167 .eraseblocks = { {128 * 1024, 1} },
14168 .block_erase = erase_chip_block_jedec,
14169 }
14170 },
14171 .write = write_jedec,
14172 .read = read_memmapped,
14173 .voltage = {3000, 3600},
14174 },
14175
14176 {
14177 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014178 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014179 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014180 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014181 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014182 .total_size = 256,
14183 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014184 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014185 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014186 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014187 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014188 .block_erasers =
14189 {
14190 {
14191 .eraseblocks = { {256 * 1024, 1} },
14192 .block_erase = erase_chip_block_jedec,
14193 }
14194 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014195 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014196 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014197 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014198 },
14199
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014200 {
14201 .vendor = "SST",
14202 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014203 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014204 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014205 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014206 .total_size = 128,
14207 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014208 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014209 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014210 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014211 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014212 .block_erasers =
14213 {
14214 {
14215 .eraseblocks = { {4 * 1024, 32} },
14216 .block_erase = erase_sector_jedec,
14217 }, {
14218 .eraseblocks = { {128 * 1024, 1} },
14219 .block_erase = erase_chip_block_jedec,
14220 }
14221 },
Sean Nelson35727f72010-01-28 23:55:12 +000014222 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014223 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014224 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014225 },
14226
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014227 {
14228 .vendor = "SST",
14229 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014230 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014231 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014232 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014233 .total_size = 256,
14234 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014235 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000014236 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014237 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014238 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014239 .block_erasers =
14240 {
14241 {
14242 .eraseblocks = { {4 * 1024, 64} },
14243 .block_erase = erase_sector_jedec,
14244 }, {
14245 .eraseblocks = { {256 * 1024, 1} },
14246 .block_erase = erase_chip_block_jedec,
14247 }
14248 },
Sean Nelson35727f72010-01-28 23:55:12 +000014249 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014250 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014251 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014252 },
14253
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014254 {
14255 .vendor = "SST",
14256 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014257 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014258 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014259 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014260 .total_size = 512,
14261 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014262 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000014263 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014264 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014265 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014266 .block_erasers =
14267 {
14268 {
14269 .eraseblocks = { {4 * 1024, 128} },
14270 .block_erase = erase_sector_jedec,
14271 }, {
14272 .eraseblocks = { {512 * 1024, 1} },
14273 .block_erase = erase_chip_block_jedec,
14274 }
14275 },
Sean Nelson35727f72010-01-28 23:55:12 +000014276 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014277 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014278 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014279 },
14280
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014281 {
14282 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014283 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014284 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014285 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014286 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014287 .total_size = 64,
14288 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014289 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000014290 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014291 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014292 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014293 .block_erasers =
14294 {
14295 {
14296 .eraseblocks = { {4 * 1024, 16} },
14297 .block_erase = erase_sector_jedec,
14298 }, {
14299 .eraseblocks = { {64 * 1024, 1} },
14300 .block_erase = erase_chip_block_jedec,
14301 }
14302 },
Sean Nelson35727f72010-01-28 23:55:12 +000014303 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014304 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014305 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014306 },
14307
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014308 {
14309 .vendor = "SST",
14310 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014311 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014312 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014313 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014314 .total_size = 128,
14315 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014316 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000014317 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014318 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014319 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014320 .block_erasers =
14321 {
14322 {
14323 .eraseblocks = { {4 * 1024, 32} },
14324 .block_erase = erase_sector_jedec,
14325 }, {
14326 .eraseblocks = { {128 * 1024, 1} },
14327 .block_erase = erase_chip_block_jedec,
14328 }
14329 },
Sean Nelson35727f72010-01-28 23:55:12 +000014330 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014331 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014332 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014333 },
14334
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014335 {
14336 .vendor = "SST",
14337 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014338 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014339 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014340 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014341 .total_size = 256,
14342 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014343 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014344 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014345 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014346 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014347 .block_erasers =
14348 {
14349 {
14350 .eraseblocks = { {4 * 1024, 64} },
14351 .block_erase = erase_sector_jedec,
14352 }, {
14353 .eraseblocks = { {256 * 1024, 1} },
14354 .block_erase = erase_chip_block_jedec,
14355 }
14356 },
Sean Nelson35727f72010-01-28 23:55:12 +000014357 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014358 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014359 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014360 },
14361
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014362 {
14363 .vendor = "SST",
14364 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014365 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014366 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014367 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014368 .total_size = 512,
14369 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014370 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014371 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014372 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014373 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014374 .block_erasers =
14375 {
14376 {
14377 .eraseblocks = { {4 * 1024, 128} },
14378 .block_erase = erase_sector_jedec,
14379 }, {
14380 .eraseblocks = { {512 * 1024, 1} },
14381 .block_erase = erase_chip_block_jedec,
14382 }
14383 },
Sean Nelson35727f72010-01-28 23:55:12 +000014384 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014385 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014386 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000014387 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014388
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014389 {
14390 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000014391 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014392 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014393 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014394 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000014395 .total_size = 1024,
14396 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014397 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000014398 .tested = TEST_UNTESTED,
14399 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014400 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014401 .block_erasers =
14402 {
14403 {
14404 .eraseblocks = { {4 * 1024, 256} },
14405 .block_erase = erase_sector_jedec,
14406 }, {
14407 .eraseblocks = { {64 * 1024, 16} },
14408 .block_erase = erase_block_jedec,
14409 }, {
14410 .eraseblocks = { {1024 * 1024, 1} },
14411 .block_erase = erase_chip_block_jedec,
14412 }
14413 },
Sean Nelson35727f72010-01-28 23:55:12 +000014414 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014415 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014416 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000014417 },
14418
14419 {
14420 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014421 .name = "SST39VF512",
14422 .bustype = BUS_PARALLEL,
14423 .manufacture_id = SST_ID,
14424 .model_id = SST_SST39VF512,
14425 .total_size = 64,
14426 .page_size = 4096,
14427 .feature_bits = FEATURE_EITHER_RESET,
14428 .tested = TEST_OK_PREW,
14429 .probe = probe_jedec,
14430 .probe_timing = 1, /* 150 ns */
14431 .block_erasers =
14432 {
14433 {
14434 .eraseblocks = { {4 * 1024, 16} },
14435 .block_erase = erase_sector_jedec,
14436 }, {
14437 .eraseblocks = { {64 * 1024, 1} },
14438 .block_erase = erase_chip_block_jedec,
14439 }
14440 },
14441 .write = write_jedec_1,
14442 .read = read_memmapped,
14443 .voltage = {2700, 3600},
14444 },
14445
14446 {
14447 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014448 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014449 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014450 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014451 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014452 .total_size = 256,
14453 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014454 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014455 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014456 .probe = probe_jedec,
14457 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014458 .block_erasers =
14459 {
14460 {
14461 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014462 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014463 }, {
14464 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014465 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014466 }, {
14467 .eraseblocks = { {256 * 1024, 1} },
14468 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14469 }
14470 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014471 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014472 .unlock = unlock_sst_fwhub,
14473 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014474 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014475 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014476 },
14477
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014478 {
14479 .vendor = "SST",
14480 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014481 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014482 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014483 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014484 .total_size = 384,
14485 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014486 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014487 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014488 .probe = probe_jedec,
14489 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014490 .block_erasers =
14491 {
14492 {
14493 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014494 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014495 }, {
14496 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014497 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014498 }, {
14499 .eraseblocks = { {384 * 1024, 1} },
14500 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14501 }
14502 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014503 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014504 .unlock = unlock_sst_fwhub,
14505 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014506 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014507 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014508 },
14509
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014510 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014511 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14512 * and is only honored for 64k block erase, but not 4k sector erase.
14513 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014514 .vendor = "SST",
14515 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014516 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014517 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014518 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014519 .total_size = 512,
14520 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014521 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014522 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014523 .probe = probe_jedec,
14524 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014525 .block_erasers =
14526 {
14527 {
14528 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014529 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014530 }, {
14531 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014532 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014533 }, {
14534 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000014535 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014536 },
14537 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014538 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014539 .unlock = unlock_sst_fwhub,
14540 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014541 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014542 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014543 },
14544
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014545 {
14546 .vendor = "SST",
14547 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014548 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014549 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014550 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014551 .total_size = 512,
14552 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014553 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014554 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014555 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014556 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014557 .block_erasers =
14558 {
14559 {
14560 .eraseblocks = { {4 * 1024, 128} },
14561 .block_erase = erase_sector_49lfxxxc,
14562 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014563 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014564 {64 * 1024, 7},
14565 {32 * 1024, 1},
14566 {8 * 1024, 2},
14567 {16 * 1024, 1},
14568 },
Sean Nelson69e58112010-03-23 17:10:28 +000014569 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014570 }
14571 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014572 .printlock = printlock_regspace2_block_eraser_1,
14573 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014574 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014575 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014576 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014577 },
14578
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014579 {
14580 .vendor = "SST",
14581 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014582 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014583 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014584 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014585 .total_size = 1024,
14586 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014587 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014588 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014589 .probe = probe_jedec,
14590 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014591 .block_erasers =
14592 {
14593 {
14594 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014595 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014596 }, {
14597 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014598 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014599 }, {
14600 .eraseblocks = { {1024 * 1024, 1} },
14601 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14602 }
14603 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014604 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014605 .unlock = unlock_sst_fwhub,
14606 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014607 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014608 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014609 },
14610
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014611 {
14612 .vendor = "SST",
14613 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014614 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014615 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014616 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014617 .total_size = 1024,
14618 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014619 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014620 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014621 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014622 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014623 .block_erasers =
14624 {
14625 {
14626 .eraseblocks = { {4 * 1024, 256} },
14627 .block_erase = erase_sector_49lfxxxc,
14628 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014629 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014630 {64 * 1024, 15},
14631 {32 * 1024, 1},
14632 {8 * 1024, 2},
14633 {16 * 1024, 1},
14634 },
Sean Nelson69e58112010-03-23 17:10:28 +000014635 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014636 }
14637 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014638 .printlock = printlock_regspace2_block_eraser_1,
14639 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014640 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014641 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014642 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014643 },
14644
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014645 {
14646 .vendor = "SST",
14647 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014648 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014649 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014650 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014651 .total_size = 2048,
14652 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014653 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014654 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014655 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014656 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014657 .block_erasers =
14658 {
14659 {
14660 .eraseblocks = { {4 * 1024, 512} },
14661 .block_erase = erase_sector_49lfxxxc,
14662 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014663 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014664 {64 * 1024, 31},
14665 {32 * 1024, 1},
14666 {8 * 1024, 2},
14667 {16 * 1024, 1},
14668 },
Sean Nelson69e58112010-03-23 17:10:28 +000014669 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014670 }
14671 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014672 .printlock = printlock_regspace2_block_eraser_1,
14673 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014674 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014675 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014676 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014677 },
14678
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014679 {
14680 .vendor = "SST",
14681 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014682 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014683 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014684 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014685 .total_size = 256,
14686 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014687 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000014688 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014689 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014690 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014691 .block_erasers =
14692 {
14693 {
14694 .eraseblocks = { {4 * 1024, 64} },
14695 .block_erase = erase_sector_jedec,
14696 }, {
14697 .eraseblocks = { {16 * 1024, 16} },
14698 .block_erase = erase_block_jedec,
14699 }, {
14700 .eraseblocks = { {256 * 1024, 1} },
14701 .block_erase = NULL,
14702 }
14703 },
Sean Nelson35727f72010-01-28 23:55:12 +000014704 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014705 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014706 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000014707 },
14708
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014709 {
14710 .vendor = "SST",
14711 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014712 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014713 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014714 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014715 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000014716 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014717 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014718 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014719 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014720 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014721 .block_erasers =
14722 {
14723 {
14724 .eraseblocks = { {4 * 1024, 64} },
14725 .block_erase = erase_sector_jedec,
14726 }, {
14727 .eraseblocks = { {16 * 1024, 16} },
14728 .block_erase = erase_block_jedec,
14729 }, {
14730 .eraseblocks = { {256 * 1024, 1} },
14731 .block_erase = NULL,
14732 }
14733 },
Sean Nelson35727f72010-01-28 23:55:12 +000014734 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014735 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014736 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014737 },
14738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014739 {
14740 .vendor = "SST",
14741 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014742 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014743 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014744 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014745 .total_size = 512,
14746 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014747 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014748 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014749 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014750 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014751 .block_erasers =
14752 {
14753 {
14754 .eraseblocks = { {4 * 1024, 128} },
14755 .block_erase = erase_sector_jedec,
14756 }, {
14757 .eraseblocks = { {64 * 1024, 8} },
14758 .block_erase = erase_block_jedec,
14759 }, {
14760 .eraseblocks = { {512 * 1024, 1} },
14761 .block_erase = NULL,
14762 }
14763 },
Sean Nelson35727f72010-01-28 23:55:12 +000014764 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014765 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014766 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014767 },
14768
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014769 {
14770 .vendor = "SST",
14771 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014772 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014773 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014774 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014775 .total_size = 512,
14776 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000014777 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014778 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014779 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014780 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014781 .block_erasers =
14782 {
14783 {
14784 .eraseblocks = { {4 * 1024, 128} },
14785 .block_erase = erase_sector_jedec,
14786 }, {
14787 .eraseblocks = { {64 * 1024, 8} },
14788 .block_erase = erase_block_jedec,
14789 }, {
14790 .eraseblocks = { {512 * 1024, 1} },
14791 .block_erase = NULL,
14792 }
14793 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014794 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014795 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014796 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014797 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014798 },
14799
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014800 {
14801 .vendor = "SST",
14802 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014803 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014804 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020014805 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014806 .total_size = 1024,
14807 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014808 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000014809 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014810 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014811 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014812 .block_erasers =
14813 {
14814 {
14815 .eraseblocks = { {4 * 1024, 256} },
14816 .block_erase = erase_sector_jedec,
14817 }, {
14818 .eraseblocks = { {64 * 1024, 16} },
14819 .block_erase = erase_block_jedec,
14820 }, {
14821 .eraseblocks = { {1024 * 1024, 1} },
14822 .block_erase = NULL,
14823 }
14824 },
Sean Nelson35727f72010-01-28 23:55:12 +000014825 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014826 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014827 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014828 },
14829
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014830 {
14831 .vendor = "SST",
14832 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014833 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014834 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014835 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014836 .total_size = 2048,
14837 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014838 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014839 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014840 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014841 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014842 .block_erasers =
14843 {
14844 {
14845 .eraseblocks = { {4 * 1024, 512} },
14846 .block_erase = erase_sector_49lfxxxc,
14847 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014848 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014849 {64 * 1024, 31},
14850 {32 * 1024, 1},
14851 {8 * 1024, 2},
14852 {16 * 1024, 1},
14853 },
Sean Nelson69e58112010-03-23 17:10:28 +000014854 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014855 }
14856 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014857 .printlock = printlock_regspace2_block_eraser_1,
14858 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014859 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014860 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014861 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014862 },
14863
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014864 {
14865 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014866 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014867 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014868 .manufacture_id = ST_ID,
14869 .model_id = ST_M29F002B,
14870 .total_size = 256,
14871 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014872 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014873 .tested = TEST_UNTESTED,
14874 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014875 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014876 .block_erasers =
14877 {
14878 {
14879 .eraseblocks = {
14880 {16 * 1024, 1},
14881 {8 * 1024, 2},
14882 {32 * 1024, 1},
14883 {64 * 1024, 3},
14884 },
14885 .block_erase = erase_sector_jedec,
14886 }, {
14887 .eraseblocks = { {256 * 1024, 1} },
14888 .block_erase = erase_chip_block_jedec,
14889 }
14890 },
Sean Nelson35727f72010-01-28 23:55:12 +000014891 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014892 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014893 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014894 },
14895
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014896 {
14897 .vendor = "ST",
14898 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014899 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014900 .manufacture_id = ST_ID,
14901 .model_id = ST_M29F002T,
14902 .total_size = 256,
14903 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014904 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014905 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014906 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014907 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014908 .block_erasers =
14909 {
14910 {
14911 .eraseblocks = {
14912 {64 * 1024, 3},
14913 {32 * 1024, 1},
14914 {8 * 1024, 2},
14915 {16 * 1024, 1},
14916 },
14917 .block_erase = erase_sector_jedec,
14918 }, {
14919 .eraseblocks = { {256 * 1024, 1} },
14920 .block_erase = erase_chip_block_jedec,
14921 }
14922 },
Sean Nelson35727f72010-01-28 23:55:12 +000014923 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014924 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014925 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014926 },
14927
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014928 {
14929 .vendor = "ST",
14930 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014931 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014932 .manufacture_id = ST_ID,
14933 .model_id = ST_M29F040B,
14934 .total_size = 512,
14935 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014936 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14937 .tested = TEST_UNTESTED,
14938 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000014939 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000014940 .block_erasers =
14941 {
14942 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014943 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000014944 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014945 }, {
14946 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000014947 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014948 }
14949 },
Sean Nelson35727f72010-01-28 23:55:12 +000014950 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014951 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014952 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014953 },
14954
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014955 {
Sean Nelson35727f72010-01-28 23:55:12 +000014956 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014957 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014958 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014959 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014960 .manufacture_id = ST_ID,
14961 .model_id = ST_M29F400BB,
14962 .total_size = 512,
14963 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014964 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014965 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014966 .probe = probe_jedec,
14967 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014968 .block_erasers =
14969 {
14970 {
14971 .eraseblocks = {
14972 {16 * 1024, 1},
14973 {8 * 1024, 2},
14974 {32 * 1024, 1},
14975 {64 * 1024, 7},
14976 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014977 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014978 }, {
14979 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014980 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014981 }
14982 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014983 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014984 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014985 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014986 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014987
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014988 {
14989 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14990 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014991 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014992 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014993 .manufacture_id = ST_ID,
14994 .model_id = ST_M29F400BT,
14995 .total_size = 512,
14996 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014997 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014998 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014999 .probe = probe_jedec,
15000 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000015001 .block_erasers =
15002 {
15003 {
15004 .eraseblocks = {
15005 {64 * 1024, 7},
15006 {32 * 1024, 1},
15007 {8 * 1024, 2},
15008 {16 * 1024, 1},
15009 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015010 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015011 }, {
15012 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015013 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015014 }
15015 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015016 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015017 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015018 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015019 },
15020
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015021 {
15022 .vendor = "ST",
15023 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015024 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015025 .manufacture_id = ST_ID,
15026 .model_id = ST_M29W010B,
15027 .total_size = 128,
15028 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015029 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015030 .tested = TEST_UNTESTED,
15031 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015032 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015033 .block_erasers =
15034 {
15035 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015036 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015037 .block_erase = erase_sector_jedec,
15038 }, {
15039 .eraseblocks = { {128 * 1024, 1} },
15040 .block_erase = erase_chip_block_jedec,
15041 }
15042 },
Sean Nelson35727f72010-01-28 23:55:12 +000015043 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015044 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015045 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015046 },
15047
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015048 {
15049 .vendor = "ST",
15050 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015051 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015052 .manufacture_id = ST_ID,
15053 .model_id = ST_M29W040B,
15054 .total_size = 512,
15055 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015056 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015057 .tested = TEST_UNTESTED,
15058 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015059 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015060 .block_erasers =
15061 {
15062 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015063 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015064 .block_erase = erase_sector_jedec,
15065 }, {
15066 .eraseblocks = { {512 * 1024, 1} },
15067 .block_erase = erase_chip_block_jedec,
15068 }
15069 },
Sean Nelson35727f72010-01-28 23:55:12 +000015070 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015071 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015072 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015073 },
15074
Stefan Taunereb582572012-09-21 12:52:50 +000015075 {
15076 .vendor = "ST",
15077 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015078 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100015079 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000015080 .model_id = ST_M29W512B,
15081 .total_size = 64,
15082 .page_size = 64 * 1024,
15083 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015084 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000015085 .probe = probe_jedec,
15086 .probe_timing = TIMING_ZERO,
15087 .block_erasers =
15088 {
15089 {
15090 .eraseblocks = { {64 * 1024, 1} },
15091 .block_erase = erase_chip_block_jedec,
15092 }
15093 },
15094 .write = write_jedec_1,
15095 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015096 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000015097 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000015098
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015099 {
15100 .vendor = "ST",
15101 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015102 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015103 .manufacture_id = ST_ID,
15104 .model_id = ST_M50FLW040A,
15105 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015106 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015107 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015108 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015109 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015110 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015111 .block_erasers =
15112 {
15113 {
Sean Nelson329bde72010-01-19 16:39:19 +000015114 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015115 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015116 {64 * 1024, 5}, /* block */
15117 {4 * 1024, 16}, /* sector */
15118 {4 * 1024, 16}, /* sector */
15119 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015120 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015121 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015122 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015123 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015124 }
15125 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015126 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015127 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015128 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015129 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015130 },
15131
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015132 {
15133 .vendor = "ST",
15134 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015135 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015136 .manufacture_id = ST_ID,
15137 .model_id = ST_M50FLW040B,
15138 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015139 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015140 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015141 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015142 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015143 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015144 .block_erasers =
15145 {
15146 {
Sean Nelson329bde72010-01-19 16:39:19 +000015147 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015148 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015149 {4 * 1024, 16}, /* sector */
15150 {64 * 1024, 5}, /* block */
15151 {4 * 1024, 16}, /* sector */
15152 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015153 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015154 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015155 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015156 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015157 }
15158 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015159 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015160 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015161 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015162 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015163 },
15164
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015165 {
15166 .vendor = "ST",
15167 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015168 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015169 .manufacture_id = ST_ID,
15170 .model_id = ST_M50FLW080A,
15171 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015172 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015173 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015174 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015175 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015176 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015177 .block_erasers =
15178 {
15179 {
Sean Nelson329bde72010-01-19 16:39:19 +000015180 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015181 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015182 {64 * 1024, 13}, /* block */
15183 {4 * 1024, 16}, /* sector */
15184 {4 * 1024, 16}, /* sector */
15185 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015186 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015187 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015188 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015189 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015190 }
15191 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015192 .printlock = printlock_regspace2_block_eraser_0,
15193 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015194 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015195 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015196 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015197 },
15198
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015199 {
15200 .vendor = "ST",
15201 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015202 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015203 .manufacture_id = ST_ID,
15204 .model_id = ST_M50FLW080B,
15205 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015206 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015207 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015208 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015209 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015210 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015211 .block_erasers =
15212 {
15213 {
Sean Nelson329bde72010-01-19 16:39:19 +000015214 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015215 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015216 {4 * 1024, 16}, /* sector */
15217 {64 * 1024, 13}, /* block */
15218 {4 * 1024, 16}, /* sector */
15219 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015220 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015221 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015222 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015223 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015224 }
15225 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015226 .printlock = printlock_regspace2_block_eraser_0,
15227 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015228 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015229 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015230 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015231 },
15232
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015233 {
15234 .vendor = "ST",
15235 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015236 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015237 .manufacture_id = ST_ID,
15238 .model_id = ST_M50FW002,
15239 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000015240 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015241 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015242 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015243 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015244 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015245 .block_erasers =
15246 {
15247 {
15248 .eraseblocks = {
15249 {64 * 1024, 3},
15250 {32 * 1024, 1},
15251 {8 * 1024, 2},
15252 {16 * 1024, 1},
15253 },
Sean Nelson28accc22010-03-19 18:47:06 +000015254 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015255 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000015256 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015257 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000015258 }
15259 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015260 .printlock = printlock_regspace2_block_eraser_0,
15261 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015262 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015263 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015264 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015265 },
15266
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015267 {
15268 .vendor = "ST",
15269 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015270 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015271 .manufacture_id = ST_ID,
15272 .model_id = ST_M50FW016,
15273 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015274 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015275 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015276 .tested = TEST_UNTESTED,
15277 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015278 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015279 .block_erasers =
15280 {
15281 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015282 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000015283 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015284 }
15285 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015286 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015287 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015288 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015289 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015290 },
15291
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015292 {
15293 .vendor = "ST",
15294 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015295 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015296 .manufacture_id = ST_ID,
15297 .model_id = ST_M50FW040,
15298 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015299 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015300 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000015301 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015302 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015303 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015304 .block_erasers =
15305 {
15306 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015307 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015308 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015309 }
15310 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015311 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015312 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015313 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015314 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015315 },
15316
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015317 {
15318 .vendor = "ST",
15319 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015320 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015321 .manufacture_id = ST_ID,
15322 .model_id = ST_M50FW080,
15323 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015324 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015325 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015326 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015327 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015328 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015329 .block_erasers =
15330 {
15331 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015332 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015333 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015334 }
15335 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015336 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015337 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015338 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015339 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015340 },
15341
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015342 {
15343 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015344 .name = "M50LPW080",
15345 .bustype = BUS_LPC, /* A/A Mux */
15346 .manufacture_id = ST_ID,
15347 .model_id = ST_M50LPW080,
15348 .total_size = 1024,
15349 .page_size = 0,
15350 .feature_bits = FEATURE_REGISTERMAP,
15351 .tested = TEST_UNTESTED,
15352 .probe = probe_82802ab,
15353 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15354 .block_erasers =
15355 {
15356 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015357 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015358 .block_erase = erase_block_82802ab,
15359 }
15360 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015361 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015362 .write = write_82802ab,
15363 .read = read_memmapped,
15364 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15365 },
15366
15367 {
15368 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015369 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015370 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015371 .manufacture_id = ST_ID,
15372 .model_id = ST_M50LPW116,
15373 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015374 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015375 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015376 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015377 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000015378 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015379 .block_erasers =
15380 {
15381 {
15382 .eraseblocks = {
15383 {4 * 1024, 16},
15384 {64 * 1024, 30},
15385 {32 * 1024, 1},
15386 {8 * 1024, 2},
15387 {16 * 1024, 1},
15388 },
Sean Nelson28accc22010-03-19 18:47:06 +000015389 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015390 }
15391 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015392 .printlock = printlock_regspace2_block_eraser_0,
15393 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015394 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015395 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015396 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015397 },
15398
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015399 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030015400 .vendor = "ST",
15401 .name = "M95M02",
15402 .bustype = BUS_SPI,
15403 .manufacture_id = ST_ID,
15404 .model_id = ST_M95M02,
15405 .total_size = 256,
15406 .page_size = 256,
15407 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
15408 .tested = TEST_OK_PREW,
15409 .probe = probe_spi_st95,
15410 .probe_timing = TIMING_ZERO,
15411 .block_erasers =
15412 {
15413 {
15414 .eraseblocks = { {256 * 1024, 1} },
15415 .block_erase = spi_block_erase_emulation,
15416 }
15417 },
15418
15419 .printlock = spi_prettyprint_status_register_bp1_srwd,
15420 .unlock = spi_disable_blockprotect_bp1_srwd,
15421 .write = spi_chip_write_256,
15422 .read = spi_chip_read,
15423 .voltage = {2500, 5500},
15424 },
15425
15426 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015427 .vendor = "Sanyo",
15428 .name = "LE25FU106B",
15429 .bustype = BUS_SPI,
15430 .manufacture_id = SANYO_ID,
15431 .model_id = SANYO_LE25FU106B,
15432 .total_size = 128,
15433 .page_size = 256,
15434 .feature_bits = FEATURE_WRSR_WREN,
15435 .tested = TEST_UNTESTED,
15436 .probe = probe_spi_res2,
15437 .probe_timing = TIMING_ZERO,
15438 .block_erasers =
15439 {
15440 /* FIXME: Is this correct?
15441 {
15442 .eraseblocks = { {2 * 1024, 64} },
15443 .block_erase = spi_block_erase_d7,
15444 },*/
15445 {
15446 .eraseblocks = { {32 * 1024, 4} },
15447 .block_erase = spi_block_erase_d8,
15448 }, {
15449 .eraseblocks = { {128 * 1024, 1} },
15450 .block_erase = spi_block_erase_c7,
15451 }
15452 },
15453 .printlock = spi_prettyprint_status_register_bp1_srwd,
15454 .unlock = spi_disable_blockprotect_bp1_srwd,
15455 .write = spi_chip_write_256,
15456 .read = spi_chip_read,
15457 .voltage = {2300, 3600},
15458 },
15459
15460 {
15461 .vendor = "Sanyo",
15462 .name = "LE25FU206",
15463 .bustype = BUS_SPI,
15464 .manufacture_id = SANYO_ID,
15465 .model_id = SANYO_LE25FU206,
15466 .total_size = 256,
15467 .page_size = 256,
15468 .feature_bits = FEATURE_WRSR_WREN,
15469 .tested = TEST_UNTESTED,
15470 .probe = probe_spi_res2,
15471 .probe_timing = TIMING_ZERO,
15472 .block_erasers =
15473 {
15474 {
15475 .eraseblocks = { {4 * 1024, 64} },
15476 .block_erase = spi_block_erase_d7,
15477 }, {
15478 .eraseblocks = { {64 * 1024, 4} },
15479 .block_erase = spi_block_erase_d8,
15480 }, {
15481 .eraseblocks = { {256 * 1024, 1} },
15482 .block_erase = spi_block_erase_c7,
15483 }
15484 },
15485 .printlock = spi_prettyprint_status_register_bp1_srwd,
15486 .unlock = spi_disable_blockprotect_bp1_srwd,
15487 .write = spi_chip_write_256,
15488 .read = spi_chip_read,
15489 .voltage = {2300, 3600},
15490 },
15491
15492 {
15493 .vendor = "Sanyo",
15494 .name = "LE25FU206A",
15495 .bustype = BUS_SPI,
15496 .manufacture_id = SANYO_ID,
15497 .model_id = SANYO_LE25FU206A,
15498 .total_size = 256,
15499 .page_size = 256,
15500 .tested = TEST_UNTESTED,
15501 .probe = probe_spi_rdid,
15502 .probe_timing = TIMING_ZERO,
15503 .block_erasers =
15504 {
15505 {
15506 .eraseblocks = { {4 * 1024, 64} },
15507 .block_erase = spi_block_erase_20,
15508 }, {
15509 .eraseblocks = { {4 * 1024, 64} },
15510 .block_erase = spi_block_erase_d7,
15511 }, {
15512 .eraseblocks = { {64 * 1024, 4} },
15513 .block_erase = spi_block_erase_d8,
15514 }, {
15515 .eraseblocks = { {256 * 1024, 1} },
15516 .block_erase = spi_block_erase_60,
15517 }, {
15518 .eraseblocks = { {256 * 1024, 1} },
15519 .block_erase = spi_block_erase_c7,
15520 }
15521 },
15522 .printlock = spi_prettyprint_status_register_bp2_srwd,
15523 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15524 .write = spi_chip_write_256,
15525 .read = spi_chip_read,
15526 .voltage = {2300, 3600},
15527 },
15528
15529 {
15530 .vendor = "Sanyo",
15531 .name = "LE25FU406B",
15532 .bustype = BUS_SPI,
15533 .manufacture_id = SANYO_ID,
15534 .model_id = SANYO_LE25FU406B,
15535 .total_size = 512,
15536 .page_size = 256,
15537 .feature_bits = FEATURE_WRSR_WREN,
15538 .tested = TEST_OK_PREW,
15539 .probe = probe_spi_res2,
15540 .probe_timing = TIMING_ZERO,
15541 .block_erasers =
15542 {
15543 {
15544 .eraseblocks = { {4 * 1024, 128} },
15545 .block_erase = spi_block_erase_d7,
15546 }, {
15547 .eraseblocks = { {64 * 1024, 8} },
15548 .block_erase = spi_block_erase_d8,
15549 }, {
15550 .eraseblocks = { {512 * 1024, 1} },
15551 .block_erase = spi_block_erase_c7,
15552 }
15553 },
15554 .printlock = spi_prettyprint_status_register_bp2_srwd,
15555 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15556 .write = spi_chip_write_256,
15557 .read = spi_chip_read,
15558 .voltage = {2300, 3600},
15559 },
15560
15561 {
15562 .vendor = "Sanyo",
15563 .name = "LE25FU406C/LE25U40CMC",
15564 .bustype = BUS_SPI,
15565 .manufacture_id = SANYO_ID,
15566 .model_id = SANYO_LE25FU406C,
15567 .total_size = 512,
15568 .page_size = 256,
15569 .feature_bits = FEATURE_WRSR_WREN,
15570 .tested = TEST_OK_PREW,
15571 .probe = probe_spi_rdid,
15572 .probe_timing = TIMING_ZERO,
15573 .block_erasers =
15574 {
15575 {
15576 .eraseblocks = { {4 * 1024, 128} },
15577 .block_erase = spi_block_erase_20,
15578 }, {
15579 .eraseblocks = { {4 * 1024, 128} },
15580 .block_erase = spi_block_erase_d7,
15581 }, {
15582 .eraseblocks = { {64 * 1024, 8} },
15583 .block_erase = spi_block_erase_d8,
15584 }, {
15585 .eraseblocks = { {512 * 1024, 1} },
15586 .block_erase = spi_block_erase_60,
15587 }, {
15588 .eraseblocks = { {512 * 1024, 1} },
15589 .block_erase = spi_block_erase_c7,
15590 }
15591 },
15592 .printlock = spi_prettyprint_status_register_bp2_srwd,
15593 .unlock = spi_disable_blockprotect_bp2_srwd,
15594 .write = spi_chip_write_256,
15595 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
15596 .voltage = {2300, 3600},
15597 },
15598
15599 {
15600 .vendor = "Sanyo",
15601 .name = "LE25FW106",
15602 .bustype = BUS_SPI,
15603 .manufacture_id = SANYO_ID,
15604 .model_id = SANYO_LE25FW106,
15605 .total_size = 128,
15606 .page_size = 256,
15607 .feature_bits = FEATURE_WRSR_WREN,
15608 .tested = TEST_OK_PREW,
15609 .probe = probe_spi_res2,
15610 .probe_timing = TIMING_ZERO,
15611 .block_erasers =
15612 {
15613 {
15614 .eraseblocks = { {2 * 1024, 64} },
15615 .block_erase = spi_block_erase_d7,
15616 }, {
15617 .eraseblocks = { {32 * 1024, 4} },
15618 .block_erase = spi_block_erase_d8,
15619 }, {
15620 .eraseblocks = { {128 * 1024, 1} },
15621 .block_erase = spi_block_erase_c7,
15622 }
15623 },
15624 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
15625 .unlock = spi_disable_blockprotect_bp1_srwd,
15626 .write = spi_chip_write_256,
15627 .read = spi_chip_read,
15628 .voltage = {2700, 3600},
15629 },
15630
15631 {
15632 .vendor = "Sanyo",
15633 .name = "LE25FW203A",
15634 .bustype = BUS_SPI,
15635 .manufacture_id = SANYO_ID,
15636 .model_id = SANYO_LE25FW203A,
15637 .total_size = 256,
15638 .page_size = 256,
15639 .tested = TEST_UNTESTED,
15640 .probe = probe_spi_rdid,
15641 .probe_timing = TIMING_ZERO,
15642 .block_erasers =
15643 {
15644 {
15645 .eraseblocks = { {256, 1024} },
15646 .block_erase = spi_block_erase_db,
15647 }, {
15648 .eraseblocks = { {64 * 1024, 4} },
15649 .block_erase = spi_block_erase_d8,
15650 }, {
15651 .eraseblocks = { {256 * 1024, 1} },
15652 .block_erase = spi_block_erase_c7,
15653 }
15654 },
15655 .printlock = spi_prettyprint_status_register_default_welwip,
15656 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15657 .write = spi_chip_write_256,
15658 .read = spi_chip_read,
15659 .voltage = {2700, 3600},
15660 },
15661
15662 {
15663 .vendor = "Sanyo",
15664 .name = "LE25FW403A",
15665 .bustype = BUS_SPI,
15666 .manufacture_id = SANYO_ID,
15667 .model_id = SANYO_LE25FW403A,
15668 .total_size = 512,
15669 .page_size = 256,
15670 .tested = TEST_UNTESTED,
15671 .probe = probe_spi_rdid,
15672 .probe_timing = TIMING_ZERO,
15673 .block_erasers =
15674 {
15675 {
15676 .eraseblocks = { {256, 2 * 1024} },
15677 .block_erase = spi_block_erase_db,
15678 }, {
15679 .eraseblocks = { {64 * 1024, 8} },
15680 .block_erase = spi_block_erase_d8,
15681 }, {
15682 .eraseblocks = { {512 * 1024, 1} },
15683 .block_erase = spi_block_erase_c7,
15684 }
15685 },
15686 .printlock = spi_prettyprint_status_register_default_welwip,
15687 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15688 .write = spi_chip_write_256,
15689 .read = spi_chip_read,
15690 .voltage = {2700, 3600},
15691 },
15692
15693 {
15694 .vendor = "Sanyo",
15695 .name = "LE25FW406A",
15696 .bustype = BUS_SPI,
15697 .manufacture_id = SANYO_ID,
15698 .model_id = SANYO_LE25FW406A,
15699 .total_size = 512,
15700 .page_size = 256,
15701 .feature_bits = FEATURE_WRSR_WREN,
15702 .tested = TEST_OK_PREW,
15703 .probe = probe_spi_res2,
15704 .probe_timing = TIMING_ZERO,
15705 .block_erasers =
15706 {
15707 {
15708 .eraseblocks = { {4 * 1024, 128} },
15709 .block_erase = spi_block_erase_d7,
15710 }, {
15711 .eraseblocks = { {64 * 1024, 8} },
15712 .block_erase = spi_block_erase_d8,
15713 }, {
15714 .eraseblocks = { {512 * 1024, 1} },
15715 .block_erase = spi_block_erase_c7,
15716 }
15717 },
15718 .printlock = spi_prettyprint_status_register_plain,
15719 .unlock = spi_disable_blockprotect,
15720 .write = spi_chip_write_256,
15721 .read = spi_chip_read,
15722 .voltage = {2700, 3600},
15723 },
15724
15725 {
15726 .vendor = "Sanyo",
15727 .name = "LE25FW418A",
15728 .bustype = BUS_SPI,
15729 .manufacture_id = SANYO_ID,
15730 .model_id = SANYO_LE25FW418A,
15731 .total_size = 512,
15732 .page_size = 256,
15733 .feature_bits = FEATURE_WRSR_WREN,
15734 .tested = TEST_UNTESTED,
15735 .probe = probe_spi_res2,
15736 .probe_timing = TIMING_ZERO,
15737 .block_erasers =
15738 {
15739 {
15740 .eraseblocks = { {4 * 1024, 128} },
15741 .block_erase = spi_block_erase_d7,
15742 }, {
15743 .eraseblocks = { {64 * 1024, 8} },
15744 .block_erase = spi_block_erase_d8,
15745 }, {
15746 .eraseblocks = { {512 * 1024, 1} },
15747 .block_erase = spi_block_erase_c7,
15748 }
15749 },
15750 .printlock = spi_prettyprint_status_register_bp2_srwd,
15751 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15752 .write = spi_chip_write_256,
15753 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15754 .voltage = {2700, 3600},
15755 },
15756
15757 {
15758 .vendor = "Sanyo",
15759 .name = "LE25FW806",
15760 .bustype = BUS_SPI,
15761 .manufacture_id = SANYO_ID,
15762 .model_id = SANYO_LE25FW806,
15763 .total_size = 1024,
15764 .page_size = 256,
15765 .feature_bits = FEATURE_WRSR_WREN,
15766 .tested = TEST_UNTESTED,
15767 .probe = probe_spi_res2,
15768 .probe_timing = TIMING_ZERO,
15769 .block_erasers =
15770 {
15771 {
15772 .eraseblocks = { {4 * 1024, 256} },
15773 .block_erase = spi_block_erase_20,
15774 }, {
15775 .eraseblocks = { {4 * 1024, 256} },
15776 .block_erase = spi_block_erase_d7,
15777 }, {
15778 .eraseblocks = { {64 * 1024, 16} },
15779 .block_erase = spi_block_erase_d8,
15780 }, {
15781 .eraseblocks = { {1024 * 1024, 1} },
15782 .block_erase = spi_block_erase_c7,
15783 }
15784 },
15785 .printlock = spi_prettyprint_status_register_bp2_srwd,
15786 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15787 .write = spi_chip_write_256,
15788 .read = spi_chip_read,
15789 .voltage = {2700, 3600},
15790 },
15791
15792 {
15793 .vendor = "Sanyo",
15794 .name = "LE25FW808",
15795 .bustype = BUS_SPI,
15796 .manufacture_id = SANYO_ID,
15797 .model_id = SANYO_LE25FW808,
15798 .total_size = 1024,
15799 .page_size = 256,
15800 .feature_bits = FEATURE_WRSR_WREN,
15801 .tested = TEST_UNTESTED,
15802 .probe = probe_spi_res2,
15803 .probe_timing = TIMING_ZERO,
15804 .block_erasers =
15805 {
15806 {
15807 .eraseblocks = { {8 * 1024, 128} },
15808 .block_erase = spi_block_erase_d7,
15809 }, {
15810 .eraseblocks = { {64 * 1024, 16} },
15811 .block_erase = spi_block_erase_d8,
15812 }, {
15813 .eraseblocks = { {1024 * 1024, 1} },
15814 .block_erase = spi_block_erase_c7,
15815 }
15816 },
15817 .printlock = spi_prettyprint_status_register_bp2_srwd,
15818 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15819 .write = spi_chip_write_256,
15820 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15821 .voltage = {2700, 3600},
15822 },
15823
15824 {
15825 .vendor = "Sharp",
15826 .name = "LH28F008BJT-BTLZ1",
15827 .bustype = BUS_PARALLEL,
15828 .manufacture_id = SHARP_ID,
15829 .model_id = SHARP_LH28F008BJ__PB,
15830 .total_size = 1024,
15831 .page_size = 64 * 1024,
15832 .tested = TEST_OK_PREW,
15833 .probe = probe_82802ab,
15834 .probe_timing = TIMING_ZERO,
15835 .block_erasers =
15836 {
15837 {
15838 .eraseblocks = {
15839 {8 * 1024, 8},
15840 {64 * 1024, 15}
15841 },
15842 .block_erase = erase_block_82802ab,
15843 }, {
15844 .eraseblocks = { {1024 * 1024, 1} },
15845 .block_erase = erase_sector_49lfxxxc,
15846 }
15847 },
15848 .unlock = unlock_lh28f008bjt,
15849 .write = write_82802ab,
15850 .read = read_memmapped,
15851 .voltage = {2700, 3600},
15852 },
15853
15854 {
15855 .vendor = "Sharp",
15856 .name = "LHF00L04",
15857 .bustype = BUS_FWH, /* A/A Mux */
15858 .manufacture_id = SHARP_ID,
15859 .model_id = SHARP_LHF00L04,
15860 .total_size = 1024,
15861 .page_size = 64 * 1024,
15862 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
15863 .tested = TEST_UNTESTED,
15864 .probe = probe_82802ab,
15865 .probe_timing = TIMING_ZERO,
15866 .block_erasers =
15867 {
15868 {
15869 .eraseblocks = {
15870 {64 * 1024, 15},
15871 {8 * 1024, 8}
15872 },
15873 .block_erase = erase_block_82802ab,
15874 }, {
15875 .eraseblocks = {
15876 {1024 * 1024, 1}
15877 },
15878 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
15879 },
15880 },
15881 .unlock = unlock_regspace2_uniform_64k,
15882 .write = write_82802ab,
15883 .read = read_memmapped,
15884 .voltage = {3000, 3600},
15885 },
15886
15887 {
15888 .vendor = "Spansion",
15889 .name = "S25FL004A",
15890 .bustype = BUS_SPI,
15891 .manufacture_id = SPANSION_ID,
15892 .model_id = SPANSION_S25FL004A,
15893 .total_size = 512,
15894 .page_size = 256,
15895 .feature_bits = FEATURE_WRSR_WREN,
15896 .tested = TEST_UNTESTED,
15897 .probe = probe_spi_rdid,
15898 .probe_timing = TIMING_ZERO,
15899 .block_erasers =
15900 {
15901 {
15902 .eraseblocks = { {64 * 1024, 8} },
15903 .block_erase = spi_block_erase_d8,
15904 }, {
15905 .eraseblocks = { {512 * 1024, 1} },
15906 .block_erase = spi_block_erase_c7,
15907 }
15908 },
15909 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15910 .unlock = spi_disable_blockprotect,
15911 .write = spi_chip_write_256,
15912 .read = spi_chip_read,
15913 .voltage = {2700, 3600},
15914 },
15915
15916 {
15917 .vendor = "Spansion",
15918 .name = "S25FL008A",
15919 .bustype = BUS_SPI,
15920 .manufacture_id = SPANSION_ID,
15921 .model_id = SPANSION_S25FL008A,
15922 .total_size = 1024,
15923 .page_size = 256,
15924 .feature_bits = FEATURE_WRSR_WREN,
15925 .tested = TEST_OK_PRE,
15926 .probe = probe_spi_rdid,
15927 .probe_timing = TIMING_ZERO,
15928 .block_erasers =
15929 {
15930 {
15931 .eraseblocks = { {64 * 1024, 16} },
15932 .block_erase = spi_block_erase_d8,
15933 }, {
15934 .eraseblocks = { {1024 * 1024, 1} },
15935 .block_erase = spi_block_erase_c7,
15936 }
15937 },
15938 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15939 .unlock = spi_disable_blockprotect,
15940 .write = spi_chip_write_256,
15941 .read = spi_chip_read,
15942 .voltage = {2700, 3600},
15943 },
15944
15945 {
15946 .vendor = "Spansion",
15947 .name = "S25FL016A",
15948 .bustype = BUS_SPI,
15949 .manufacture_id = SPANSION_ID,
15950 .model_id = SPANSION_S25FL016A,
15951 .total_size = 2048,
15952 .page_size = 256,
15953 .feature_bits = FEATURE_WRSR_WREN,
15954 .tested = TEST_OK_PREW,
15955 .probe = probe_spi_rdid,
15956 .probe_timing = TIMING_ZERO,
15957 .block_erasers =
15958 {
15959 {
15960 .eraseblocks = { {64 * 1024, 32} },
15961 .block_erase = spi_block_erase_d8,
15962 }, {
15963 .eraseblocks = { {2 * 1024 * 1024, 1} },
15964 .block_erase = spi_block_erase_c7,
15965 }
15966 },
15967 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15968 .unlock = spi_disable_blockprotect,
15969 .write = spi_chip_write_256,
15970 .read = spi_chip_read,
15971 .voltage = {2700, 3600},
15972 },
15973
15974 {
15975 .vendor = "Spansion",
15976 .name = "S25FL032A/P",
15977 .bustype = BUS_SPI,
15978 .manufacture_id = SPANSION_ID,
15979 .model_id = SPANSION_S25FL032A,
15980 .total_size = 4096,
15981 .page_size = 256,
15982 .feature_bits = FEATURE_WRSR_WREN,
15983 .tested = TEST_OK_PREW,
15984 .probe = probe_spi_rdid,
15985 .probe_timing = TIMING_ZERO,
15986 .block_erasers =
15987 {
15988 {
15989 .eraseblocks = { {64 * 1024, 64} },
15990 .block_erase = spi_block_erase_d8,
15991 }, {
15992 .eraseblocks = { {4 * 1024 * 1024, 1} },
15993 .block_erase = spi_block_erase_c7,
15994 }
15995 },
15996 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15997 .unlock = spi_disable_blockprotect,
15998 .write = spi_chip_write_256,
15999 .read = spi_chip_read,
16000 .voltage = {2700, 3600},
16001 },
16002
16003 {
16004 .vendor = "Spansion",
16005 .name = "S25FL064A/P",
16006 .bustype = BUS_SPI,
16007 .manufacture_id = SPANSION_ID,
16008 .model_id = SPANSION_S25FL064A,
16009 .total_size = 8192,
16010 .page_size = 256,
16011 .feature_bits = FEATURE_WRSR_WREN,
16012 .tested = TEST_OK_PREW,
16013 .probe = probe_spi_rdid,
16014 .probe_timing = TIMING_ZERO,
16015 .block_erasers =
16016 {
16017 {
16018 .eraseblocks = { {64 * 1024, 128} },
16019 .block_erase = spi_block_erase_d8,
16020 }, {
16021 .eraseblocks = { {8 * 1024 * 1024, 1} },
16022 .block_erase = spi_block_erase_c7,
16023 }
16024 },
16025 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16026 .unlock = spi_disable_blockprotect,
16027 .write = spi_chip_write_256,
16028 .read = spi_chip_read,
16029 .voltage = {2700, 3600},
16030 },
16031
16032 {
16033 .vendor = "Spansion",
16034 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
16035 .bustype = BUS_SPI,
16036 .manufacture_id = SPANSION_ID,
16037 .model_id = SPANSION_S25FL216,
16038 .total_size = 2048,
16039 .page_size = 256,
16040 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
16041 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16042 .tested = TEST_UNTESTED,
16043 .probe = probe_spi_rdid,
16044 .probe_timing = TIMING_ZERO,
16045 .block_erasers =
16046 {
16047 {
16048 .eraseblocks = { {4 * 1024, 512} },
16049 .block_erase = spi_block_erase_20,
16050 }, {
16051 .eraseblocks = { {64 * 1024, 32} },
16052 .block_erase = spi_block_erase_d8,
16053 }, {
16054 .eraseblocks = { { 2048 * 1024, 1} },
16055 .block_erase = spi_block_erase_60,
16056 }, {
16057 .eraseblocks = { { 2048 * 1024, 1} },
16058 .block_erase = spi_block_erase_c7,
16059 }
16060 },
16061 .printlock = spi_prettyprint_status_register_bp3_srwd,
16062 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16063 .write = spi_chip_write_256,
16064 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16065 .voltage = {2700, 3600},
16066 },
16067
16068 {
16069 .vendor = "Spansion",
16070 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
16071 .bustype = BUS_SPI,
16072 .manufacture_id = SPANSION_ID,
16073 .model_id = SPANSION_S25FL128,
16074 .total_size = 16384,
16075 .page_size = 512,
16076 /* supports 4B addressing */
16077 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16078 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16079 .tested = TEST_UNTESTED,
16080 .probe = probe_spi_rdid,
16081 .probe_timing = TIMING_ZERO,
16082 .block_erasers =
16083 {
16084 {
16085 .eraseblocks = { {256 * 1024, 64} },
16086 .block_erase = spi_block_erase_d8,
16087 }, {
16088 .eraseblocks = { { 16384 * 1024, 1} },
16089 .block_erase = spi_block_erase_60,
16090 }, {
16091 .eraseblocks = { { 16384 * 1024, 1} },
16092 .block_erase = spi_block_erase_c7,
16093 }
16094 },
16095 .printlock = spi_prettyprint_status_register_bp2_srwd,
16096 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16097 .write = spi_chip_write_256, /* Multi I/O supported */
16098 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16099 .voltage = {2700, 3600},
16100 },
16101
16102 {
16103 .vendor = "Spansion",
16104 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16105 .bustype = BUS_SPI,
16106 .manufacture_id = SPANSION_ID,
16107 .model_id = SPANSION_S25FL128,
16108 .total_size = 16384,
16109 .page_size = 256,
16110 /* supports 4B addressing */
16111 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16112 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16113 .tested = TEST_OK_PREW,
16114 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
16115 .probe = probe_spi_rdid,
16116 .probe_timing = TIMING_ZERO,
16117 .block_erasers =
16118 {
16119 {
16120 /* This chip supports erasing of 32 so-called "parameter sectors" with
16121 * opcode 0x20 which may be configured to be on top or bottom of the address
16122 * space. Trying to access an address outside these 4kB blocks does have no
16123 * effect on the memory contents, e.g.
16124 .eraseblocks = {
16125 {4 * 1024, 32},
16126 {64 * 1024, 254} // inaccessible
16127 },
16128 .block_erase = spi_block_erase_20,
16129 }, { */
16130 .eraseblocks = { { 64 * 1024, 256} },
16131 .block_erase = spi_block_erase_d8,
16132 }, {
16133 .eraseblocks = { { 16384 * 1024, 1} },
16134 .block_erase = spi_block_erase_60,
16135 }, {
16136 .eraseblocks = { { 16384 * 1024, 1} },
16137 .block_erase = spi_block_erase_c7,
16138 }
16139 },
16140 .printlock = spi_prettyprint_status_register_bp2_srwd,
16141 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16142 .write = spi_chip_write_256, /* Multi I/O supported */
16143 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16144 .voltage = {2700, 3600},
16145 },
16146
16147 {
16148 .vendor = "Spansion",
16149 .name = "S25FL128P......0", /* uniform 64 kB sectors */
16150 .bustype = BUS_SPI,
16151 .manufacture_id = SPANSION_ID,
16152 .model_id = SPANSION_S25FL128,
16153 .total_size = 16384,
16154 .page_size = 256,
16155 .feature_bits = FEATURE_WRSR_WREN,
16156 .tested = TEST_OK_PREW,
16157 .probe = probe_spi_rdid,
16158 .probe_timing = TIMING_ZERO,
16159 .block_erasers =
16160 {
16161 {
16162 .eraseblocks = { {64 * 1024, 256} },
16163 .block_erase = spi_block_erase_20,
16164 }, {
16165 .eraseblocks = { {64 * 1024, 256} },
16166 .block_erase = spi_block_erase_d8,
16167 }, {
16168 .eraseblocks = { { 16384 * 1024, 1} },
16169 .block_erase = spi_block_erase_60,
16170 }, {
16171 .eraseblocks = { { 16384 * 1024, 1} },
16172 .block_erase = spi_block_erase_c7,
16173 }
16174 },
16175 .printlock = spi_prettyprint_status_register_bp3_srwd,
16176 .unlock = spi_disable_blockprotect_bp3_srwd,
16177 .write = spi_chip_write_256,
16178 .read = spi_chip_read, /* Fast read (0x0B) supported */
16179 .voltage = {2700, 3600},
16180 },
16181
16182 {
16183 .vendor = "Spansion",
16184 .name = "S25FL128P......1", /* uniform 256kB sectors */
16185 .bustype = BUS_SPI,
16186 .manufacture_id = SPANSION_ID,
16187 .model_id = SPANSION_S25FL128,
16188 .total_size = 16384,
16189 .page_size = 256,
16190 .feature_bits = FEATURE_WRSR_WREN,
16191 .tested = TEST_UNTESTED,
16192 .probe = probe_spi_rdid,
16193 .probe_timing = TIMING_ZERO,
16194 .block_erasers =
16195 {
16196 {
16197 .eraseblocks = { {256 * 1024, 64} },
16198 .block_erase = spi_block_erase_d8,
16199 }, {
16200 .eraseblocks = { { 16384 * 1024, 1} },
16201 .block_erase = spi_block_erase_c7,
16202 }
16203 },
16204 .printlock = spi_prettyprint_status_register_bp2_srwd,
16205 .unlock = spi_disable_blockprotect_bp2_srwd,
16206 .write = spi_chip_write_256,
16207 .read = spi_chip_read, /* Fast read (0x0B) supported */
16208 .voltage = {2700, 3600},
16209 },
16210
16211 {
16212 .vendor = "Spansion",
16213 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16214 .bustype = BUS_SPI,
16215 .manufacture_id = SPANSION_ID,
16216 .model_id = SPANSION_S25FL128,
16217 .total_size = 16384,
16218 .page_size = 256,
16219 /* supports 4B addressing */
16220 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16221 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16222 .tested = TEST_OK_PREW,
16223 .probe = probe_spi_rdid,
16224 .probe_timing = TIMING_ZERO,
16225 .block_erasers =
16226 {
16227 {
16228 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16229 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16230 * have no effect on the memory contents, but sets a flag in the SR.
16231 .eraseblocks = {
16232 {4 * 1024, 32},
16233 {64 * 1024, 254} // inaccessible
16234 },
16235 .block_erase = spi_block_erase_20,
16236 }, { */
16237 .eraseblocks = { { 64 * 1024, 256} },
16238 .block_erase = spi_block_erase_d8,
16239 }, {
16240 .eraseblocks = { { 16384 * 1024, 1} },
16241 .block_erase = spi_block_erase_60,
16242 }, {
16243 .eraseblocks = { { 16384 * 1024, 1} },
16244 .block_erase = spi_block_erase_c7,
16245 }
16246 },
16247 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16248 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16249 .write = spi_chip_write_256, /* Multi I/O supported */
16250 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16251 .voltage = {2700, 3600},
16252 },
16253
16254 {
16255 .vendor = "Spansion",
16256 .name = "S25FL128S......1", /* uniform 256 kB sectors */
16257 .bustype = BUS_SPI,
16258 .manufacture_id = SPANSION_ID,
16259 .model_id = SPANSION_S25FL128,
16260 .total_size = 16384,
16261 .page_size = 512,
16262 /* supports 4B addressing */
16263 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16264 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16265 .tested = TEST_UNTESTED,
16266 .probe = probe_spi_rdid,
16267 .probe_timing = TIMING_ZERO,
16268 .block_erasers =
16269 {
16270 {
16271 .eraseblocks = { {256 * 1024, 64} },
16272 .block_erase = spi_block_erase_d8,
16273 }, {
16274 .eraseblocks = { { 16384 * 1024, 1} },
16275 .block_erase = spi_block_erase_60,
16276 }, {
16277 .eraseblocks = { { 16384 * 1024, 1} },
16278 .block_erase = spi_block_erase_c7,
16279 }
16280 },
16281 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16282 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16283 .write = spi_chip_write_256, /* Multi I/O supported */
16284 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16285 .voltage = {2700, 3600},
16286 },
16287
16288 {
16289 .vendor = "Spansion",
16290 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16291 .bustype = BUS_SPI,
16292 .manufacture_id = SPANSION_ID,
16293 .model_id = SPANSION_S25FL128,
16294 .total_size = 16384,
16295 .page_size = 256,
16296 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16298 .tested = TEST_OK_PREW,
16299 .probe = probe_spi_rdid,
16300 .probe_timing = TIMING_ZERO,
16301 .block_erasers =
16302 {
16303 {
16304 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
16305 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
16306 * effect on the memory contents, but sets a flag in the SR.
16307 .eraseblocks = {
16308 {4 * 1024, 32},
16309 {64 * 1024, 254} // inaccessible
16310 },
16311 .block_erase = spi_block_erase_20,
16312 }, { */
16313 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
16314 .eraseblocks = {
16315 {8 * 1024, 16},
16316 {64 * 1024, 254} // inaccessible
16317 },
16318 .block_erase = spi_block_erase_40,
16319 }, { */
16320 .eraseblocks = { { 64 * 1024, 256} },
16321 .block_erase = spi_block_erase_d8,
16322 }, {
16323 .eraseblocks = { { 16384 * 1024, 1} },
16324 .block_erase = spi_block_erase_60,
16325 }, {
16326 .eraseblocks = { { 16384 * 1024, 1} },
16327 .block_erase = spi_block_erase_c7,
16328 }
16329 },
16330 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16331 .unlock = spi_disable_blockprotect_bp2_srwd,
16332 .write = spi_chip_write_256, /* Multi I/O supported */
16333 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16334 .voltage = {2700, 3600},
16335 },
16336
16337 {
16338 .vendor = "Spansion",
16339 .name = "S25FL129P......1", /* uniform 256 kB sectors */
16340 .bustype = BUS_SPI,
16341 .manufacture_id = SPANSION_ID,
16342 .model_id = SPANSION_S25FL128,
16343 .total_size = 16384,
16344 .page_size = 256,
16345 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16346 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16347 .tested = TEST_UNTESTED,
16348 .probe = probe_spi_rdid,
16349 .probe_timing = TIMING_ZERO,
16350 .block_erasers =
16351 {
16352 {
16353 .eraseblocks = { {256 * 1024, 64} },
16354 .block_erase = spi_block_erase_d8,
16355 }, {
16356 .eraseblocks = { { 16384 * 1024, 1} },
16357 .block_erase = spi_block_erase_60,
16358 }, {
16359 .eraseblocks = { { 16384 * 1024, 1} },
16360 .block_erase = spi_block_erase_c7,
16361 }
16362 },
16363 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16364 .unlock = spi_disable_blockprotect_bp2_srwd,
16365 .write = spi_chip_write_256, /* Multi I/O supported */
16366 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16367 .voltage = {2700, 3600},
16368 },
16369
16370 {
16371 .vendor = "Spansion",
16372 .name = "S25FL132K",
16373 .bustype = BUS_SPI,
16374 .manufacture_id = SPANSION_ID,
16375 .model_id = SPANSION_S25FL132K,
16376 .total_size = 4096,
16377 .page_size = 256,
16378 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16380 .tested = TEST_UNTESTED,
16381 .probe = probe_spi_rdid,
16382 .probe_timing = TIMING_ZERO,
16383 .block_erasers =
16384 {
16385 {
16386 .eraseblocks = { {4 * 1024, 1024} },
16387 .block_erase = spi_block_erase_20,
16388 }, {
16389 .eraseblocks = { {64 * 1024, 64} },
16390 .block_erase = spi_block_erase_d8,
16391 }, {
16392 .eraseblocks = { { 4096 * 1024, 1} },
16393 .block_erase = spi_block_erase_60,
16394 }, {
16395 .eraseblocks = { { 4096 * 1024, 1} },
16396 .block_erase = spi_block_erase_c7,
16397 }
16398 },
16399 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16400 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16401 .write = spi_chip_write_256,
16402 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16403 .voltage = {2700, 3600},
16404 },
16405
16406 {
16407 .vendor = "Spansion",
16408 .name = "S25FL164K",
16409 .bustype = BUS_SPI,
16410 .manufacture_id = SPANSION_ID,
16411 .model_id = SPANSION_S25FL164K,
16412 .total_size = 8192,
16413 .page_size = 256,
16414 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16416 .tested = TEST_OK_PREW,
16417 .probe = probe_spi_rdid,
16418 .probe_timing = TIMING_ZERO,
16419 .block_erasers =
16420 {
16421 {
16422 .eraseblocks = { {4 * 1024, 2048} },
16423 .block_erase = spi_block_erase_20,
16424 }, {
16425 .eraseblocks = { {64 * 1024, 128} },
16426 .block_erase = spi_block_erase_d8,
16427 }, {
16428 .eraseblocks = { { 8192 * 1024, 1} },
16429 .block_erase = spi_block_erase_60,
16430 }, {
16431 .eraseblocks = { { 8192 * 1024, 1} },
16432 .block_erase = spi_block_erase_c7,
16433 }
16434 },
16435 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16436 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16437 .write = spi_chip_write_256,
16438 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16439 .voltage = {2700, 3600},
16440 },
16441
16442 {
16443 .vendor = "Spansion",
16444 .name = "S25FL204K",
16445 .bustype = BUS_SPI,
16446 .manufacture_id = SPANSION_ID,
16447 .model_id = SPANSION_S25FL204,
16448 .total_size = 512,
16449 .page_size = 256,
16450 .feature_bits = FEATURE_WRSR_WREN,
16451 .tested = TEST_OK_PR,
16452 .probe = probe_spi_rdid,
16453 .probe_timing = TIMING_ZERO,
16454 .block_erasers =
16455 {
16456 {
16457 .eraseblocks = { {4 * 1024, 128} },
16458 .block_erase = spi_block_erase_20,
16459 }, {
16460 .eraseblocks = { {64 * 1024, 8} },
16461 .block_erase = spi_block_erase_d8,
16462 }, {
16463 .eraseblocks = { { 512 * 1024, 1} },
16464 .block_erase = spi_block_erase_60,
16465 }, {
16466 .eraseblocks = { { 512 * 1024, 1} },
16467 .block_erase = spi_block_erase_c7,
16468 }
16469 },
16470 .printlock = spi_prettyprint_status_register_bp3_srwd,
16471 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16472 .write = spi_chip_write_256,
16473 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16474 .voltage = {2700, 3600},
16475 },
16476
16477 {
16478 .vendor = "Spansion",
16479 .name = "S25FL208K",
16480 .bustype = BUS_SPI,
16481 .manufacture_id = SPANSION_ID,
16482 .model_id = SPANSION_S25FL208,
16483 .total_size = 1024,
16484 .page_size = 256,
16485 .feature_bits = FEATURE_WRSR_WREN,
16486 .tested = TEST_OK_PREW,
16487 .probe = probe_spi_rdid,
16488 .probe_timing = TIMING_ZERO,
16489 .block_erasers =
16490 {
16491 {
16492 .eraseblocks = { {4 * 1024, 256} },
16493 .block_erase = spi_block_erase_20,
16494 }, {
16495 .eraseblocks = { {64 * 1024, 16} },
16496 .block_erase = spi_block_erase_d8,
16497 }, {
16498 .eraseblocks = { { 1024 * 1024, 1} },
16499 .block_erase = spi_block_erase_60,
16500 }, {
16501 .eraseblocks = { { 1024 * 1024, 1} },
16502 .block_erase = spi_block_erase_c7,
16503 }
16504 },
16505 .printlock = spi_prettyprint_status_register_bp3_srwd,
16506 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16507 .write = spi_chip_write_256,
16508 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16509 .voltage = {2700, 3600},
16510 },
16511
16512 {
16513 .vendor = "Spansion",
16514 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16515 .bustype = BUS_SPI,
16516 .manufacture_id = SPANSION_ID,
16517 .model_id = SPANSION_S25FL256,
16518 .total_size = 32768,
16519 .page_size = 256,
16520 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16521 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
16522 .tested = TEST_OK_PREW,
16523 .probe = probe_spi_rdid,
16524 .probe_timing = TIMING_ZERO,
16525 .block_erasers =
16526 {
16527 {
16528 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16529 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16530 * have no effect on the memory contents, but sets a flag in the SR.
16531 .eraseblocks = {
16532 {4 * 1024, 32},
16533 {64 * 1024, 254} // inaccessible
16534 },
16535 .block_erase = spi_block_erase_20,
16536 }, { */
16537 .eraseblocks = { { 64 * 1024, 512} },
16538 .block_erase = spi_block_erase_dc,
16539 }, {
16540 .eraseblocks = { { 64 * 1024, 512} },
16541 .block_erase = spi_block_erase_d8,
16542 }, {
16543 .eraseblocks = { { 32768 * 1024, 1} },
16544 .block_erase = spi_block_erase_60,
16545 }, {
16546 .eraseblocks = { { 32768 * 1024, 1} },
16547 .block_erase = spi_block_erase_c7,
16548 }
16549 },
16550 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16551 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16552 .write = spi_chip_write_256, /* Multi I/O supported */
16553 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16554 .voltage = {2700, 3600},
16555 .wrea_override = 0x17,
16556 },
16557
16558 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010016559 .vendor = "Spansion",
16560 .name = "S25FL512S",
16561 .bustype = BUS_SPI,
16562 .manufacture_id = SPANSION_ID,
16563 .model_id = SPANSION_S25FL512,
16564 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
16565 .page_size = 256,
16566 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16567 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE,
16568 .tested = TEST_OK_PREW,
16569 .probe = probe_spi_rdid,
16570 .probe_timing = TIMING_ZERO,
16571 .block_erasers =
16572 {
16573 {
16574 .eraseblocks = { { 256 * 1024, 256} },
16575 .block_erase = spi_block_erase_dc,
16576 }, {
16577 .eraseblocks = { { 65536 * 1024, 1} },
16578 .block_erase = spi_block_erase_60,
16579 }, {
16580 .eraseblocks = { { 65536 * 1024, 1} },
16581 .block_erase = spi_block_erase_c7,
16582 }
16583 },
16584 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16585 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16586 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
16587 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16588 .voltage = {2700, 3600},
16589 },
16590
16591 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016592 .vendor = "SyncMOS/MoselVitelic",
16593 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016594 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016595 .manufacture_id = SYNCMOS_MVC_ID,
16596 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016597 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016598 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000016599 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016600 .tested = TEST_UNTESTED,
16601 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016602 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016603 .block_erasers =
16604 {
16605 {
16606 .eraseblocks = { {512, 256} },
16607 .block_erase = erase_sector_jedec,
16608 }, {
16609 .eraseblocks = { {128 * 1024, 1} },
16610 .block_erase = erase_chip_block_jedec,
16611 },
16612 },
Sean Nelson35727f72010-01-28 23:55:12 +000016613 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016614 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016615 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016616 },
16617
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016618 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016619 .vendor = "SyncMOS/MoselVitelic",
16620 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016621 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016622 .manufacture_id = SYNCMOS_MVC_ID,
16623 .model_id = SM_MVC_29C51001T,
16624 .total_size = 128,
16625 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000016626 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016627 .tested = TEST_UNTESTED,
16628 .probe = probe_jedec,
16629 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16630 .block_erasers =
16631 {
16632 {
16633 .eraseblocks = { {512, 256} },
16634 .block_erase = erase_sector_jedec,
16635 }, {
16636 .eraseblocks = { {128 * 1024, 1} },
16637 .block_erase = erase_chip_block_jedec,
16638 },
16639 },
16640 .write = write_jedec_1,
16641 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016642 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016643 },
16644
16645 {
16646 .vendor = "SyncMOS/MoselVitelic",
16647 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016648 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016649 .manufacture_id = SYNCMOS_MVC_ID,
16650 .model_id = SM_MVC_29C51002B,
16651 .total_size = 256,
16652 .page_size = 512,
16653 .feature_bits = FEATURE_EITHER_RESET,
16654 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016655 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016656 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016657 .block_erasers =
16658 {
16659 {
16660 .eraseblocks = { {512, 512} },
16661 .block_erase = erase_sector_jedec,
16662 }, {
16663 .eraseblocks = { {256 * 1024, 1} },
16664 .block_erase = erase_chip_block_jedec,
16665 },
16666 },
Sean Nelson35727f72010-01-28 23:55:12 +000016667 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016668 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000016669 },
16670
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016671 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016672 .vendor = "SyncMOS/MoselVitelic",
16673 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016674 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016675 .manufacture_id = SYNCMOS_MVC_ID,
16676 .model_id = SM_MVC_29C51002T,
16677 .total_size = 256,
16678 .page_size = 512,
16679 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016680 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016681 .probe = probe_jedec,
16682 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16683 .block_erasers =
16684 {
16685 {
16686 .eraseblocks = { {512, 512} },
16687 .block_erase = erase_sector_jedec,
16688 }, {
16689 .eraseblocks = { {256 * 1024, 1} },
16690 .block_erase = erase_chip_block_jedec,
16691 },
16692 },
16693 .write = write_jedec_1,
16694 .read = read_memmapped,
16695 },
16696
16697 {
16698 .vendor = "SyncMOS/MoselVitelic",
16699 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016700 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016701 .manufacture_id = SYNCMOS_MVC_ID,
16702 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016703 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016704 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016705 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016706 .tested = TEST_UNTESTED,
16707 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016708 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000016709 .block_erasers =
16710 {
16711 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016712 .eraseblocks = { {1024, 512} },
16713 .block_erase = erase_sector_jedec,
16714 }, {
16715 .eraseblocks = { {512 * 1024, 1} },
16716 .block_erase = erase_chip_block_jedec,
16717 },
16718 },
16719 .write = write_jedec_1,
16720 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016721 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016722 },
16723
16724 {
16725 .vendor = "SyncMOS/MoselVitelic",
16726 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016727 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016728 .manufacture_id = SYNCMOS_MVC_ID,
16729 .model_id = SM_MVC_29C51004T,
16730 .total_size = 512,
16731 .page_size = 1024,
16732 .feature_bits = FEATURE_EITHER_RESET,
16733 .tested = TEST_UNTESTED,
16734 .probe = probe_jedec,
16735 .probe_timing = TIMING_ZERO,
16736 .block_erasers =
16737 {
16738 {
16739 .eraseblocks = { {1024, 512} },
16740 .block_erase = erase_sector_jedec,
16741 }, {
16742 .eraseblocks = { {512 * 1024, 1} },
16743 .block_erase = erase_chip_block_jedec,
16744 },
16745 },
16746 .write = write_jedec_1,
16747 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016748 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016749 },
16750
16751 {
16752 .vendor = "SyncMOS/MoselVitelic",
16753 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016754 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016755 .manufacture_id = SYNCMOS_MVC_ID,
16756 .model_id = SM_MVC_29C31004B,
16757 .total_size = 512,
16758 .page_size = 1024,
16759 .feature_bits = FEATURE_EITHER_RESET,
16760 .tested = TEST_UNTESTED,
16761 .probe = probe_jedec,
16762 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16763 .block_erasers =
16764 {
16765 {
16766 .eraseblocks = { {1024, 512} },
16767 .block_erase = erase_sector_jedec,
16768 }, {
16769 .eraseblocks = { {512 * 1024, 1} },
16770 .block_erase = erase_chip_block_jedec,
16771 },
16772 },
16773 .write = write_jedec_1,
16774 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016775 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016776 },
16777
16778 {
16779 .vendor = "SyncMOS/MoselVitelic",
16780 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016781 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016782 .manufacture_id = SYNCMOS_MVC_ID,
16783 .model_id = SM_MVC_29C31004T,
16784 .total_size = 512,
16785 .page_size = 1024,
16786 .feature_bits = FEATURE_EITHER_RESET,
16787 .tested = TEST_UNTESTED,
16788 .probe = probe_jedec,
16789 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16790 .block_erasers =
16791 {
16792 {
16793 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016794 .block_erase = erase_sector_jedec,
16795 }, {
16796 .eraseblocks = { {512 * 1024, 1} },
16797 .block_erase = erase_chip_block_jedec,
16798 },
16799 },
Sean Nelson35727f72010-01-28 23:55:12 +000016800 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016801 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016802 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016803 },
16804
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016805 {
Uwe Hermanna106d152009-05-27 23:17:40 +000016806 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016807 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016808 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016809 .manufacture_id = TI_OLD_ID,
16810 .model_id = TI_TMS29F002RB,
16811 .total_size = 256,
16812 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000016813 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016814 .tested = TEST_UNTESTED,
16815 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016816 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016817 .block_erasers =
16818 {
16819 {
16820 .eraseblocks = {
16821 {16 * 1024, 1},
16822 {8 * 1024, 2},
16823 {32 * 1024, 1},
16824 {64 * 1024, 3},
16825 },
16826 .block_erase = erase_sector_jedec,
16827 }, {
16828 .eraseblocks = { {256 * 1024, 1} },
16829 .block_erase = erase_chip_block_jedec,
16830 },
16831 },
Sean Nelson35727f72010-01-28 23:55:12 +000016832 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016833 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016834 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016835 },
16836
16837 {
Uwe Hermanna106d152009-05-27 23:17:40 +000016838 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016839 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016840 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016841 .manufacture_id = TI_OLD_ID,
16842 .model_id = TI_TMS29F002RT,
16843 .total_size = 256,
16844 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000016845 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016846 .tested = TEST_UNTESTED,
16847 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016848 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016849 .block_erasers =
16850 {
16851 {
16852 .eraseblocks = {
16853 {64 * 1024, 3},
16854 {32 * 1024, 1},
16855 {8 * 1024, 2},
16856 {16 * 1024, 1},
16857 },
16858 .block_erase = erase_sector_jedec,
16859 }, {
16860 .eraseblocks = { {256 * 1024, 1} },
16861 .block_erase = erase_chip_block_jedec,
16862 },
16863 },
Sean Nelson35727f72010-01-28 23:55:12 +000016864 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016865 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016866 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016867 },
16868
16869 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016870 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016871 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016872 .bustype = BUS_SPI,
16873 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016874 .model_id = WINBOND_NEX_W25P16,
16875 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016876 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016877 .feature_bits = FEATURE_WRSR_WREN,
16878 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016879 .probe = probe_spi_rdid,
16880 .probe_timing = TIMING_ZERO,
16881 .block_erasers =
16882 {
16883 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016884 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016885 .block_erase = spi_block_erase_d8,
16886 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016887 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016888 .block_erase = spi_block_erase_c7,
16889 }
16890 },
16891 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16892 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016893 .write = spi_chip_write_256,
16894 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016895 .voltage = {2700, 3600},
16896 },
16897
16898 {
16899 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016900 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016901 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000016902 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016903 .model_id = WINBOND_NEX_W25P32,
16904 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000016905 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016906 .feature_bits = FEATURE_WRSR_WREN,
16907 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000016908 .probe = probe_spi_rdid,
16909 .probe_timing = TIMING_ZERO,
16910 .block_erasers =
16911 {
16912 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016913 .eraseblocks = { {64 * 1024, 64} },
16914 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000016915 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016916 .eraseblocks = { {4096 * 1024, 1} },
16917 .block_erase = spi_block_erase_c7,
16918 }
16919 },
16920 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16921 .unlock = spi_disable_blockprotect,
16922 .write = spi_chip_write_256,
16923 .read = spi_chip_read, /* Fast read (0x0B) supported */
16924 .voltage = {2700, 3600},
16925 },
16926
16927 {
16928 .vendor = "Winbond",
16929 .name = "W25P80",
16930 .bustype = BUS_SPI,
16931 .manufacture_id = WINBOND_NEX_ID,
16932 .model_id = WINBOND_NEX_W25P80,
16933 .total_size = 1024,
16934 .page_size = 256,
16935 .feature_bits = FEATURE_WRSR_WREN,
16936 .tested = TEST_UNTESTED,
16937 .probe = probe_spi_rdid,
16938 .probe_timing = TIMING_ZERO,
16939 .block_erasers =
16940 {
16941 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000016942 .eraseblocks = { {64 * 1024, 16} },
16943 .block_erase = spi_block_erase_d8,
16944 }, {
16945 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000016946 .block_erase = spi_block_erase_c7,
16947 }
16948 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016949 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000016950 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000016951 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016952 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016953 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000016954 },
16955
16956 {
16957 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016958 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016959 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000016960 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016961 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000016962 .total_size = 16384,
16963 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016964 /* supports SFDP */
16965 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020016966 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Stefan Tauner0554ca52013-07-25 22:54:25 +000016967 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000016968 .probe = probe_spi_rdid,
16969 .probe_timing = TIMING_ZERO,
16970 .block_erasers =
16971 {
16972 {
16973 .eraseblocks = { {4 * 1024, 4096} },
16974 .block_erase = spi_block_erase_20,
16975 }, {
16976 .eraseblocks = { {32 * 1024, 512} },
16977 .block_erase = spi_block_erase_52,
16978 }, {
16979 .eraseblocks = { {64 * 1024, 256} },
16980 .block_erase = spi_block_erase_d8,
16981 }, {
16982 .eraseblocks = { {16 * 1024 * 1024, 1} },
16983 .block_erase = spi_block_erase_60,
16984 }, {
16985 .eraseblocks = { {16 * 1024 * 1024, 1} },
16986 .block_erase = spi_block_erase_c7,
16987 }
16988 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000016989 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000016990 .unlock = spi_disable_blockprotect,
16991 .write = spi_chip_write_256,
16992 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000016993 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020016994 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
16995 .reg_bits =
16996 {
16997 .srp = {STATUS1, 7, RW},
16998 .srl = {STATUS2, 0, RW},
16999 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17000 .tb = {STATUS1, 5, RW},
17001 .sec = {STATUS1, 6, RW},
17002 .cmp = {STATUS2, 6, RW},
17003 .wps = {STATUS3, 2, RW},
17004 },
17005 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017006 },
17007
17008 {
17009 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020017010 .name = "W25Q128.V..M",
17011 .bustype = BUS_SPI,
17012 .manufacture_id = WINBOND_NEX_ID,
17013 .model_id = WINBOND_NEX_W25Q128_V_M,
17014 .total_size = 16384,
17015 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017016 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Patrick Rudolph34323492018-10-04 14:59:40 +020017017 .tested = TEST_OK_PREW,
17018 .probe = probe_spi_rdid,
17019 .probe_timing = TIMING_ZERO,
17020 .block_erasers =
17021 {
17022 {
17023 .eraseblocks = { {4 * 1024, 4096} },
17024 .block_erase = spi_block_erase_20,
17025 }, {
17026 .eraseblocks = { {32 * 1024, 512} },
17027 .block_erase = spi_block_erase_52,
17028 }, {
17029 .eraseblocks = { {64 * 1024, 256} },
17030 .block_erase = spi_block_erase_d8,
17031 }, {
17032 .eraseblocks = { {16 * 1024 * 1024, 1} },
17033 .block_erase = spi_block_erase_60,
17034 }, {
17035 .eraseblocks = { {16 * 1024 * 1024, 1} },
17036 .block_erase = spi_block_erase_c7,
17037 }
17038 },
Alan Greena1fc01d2019-09-23 17:12:44 +100017039 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020017040 .unlock = spi_disable_blockprotect,
17041 .write = spi_chip_write_256,
17042 .read = spi_chip_read,
17043 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017044 .reg_bits =
17045 {
17046 .srp = {STATUS1, 7, RW},
17047 .srl = {STATUS2, 0, RW},
17048 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17049 .tb = {STATUS1, 5, RW},
17050 .sec = {STATUS1, 6, RW},
17051 .cmp = {STATUS2, 6, RW},
17052 },
17053 .decode_range = decode_range_spi25,
Patrick Rudolph34323492018-10-04 14:59:40 +020017054 },
17055
17056 {
17057 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017058 .name = "W25Q128.W",
17059 .bustype = BUS_SPI,
17060 .manufacture_id = WINBOND_NEX_ID,
17061 .model_id = WINBOND_NEX_W25Q128_W,
17062 .total_size = 16384,
17063 .page_size = 256,
17064 /* supports SFDP */
17065 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017067 .tested = TEST_OK_PREW,
17068 .probe = probe_spi_rdid,
17069 .probe_timing = TIMING_ZERO,
17070 .block_erasers =
17071 {
17072 {
17073 .eraseblocks = { {4 * 1024, 4096} },
17074 .block_erase = spi_block_erase_20,
17075 }, {
17076 .eraseblocks = { {32 * 1024, 512} },
17077 .block_erase = spi_block_erase_52,
17078 }, {
17079 .eraseblocks = { {64 * 1024, 256} },
17080 .block_erase = spi_block_erase_d8,
17081 }, {
17082 .eraseblocks = { {16 * 1024 * 1024, 1} },
17083 .block_erase = spi_block_erase_60,
17084 }, {
17085 .eraseblocks = { {16 * 1024 * 1024, 1} },
17086 .block_erase = spi_block_erase_c7,
17087 }
17088 },
17089 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17090 .unlock = spi_disable_blockprotect,
17091 .write = spi_chip_write_256,
17092 .read = spi_chip_read,
17093 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017094 .reg_bits =
17095 {
17096 .srp = {STATUS1, 7, RW},
17097 .srl = {STATUS2, 0, RW},
17098 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17099 .tb = {STATUS1, 5, RW},
17100 .sec = {STATUS1, 6, RW},
17101 .cmp = {STATUS2, 6, RW},
17102 },
17103 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017104 },
17105
17106 {
17107 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080017108 .name = "W25Q128.JW.DTR",
17109 .bustype = BUS_SPI,
17110 .manufacture_id = WINBOND_NEX_ID,
17111 .model_id = WINBOND_NEX_W25Q128_DTR,
17112 .total_size = 16384,
17113 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017114 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Peichao Wang1a119492019-11-11 15:26:41 +080017115 .tested = TEST_OK_PREW,
17116 .probe = probe_spi_rdid,
17117 .probe_timing = TIMING_ZERO,
17118 .block_erasers =
17119 {
17120 {
17121 .eraseblocks = { {4 * 1024, 4096} },
17122 .block_erase = spi_block_erase_20,
17123 }, {
17124 .eraseblocks = { {32 * 1024, 512} },
17125 .block_erase = spi_block_erase_52,
17126 }, {
17127 .eraseblocks = { {64 * 1024, 256} },
17128 .block_erase = spi_block_erase_d8,
17129 }, {
17130 .eraseblocks = { {16 * 1024 * 1024, 1} },
17131 .block_erase = spi_block_erase_60,
17132 }, {
17133 .eraseblocks = { {16 * 1024 * 1024, 1} },
17134 .block_erase = spi_block_erase_c7,
17135 }
17136 },
17137 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17138 .unlock = spi_disable_blockprotect,
17139 .write = spi_chip_write_256,
17140 .read = spi_chip_read,
17141 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017142 .reg_bits =
17143 {
17144 .srp = {STATUS1, 7, RW},
17145 .srl = {STATUS2, 0, RW},
17146 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17147 .tb = {STATUS1, 5, RW},
17148 .sec = {STATUS1, 6, RW},
17149 .cmp = {STATUS2, 6, RW},
17150 },
17151 .decode_range = decode_range_spi25,
Peichao Wang1a119492019-11-11 15:26:41 +080017152 },
17153
17154 {
17155 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017156 .name = "W25Q16.V",
17157 .bustype = BUS_SPI,
17158 .manufacture_id = WINBOND_NEX_ID,
17159 .model_id = WINBOND_NEX_W25Q16_V,
17160 .total_size = 2048,
17161 .page_size = 256,
17162 /* supports SFDP */
17163 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17164 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17165 .tested = TEST_OK_PREW,
17166 .probe = probe_spi_rdid,
17167 .probe_timing = TIMING_ZERO,
17168 .block_erasers =
17169 {
17170 {
17171 .eraseblocks = { {4 * 1024, 512} },
17172 .block_erase = spi_block_erase_20,
17173 }, {
17174 .eraseblocks = { {32 * 1024, 64} },
17175 .block_erase = spi_block_erase_52,
17176 }, {
17177 .eraseblocks = { {64 * 1024, 32} },
17178 .block_erase = spi_block_erase_d8,
17179 }, {
17180 .eraseblocks = { {2 * 1024 * 1024, 1} },
17181 .block_erase = spi_block_erase_60,
17182 }, {
17183 .eraseblocks = { {2 * 1024 * 1024, 1} },
17184 .block_erase = spi_block_erase_c7,
17185 }
17186 },
17187 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17188 .unlock = spi_disable_blockprotect,
17189 .write = spi_chip_write_256,
17190 .read = spi_chip_read,
17191 .voltage = {2700, 3600},
17192 },
17193
17194 {
17195 .vendor = "Winbond",
17196 .name = "W25Q16.W",
17197 .bustype = BUS_SPI,
17198 .manufacture_id = WINBOND_NEX_ID,
17199 .model_id = WINBOND_NEX_W25Q16_W,
17200 .total_size = 2048,
17201 .page_size = 256,
17202 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17203 /* QPI enable 0x38, disable 0xFF */
17204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17205 .tested = TEST_UNTESTED,
17206 .probe = probe_spi_rdid,
17207 .probe_timing = TIMING_ZERO,
17208 .block_erasers =
17209 {
17210 {
17211 .eraseblocks = { {4 * 1024, 512} },
17212 .block_erase = spi_block_erase_20,
17213 }, {
17214 .eraseblocks = { {32 * 1024, 64} },
17215 .block_erase = spi_block_erase_52,
17216 }, {
17217 .eraseblocks = { {64 * 1024, 32} },
17218 .block_erase = spi_block_erase_d8,
17219 }, {
17220 .eraseblocks = { {2 * 1024 * 1024, 1} },
17221 .block_erase = spi_block_erase_60,
17222 }, {
17223 .eraseblocks = { {2 * 1024 * 1024, 1} },
17224 .block_erase = spi_block_erase_c7,
17225 }
17226 },
17227 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17228 .unlock = spi_disable_blockprotect,
17229 .write = spi_chip_write_256,
17230 .read = spi_chip_read,
17231 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17232 },
17233
17234 {
17235 .vendor = "Winbond",
17236 .name = "W25Q20.W",
17237 .bustype = BUS_SPI,
17238 .manufacture_id = WINBOND_NEX_ID,
17239 .model_id = WINBOND_NEX_W25Q20_W,
17240 .total_size = 256,
17241 .page_size = 256,
17242 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17244 .tested = TEST_UNTESTED,
17245 .probe = probe_spi_rdid,
17246 .probe_timing = TIMING_ZERO,
17247 .block_erasers =
17248 {
17249 {
17250 .eraseblocks = { {4 * 1024, 64} },
17251 .block_erase = spi_block_erase_20,
17252 }, {
17253 .eraseblocks = { {32 * 1024, 8} },
17254 .block_erase = spi_block_erase_52,
17255 }, {
17256 .eraseblocks = { {64 * 1024, 4} },
17257 .block_erase = spi_block_erase_d8,
17258 }, {
17259 .eraseblocks = { {256 * 1024, 1} },
17260 .block_erase = spi_block_erase_60,
17261 }, {
17262 .eraseblocks = { {256 * 1024, 1} },
17263 .block_erase = spi_block_erase_c7,
17264 }
17265 },
17266 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17267 .unlock = spi_disable_blockprotect,
17268 .write = spi_chip_write_256,
17269 .read = spi_chip_read,
17270 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17271 },
17272
17273 {
17274 .vendor = "Winbond",
Boris Baykovaa6c3742016-06-11 18:29:01 +020017275 .name = "W25Q256.V",
17276 .bustype = BUS_SPI,
17277 .manufacture_id = WINBOND_NEX_ID,
17278 .model_id = WINBOND_NEX_W25Q256_V,
17279 .total_size = 32768,
17280 .page_size = 256,
17281 /* supports SFDP */
17282 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17283 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017284 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN |
17285 FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
17286 FEATURE_WRSR2,
Angel Pons3130cbd2018-09-30 19:32:30 +020017287 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017288 .probe = probe_spi_rdid,
17289 .probe_timing = TIMING_ZERO,
17290 .block_erasers =
17291 {
17292 {
17293 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020017294 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017295 }, {
17296 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020017297 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017298 }, {
17299 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020017300 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017301 }, {
17302 .eraseblocks = { {32 * 1024 * 1024, 1} },
17303 .block_erase = spi_block_erase_60,
17304 }, {
17305 .eraseblocks = { {32 * 1024 * 1024, 1} },
17306 .block_erase = spi_block_erase_c7,
17307 }
17308 },
17309 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17310 .unlock = spi_disable_blockprotect,
17311 .write = spi_chip_write_256,
17312 .read = spi_chip_read,
17313 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017314 .reg_bits =
17315 {
17316 .srp = {STATUS1, 7, RW},
17317 .srl = {STATUS2, 0, RW},
17318 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17319 .tb = {STATUS1, 6, RW},
17320 .cmp = {STATUS2, 6, RW},
17321 },
17322 .decode_range = decode_range_spi25,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017323 },
17324
17325 {
17326 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000017327 .name = "W25Q256JV_M",
17328 .bustype = BUS_SPI,
17329 .manufacture_id = WINBOND_NEX_ID,
17330 .model_id = WINBOND_NEX_W25Q256JV_M,
17331 .total_size = 32768,
17332 .page_size = 256,
17333 /* supports SFDP */
17334 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17335 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2,
David Hendricks49876792018-10-27 20:19:42 +000017337 .tested = TEST_OK_PREW,
17338 .probe = probe_spi_rdid,
17339 .probe_timing = TIMING_ZERO,
17340 .block_erasers =
17341 {
17342 {
17343 .eraseblocks = { {4 * 1024, 8192} },
17344 .block_erase = spi_block_erase_21,
17345 }, {
17346 .eraseblocks = { {4 * 1024, 8192} },
17347 .block_erase = spi_block_erase_20,
17348 }, {
17349 .eraseblocks = { {32 * 1024, 1024} },
17350 .block_erase = spi_block_erase_52,
17351 }, {
17352 .eraseblocks = { {64 * 1024, 512} },
17353 .block_erase = spi_block_erase_dc,
17354 }, {
17355 .eraseblocks = { {64 * 1024, 512} },
17356 .block_erase = spi_block_erase_d8,
17357 }, {
17358 .eraseblocks = { {32 * 1024 * 1024, 1} },
17359 .block_erase = spi_block_erase_60,
17360 }, {
17361 .eraseblocks = { {32 * 1024 * 1024, 1} },
17362 .block_erase = spi_block_erase_c7,
17363 }
17364 },
17365 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17366 .unlock = spi_disable_blockprotect,
17367 .write = spi_chip_write_256,
17368 .read = spi_chip_read,
17369 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017370 .reg_bits =
17371 {
17372 .srp = {STATUS1, 7, RW},
17373 .srl = {STATUS2, 0, RW},
17374 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17375 .tb = {STATUS1, 6, RW},
17376 .cmp = {STATUS2, 6, RW},
17377 },
17378 .decode_range = decode_range_spi25,
David Hendricks49876792018-10-27 20:19:42 +000017379 },
17380
17381 {
17382 .vendor = "Winbond",
el-coderon01209852020-04-29 12:12:53 +020017383 .name = "W25Q256.W",
17384 .bustype = BUS_SPI,
17385 .manufacture_id = WINBOND_NEX_ID,
17386 .model_id = WINBOND_NEX_W25Q256_W,
17387 .total_size = 32768,
17388 .page_size = 256,
17389 /* supports SFDP */
17390 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17391 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
17392 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
17393 .tested = TEST_OK_PREW,
17394 .probe = probe_spi_rdid,
17395 .probe_timing = TIMING_ZERO,
17396 .block_erasers =
17397 {
17398 {
17399 .eraseblocks = { {4 * 1024, 8192} },
17400 .block_erase = spi_block_erase_20,
17401 }, {
17402 .eraseblocks = { {32 * 1024, 1024} },
17403 .block_erase = spi_block_erase_52,
17404 }, {
17405 .eraseblocks = { {64 * 1024, 512} },
17406 .block_erase = spi_block_erase_d8,
17407 }, {
17408 .eraseblocks = { {32 * 1024 * 1024, 1} },
17409 .block_erase = spi_block_erase_60,
17410 }, {
17411 .eraseblocks = { {32 * 1024 * 1024, 1} },
17412 .block_erase = spi_block_erase_c7,
17413 }
17414 },
17415 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17416 .unlock = spi_disable_blockprotect,
17417 .write = spi_chip_write_256,
17418 .read = spi_chip_read,
17419 .voltage = {1650, 1950},
17420 },
17421
17422 {
17423 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070017424 .name = "W25Q256JW_DTR",
17425 .bustype = BUS_SPI,
17426 .manufacture_id = WINBOND_NEX_ID,
17427 .model_id = WINBOND_NEX_W25Q256_DTR,
17428 .total_size = 32768,
17429 .page_size = 256,
17430 /* supports SFDP */
17431 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17432 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
17433 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17434 .tested = TEST_OK_PREW,
17435 .probe = probe_spi_rdid,
17436 .probe_timing = TIMING_ZERO,
17437 .block_erasers =
17438 {
17439 {
17440 .eraseblocks = { {4 * 1024, 8192} },
17441 .block_erase = spi_block_erase_21,
17442 }, {
17443 .eraseblocks = { {4 * 1024, 8192} },
17444 .block_erase = spi_block_erase_20,
17445 }, {
17446 .eraseblocks = { {32 * 1024, 1024} },
17447 .block_erase = spi_block_erase_52,
17448 }, {
17449 .eraseblocks = { {64 * 1024, 512} },
17450 .block_erase = spi_block_erase_dc,
17451 }, {
17452 .eraseblocks = { {64 * 1024, 512} },
17453 .block_erase = spi_block_erase_d8,
17454 }, {
17455 .eraseblocks = { {32 * 1024 * 1024, 1} },
17456 .block_erase = spi_block_erase_60,
17457 }, {
17458 .eraseblocks = { {32 * 1024 * 1024, 1} },
17459 .block_erase = spi_block_erase_c7,
17460 }
17461 },
17462 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17463 .unlock = spi_disable_blockprotect,
17464 .write = spi_chip_write_256,
17465 .read = spi_chip_read,
17466 .voltage = {1700, 1950},
17467 },
17468
17469 {
17470 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017471 .name = "W25Q32.V",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017472 .bustype = BUS_SPI,
17473 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017474 .model_id = WINBOND_NEX_W25Q32_V,
17475 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017476 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017477 /* supports SFDP */
17478 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017479 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017480 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017481 .probe = probe_spi_rdid,
17482 .probe_timing = TIMING_ZERO,
17483 .block_erasers =
17484 {
17485 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017486 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017487 .block_erase = spi_block_erase_20,
17488 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017489 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017490 .block_erase = spi_block_erase_52,
17491 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017492 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017493 .block_erase = spi_block_erase_d8,
17494 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017495 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017496 .block_erase = spi_block_erase_60,
17497 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017498 .eraseblocks = { {4 * 1024 * 1024, 1} },
17499 .block_erase = spi_block_erase_c7,
17500 }
17501 },
17502 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17503 .unlock = spi_disable_blockprotect,
17504 .write = spi_chip_write_256,
17505 .read = spi_chip_read,
17506 .voltage = {2700, 3600},
17507 },
17508
17509 {
17510 .vendor = "Winbond",
17511 .name = "W25Q32.W",
17512 .bustype = BUS_SPI,
17513 .manufacture_id = WINBOND_NEX_ID,
17514 .model_id = WINBOND_NEX_W25Q32_W,
17515 .total_size = 4096,
17516 .page_size = 256,
17517 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17518 /* QPI enable 0x38, disable 0xFF */
17519 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17520 .tested = TEST_OK_PREW,
17521 .probe = probe_spi_rdid,
17522 .probe_timing = TIMING_ZERO,
17523 .block_erasers =
17524 {
17525 {
17526 .eraseblocks = { {4 * 1024, 1024} },
17527 .block_erase = spi_block_erase_20,
17528 }, {
17529 .eraseblocks = { {32 * 1024, 128} },
17530 .block_erase = spi_block_erase_52,
17531 }, {
17532 .eraseblocks = { {64 * 1024, 64} },
17533 .block_erase = spi_block_erase_d8,
17534 }, {
17535 .eraseblocks = { {4 * 1024 * 1024, 1} },
17536 .block_erase = spi_block_erase_60,
17537 }, {
17538 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017539 .block_erase = spi_block_erase_c7,
17540 }
17541 },
17542 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17543 .unlock = spi_disable_blockprotect,
17544 .write = spi_chip_write_256,
17545 .read = spi_chip_read,
17546 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17547 },
17548
17549 {
17550 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100017551 .name = "W25Q32JW...M",
17552 .bustype = BUS_SPI,
17553 .manufacture_id = WINBOND_NEX_ID,
17554 .model_id = WINBOND_NEX_W25Q32JW_M,
17555 .total_size = 4096,
17556 .page_size = 256,
17557 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17558 .tested = TEST_OK_PREW,
17559 .probe = probe_spi_rdid,
17560 .probe_timing = TIMING_ZERO,
17561 .block_erasers =
17562 {
17563 {
17564 .eraseblocks = { {4 * 1024, 1024} },
17565 .block_erase = spi_block_erase_20,
17566 }, {
17567 .eraseblocks = { {32 * 1024, 128} },
17568 .block_erase = spi_block_erase_52,
17569 }, {
17570 .eraseblocks = { {64 * 1024, 64} },
17571 .block_erase = spi_block_erase_d8,
17572 }, {
17573 .eraseblocks = { {4 * 1024 * 1024, 1} },
17574 .block_erase = spi_block_erase_60,
17575 }, {
17576 .eraseblocks = { {4 * 1024 * 1024, 1} },
17577 .block_erase = spi_block_erase_c7,
17578 }
17579 },
17580 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
17581 .unlock = spi_disable_blockprotect_bp2_srwd,
17582 .write = spi_chip_write_256,
17583 .read = spi_chip_read,
17584 .voltage = {1700, 1950},
17585 },
17586
17587 {
17588 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017589 .name = "W25Q40.V",
17590 .bustype = BUS_SPI,
17591 .manufacture_id = WINBOND_NEX_ID,
17592 .model_id = WINBOND_NEX_W25Q40_V,
17593 .total_size = 512,
17594 .page_size = 256,
17595 /* supports SFDP */
17596 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17597 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17598 .tested = TEST_OK_PREW,
17599 .probe = probe_spi_rdid,
17600 .probe_timing = TIMING_ZERO,
17601 .block_erasers =
17602 {
17603 {
17604 .eraseblocks = { {4 * 1024, 128} },
17605 .block_erase = spi_block_erase_20,
17606 }, {
17607 .eraseblocks = { {32 * 1024, 16} },
17608 .block_erase = spi_block_erase_52,
17609 }, {
17610 .eraseblocks = { {64 * 1024, 8} },
17611 .block_erase = spi_block_erase_d8,
17612 }, {
17613 .eraseblocks = { {512 * 1024, 1} },
17614 .block_erase = spi_block_erase_60,
17615 }, {
17616 .eraseblocks = { {512 * 1024, 1} },
17617 .block_erase = spi_block_erase_c7,
17618 }
17619 },
17620 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17621 .unlock = spi_disable_blockprotect,
17622 .write = spi_chip_write_256, /* Multi I/O supported */
17623 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17624 .voltage = {2700, 3600},
17625 },
17626
17627 {
17628 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020017629 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017630 .bustype = BUS_SPI,
17631 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020017632 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017633 .total_size = 512,
17634 .page_size = 256,
17635 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17636 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons3164a0c2018-09-30 20:26:06 +020017637 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017638 .probe = probe_spi_rdid,
17639 .probe_timing = TIMING_ZERO,
17640 .block_erasers =
17641 {
17642 {
17643 .eraseblocks = { {4 * 1024, 128} },
17644 .block_erase = spi_block_erase_20,
17645 }, {
17646 .eraseblocks = { {32 * 1024, 16} },
17647 .block_erase = spi_block_erase_52,
17648 }, {
17649 .eraseblocks = { {64 * 1024, 8} },
17650 .block_erase = spi_block_erase_d8,
17651 }, {
17652 .eraseblocks = { {512 * 1024, 1} },
17653 .block_erase = spi_block_erase_60,
17654 }, {
17655 .eraseblocks = { {512 * 1024, 1} },
17656 .block_erase = spi_block_erase_c7,
17657 }
17658 },
17659 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17660 .unlock = spi_disable_blockprotect,
17661 .write = spi_chip_write_256,
17662 .read = spi_chip_read,
17663 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17664 },
17665
17666 {
17667 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020017668 .name = "W25Q40EW",
17669 .bustype = BUS_SPI,
17670 .manufacture_id = WINBOND_NEX_ID,
17671 .model_id = WINBOND_NEX_W25Q40EW,
17672 .total_size = 512,
17673 .page_size = 256,
17674 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17675 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green07b8a172019-09-23 16:47:05 +100017676 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020017677 .probe = probe_spi_rdid,
17678 .probe_timing = TIMING_ZERO,
17679 .block_erasers =
17680 {
17681 {
17682 .eraseblocks = { {4 * 1024, 128} },
17683 .block_erase = spi_block_erase_20,
17684 }, {
17685 .eraseblocks = { {32 * 1024, 16} },
17686 .block_erase = spi_block_erase_52,
17687 }, {
17688 .eraseblocks = { {64 * 1024, 8} },
17689 .block_erase = spi_block_erase_d8,
17690 }, {
17691 .eraseblocks = { {512 * 1024, 1} },
17692 .block_erase = spi_block_erase_60,
17693 }, {
17694 .eraseblocks = { {512 * 1024, 1} },
17695 .block_erase = spi_block_erase_c7,
17696 }
17697 },
17698 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17699 .unlock = spi_disable_blockprotect,
17700 .write = spi_chip_write_256,
17701 .read = spi_chip_read,
17702 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
17703 },
17704
Stanislav Sedovf5775442018-03-07 14:16:51 -080017705 {
17706 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093017707 .name = "W25Q512JV",
17708 .bustype = BUS_SPI,
17709 .manufacture_id = WINBOND_NEX_ID,
17710 .model_id = WINBOND_NEX_W25Q512JV,
17711 .total_size = 64 * 1024,
17712 .page_size = 256,
17713 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17714 .tested = TEST_OK_PREW,
17715 .probe = probe_spi_rdid,
17716 .probe_timing = TIMING_ZERO,
17717 .block_erasers =
17718 {
17719 {
17720 .eraseblocks = { {4 * 1024, 16384} },
17721 .block_erase = spi_block_erase_21,
17722 }, {
17723 .eraseblocks = { {4 * 1024, 16384} },
17724 .block_erase = spi_block_erase_20,
17725 }, {
17726 .eraseblocks = { {32 * 1024, 2048} },
17727 .block_erase = spi_block_erase_52,
17728 }, {
17729 .eraseblocks = { {64 * 1024, 1024} },
17730 .block_erase = spi_block_erase_dc,
17731 }, {
17732 .eraseblocks = { {64 * 1024, 1024} },
17733 .block_erase = spi_block_erase_d8,
17734 }, {
17735 .eraseblocks = { {64 * 1024 * 1024, 1} },
17736 .block_erase = spi_block_erase_60,
17737 }, {
17738 .eraseblocks = { {64 * 1024 * 1024, 1} },
17739 .block_erase = spi_block_erase_c7,
17740 }
17741 },
17742 .printlock = spi_prettyprint_status_register_plain,
17743 .unlock = spi_disable_blockprotect,
17744 .write = spi_chip_write_256,
17745 .read = spi_chip_read,
17746 .voltage = {2700, 3600},
17747 },
17748
17749 {
17750 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017751 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080017752 .bustype = BUS_SPI,
17753 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017754 .model_id = WINBOND_NEX_W25Q64_V,
17755 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080017756 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017757 /* supports SFDP */
17758 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Stanislav Sedovf5775442018-03-07 14:16:51 -080017760 .tested = TEST_OK_PREW,
17761 .probe = probe_spi_rdid,
17762 .probe_timing = TIMING_ZERO,
17763 .block_erasers =
17764 {
17765 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017766 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017767 .block_erase = spi_block_erase_20,
17768 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017769 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017770 .block_erase = spi_block_erase_52,
17771 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017772 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017773 .block_erase = spi_block_erase_d8,
17774 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017775 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017776 .block_erase = spi_block_erase_60,
17777 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017778 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017779 .block_erase = spi_block_erase_c7,
17780 }
17781 },
17782 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17783 .unlock = spi_disable_blockprotect,
17784 .write = spi_chip_write_256,
17785 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017786 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017787 .reg_bits =
17788 {
17789 .srp = {STATUS1, 7, RW},
17790 .srl = {STATUS2, 0, RW},
17791 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17792 .tb = {STATUS1, 5, RW},
17793 .sec = {STATUS1, 6, RW},
17794 .cmp = {STATUS2, 6, RW},
17795 },
17796 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017797 },
17798
17799 {
17800 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017801 .name = "W25Q64JV-.Q",
17802 .bustype = BUS_SPI,
17803 .manufacture_id = WINBOND_NEX_ID,
17804 .model_id = WINBOND_NEX_W25Q64_V,
17805 .total_size = 8192,
17806 .page_size = 256,
17807 /* supports SFDP */
17808 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17809 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
17810 .tested = TEST_OK_PREW,
17811 .probe = probe_spi_rdid,
17812 .probe_timing = TIMING_ZERO,
17813 .block_erasers =
17814 {
17815 {
17816 .eraseblocks = { {4 * 1024, 2048} },
17817 .block_erase = spi_block_erase_20,
17818 }, {
17819 .eraseblocks = { {32 * 1024, 256} },
17820 .block_erase = spi_block_erase_52,
17821 }, {
17822 .eraseblocks = { {64 * 1024, 128} },
17823 .block_erase = spi_block_erase_d8,
17824 }, {
17825 .eraseblocks = { {8 * 1024 * 1024, 1} },
17826 .block_erase = spi_block_erase_60,
17827 }, {
17828 .eraseblocks = { {8 * 1024 * 1024, 1} },
17829 .block_erase = spi_block_erase_c7,
17830 }
17831 },
17832 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17833 .unlock = spi_disable_blockprotect,
17834 .write = spi_chip_write_256,
17835 .read = spi_chip_read,
17836 .voltage = {2700, 3600},
17837 .reg_bits =
17838 {
17839 .srp = {STATUS1, 7, RW},
17840 .srl = {STATUS2, 0, RW},
17841 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17842 .tb = {STATUS1, 5, RW},
17843 .sec = {STATUS1, 6, RW},
17844 .cmp = {STATUS2, 6, RW},
17845 .wps = {STATUS3, 2, RW},
17846 },
17847 .decode_range = decode_range_spi25,
17848 },
17849
17850 {
17851 .vendor = "Winbond",
17852 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010017853 .bustype = BUS_SPI,
17854 .manufacture_id = WINBOND_NEX_ID,
17855 .model_id = WINBOND_NEX_W25Q64JV,
17856 .total_size = 8192,
17857 .page_size = 256,
17858 /* supports SFDP */
17859 /* QPI enable 0x38 */
17860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17861 .tested = TEST_OK_PREW,
17862 .probe = probe_spi_rdid,
17863 .probe_timing = TIMING_ZERO,
17864 .block_erasers =
17865 {
17866 {
17867 .eraseblocks = { {4 * 1024, 2048} },
17868 .block_erase = spi_block_erase_20,
17869 }, {
17870 .eraseblocks = { {32 * 1024, 256} },
17871 .block_erase = spi_block_erase_52,
17872 }, {
17873 .eraseblocks = { {64 * 1024, 128} },
17874 .block_erase = spi_block_erase_d8,
17875 }, {
17876 .eraseblocks = { {8 * 1024 * 1024, 1} },
17877 .block_erase = spi_block_erase_60,
17878 }, {
17879 .eraseblocks = { {8 * 1024 * 1024, 1} },
17880 .block_erase = spi_block_erase_c7,
17881 }
17882 },
17883 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
17884 .unlock = spi_disable_blockprotect_bp2_srwd,
17885 .write = spi_chip_write_256,
17886 .read = spi_chip_read,
17887 .voltage = {2700, 3600},
17888 },
17889
17890 {
17891 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017892 .name = "W25Q64.W",
17893 .bustype = BUS_SPI,
17894 .manufacture_id = WINBOND_NEX_ID,
17895 .model_id = WINBOND_NEX_W25Q64_W,
17896 .total_size = 8192,
17897 .page_size = 256,
17898 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17899 /* QPI enable 0x38, disable 0xFF */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017900 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Stefan Tauner0554ca52013-07-25 22:54:25 +000017901 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017902 .probe = probe_spi_rdid,
17903 .probe_timing = TIMING_ZERO,
17904 .block_erasers =
17905 {
17906 {
17907 .eraseblocks = { {4 * 1024, 2048} },
17908 .block_erase = spi_block_erase_20,
17909 }, {
17910 .eraseblocks = { {32 * 1024, 256} },
17911 .block_erase = spi_block_erase_52,
17912 }, {
17913 .eraseblocks = { {64 * 1024, 128} },
17914 .block_erase = spi_block_erase_d8,
17915 }, {
17916 .eraseblocks = { {8 * 1024 * 1024, 1} },
17917 .block_erase = spi_block_erase_60,
17918 }, {
17919 .eraseblocks = { {8 * 1024 * 1024, 1} },
17920 .block_erase = spi_block_erase_c7,
17921 }
17922 },
17923 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17924 .unlock = spi_disable_blockprotect,
17925 .write = spi_chip_write_256,
17926 .read = spi_chip_read,
17927 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017928 .reg_bits =
17929 {
17930 .srp = {STATUS1, 7, RW},
17931 .srl = {STATUS2, 0, RW},
17932 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17933 .tb = {STATUS1, 5, RW},
17934 .sec = {STATUS1, 6, RW},
17935 .cmp = {STATUS2, 6, RW},
17936 },
17937 .decode_range = decode_range_spi25,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017938 },
17939
17940 {
17941 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100017942 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080017943 .bustype = BUS_SPI,
17944 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100017945 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080017946 .total_size = 8192,
17947 .page_size = 256,
17948 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17949 /* QPI enable 0x38, disable 0xFF */
17950 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17951 .tested = TEST_OK_PREW,
17952 .probe = probe_spi_rdid,
17953 .probe_timing = TIMING_ZERO,
17954 .block_erasers =
17955 {
17956 {
17957 .eraseblocks = { {4 * 1024, 2048} },
17958 .block_erase = spi_block_erase_20,
17959 }, {
17960 .eraseblocks = { {32 * 1024, 256} },
17961 .block_erase = spi_block_erase_52,
17962 }, {
17963 .eraseblocks = { {64 * 1024, 128} },
17964 .block_erase = spi_block_erase_d8,
17965 }, {
17966 .eraseblocks = { {8 * 1024 * 1024, 1} },
17967 .block_erase = spi_block_erase_60,
17968 }, {
17969 .eraseblocks = { {8 * 1024 * 1024, 1} },
17970 .block_erase = spi_block_erase_c7,
17971 }
17972 },
17973 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17974 .unlock = spi_disable_blockprotect,
17975 .write = spi_chip_write_256,
17976 .read = spi_chip_read,
17977 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17978 },
17979
17980 {
17981 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017982 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020017983 .bustype = BUS_SPI,
17984 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017985 .model_id = WINBOND_NEX_W25Q80_V,
17986 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020017987 .page_size = 256,
17988 /* supports SFDP */
17989 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green1f9cc7d2019-07-01 11:10:45 +100017990 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks48729d32017-12-08 14:44:07 -080017991 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020017992 .probe = probe_spi_rdid,
17993 .probe_timing = TIMING_ZERO,
17994 .block_erasers =
17995 {
17996 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017997 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020017998 .block_erase = spi_block_erase_20,
17999 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018000 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018001 .block_erase = spi_block_erase_52,
18002 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018003 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018004 .block_erase = spi_block_erase_d8,
18005 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018006 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018007 .block_erase = spi_block_erase_60,
18008 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018009 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018010 .block_erase = spi_block_erase_c7,
18011 }
18012 },
18013 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18014 .unlock = spi_disable_blockprotect,
18015 .write = spi_chip_write_256,
18016 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018017 .voltage = {2700, 3600},
18018 },
18019
18020 {
18021 .vendor = "Winbond",
18022 .name = "W25Q80BW",
18023 .bustype = BUS_SPI,
18024 .manufacture_id = WINBOND_NEX_ID,
18025 .model_id = WINBOND_NEX_W25Q80BW,
18026 .total_size = 1024,
18027 .page_size = 256,
18028 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18029 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
18030 .tested = TEST_OK_PREW,
18031 .probe = probe_spi_rdid,
18032 .probe_timing = TIMING_ZERO,
18033 .block_erasers =
18034 {
18035 {
18036 .eraseblocks = { {4 * 1024, 256} },
18037 .block_erase = spi_block_erase_20,
18038 }, {
18039 .eraseblocks = { {32 * 1024, 32} },
18040 .block_erase = spi_block_erase_52,
18041 }, {
18042 .eraseblocks = { {64 * 1024, 16} },
18043 .block_erase = spi_block_erase_d8,
18044 }, {
18045 .eraseblocks = { {1 * 1024 * 1024, 1} },
18046 .block_erase = spi_block_erase_60,
18047 }, {
18048 .eraseblocks = { {1 * 1024 * 1024, 1} },
18049 .block_erase = spi_block_erase_c7,
18050 }
18051 },
18052 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18053 .unlock = spi_disable_blockprotect,
18054 .write = spi_chip_write_256,
18055 .read = spi_chip_read,
18056 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18057 },
18058
18059 {
18060 .vendor = "Winbond",
18061 .name = "W25Q80EW",
18062 .bustype = BUS_SPI,
18063 .manufacture_id = WINBOND_NEX_ID,
18064 .model_id = WINBOND_NEX_W25Q80EW,
18065 .total_size = 1024,
18066 .page_size = 256,
18067 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
18069 .tested = TEST_OK_PREW,
18070 .probe = probe_spi_rdid,
18071 .probe_timing = TIMING_ZERO,
18072 .block_erasers =
18073 {
18074 {
18075 .eraseblocks = { {4 * 1024, 256} },
18076 .block_erase = spi_block_erase_20,
18077 }, {
18078 .eraseblocks = { {32 * 1024, 32} },
18079 .block_erase = spi_block_erase_52,
18080 }, {
18081 .eraseblocks = { {64 * 1024, 16} },
18082 .block_erase = spi_block_erase_d8,
18083 }, {
18084 .eraseblocks = { {1 * 1024 * 1024, 1} },
18085 .block_erase = spi_block_erase_60,
18086 }, {
18087 .eraseblocks = { {1 * 1024 * 1024, 1} },
18088 .block_erase = spi_block_erase_c7,
18089 }
18090 },
18091 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18092 .unlock = spi_disable_blockprotect,
18093 .write = spi_chip_write_256,
18094 .read = spi_chip_read,
18095 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nico Huber70eed9f2017-04-24 22:19:27 +020018096 },
18097
18098 {
18099 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040018100 .name = "W25X05",
18101 .bustype = BUS_SPI,
18102 .manufacture_id = WINBOND_NEX_ID,
18103 .model_id = WINBOND_NEX_W25X05,
18104 .total_size = 64,
18105 .page_size = 256,
18106 .feature_bits = FEATURE_WRSR_WREN,
18107 .tested = TEST_OK_PREW,
18108 .probe = probe_spi_rdid,
18109 .probe_timing = TIMING_ZERO,
18110 .block_erasers =
18111 {
18112 {
18113 .eraseblocks = { {4 * 1024, 16} },
18114 .block_erase = spi_block_erase_20,
18115 }, {
18116 .eraseblocks = { {32 * 1024, 2} },
18117 .block_erase = spi_block_erase_52,
18118 }, {
18119 .eraseblocks = { {64 * 1024, 1} },
18120 .block_erase = spi_block_erase_d8,
18121 }
18122 },
18123 .printlock = spi_prettyprint_status_register_plain,
18124 .unlock = spi_disable_blockprotect,
18125 .write = spi_chip_write_256,
18126 .read = spi_chip_read,
18127 .voltage = {2300, 3600},
18128 },
18129
18130 {
18131 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018132 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018133 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018134 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018135 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018136 .total_size = 128,
18137 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018138 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000018139 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018140 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000018141 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018142 .block_erasers =
18143 {
18144 {
18145 .eraseblocks = { {4 * 1024, 32} },
18146 .block_erase = spi_block_erase_20,
18147 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018148 .eraseblocks = { {64 * 1024, 2} },
18149 .block_erase = spi_block_erase_d8,
18150 }, {
18151 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018152 .block_erase = spi_block_erase_c7,
18153 }
18154 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018155 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018156 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000018157 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018158 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018159 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018160 },
18161
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018162 {
18163 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018164 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018165 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000018166 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018167 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000018168 .total_size = 2048,
18169 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018170 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000018171 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000018172 .probe = probe_spi_rdid,
18173 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018174 .block_erasers =
18175 {
18176 {
18177 .eraseblocks = { {4 * 1024, 512} },
18178 .block_erase = spi_block_erase_20,
18179 }, {
18180 .eraseblocks = { {32 * 1024, 64} },
18181 .block_erase = spi_block_erase_52,
18182 }, {
18183 .eraseblocks = { {64 * 1024, 32} },
18184 .block_erase = spi_block_erase_d8,
18185 }, {
18186 .eraseblocks = { {2 * 1024 * 1024, 1} },
18187 .block_erase = spi_block_erase_60,
18188 }, {
18189 .eraseblocks = { {2 * 1024 * 1024, 1} },
18190 .block_erase = spi_block_erase_c7,
18191 }
18192 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018193 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018194 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000018195 .write = spi_chip_write_256,
18196 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018197 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000018198 },
18199
18200 {
18201 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018202 .name = "W25X20",
18203 .bustype = BUS_SPI,
18204 .manufacture_id = WINBOND_NEX_ID,
18205 .model_id = WINBOND_NEX_W25X20,
18206 .total_size = 256,
18207 .page_size = 256,
18208 .feature_bits = FEATURE_WRSR_WREN,
18209 .tested = TEST_OK_PREW,
18210 .probe = probe_spi_rdid,
18211 .probe_timing = TIMING_ZERO,
18212 .block_erasers =
18213 {
18214 {
18215 .eraseblocks = { {4 * 1024, 64} },
18216 .block_erase = spi_block_erase_20,
18217 }, {
18218 .eraseblocks = { {64 * 1024, 4} },
18219 .block_erase = spi_block_erase_d8,
18220 }, {
18221 .eraseblocks = { {256 * 1024, 1} },
18222 .block_erase = spi_block_erase_c7,
18223 }
18224 },
18225 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18226 .unlock = spi_disable_blockprotect,
18227 .write = spi_chip_write_256,
18228 .read = spi_chip_read,
18229 .voltage = {2700, 3600},
18230 },
18231
18232 {
18233 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018234 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018235 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000018236 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018237 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000018238 .total_size = 4096,
18239 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018240 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000018241 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000018242 .probe = probe_spi_rdid,
18243 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018244 .block_erasers =
18245 {
18246 {
18247 .eraseblocks = { {4 * 1024, 1024} },
18248 .block_erase = spi_block_erase_20,
18249 }, {
18250 .eraseblocks = { {32 * 1024, 128} },
18251 .block_erase = spi_block_erase_52,
18252 }, {
18253 .eraseblocks = { {64 * 1024, 64} },
18254 .block_erase = spi_block_erase_d8,
18255 }, {
18256 .eraseblocks = { {4 * 1024 * 1024, 1} },
18257 .block_erase = spi_block_erase_60,
18258 }, {
18259 .eraseblocks = { {4 * 1024 * 1024, 1} },
18260 .block_erase = spi_block_erase_c7,
18261 }
18262 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018264 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000018265 .write = spi_chip_write_256,
18266 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018267 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000018268 },
18269
18270 {
18271 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018272 .name = "W25X40",
18273 .bustype = BUS_SPI,
18274 .manufacture_id = WINBOND_NEX_ID,
18275 .model_id = WINBOND_NEX_W25X40,
18276 .total_size = 512,
18277 .page_size = 256,
18278 .feature_bits = FEATURE_WRSR_WREN,
18279 .tested = TEST_OK_PREW,
18280 .probe = probe_spi_rdid,
18281 .probe_timing = TIMING_ZERO,
18282 .block_erasers =
18283 {
18284 {
18285 .eraseblocks = { {4 * 1024, 128} },
18286 .block_erase = spi_block_erase_20,
18287 }, {
18288 .eraseblocks = { {64 * 1024, 8} },
18289 .block_erase = spi_block_erase_d8,
18290 }, {
18291 .eraseblocks = { {512 * 1024, 1} },
18292 .block_erase = spi_block_erase_c7,
18293 }
18294 },
18295 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18296 .unlock = spi_disable_blockprotect,
18297 .write = spi_chip_write_256,
18298 .read = spi_chip_read,
18299 .voltage = {2700, 3600},
18300 },
18301
18302 {
18303 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018304 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018305 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000018306 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018307 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000018308 .total_size = 8192,
18309 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018310 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000018311 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000018312 .probe = probe_spi_rdid,
18313 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018314 .block_erasers =
18315 {
18316 {
18317 .eraseblocks = { {4 * 1024, 2048} },
18318 .block_erase = spi_block_erase_20,
18319 }, {
18320 .eraseblocks = { {32 * 1024, 256} },
18321 .block_erase = spi_block_erase_52,
18322 }, {
18323 .eraseblocks = { {64 * 1024, 128} },
18324 .block_erase = spi_block_erase_d8,
18325 }, {
18326 .eraseblocks = { {8 * 1024 * 1024, 1} },
18327 .block_erase = spi_block_erase_60,
18328 }, {
18329 .eraseblocks = { {8 * 1024 * 1024, 1} },
18330 .block_erase = spi_block_erase_c7,
18331 }
18332 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018333 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018334 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000018335 .write = spi_chip_write_256,
18336 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018337 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000018338 },
18339
18340 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100018341 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018342 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100018343 .bustype = BUS_SPI,
18344 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018345 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018346 .total_size = 1024,
18347 .page_size = 256,
18348 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018349 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018350 .probe = probe_spi_rdid,
18351 .probe_timing = TIMING_ZERO,
18352 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018353 {
18354 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018355 .eraseblocks = { {4 * 1024, 256} },
18356 .block_erase = spi_block_erase_20,
18357 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018358 .eraseblocks = { {64 * 1024, 16} },
18359 .block_erase = spi_block_erase_d8,
18360 }, {
18361 .eraseblocks = { {1024 * 1024, 1} },
18362 .block_erase = spi_block_erase_c7,
18363 }
18364 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100018365 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18366 .unlock = spi_disable_blockprotect,
18367 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018368 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018369 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018370 },
18371
Alan Greenf29ea362019-06-27 17:14:02 +100018372 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
18373 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000018374 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018375 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018376 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018377 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018378 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018379 .total_size = 128,
18380 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000018381 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000018382 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018383 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018384 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018385 .block_erasers =
18386 {
18387 {
18388 .eraseblocks = { {128 * 1024, 1} },
18389 .block_erase = erase_chip_block_jedec,
18390 }
18391 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018392 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018393 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000018394 },
18395
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018396 {
18397 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018398 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
18399 .bustype = BUS_PARALLEL,
18400 .manufacture_id = WINBOND_ID,
18401 .model_id = WINBOND_W29C010,
18402 .total_size = 128,
18403 .page_size = 128,
18404 .feature_bits = FEATURE_LONG_RESET,
18405 .tested = TEST_OK_PREW,
18406 .probe = probe_w29ee011,
18407 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
18408 .block_erasers =
18409 {
18410 {
18411 .eraseblocks = { {128 * 1024, 1} },
18412 .block_erase = erase_chip_block_jedec,
18413 }
18414 },
18415 .write = write_jedec,
18416 .read = read_memmapped,
18417 },
18418
18419 {
18420 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018421 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018422 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018423 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018424 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018425 .total_size = 256,
18426 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000018427 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018428 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018429 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018430 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018431 .block_erasers =
18432 {
18433 {
18434 .eraseblocks = { {256 * 1024, 1} },
18435 .block_erase = erase_chip_block_jedec,
18436 }
18437 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018438 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018439 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018440 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000018441 },
18442
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018443 {
18444 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018445 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018446 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018447 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018448 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018449 .total_size = 512,
18450 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000018451 .feature_bits = FEATURE_LONG_RESET,
18452 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018453 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000018454 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018455 .block_erasers =
18456 {
18457 {
18458 .eraseblocks = { {512 * 1024, 1} },
18459 .block_erase = erase_chip_block_jedec,
18460 }
18461 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018462 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018463 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018464 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000018465 },
18466
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018467 {
18468 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018469 .name = "W29C512A/W29EE512",
18470 .bustype = BUS_PARALLEL,
18471 .manufacture_id = WINBOND_ID,
18472 .model_id = WINBOND_W29C512A,
18473 .total_size = 64,
18474 .page_size = 128,
18475 .feature_bits = FEATURE_LONG_RESET,
18476 .tested = TEST_OK_PREW,
18477 .probe = probe_jedec,
18478 .probe_timing = 10,
18479 .block_erasers =
18480 {
18481 {
18482 .eraseblocks = { {64 * 1024, 1} },
18483 .block_erase = erase_chip_block_jedec,
18484 }
18485 },
18486 .write = write_jedec,
18487 .read = read_memmapped,
18488 .voltage = {4500, 5500},
18489 },
18490
18491 {
18492 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018493 .name = "W29GL032CB",
18494 .bustype = BUS_PARALLEL,
18495 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18496 .model_id = WINBOND_W29GL032CB,
18497 .total_size = 4096,
18498 .page_size = 128 * 1024, /* actual page size is 16 */
18499 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18500 .tested = TEST_UNTESTED,
18501 .probe = probe_jedec_29gl,
18502 .probe_timing = TIMING_ZERO,
18503 .block_erasers =
18504 {
18505 {
18506 .eraseblocks = {
18507 {8 * 1024, 8},
18508 {64 * 1024, 63},
18509 },
18510 .block_erase = erase_sector_jedec,
18511 }, {
18512 .eraseblocks = { {4 * 1024 * 1024, 1} },
18513 .block_erase = erase_chip_block_jedec,
18514 },
18515 },
18516 .write = write_jedec_1,
18517 .read = read_memmapped,
18518 .voltage = {2700, 3600},
18519 },
18520
18521 {
18522 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018523 .name = "W29GL032CH/L",
18524 .bustype = BUS_PARALLEL,
18525 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18526 .model_id = WINBOND_W29GL032CHL,
18527 .total_size = 4096,
18528 .page_size = 128 * 1024, /* actual page size is 16 */
18529 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18530 .tested = TEST_UNTESTED,
18531 .probe = probe_jedec_29gl,
18532 .probe_timing = TIMING_ZERO,
18533 .block_erasers =
18534 {
18535 {
18536 .eraseblocks = { {64 * 1024, 64} },
18537 .block_erase = erase_sector_jedec,
18538 }, {
18539 .eraseblocks = { {4 * 1024 * 1024, 1} },
18540 .block_erase = erase_chip_block_jedec,
18541 },
18542 },
18543 .write = write_jedec_1,
18544 .read = read_memmapped,
18545 .voltage = {2700, 3600},
18546 },
18547
18548 {
18549 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018550 .name = "W29GL032CT",
18551 .bustype = BUS_PARALLEL,
18552 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18553 .model_id = WINBOND_W29GL032CT,
18554 .total_size = 4096,
18555 .page_size = 128 * 1024, /* actual page size is 16 */
18556 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18557 .tested = TEST_UNTESTED,
18558 .probe = probe_jedec_29gl,
18559 .probe_timing = TIMING_ZERO,
18560 .block_erasers =
18561 {
18562 {
18563 .eraseblocks = {
18564 {64 * 1024, 63},
18565 {8 * 1024, 8},
18566 },
18567 .block_erase = erase_sector_jedec,
18568 }, {
18569 .eraseblocks = { {4 * 1024 * 1024, 1} },
18570 .block_erase = erase_chip_block_jedec,
18571 },
18572 },
18573 .write = write_jedec_1,
18574 .read = read_memmapped,
18575 .voltage = {2700, 3600},
18576 },
18577
18578 {
18579 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018580 .name = "W29GL064CB",
18581 .bustype = BUS_PARALLEL,
18582 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18583 .model_id = WINBOND_W29GL064CB,
18584 .total_size = 8192,
18585 .page_size = 128 * 1024, /* actual page size is 16 */
18586 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18587 .tested = TEST_UNTESTED,
18588 .probe = probe_jedec_29gl,
18589 .probe_timing = TIMING_ZERO,
18590 .block_erasers =
18591 {
18592 {
18593 .eraseblocks = {
18594 {8 * 1024, 8},
18595 {64 * 1024, 127},
18596 },
18597 .block_erase = erase_sector_jedec,
18598 }, {
18599 .eraseblocks = { {8 * 1024 * 1024, 1} },
18600 .block_erase = erase_chip_block_jedec,
18601 },
18602 },
18603 .write = write_jedec_1,
18604 .read = read_memmapped,
18605 .voltage = {2700, 3600},
18606 },
18607
18608 {
18609 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018610 .name = "W29GL064CH/L",
18611 .bustype = BUS_PARALLEL,
18612 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18613 .model_id = WINBOND_W29GL064CHL,
18614 .total_size = 8192,
18615 .page_size = 128 * 1024, /* actual page size is 16 */
18616 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18617 .tested = TEST_UNTESTED,
18618 .probe = probe_jedec_29gl,
18619 .probe_timing = TIMING_ZERO,
18620 .block_erasers =
18621 {
18622 {
18623 .eraseblocks = { {64 * 1024, 128} },
18624 .block_erase = erase_sector_jedec,
18625 }, {
18626 .eraseblocks = { {8 * 1024 * 1024, 1} },
18627 .block_erase = erase_chip_block_jedec,
18628 },
18629 },
18630 .write = write_jedec_1,
18631 .read = read_memmapped,
18632 .voltage = {2700, 3600},
18633 },
18634
18635 {
18636 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018637 .name = "W29GL064CT",
18638 .bustype = BUS_PARALLEL,
18639 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18640 .model_id = WINBOND_W29GL064CT,
18641 .total_size = 8192,
18642 .page_size = 128 * 1024, /* actual page size is 16 */
18643 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18644 .tested = TEST_UNTESTED,
18645 .probe = probe_jedec_29gl,
18646 .probe_timing = TIMING_ZERO,
18647 .block_erasers =
18648 {
18649 {
18650 .eraseblocks = {
18651 {64 * 1024, 127},
18652 {8 * 1024, 8},
18653 },
18654 .block_erase = erase_sector_jedec,
18655 }, {
18656 .eraseblocks = { {8 * 1024 * 1024, 1} },
18657 .block_erase = erase_chip_block_jedec,
18658 },
18659 },
18660 .write = write_jedec_1,
18661 .read = read_memmapped,
18662 .voltage = {2700, 3600},
18663 },
18664
18665 {
18666 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018667 .name = "W29GL128C",
18668 .bustype = BUS_PARALLEL,
18669 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18670 .model_id = WINBOND_W29GL128CHL,
18671 .total_size = 16384,
18672 .page_size = 128 * 1024, /* actual page size is 16 */
18673 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18674 .tested = TEST_UNTESTED,
18675 .probe = probe_jedec_29gl,
18676 .probe_timing = TIMING_ZERO,
18677 .block_erasers =
18678 {
18679 {
18680 .eraseblocks = { {128 * 1024, 128} },
18681 .block_erase = erase_sector_jedec,
18682 }, {
18683 .eraseblocks = { {16 * 1024 * 1024, 1} },
18684 .block_erase = erase_chip_block_jedec,
18685 },
18686 },
18687 .write = write_jedec_1,
18688 .read = read_memmapped,
18689 .voltage = {2700, 3600},
18690 },
18691
18692 {
18693 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000018694 .name = "W39F010",
18695 .bustype = BUS_PARALLEL,
18696 .manufacture_id = WINBOND_ID,
18697 .model_id = WINBOND_W39F010,
18698 .total_size = 128,
18699 .page_size = 4 * 1024,
18700 .feature_bits = FEATURE_EITHER_RESET,
18701 .tested = TEST_OK_PREW,
18702 .probe = probe_jedec,
18703 .probe_timing = 10,
18704 .block_erasers =
18705 {
18706 {
18707 .eraseblocks = { {4 * 1024, 32} },
18708 .block_erase = erase_block_jedec,
18709 }, {
18710 .eraseblocks = { {128 * 1024, 1} },
18711 .block_erase = erase_chip_block_jedec,
18712 }
18713 },
18714 .printlock = printlock_w39f010,
18715 .write = write_jedec_1,
18716 .read = read_memmapped,
18717 .voltage = {4500, 5500},
18718 },
18719
18720 {
18721 .vendor = "Winbond",
18722 .name = "W39L010",
18723 .bustype = BUS_PARALLEL,
18724 .manufacture_id = WINBOND_ID,
18725 .model_id = WINBOND_W39L010,
18726 .total_size = 128,
18727 .page_size = 4 * 1024,
18728 .feature_bits = FEATURE_EITHER_RESET,
18729 .tested = TEST_UNTESTED,
18730 .probe = probe_jedec,
18731 .probe_timing = 10,
18732 .block_erasers =
18733 {
18734 {
18735 .eraseblocks = { {4 * 1024, 32} },
18736 .block_erase = erase_block_jedec,
18737 }, {
18738 .eraseblocks = { {128 * 1024, 1} },
18739 .block_erase = erase_chip_block_jedec,
18740 }
18741 },
18742 .printlock = printlock_w39l010,
18743 .write = write_jedec_1,
18744 .read = read_memmapped,
18745 .voltage = {3000, 3600},
18746 },
18747
18748 {
18749 .vendor = "Winbond",
18750 .name = "W39L020",
18751 .bustype = BUS_PARALLEL,
18752 .manufacture_id = WINBOND_ID,
18753 .model_id = WINBOND_W39L020,
18754 .total_size = 256,
18755 .page_size = 4 * 1024,
18756 .feature_bits = FEATURE_EITHER_RESET,
18757 .tested = TEST_UNTESTED,
18758 .probe = probe_jedec,
18759 .probe_timing = 10,
18760 .block_erasers =
18761 {
18762 {
18763 .eraseblocks = { {4 * 1024, 64} },
18764 .block_erase = erase_block_jedec,
18765 }, {
18766 .eraseblocks = { {64 * 1024, 4} },
18767 .block_erase = erase_sector_jedec,
18768 }, {
18769 .eraseblocks = { {256 * 1024, 1} },
18770 .block_erase = erase_chip_block_jedec,
18771 }
18772 },
18773 .printlock = printlock_w39l020,
18774 .write = write_jedec_1,
18775 .read = read_memmapped,
18776 .voltage = {3000, 3600},
18777 },
18778
18779 {
18780 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000018781 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018782 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000018783 .manufacture_id = WINBOND_ID,
18784 .model_id = WINBOND_W39L040,
18785 .total_size = 512,
18786 .page_size = 64 * 1024,
18787 .feature_bits = FEATURE_EITHER_RESET,
18788 .tested = TEST_OK_PR,
18789 .probe = probe_jedec,
18790 .probe_timing = 10,
18791 .block_erasers =
18792 {
18793 {
18794 .eraseblocks = { {4 * 1024, 128} },
18795 .block_erase = erase_block_jedec,
18796 }, {
18797 .eraseblocks = { {64 * 1024, 8} },
18798 .block_erase = erase_sector_jedec,
18799 }, {
18800 .eraseblocks = { {512 * 1024, 1} },
18801 .block_erase = erase_chip_block_jedec,
18802 }
18803 },
18804 .printlock = printlock_w39l040,
18805 .write = write_jedec_1,
18806 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000018807 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000018808 },
18809
18810 {
18811 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018812 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018813 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018814 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018815 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018816 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000018817 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000018818 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000018819 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018820 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000018821 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018822 .block_erasers =
18823 {
18824 {
18825 .eraseblocks = { {64 * 1024, 8} },
18826 .block_erase = erase_sector_jedec,
18827 }, {
18828 .eraseblocks = { {512 * 1024, 1} },
18829 .block_erase = erase_chip_block_jedec,
18830 }
18831 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018832 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000018833 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018834 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018835 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018836 },
18837
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018838 {
18839 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018840 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018841 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018842 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018843 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018844 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000018845 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000018846 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000018847 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018848 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000018849 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018850 .block_erasers =
18851 {
18852 {
18853 .eraseblocks = { {64 * 1024, 8} },
18854 .block_erase = erase_sector_jedec,
18855 }, {
18856 .eraseblocks = { {512 * 1024, 1} },
18857 .block_erase = erase_chip_block_jedec,
18858 }
18859 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018860 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000018861 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018862 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018863 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018864 },
18865
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018866 {
18867 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018868 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018869 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018870 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018871 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018872 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000018873 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000018874 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000018875 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000018876 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018877 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018878 .block_erasers =
18879 {
18880 {
18881 .eraseblocks = { {64 * 1024, 8} },
18882 .block_erase = erase_sector_jedec,
18883 }, {
18884 .eraseblocks = { {512 * 1024, 1} },
18885 .block_erase = erase_chip_block_jedec,
18886 }
18887 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000018888 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000018889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018890 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018891 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018892 },
18893
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018894 {
18895 .vendor = "Winbond",
18896 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018897 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018898 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018899 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018900 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000018901 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000018902 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000018903 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018904 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018905 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018906 .block_erasers =
18907 {
18908 {
18909 .eraseblocks = { {4 * 1024, 128} },
18910 .block_erase = erase_block_jedec,
18911 }, {
18912 .eraseblocks = { {64 * 1024, 8} },
18913 .block_erase = erase_sector_jedec,
18914 }, {
18915 .eraseblocks = { {512 * 1024, 1} },
18916 .block_erase = erase_chip_block_jedec,
18917 }
18918 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018919 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000018920 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000018921 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018922 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018923 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018924 },
18925
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018926 {
18927 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018928 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018929 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018930 .manufacture_id = WINBOND_ID,
18931 .model_id = WINBOND_W39V040B,
18932 .total_size = 512,
18933 .page_size = 64 * 1024,
18934 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000018935 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018936 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000018937 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018938 .block_erasers =
18939 {
18940 {
18941 .eraseblocks = { {64 * 1024, 8} },
18942 .block_erase = erase_sector_jedec,
18943 }, {
18944 .eraseblocks = { {512 * 1024, 1} },
18945 .block_erase = erase_chip_block_jedec,
18946 }
18947 },
18948 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000018949 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018950 .write = write_jedec_1,
18951 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000018952 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018953 },
18954
18955 {
18956 .vendor = "Winbond",
18957 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018958 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018959 .manufacture_id = WINBOND_ID,
18960 .model_id = WINBOND_W39V040C,
18961 .total_size = 512,
18962 .page_size = 64 * 1024,
18963 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000018964 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018965 .probe = probe_jedec,
18966 .probe_timing = 10,
18967 .block_erasers =
18968 {
18969 {
18970 .eraseblocks = { {64 * 1024, 8} },
18971 .block_erase = erase_sector_jedec,
18972 }, {
18973 .eraseblocks = { {512 * 1024, 1} },
18974 .block_erase = erase_chip_block_jedec,
18975 }
18976 },
18977 .printlock = printlock_w39v040fc,
18978 .write = write_jedec_1,
18979 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000018980 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000018981 },
18982
18983 {
18984 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018985 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018986 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018987 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018988 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018989 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000018990 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000018991 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000018992 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018993 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000018994 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018995 .block_erasers =
18996 {
18997 {
18998 .eraseblocks = { {64 * 1024, 16} },
18999 .block_erase = erase_sector_jedec,
19000 }, {
19001 .eraseblocks = { {1024 * 1024, 1} },
19002 .block_erase = erase_chip_block_jedec,
19003 }
19004 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019005 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000019006 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019007 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019008 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019009 },
19010
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019011 {
19012 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019013 .name = "W39V080FA",
19014 .bustype = BUS_FWH,
19015 .manufacture_id = WINBOND_ID,
19016 .model_id = WINBOND_W39V080FA,
19017 .total_size = 1024,
19018 .page_size = 64 * 1024,
19019 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
19020 .tested = TEST_OK_PREW,
19021 .probe = probe_jedec,
19022 .probe_timing = 10,
19023 .block_erasers =
19024 {
19025 {
19026 .eraseblocks = { {64 * 1024, 16} },
19027 .block_erase = erase_sector_jedec,
19028 }, {
19029 .eraseblocks = { {1024 * 1024, 1} },
19030 .block_erase = erase_chip_block_jedec,
19031 }
19032 },
19033 .printlock = printlock_w39v080fa,
19034 .unlock = unlock_regspace2_uniform_64k,
19035 .write = write_jedec_1,
19036 .read = read_memmapped,
19037 .voltage = {3000, 3600}, /* Also has 12V fast program */
19038 },
19039
19040 {
19041 .vendor = "Winbond",
19042 .name = "W39V080FA (dual mode)",
19043 .bustype = BUS_FWH,
19044 .manufacture_id = WINBOND_ID,
19045 .model_id = WINBOND_W39V080FA_DM,
19046 .total_size = 512,
19047 .page_size = 64 * 1024,
19048 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
19049 .tested = TEST_UNTESTED,
19050 .probe = probe_jedec,
19051 .probe_timing = 10,
19052 .block_erasers =
19053 {
19054 {
19055 .eraseblocks = { {64 * 1024, 8} },
19056 .block_erase = erase_sector_jedec,
19057 }, {
19058 .eraseblocks = { {512 * 1024, 1} },
19059 .block_erase = erase_chip_block_jedec,
19060 }
19061 },
19062 .printlock = printlock_w39v080fa_dual,
19063 .write = write_jedec_1,
19064 .read = read_memmapped,
19065 .voltage = {3000, 3600}, /* Also has 12V fast program */
19066 },
19067
19068 {
19069 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000019070 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019071 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019072 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019073 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019074 .total_size = 256,
19075 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019076 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000019077 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019078 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000019079 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019080 .block_erasers =
19081 {
19082 {
19083 .eraseblocks = {
19084 {128 * 1024, 1},
19085 {96 * 1024, 1},
19086 {8 * 1024, 2},
19087 {16 * 1024, 1},
19088 },
19089 .block_erase = erase_sector_jedec,
19090 }, {
19091 .eraseblocks = { {256 * 1024, 1} },
19092 .block_erase = erase_chip_block_jedec,
19093 }
19094 },
Sean Nelson35727f72010-01-28 23:55:12 +000019095 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019096 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019097 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000019098 },
19099
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019100 {
19101 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019102 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019103 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019104 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019105 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019106 .total_size = 256,
19107 .page_size = 128,
19108 .feature_bits = FEATURE_EITHER_RESET,
19109 .tested = TEST_OK_PROBE,
19110 .probe = probe_jedec,
19111 .probe_timing = 10,
19112 .block_erasers =
19113 {
19114 {
19115 .eraseblocks = { {256 * 1024, 1} },
19116 .block_erase = erase_chip_block_jedec,
19117 }
19118 },
19119 .write = write_jedec_1,
19120 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019121 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019122 },
19123
19124 {
19125 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019126 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019127 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019128 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019129 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019130 .total_size = 256,
19131 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019132 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019133 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019134 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019135 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019136 .block_erasers =
19137 {
19138 {
19139 .eraseblocks = {
19140 {64 * 1024, 3},
19141 {32 * 1024, 1},
19142 {8 * 1024, 2},
19143 {16 * 1024, 1},
19144 },
19145 .block_erase = erase_sector_jedec,
19146 }, {
19147 .eraseblocks = { {256 * 1024, 1} },
19148 .block_erase = erase_chip_block_jedec,
19149 }
19150 },
Sean Nelson35727f72010-01-28 23:55:12 +000019151 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019152 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019153 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019154 },
19155
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019156 {
19157 .vendor = "Winbond",
19158 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019159 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019160 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019161 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019162 .total_size = 256,
19163 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019164 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000019165 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019166 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000019167 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019168 .block_erasers =
19169 {
19170 {
19171 .eraseblocks = {
19172 {64 * 1024, 3},
19173 {32 * 1024, 1},
19174 {8 * 1024, 2},
19175 {16 * 1024, 1},
19176 },
19177 .block_erase = erase_sector_jedec,
19178 }, {
19179 .eraseblocks = { {256 * 1024, 1} },
19180 .block_erase = erase_chip_block_jedec,
19181 }
19182 },
Sean Nelson35727f72010-01-28 23:55:12 +000019183 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019184 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019185 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019186 },
19187
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019188 {
luke heef884232020-12-28 18:22:21 +080019189 .vendor = "XMC",
19190 .name = "XM25QH128C",
19191 .bustype = BUS_SPI,
19192 .manufacture_id = ST_ID,
19193 .model_id = XMC_XM25QH128C,
19194 .total_size = 16384,
19195 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019196 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080019197 .tested = TEST_UNTESTED,
19198 .probe = probe_spi_rdid,
19199 .probe_timing = TIMING_ZERO,
19200 .block_erasers =
19201 {
19202 {
19203 .eraseblocks = { {4 * 1024, 4096} },
19204 .block_erase = spi_block_erase_20,
19205 }, {
19206 .eraseblocks = { {32 * 1024, 512} },
19207 .block_erase = spi_block_erase_52,
19208 }, {
19209 .eraseblocks = { {64 * 1024, 256} },
19210 .block_erase = spi_block_erase_d8,
19211 }, {
19212 .eraseblocks = { {16 * 1024 * 1024, 1} },
19213 .block_erase = spi_block_erase_60,
19214 }, {
19215 .eraseblocks = { {16 * 1024 * 1024, 1} },
19216 .block_erase = spi_block_erase_c7,
19217 }
19218 },
19219 .printlock = spi_prettyprint_status_register_plain,
19220 .unlock = spi_disable_blockprotect,
19221 .write = spi_chip_write_256,
19222 .read = spi_chip_read,
19223 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019224 .reg_bits =
19225 {
19226 .srp = {STATUS1, 7, RW},
19227 .srl = {STATUS2, 0, RW},
19228 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19229 .tb = {STATUS1, 5, RW},
19230 .sec = {STATUS1, 6, RW},
19231 .cmp = {STATUS2, 6, RW},
19232 },
19233 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080019234 },
19235
19236 {
19237 .vendor = "XMC",
19238 .name = "XM25QH256C",
19239 .bustype = BUS_SPI,
19240 .manufacture_id = ST_ID,
19241 .model_id = XMC_XM25QH256C,
19242 .total_size = 32768,
19243 .page_size = 256,
19244 /* supports SFDP */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019245 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080019246 .tested = TEST_UNTESTED,
19247 .probe = probe_spi_rdid,
19248 .probe_timing = TIMING_ZERO,
19249 .block_erasers =
19250 {
19251 {
19252 .eraseblocks = { {4 * 1024, 8192} },
19253 .block_erase = spi_block_erase_21,
19254 }, {
19255 .eraseblocks = { {4 * 1024, 8192} },
19256 .block_erase = spi_block_erase_20,
19257 }, {
19258 .eraseblocks = { {32 * 1024, 1024} },
19259 .block_erase = spi_block_erase_52,
19260 }, {
19261 .eraseblocks = { {64 * 1024, 512} },
19262 .block_erase = spi_block_erase_dc,
19263 }, {
19264 .eraseblocks = { {64 * 1024, 512} },
19265 .block_erase = spi_block_erase_d8,
19266 }, {
19267 .eraseblocks = { {32 * 1024 * 1024, 1} },
19268 .block_erase = spi_block_erase_60,
19269 }, {
19270 .eraseblocks = { {32 * 1024 * 1024, 1} },
19271 .block_erase = spi_block_erase_c7,
19272 }
19273 },
19274 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19275 .unlock = spi_disable_blockprotect,
19276 .write = spi_chip_write_256,
19277 .read = spi_chip_read,
19278 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019279 .reg_bits =
19280 {
19281 .srp = {STATUS1, 7, RW},
19282 .srl = {STATUS2, 0, RW},
19283 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19284 .tb = {STATUS1, 6, RW},
19285 },
19286 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080019287 },
19288
19289 {
19290 .vendor = "XMC",
19291 .name = "XM25QH64C",
19292 .bustype = BUS_SPI,
19293 .manufacture_id = ST_ID,
19294 .model_id = XMC_XM25QH64C,
19295 .total_size = 8192,
19296 .page_size = 256,
19297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19298 .tested = TEST_UNTESTED,
19299 .probe = probe_spi_rdid,
19300 .probe_timing = TIMING_ZERO,
19301 .block_erasers =
19302 {
19303 {
19304 .eraseblocks = { {4 * 1024, 2048} },
19305 .block_erase = spi_block_erase_20,
19306 }, {
19307 .eraseblocks = { {32 * 1024, 256} },
19308 .block_erase = spi_block_erase_52,
19309 }, {
19310 .eraseblocks = { {64 * 1024, 128} },
19311 .block_erase = spi_block_erase_d8,
19312 }, {
19313 .eraseblocks = { {8 * 1024 * 1024, 1} },
19314 .block_erase = spi_block_erase_60,
19315 }, {
19316 .eraseblocks = { {8 * 1024 * 1024, 1} },
19317 .block_erase = spi_block_erase_c7,
19318 }
19319 },
19320 .printlock = spi_prettyprint_status_register_plain,
19321 .unlock = spi_disable_blockprotect,
19322 .write = spi_chip_write_256,
19323 .read = spi_chip_read,
19324 .voltage = {2700, 3600},
19325 },
19326
19327 {
19328 .vendor = "XMC",
19329 .name = "XM25QU128C",
19330 .bustype = BUS_SPI,
19331 .manufacture_id = ST_ID,
19332 .model_id = XMC_XM25QU128C,
19333 .total_size = 16384,
19334 .page_size = 256,
19335 /* supports SFDP */
19336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19337 .tested = TEST_UNTESTED,
19338 .probe = probe_spi_rdid,
19339 .probe_timing = TIMING_ZERO,
19340 .block_erasers =
19341 {
19342 {
19343 .eraseblocks = { {4 * 1024, 4096} },
19344 .block_erase = spi_block_erase_20,
19345 }, {
19346 .eraseblocks = { {32 * 1024, 512} },
19347 .block_erase = spi_block_erase_52,
19348 }, {
19349 .eraseblocks = { {64 * 1024, 256} },
19350 .block_erase = spi_block_erase_d8,
19351 }, {
19352 .eraseblocks = { {16 * 1024 * 1024, 1} },
19353 .block_erase = spi_block_erase_60,
19354 }, {
19355 .eraseblocks = { {16 * 1024 * 1024, 1} },
19356 .block_erase = spi_block_erase_c7,
19357 }
19358 },
19359 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19360 .unlock = spi_disable_blockprotect,
19361 .write = spi_chip_write_256,
19362 .read = spi_chip_read,
19363 .voltage = {1650, 1950},
19364 },
19365
19366 {
19367 .vendor = "XMC",
19368 .name = "XM25QU256C",
19369 .bustype = BUS_SPI,
19370 .manufacture_id = ST_ID,
19371 .model_id = XMC_XM25QU256C,
19372 .total_size = 32768,
19373 .page_size = 256,
19374 /* supports SFDP */
19375 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
19376 .tested = TEST_UNTESTED,
19377 .probe = probe_spi_rdid,
19378 .probe_timing = TIMING_ZERO,
19379 .block_erasers =
19380 {
19381 {
19382 .eraseblocks = { {4 * 1024, 8192} },
19383 .block_erase = spi_block_erase_21,
19384 }, {
19385 .eraseblocks = { {4 * 1024, 8192} },
19386 .block_erase = spi_block_erase_20,
19387 }, {
19388 .eraseblocks = { {32 * 1024, 1024} },
19389 .block_erase = spi_block_erase_52,
19390 }, {
19391 .eraseblocks = { {64 * 1024, 512} },
19392 .block_erase = spi_block_erase_dc,
19393 }, {
19394 .eraseblocks = { {64 * 1024, 512} },
19395 .block_erase = spi_block_erase_d8,
19396 }, {
19397 .eraseblocks = { {32 * 1024 * 1024, 1} },
19398 .block_erase = spi_block_erase_60,
19399 }, {
19400 .eraseblocks = { {32 * 1024 * 1024, 1} },
19401 .block_erase = spi_block_erase_c7,
19402 }
19403 },
19404 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19405 .unlock = spi_disable_blockprotect,
19406 .write = spi_chip_write_256,
19407 .read = spi_chip_read,
19408 .voltage = {1650, 1950},
19409 },
19410
19411 {
19412 .vendor = "XMC",
19413 .name = "XM25QU64C",
19414 .bustype = BUS_SPI,
19415 .manufacture_id = ST_ID,
19416 .model_id = XMC_XM25QU64C,
19417 .total_size = 8192,
19418 .page_size = 256,
19419 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19420 .tested = TEST_UNTESTED,
19421 .probe = probe_spi_rdid,
19422 .probe_timing = TIMING_ZERO,
19423 .block_erasers =
19424 {
19425 {
19426 .eraseblocks = { {4 * 1024, 2048} },
19427 .block_erase = spi_block_erase_20,
19428 }, {
19429 .eraseblocks = { {32 * 1024, 256} },
19430 .block_erase = spi_block_erase_52,
19431 }, {
19432 .eraseblocks = { {64 * 1024, 128} },
19433 .block_erase = spi_block_erase_d8,
19434 }, {
19435 .eraseblocks = { {8 * 1024 * 1024, 1} },
19436 .block_erase = spi_block_erase_60,
19437 }, {
19438 .eraseblocks = { {8 * 1024 * 1024, 1} },
19439 .block_erase = spi_block_erase_c7,
19440 }
19441 },
19442 .printlock = spi_prettyprint_status_register_plain,
19443 .unlock = spi_disable_blockprotect,
19444 .write = spi_chip_write_256,
19445 .read = spi_chip_read,
19446 .voltage = {1650, 1950},
19447 },
19448
19449 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100019450 .vendor = "Zetta Device",
19451 .name = "ZD25D20",
19452 .bustype = BUS_SPI,
19453 .manufacture_id = ZETTADEVICE_ID,
19454 .model_id = ZETTADEVICE_ZD25D20,
19455 .total_size = 256,
19456 .page_size = 256,
19457 .feature_bits = FEATURE_WRSR_WREN,
19458 .tested = TEST_UNTESTED,
19459 .probe = probe_spi_rdid,
19460 .probe_timing = TIMING_ZERO,
19461 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080019462 {
19463 {
19464 .eraseblocks = { {4 * 1024, 64} },
19465 .block_erase = spi_block_erase_20,
19466 }, {
19467 .eraseblocks = { {32 * 1024, 8} },
19468 .block_erase = spi_block_erase_52,
19469 }, {
19470 .eraseblocks = { {64 * 1024, 4} },
19471 .block_erase = spi_block_erase_d8,
19472 }, {
19473 .eraseblocks = { {256 * 1024, 1} },
19474 .block_erase = spi_block_erase_60,
19475 }, {
19476 .eraseblocks = { {256 * 1024, 1} },
19477 .block_erase = spi_block_erase_c7,
19478 }
19479 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100019480 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19481 .unlock = spi_disable_blockprotect,
19482 .write = spi_chip_write_256,
19483 .read = spi_chip_read,
19484 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080019485 },
19486
19487 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100019488 .vendor = "Zetta Device",
19489 .name = "ZD25D40",
19490 .bustype = BUS_SPI,
19491 .manufacture_id = ZETTADEVICE_ID,
19492 .model_id = ZETTADEVICE_ZD25D40,
19493 .total_size = 512,
19494 .page_size = 256,
19495 .feature_bits = FEATURE_WRSR_WREN,
19496 .tested = TEST_UNTESTED,
19497 .probe = probe_spi_rdid,
19498 .probe_timing = TIMING_ZERO,
19499 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080019500 {
19501 {
19502 .eraseblocks = { {4 * 1024, 128} },
19503 .block_erase = spi_block_erase_20,
19504 }, {
19505 .eraseblocks = { {32 * 1024, 16} },
19506 .block_erase = spi_block_erase_52,
19507 }, {
19508 .eraseblocks = { {64 * 1024, 8} },
19509 .block_erase = spi_block_erase_d8,
19510 }, {
19511 .eraseblocks = { {512 * 1024, 1} },
19512 .block_erase = spi_block_erase_60,
19513 }, {
19514 .eraseblocks = { {512 * 1024, 1} },
19515 .block_erase = spi_block_erase_c7,
19516 }
19517 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100019518 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19519 .unlock = spi_disable_blockprotect,
19520 .write = spi_chip_write_256,
19521 .read = spi_chip_read,
19522 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080019523 },
19524
Stefan Taunerac1b4c82012-02-17 14:51:04 +000019525 {
Alan Greendd592202019-08-23 10:11:37 +100019526 .vendor = "Unknown",
19527 .name = "SFDP-capable chip",
19528 .bustype = BUS_SPI,
19529 .manufacture_id = GENERIC_MANUF_ID,
19530 .model_id = SFDP_DEVICE_ID,
19531 .total_size = 0, /* set by probing function */
19532 .page_size = 0, /* set by probing function */
19533 .feature_bits = 0, /* set by probing function */
19534 /* We present our own "report this" text hence we do not */
19535 /* want the default "This flash part has status UNTESTED..." */
19536 /* text to be printed. */
19537 .tested = TEST_OK_PREW,
19538 .probe = probe_spi_sfdp,
19539 .block_erasers = {}, /* set by probing function */
19540 .unlock = spi_disable_blockprotect, /* is this safe? */
19541 .write = NULL, /* set by probing function */
19542 .read = spi_chip_read,
19543 /* FIXME: some vendor extensions define this */
19544 .voltage = {0},
19545 },
19546
19547 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000019548 .vendor = "Programmer",
19549 .name = "Opaque flash chip",
19550 .bustype = BUS_PROG,
19551 .manufacture_id = PROGMANUF_ID,
19552 .model_id = PROGDEV_ID,
19553 .total_size = 0,
19554 .page_size = 256,
19555 /* probe is assumed to work, rest will be filled in by probe */
19556 .tested = TEST_OK_PROBE,
19557 .probe = probe_opaque,
19558 /* eraseblock sizes will be set by the probing function */
19559 .block_erasers =
19560 {
19561 {
19562 .block_erase = erase_opaque,
19563 }
19564 },
19565 .write = write_opaque,
19566 .read = read_opaque,
19567 },
19568
19569 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000019570 .vendor = "AMIC",
19571 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019572 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000019573 .manufacture_id = AMIC_ID,
19574 .model_id = GENERIC_DEVICE_ID,
19575 .total_size = 0,
19576 .page_size = 256,
19577 .tested = TEST_BAD_PREW,
19578 .probe = probe_spi_rdid4,
19579 .probe_timing = TIMING_ZERO,
19580 .write = NULL,
19581 .read = NULL,
19582 },
19583
19584 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019585 .vendor = "Atmel",
19586 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019587 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019588 .manufacture_id = ATMEL_ID,
19589 .model_id = GENERIC_DEVICE_ID,
19590 .total_size = 0,
19591 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019592 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019593 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019594 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019595 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019596 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019597 },
19598
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019599 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000019600 .vendor = "Eon",
19601 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019602 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019603 .manufacture_id = EON_ID_NOPREFIX,
19604 .model_id = GENERIC_DEVICE_ID,
19605 .total_size = 0,
19606 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019607 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019608 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019609 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019610 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019611 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019612 },
19613
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019614 {
19615 .vendor = "Macronix",
19616 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019617 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000019618 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019619 .model_id = GENERIC_DEVICE_ID,
19620 .total_size = 0,
19621 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019622 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019623 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019624 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019625 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019626 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019627 },
19628
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019629 {
19630 .vendor = "PMC",
19631 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019632 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019633 .manufacture_id = PMC_ID,
19634 .model_id = GENERIC_DEVICE_ID,
19635 .total_size = 0,
19636 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019637 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019638 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019639 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019640 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019641 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019642 },
19643
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019644 {
19645 .vendor = "SST",
19646 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019647 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019648 .manufacture_id = SST_ID,
19649 .model_id = GENERIC_DEVICE_ID,
19650 .total_size = 0,
19651 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019652 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019653 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019654 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019655 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019656 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019657 },
19658
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019659 {
19660 .vendor = "ST",
19661 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019662 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019663 .manufacture_id = ST_ID,
19664 .model_id = GENERIC_DEVICE_ID,
19665 .total_size = 0,
19666 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019667 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019668 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019669 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019670 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019671 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019672 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000019673
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019674 {
Sean Nelson118e1d62009-11-24 02:08:11 +000019675 .vendor = "Sanyo",
19676 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019677 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000019678 .manufacture_id = SANYO_ID,
19679 .model_id = GENERIC_DEVICE_ID,
19680 .total_size = 0,
19681 .page_size = 256,
19682 .tested = TEST_BAD_PREW,
19683 .probe = probe_spi_rdid,
19684 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000019685 .write = NULL,
19686 .read = NULL,
19687 },
19688
19689 {
Stefan Taunereb582572012-09-21 12:52:50 +000019690 .vendor = "Winbond",
19691 .name = "unknown Winbond (ex Nexcom) SPI chip",
19692 .bustype = BUS_SPI,
19693 .manufacture_id = WINBOND_NEX_ID,
19694 .model_id = GENERIC_DEVICE_ID,
19695 .total_size = 0,
19696 .page_size = 256,
19697 .tested = TEST_BAD_PREW,
19698 .probe = probe_spi_rdid,
19699 .probe_timing = TIMING_ZERO,
19700 .write = NULL,
19701 .read = NULL,
19702 },
19703
19704 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019705 .vendor = "Generic",
19706 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019707 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019708 .manufacture_id = GENERIC_MANUF_ID,
19709 .model_id = GENERIC_DEVICE_ID,
19710 .total_size = 0,
19711 .page_size = 256,
19712 .tested = TEST_BAD_PREW,
19713 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019714 .write = NULL,
19715 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000019716
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019717 {
19718 .vendor = "Generic",
19719 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019720 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019721 .manufacture_id = GENERIC_MANUF_ID,
19722 .model_id = GENERIC_DEVICE_ID,
19723 .total_size = 0,
19724 .page_size = 256,
19725 .tested = TEST_BAD_PREW,
19726 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019727 .write = NULL,
19728 },
19729
Stefan Tauner96658be2014-05-26 22:05:31 +000019730 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000019731};
Stefan Tauner96658be2014-05-26 22:05:31 +000019732
19733const unsigned int flashchips_size = ARRAY_SIZE(flashchips);