blob: 736f1b3ae0c6921abecd8a5629faf2284c02d3db [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 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005320 .eraseblocks = { {32 * 1024, 64} },
5321 .block_erase = spi_block_erase_d8,
5322 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05305323 .eraseblocks = { {64 * 1024, 32} },
5324 .block_erase = spi_block_erase_52,
5325 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005326 .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 */
Nico Huber3f3c1f32022-05-28 16:48:26 +02006299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2,
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 */
Nico Huber3f3c1f32022-05-28 16:48:26 +02006465 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR_EXT2,
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 |
Nico Huber3f3c1f32022-05-28 16:48:26 +02006719 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
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 */
David Hendricks61818dc2018-10-28 01:02:21 +00007434 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7435 .tested = TEST_OK_PREW,
7436 .probe = probe_spi_rdid,
7437 .probe_timing = TIMING_ZERO,
7438 .block_erasers =
7439 {
7440 {
7441 .eraseblocks = { {4 * 1024, 8192} },
7442 .block_erase = spi_block_erase_21,
7443 }, {
7444 .eraseblocks = { {4 * 1024, 8192} },
7445 .block_erase = spi_block_erase_20,
7446 /* could also use spi_block_erase_d7 */
7447 }, {
7448 .eraseblocks = { {32 * 1024, 1024} },
7449 .block_erase = spi_block_erase_5c,
7450 }, {
7451 .eraseblocks = { {32 * 1024, 1024} },
7452 .block_erase = spi_block_erase_52,
7453 }, {
7454 .eraseblocks = { {64 * 1024, 512} },
7455 .block_erase = spi_block_erase_dc,
7456 }, {
7457 .eraseblocks = { {64 * 1024, 512} },
7458 .block_erase = spi_block_erase_d8,
7459 }, {
7460 .eraseblocks = { {32 * 1024 * 1024, 1} },
7461 .block_erase = spi_block_erase_60,
7462 }, {
7463 .eraseblocks = { {32 * 1024 * 1024, 1} },
7464 .block_erase = spi_block_erase_c7,
7465 }
7466 },
7467 .unlock = spi_disable_blockprotect,
7468 .write = spi_chip_write_256,
7469 .read = spi_chip_read,
7470 .voltage = {2300, 3600},
7471 },
7472
7473 {
7474 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007475 .name = "IS25WP032",
7476 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007477 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007478 .model_id = ISSI_IS25WP032,
7479 .total_size = 4096,
7480 .page_size = 256,
7481 /* OTP: 1024B total; read 0x48; write 0x42 */
7482 /* QPI enable 0x35, disable 0xF5 */
7483 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7484 .tested = TEST_UNTESTED,
7485 .probe = probe_spi_rdid,
7486 .probe_timing = TIMING_ZERO,
7487 .block_erasers =
7488 {
7489 {
7490 .eraseblocks = { {4 * 1024, 1024} },
7491 .block_erase = spi_block_erase_20,
7492 }, {
7493 .eraseblocks = { {4 * 1024, 1024} },
7494 .block_erase = spi_block_erase_d7,
7495 }, {
7496 .eraseblocks = { {32 * 1024, 128} },
7497 .block_erase = spi_block_erase_52,
7498 }, {
7499 .eraseblocks = { {64 * 1024, 64} },
7500 .block_erase = spi_block_erase_d8,
7501 }, {
7502 .eraseblocks = { {4 * 1024 * 1024, 1} },
7503 .block_erase = spi_block_erase_60,
7504 }, {
7505 .eraseblocks = { {4 * 1024 * 1024, 1} },
7506 .block_erase = spi_block_erase_c7,
7507 }
7508 },
7509 .unlock = spi_disable_blockprotect,
7510 .write = spi_chip_write_256,
7511 .read = spi_chip_read,
7512 .voltage = {1650, 1950},
7513 },
7514
7515 {
7516 .vendor = "ISSI",
7517 .name = "IS25WP064",
7518 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007519 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007520 .model_id = ISSI_IS25WP064,
7521 .total_size = 8192,
7522 .page_size = 256,
7523 /* OTP: 1024B total; read 0x48; write 0x42 */
7524 /* QPI enable 0x35, disable 0xF5 */
7525 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7526 .tested = TEST_OK_PREW,
7527 .probe = probe_spi_rdid,
7528 .probe_timing = TIMING_ZERO,
7529 .block_erasers =
7530 {
7531 {
7532 .eraseblocks = { {4 * 1024, 2048} },
7533 .block_erase = spi_block_erase_20,
7534 }, {
7535 .eraseblocks = { {4 * 1024, 2048} },
7536 .block_erase = spi_block_erase_d7,
7537 }, {
7538 .eraseblocks = { {32 * 1024, 256} },
7539 .block_erase = spi_block_erase_52,
7540 }, {
7541 .eraseblocks = { {64 * 1024, 128} },
7542 .block_erase = spi_block_erase_d8,
7543 }, {
7544 .eraseblocks = { {8 * 1024 * 1024, 1} },
7545 .block_erase = spi_block_erase_60,
7546 }, {
7547 .eraseblocks = { {8 * 1024 * 1024, 1} },
7548 .block_erase = spi_block_erase_c7,
7549 }
7550 },
7551 .unlock = spi_disable_blockprotect,
7552 .write = spi_chip_write_256,
7553 .read = spi_chip_read,
7554 .voltage = {1650, 1950},
7555 },
7556
7557 {
7558 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007559 .name = "IS25WP128",
7560 .bustype = BUS_SPI,
7561 .manufacture_id = ISSI_ID_SPI,
7562 .model_id = ISSI_IS25WP128,
7563 .total_size = 16384,
7564 .page_size = 256,
7565 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huberb27b8d12018-10-02 20:46:21 +02007566 /* QPI enable 0x35, disable 0xF5 */
7567 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
David Hendricks3083ed92017-05-02 13:25:56 -07007568 .tested = TEST_OK_PREW,
7569 .probe = probe_spi_rdid,
7570 .probe_timing = TIMING_ZERO,
7571 .block_erasers =
7572 {
7573 {
7574 .eraseblocks = { {4 * 1024, 4096} },
7575 .block_erase = spi_block_erase_20,
7576 }, {
7577 .eraseblocks = { {4 * 1024, 4096} },
7578 .block_erase = spi_block_erase_d7,
7579 }, {
7580 .eraseblocks = { {32 * 1024, 512} },
7581 .block_erase = spi_block_erase_52,
7582 }, {
7583 .eraseblocks = { {64 * 1024, 256} },
7584 .block_erase = spi_block_erase_d8,
7585 }, {
7586 .eraseblocks = { {16 * 1024 * 1024, 1} },
7587 .block_erase = spi_block_erase_60,
7588 }, {
7589 .eraseblocks = { {16 * 1024 * 1024, 1} },
7590 .block_erase = spi_block_erase_c7,
7591 }
7592 },
7593 .unlock = spi_disable_blockprotect,
7594 .write = spi_chip_write_256,
7595 .read = spi_chip_read,
7596 .voltage = {1650, 1950},
7597 },
7598
7599 {
7600 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007601 .name = "IS25WP256",
7602 .bustype = BUS_SPI,
7603 .manufacture_id = ISSI_ID_SPI,
7604 .model_id = ISSI_IS25WP256,
7605 .total_size = 32768,
7606 .page_size = 256,
7607 /* supports SFDP */
7608 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
David Hendricks61818dc2018-10-28 01:02:21 +00007609 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7610 .tested = TEST_OK_PREW,
7611 .probe = probe_spi_rdid,
7612 .probe_timing = TIMING_ZERO,
7613 .block_erasers =
7614 {
7615 {
7616 .eraseblocks = { {4 * 1024, 8192} },
7617 .block_erase = spi_block_erase_21,
7618 }, {
7619 .eraseblocks = { {4 * 1024, 8192} },
7620 .block_erase = spi_block_erase_20,
7621 /* could also use spi_block_erase_d7 */
7622 }, {
7623 .eraseblocks = { {32 * 1024, 1024} },
7624 .block_erase = spi_block_erase_5c,
7625 }, {
7626 .eraseblocks = { {32 * 1024, 1024} },
7627 .block_erase = spi_block_erase_52,
7628 }, {
7629 .eraseblocks = { {64 * 1024, 512} },
7630 .block_erase = spi_block_erase_dc,
7631 }, {
7632 .eraseblocks = { {64 * 1024, 512} },
7633 .block_erase = spi_block_erase_d8,
7634 }, {
7635 .eraseblocks = { {32 * 1024 * 1024, 1} },
7636 .block_erase = spi_block_erase_60,
7637 }, {
7638 .eraseblocks = { {32 * 1024 * 1024, 1} },
7639 .block_erase = spi_block_erase_c7,
7640 }
7641 },
7642 .unlock = spi_disable_blockprotect,
7643 .write = spi_chip_write_256,
7644 .read = spi_chip_read,
7645 .voltage = {1650, 1950},
7646 },
7647
7648 {
7649 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007650 .name = "IS29GL064B",
7651 .bustype = BUS_PARALLEL,
7652 .manufacture_id = ISSI_ID,
7653 .model_id = ISSI_PMC_IS29GL064B,
7654 .total_size = 8192,
7655 .page_size = 128 * 1024, /* actual page size is 16 */
7656 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7657 .tested = TEST_UNTESTED,
7658 .probe = probe_jedec_29gl,
7659 .probe_timing = TIMING_ZERO,
7660 .block_erasers =
7661 {
7662 {
7663 .eraseblocks = {
7664 {8 * 1024, 8},
7665 {64 * 1024, 127},
7666 },
7667 .block_erase = erase_sector_jedec,
7668 }, {
7669 .eraseblocks = { {8 * 1024 * 1024, 1} },
7670 .block_erase = erase_chip_block_jedec,
7671 },
7672 },
7673 .write = write_jedec_1,
7674 .read = read_memmapped,
7675 .voltage = {2700, 3600},
7676 },
7677
7678 {
7679 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007680 .name = "IS29GL064H/L",
7681 .bustype = BUS_PARALLEL,
7682 .manufacture_id = ISSI_ID,
7683 .model_id = ISSI_PMC_IS29GL064HL,
7684 .total_size = 8192,
7685 .page_size = 128 * 1024, /* actual page size is 16 */
7686 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7687 .tested = TEST_UNTESTED,
7688 .probe = probe_jedec_29gl,
7689 .probe_timing = TIMING_ZERO,
7690 .block_erasers =
7691 {
7692 {
7693 .eraseblocks = { {64 * 1024, 128} },
7694 .block_erase = erase_sector_jedec,
7695 }, {
7696 .eraseblocks = { {8 * 1024 * 1024, 1} },
7697 .block_erase = erase_chip_block_jedec,
7698 },
7699 },
7700 .write = write_jedec_1,
7701 .read = read_memmapped,
7702 .voltage = {2700, 3600},
7703 },
7704
7705 {
7706 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007707 .name = "IS29GL064T",
7708 .bustype = BUS_PARALLEL,
7709 .manufacture_id = ISSI_ID,
7710 .model_id = ISSI_PMC_IS29GL064T,
7711 .total_size = 8192,
7712 .page_size = 128 * 1024, /* actual page size is 16 */
7713 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7714 .tested = TEST_UNTESTED,
7715 .probe = probe_jedec_29gl,
7716 .probe_timing = TIMING_ZERO,
7717 .block_erasers =
7718 {
7719 {
7720 .eraseblocks = {
7721 {64 * 1024, 127},
7722 {8 * 1024, 8},
7723 },
7724 .block_erase = erase_sector_jedec,
7725 }, {
7726 .eraseblocks = { {8 * 1024 * 1024, 1} },
7727 .block_erase = erase_chip_block_jedec,
7728 },
7729 },
7730 .write = write_jedec_1,
7731 .read = read_memmapped,
7732 .voltage = {2700, 3600},
7733 },
7734
7735 {
7736 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007737 .name = "IS29GL128H/L",
7738 .bustype = BUS_PARALLEL,
7739 .manufacture_id = ISSI_ID,
7740 .model_id = ISSI_PMC_IS29GL128HL,
7741 .total_size = 16384,
7742 .page_size = 128 * 1024, /* actual page size is 16 */
7743 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7744 .tested = TEST_UNTESTED,
7745 .probe = probe_jedec_29gl,
7746 .probe_timing = TIMING_ZERO,
7747 .block_erasers =
7748 {
7749 {
7750 .eraseblocks = { {128 * 1024, 128} },
7751 .block_erase = erase_sector_jedec,
7752 }, {
7753 .eraseblocks = { {16 * 1024 * 1024, 1} },
7754 .block_erase = erase_chip_block_jedec,
7755 },
7756 },
7757 .write = write_jedec_1,
7758 .read = read_memmapped,
7759 .voltage = {2700, 3600},
7760 },
7761
7762 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007763 .vendor = "Intel",
7764 .name = "25F160S33B8",
7765 .bustype = BUS_SPI,
7766 .manufacture_id = INTEL_ID,
7767 .model_id = INTEL_25F160S33B8,
7768 .total_size = 2048,
7769 .page_size = 256,
7770 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7771 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7772 .tested = TEST_UNTESTED,
7773 .probe = probe_spi_rdid,
7774 .probe_timing = TIMING_ZERO,
7775 .block_erasers =
7776 {
7777 {
7778 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7779 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7780 * have no effect on the memory contents, but sets a flag in the SR.
7781 .eraseblocks = {
7782 {8 * 1024, 8},
7783 {64 * 1024, 31} // inaccessible
7784 },
7785 .block_erase = spi_block_erase_40,
7786 }, { */
7787 .eraseblocks = { {64 * 1024, 32} },
7788 .block_erase = spi_block_erase_d8,
7789 }, {
7790 .eraseblocks = { {2 * 1024 * 1024, 1} },
7791 .block_erase = spi_block_erase_c7,
7792 }
7793 },
7794 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7795 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7796 .write = spi_chip_write_256,
7797 .read = spi_chip_read, /* also fast read 0x0B */
7798 .voltage = {2700, 3600},
7799 },
7800
7801 {
7802 .vendor = "Intel",
7803 .name = "25F160S33T8",
7804 .bustype = BUS_SPI,
7805 .manufacture_id = INTEL_ID,
7806 .model_id = INTEL_25F160S33T8,
7807 .total_size = 2048,
7808 .page_size = 256,
7809 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7810 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7811 .tested = TEST_UNTESTED,
7812 .probe = probe_spi_rdid,
7813 .probe_timing = TIMING_ZERO,
7814 .block_erasers =
7815 {
7816 {
7817 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7818 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7819 * have no effect on the memory contents, but sets a flag in the SR.
7820 .eraseblocks = {
7821 {64 * 1024, 31}, // inaccessible
7822 {8 * 1024, 8}
7823 },
7824 .block_erase = spi_block_erase_40,
7825 }, { */
7826 .eraseblocks = { {64 * 1024, 32} },
7827 .block_erase = spi_block_erase_d8,
7828 }, {
7829 .eraseblocks = { {2 * 1024 * 1024, 1} },
7830 .block_erase = spi_block_erase_c7,
7831 }
7832 },
7833 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7834 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7835 .write = spi_chip_write_256,
7836 .read = spi_chip_read, /* also fast read 0x0B */
7837 .voltage = {2700, 3600},
7838 },
7839
7840 {
7841 .vendor = "Intel",
7842 .name = "25F320S33B8",
7843 .bustype = BUS_SPI,
7844 .manufacture_id = INTEL_ID,
7845 .model_id = INTEL_25F320S33B8,
7846 .total_size = 4096,
7847 .page_size = 256,
7848 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7849 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7850 .tested = TEST_UNTESTED,
7851 .probe = probe_spi_rdid,
7852 .probe_timing = TIMING_ZERO,
7853 .block_erasers =
7854 {
7855 {
7856 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7857 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7858 * have no effect on the memory contents, but sets a flag in the SR.
7859 .eraseblocks = {
7860 {8 * 1024, 8},
7861 {64 * 1024, 63} // inaccessible
7862 },
7863 .block_erase = spi_block_erase_40,
7864 }, { */
7865 .eraseblocks = { {64 * 1024, 64} },
7866 .block_erase = spi_block_erase_d8,
7867 }, {
7868 .eraseblocks = { {4 * 1024 * 1024, 1} },
7869 .block_erase = spi_block_erase_c7,
7870 }
7871 },
7872 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7873 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7874 .write = spi_chip_write_256,
7875 .read = spi_chip_read, /* also fast read 0x0B */
7876 .voltage = {2700, 3600},
7877 },
7878
7879 {
7880 .vendor = "Intel",
7881 .name = "25F320S33T8",
7882 .bustype = BUS_SPI,
7883 .manufacture_id = INTEL_ID,
7884 .model_id = INTEL_25F320S33T8,
7885 .total_size = 4096,
7886 .page_size = 256,
7887 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7889 .tested = TEST_UNTESTED,
7890 .probe = probe_spi_rdid,
7891 .probe_timing = TIMING_ZERO,
7892 .block_erasers =
7893 {
7894 {
7895 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7896 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7897 * have no effect on the memory contents, but sets a flag in the SR.
7898 .eraseblocks = {
7899 {64 * 1024, 63}, // inaccessible
7900 {8 * 1024, 8}
7901 },
7902 .block_erase = spi_block_erase_40,
7903 }, { */
7904 .eraseblocks = { {64 * 1024, 64} },
7905 .block_erase = spi_block_erase_d8,
7906 }, {
7907 .eraseblocks = { {4 * 1024 * 1024, 1} },
7908 .block_erase = spi_block_erase_c7,
7909 }
7910 },
7911 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7912 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7913 .write = spi_chip_write_256,
7914 .read = spi_chip_read, /* also fast read 0x0B */
7915 .voltage = {2700, 3600},
7916 },
7917
7918 {
7919 .vendor = "Intel",
7920 .name = "25F640S33B8",
7921 .bustype = BUS_SPI,
7922 .manufacture_id = INTEL_ID,
7923 .model_id = INTEL_25F640S33B8,
7924 .total_size = 8192,
7925 .page_size = 256,
7926 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7927 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02007928 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007929 .probe = probe_spi_rdid,
7930 .probe_timing = TIMING_ZERO,
7931 .block_erasers =
7932 {
7933 {
7934 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7935 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7936 * have no effect on the memory contents, but sets a flag in the SR.
7937 .eraseblocks = {
7938 {8 * 1024, 8},
7939 {64 * 1024, 127} // inaccessible
7940 },
7941 .block_erase = spi_block_erase_40,
7942 }, { */
7943 .eraseblocks = { {64 * 1024, 128} },
7944 .block_erase = spi_block_erase_d8,
7945 }, {
7946 .eraseblocks = { {8 * 1024 * 1024, 1} },
7947 .block_erase = spi_block_erase_c7,
7948 }
7949 },
7950 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7951 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7952 .write = spi_chip_write_256,
7953 .read = spi_chip_read, /* also fast read 0x0B */
7954 .voltage = {2700, 3600},
7955 },
7956
7957 {
7958 .vendor = "Intel",
7959 .name = "25F640S33T8",
7960 .bustype = BUS_SPI,
7961 .manufacture_id = INTEL_ID,
7962 .model_id = INTEL_25F640S33T8,
7963 .total_size = 8192,
7964 .page_size = 256,
7965 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7966 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7967 .tested = TEST_UNTESTED,
7968 .probe = probe_spi_rdid,
7969 .probe_timing = TIMING_ZERO,
7970 .block_erasers =
7971 {
7972 {
7973 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7974 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7975 * have no effect on the memory contents, but sets a flag in the SR.
7976 .eraseblocks = {
7977 {64 * 1024, 127}, // inaccessible
7978 {8 * 1024, 8}
7979 },
7980 .block_erase = spi_block_erase_40,
7981 }, { */
7982 .eraseblocks = { {64 * 1024, 128} },
7983 .block_erase = spi_block_erase_d8,
7984 }, {
7985 .eraseblocks = { {8 * 1024 * 1024, 1} },
7986 .block_erase = spi_block_erase_c7,
7987 }
7988 },
7989 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7990 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7991 .write = spi_chip_write_256,
7992 .read = spi_chip_read, /* also fast read 0x0B */
7993 .voltage = {2700, 3600},
7994 },
7995
7996 {
7997 .vendor = "Intel",
7998 .name = "28F001BN/BX-B",
7999 .bustype = BUS_PARALLEL,
8000 .manufacture_id = INTEL_ID,
8001 .model_id = INTEL_28F001B,
8002 .total_size = 128,
8003 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8004 .tested = TEST_UNTESTED,
8005 .probe = probe_jedec,
8006 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8007 .block_erasers =
8008 {
8009 {
8010 .eraseblocks = {
8011 {8 * 1024, 1},
8012 {4 * 1024, 2},
8013 {112 * 1024, 1},
8014 },
8015 .block_erase = erase_block_82802ab,
8016 },
8017 },
8018 .write = write_82802ab,
8019 .read = read_memmapped,
8020 .voltage = {4500, 5500},
8021 },
8022
8023 {
8024 .vendor = "Intel",
8025 .name = "28F001BN/BX-T",
8026 .bustype = BUS_PARALLEL,
8027 .manufacture_id = INTEL_ID,
8028 .model_id = INTEL_28F001T,
8029 .total_size = 128,
8030 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
8031 .tested = TEST_OK_PREW,
8032 .probe = probe_jedec,
8033 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8034 .block_erasers =
8035 {
8036 {
8037 .eraseblocks = {
8038 {112 * 1024, 1},
8039 {4 * 1024, 2},
8040 {8 * 1024, 1},
8041 },
8042 .block_erase = erase_block_82802ab,
8043 },
8044 },
8045 .write = write_82802ab,
8046 .read = read_memmapped,
8047 .voltage = {4500, 5500},
8048 },
8049
8050 {
8051 .vendor = "Intel",
8052 .name = "28F002BC/BL/BV/BX-T",
8053 .bustype = BUS_PARALLEL,
8054 .manufacture_id = INTEL_ID,
8055 .model_id = INTEL_28F002T,
8056 .total_size = 256,
8057 .page_size = 256 * 1024,
8058 .tested = TEST_OK_PRE,
8059 .probe = probe_82802ab,
8060 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8061 .block_erasers =
8062 {
8063 {
8064 .eraseblocks = {
8065 {128 * 1024, 1},
8066 {96 * 1024, 1},
8067 {8 * 1024, 2},
8068 {16 * 1024, 1},
8069 },
8070 .block_erase = erase_block_82802ab,
8071 },
8072 },
8073 .write = write_82802ab,
8074 .read = read_memmapped,
8075 },
8076
8077 {
8078 .vendor = "Intel",
8079 .name = "28F004B5/BE/BV/BX-B",
8080 .bustype = BUS_PARALLEL,
8081 .manufacture_id = INTEL_ID,
8082 .model_id = INTEL_28F004B,
8083 .total_size = 512,
8084 .page_size = 128 * 1024, /* maximal block size */
8085 .tested = TEST_UNTESTED,
8086 .probe = probe_82802ab,
8087 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8088 .block_erasers =
8089 {
8090 {
8091 .eraseblocks = {
8092 {16 * 1024, 1},
8093 {8 * 1024, 2},
8094 {96 * 1024, 1},
8095 {128 * 1024, 3},
8096 },
8097 .block_erase = erase_block_82802ab,
8098 },
8099 },
8100 .write = write_82802ab,
8101 .read = read_memmapped,
8102 },
8103
8104 {
8105 .vendor = "Intel",
8106 .name = "28F004B5/BE/BV/BX-T",
8107 .bustype = BUS_PARALLEL,
8108 .manufacture_id = INTEL_ID,
8109 .model_id = INTEL_28F004T,
8110 .total_size = 512,
8111 .page_size = 128 * 1024, /* maximal block size */
8112 .tested = TEST_UNTESTED,
8113 .probe = probe_82802ab,
8114 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8115 .block_erasers =
8116 {
8117 {
8118 .eraseblocks = {
8119 {128 * 1024, 3},
8120 {96 * 1024, 1},
8121 {8 * 1024, 2},
8122 {16 * 1024, 1},
8123 },
8124 .block_erase = erase_block_82802ab,
8125 },
8126 },
8127 .write = write_82802ab,
8128 .read = read_memmapped,
8129 },
8130
8131 {
8132 .vendor = "Intel",
8133 .name = "28F008S3/S5/SC",
8134 .bustype = BUS_PARALLEL,
8135 .manufacture_id = INTEL_ID,
8136 .model_id = INTEL_28F004S3,
8137 .total_size = 512,
8138 .page_size = 256,
8139 .tested = TEST_UNTESTED,
8140 .probe = probe_82802ab,
8141 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8142 .block_erasers =
8143 {
8144 {
8145 .eraseblocks = { {64 * 1024, 8} },
8146 .block_erase = erase_block_82802ab,
8147 },
8148 },
8149 .unlock = unlock_28f004s5,
8150 .write = write_82802ab,
8151 .read = read_memmapped,
8152 },
8153
8154 {
8155 .vendor = "Intel",
8156 .name = "28F400BV/BX/CE/CV-B",
8157 .bustype = BUS_PARALLEL,
8158 .manufacture_id = INTEL_ID,
8159 .model_id = INTEL_28F400B,
8160 .total_size = 512,
8161 .page_size = 128 * 1024, /* maximal block size */
8162 .feature_bits = FEATURE_ADDR_SHIFTED,
8163 .tested = TEST_UNTESTED,
8164 .probe = probe_82802ab,
8165 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8166 .block_erasers =
8167 {
8168 {
8169 .eraseblocks = {
8170 {16 * 1024, 1},
8171 {8 * 1024, 2},
8172 {96 * 1024, 1},
8173 {128 * 1024, 3},
8174 },
8175 .block_erase = erase_block_82802ab,
8176 },
8177 },
8178 .write = write_82802ab,
8179 .read = read_memmapped,
8180 },
8181
8182 {
8183 .vendor = "Intel",
8184 .name = "28F400BV/BX/CE/CV-T",
8185 .bustype = BUS_PARALLEL,
8186 .manufacture_id = INTEL_ID,
8187 .model_id = INTEL_28F400T,
8188 .total_size = 512,
8189 .page_size = 128 * 1024, /* maximal block size */
8190 .feature_bits = FEATURE_ADDR_SHIFTED,
8191 .tested = TEST_UNTESTED,
8192 .probe = probe_82802ab,
8193 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8194 .block_erasers =
8195 {
8196 {
8197 .eraseblocks = {
8198 {128 * 1024, 3},
8199 {96 * 1024, 1},
8200 {8 * 1024, 2},
8201 {16 * 1024, 1},
8202 },
8203 .block_erase = erase_block_82802ab,
8204 },
8205 },
8206 .write = write_82802ab,
8207 .read = read_memmapped,
8208 },
8209
8210 {
8211 .vendor = "Intel",
8212 .name = "82802AB",
8213 .bustype = BUS_FWH,
8214 .manufacture_id = INTEL_ID,
8215 .model_id = INTEL_82802AB,
8216 .total_size = 512,
8217 .page_size = 64 * 1024,
8218 .feature_bits = FEATURE_REGISTERMAP,
Alan Green88552572019-07-24 13:56:06 +10008219 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008220 .probe = probe_82802ab,
8221 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8222 .block_erasers =
8223 {
8224 {
8225 .eraseblocks = { {64 * 1024, 8} },
8226 .block_erase = erase_block_82802ab,
8227 },
8228 },
8229 .unlock = unlock_regspace2_uniform_64k,
8230 .write = write_82802ab,
8231 .read = read_memmapped,
8232 .voltage = {3000, 3600},
8233 },
8234
8235 {
8236 .vendor = "Intel",
8237 .name = "82802AC",
8238 .bustype = BUS_FWH,
8239 .manufacture_id = INTEL_ID,
8240 .model_id = INTEL_82802AC,
8241 .total_size = 1024,
8242 .page_size = 64 * 1024,
8243 .feature_bits = FEATURE_REGISTERMAP,
8244 .tested = TEST_OK_PR,
8245 .probe = probe_82802ab,
8246 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8247 .block_erasers =
8248 {
8249 {
8250 .eraseblocks = { {64 * 1024, 16} },
8251 .block_erase = erase_block_82802ab,
8252 },
8253 },
8254 .unlock = unlock_regspace2_uniform_64k,
8255 .write = write_82802ab,
8256 .read = read_memmapped,
8257 .voltage = {3000, 3600},
8258 },
8259
8260 {
8261 .vendor = "Macronix",
8262 .name = "MX23L12854",
8263 .bustype = BUS_SPI,
8264 .manufacture_id = MACRONIX_ID,
8265 .model_id = MACRONIX_MX23L12854,
8266 .total_size = 16384,
8267 .page_size = 256,
8268 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8269 .probe = probe_spi_rdid,
8270 .probe_timing = TIMING_ZERO,
8271 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8272 .read = spi_chip_read, /* Fast read (0x0B) supported */
8273 .voltage = {3000, 3600},
8274 },
8275
8276 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008277 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008278 .name = "MX23L1654",
8279 .bustype = BUS_SPI,
8280 .manufacture_id = MACRONIX_ID,
8281 .model_id = MACRONIX_MX23L1654,
8282 .total_size = 2048,
8283 .page_size = 256,
8284 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8285 .probe = probe_spi_rdid,
8286 .probe_timing = TIMING_ZERO,
8287 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8288 .read = spi_chip_read, /* Fast read (0x0B) supported */
8289 .voltage = {3000, 3600},
8290 },
8291
8292 {
8293 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008294 .name = "MX23L3254",
8295 .bustype = BUS_SPI,
8296 .manufacture_id = MACRONIX_ID,
8297 .model_id = MACRONIX_MX23L3254,
8298 .total_size = 4096,
8299 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00008300 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008301 .probe = probe_spi_rdid,
8302 .probe_timing = TIMING_ZERO,
8303 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8304 .read = spi_chip_read, /* Fast read (0x0B) supported */
8305 .voltage = {3000, 3600},
8306 },
8307
8308 {
8309 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008310 .name = "MX23L6454",
8311 .bustype = BUS_SPI,
8312 .manufacture_id = MACRONIX_ID,
8313 .model_id = MACRONIX_MX23L6454,
8314 .total_size = 8192,
8315 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008316 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00008317 .probe = probe_spi_rdid,
8318 .probe_timing = TIMING_ZERO,
8319 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8320 .read = spi_chip_read, /* Fast read (0x0B) supported */
8321 .voltage = {3000, 3600},
8322 },
8323
8324 {
8325 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00008326 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008327 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008328 .manufacture_id = MACRONIX_ID,
8329 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008330 .total_size = 128,
8331 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008332 /* MX25L1006E supports SFDP */
David Hendricks67db2eb2010-09-03 03:35:48 +00008333 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00008334 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008335 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008336 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008337 .block_erasers =
8338 {
8339 {
8340 .eraseblocks = { {4 * 1024, 32} },
8341 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008342 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008343 .eraseblocks = { {64 * 1024, 2} },
8344 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008345 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008346 .eraseblocks = { {128 * 1024, 1} },
8347 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008348 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008349 .eraseblocks = { {128 * 1024, 1} },
8350 .block_erase = spi_block_erase_c7,
8351 },
8352 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008353 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008354 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008355 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008356 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008357 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008358 },
8359
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008360 {
8361 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008362 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008363 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008364 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008365 .model_id = MACRONIX_MX25L12805D,
8366 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008367 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008368 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8369 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008370 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008371 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008372 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008373 .block_erasers =
8374 {
8375 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008376 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008377 .block_erase = spi_block_erase_20,
8378 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008379 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008380 .block_erase = spi_block_erase_d8,
8381 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008382 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008383 .block_erase = spi_block_erase_60,
8384 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008385 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008386 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008387 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008388 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008389 .printlock = spi_prettyprint_status_register_bp3_srwd,
8390 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008391 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008392 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008393 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008394 },
8395
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008396 {
8397 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08008398 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008399 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008400 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008401 .model_id = MACRONIX_MX25L12805D,
8402 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008403 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08008404 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10008405 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner8179be52011-06-04 13:13:34 +00008406 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008407 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008408 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008409 .block_erasers =
8410 {
8411 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008412 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008413 .block_erase = spi_block_erase_20,
8414 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008415 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008416 .block_erase = spi_block_erase_52,
8417 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008418 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008419 .block_erase = spi_block_erase_d8,
8420 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008421 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008422 .block_erase = spi_block_erase_60,
8423 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008424 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008425 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008426 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008427 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008428 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8429 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8430 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008431 .write = spi_chip_write_256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008432 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008433 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008434 },
8435
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008436 {
8437 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008438 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008439 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008440 .manufacture_id = MACRONIX_ID,
8441 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008442 .total_size = 2048,
8443 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008444 .feature_bits = FEATURE_WRSR_WREN,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00008445 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008446 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008447 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008448 .block_erasers =
8449 {
8450 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008451 .eraseblocks = { {64 * 1024, 32} },
8452 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008453 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008454 .eraseblocks = { {64 * 1024, 32} },
8455 .block_erase = spi_block_erase_d8,
8456 }, {
8457 .eraseblocks = { {2 * 1024 * 1024, 1} },
8458 .block_erase = spi_block_erase_60,
8459 }, {
8460 .eraseblocks = { {2 * 1024 * 1024, 1} },
8461 .block_erase = spi_block_erase_c7,
8462 },
8463 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008464 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00008465 .unlock = spi_disable_blockprotect,
8466 .write = spi_chip_write_256,
8467 .read = spi_chip_read, /* Fast read (0x0B) supported */
8468 .voltage = {2700, 3600},
8469 },
8470
8471 {
8472 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008473 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008474 .bustype = BUS_SPI,
8475 .manufacture_id = MACRONIX_ID,
8476 .model_id = MACRONIX_MX25L1605,
8477 .total_size = 2048,
8478 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008479 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008480 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8481 .tested = TEST_OK_PREW,
8482 .probe = probe_spi_rdid,
8483 .probe_timing = TIMING_ZERO,
8484 .block_erasers =
8485 {
8486 {
8487 .eraseblocks = { {4 * 1024, 512} },
8488 .block_erase = spi_block_erase_20,
8489 }, {
8490 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008491 .block_erase = spi_block_erase_52,
8492 }, {
8493 .eraseblocks = { {64 * 1024, 32} },
8494 .block_erase = spi_block_erase_d8,
8495 }, {
8496 .eraseblocks = { {2 * 1024 * 1024, 1} },
8497 .block_erase = spi_block_erase_60,
8498 }, {
8499 .eraseblocks = { {2 * 1024 * 1024, 1} },
8500 .block_erase = spi_block_erase_c7,
8501 },
8502 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008503 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008504 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008505 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008506 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
Stefan Tauner226037d2013-03-16 01:22:12 +00008507 .voltage = {2700, 3600},
8508 },
8509
8510 {
8511 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008512 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008513 .bustype = BUS_SPI,
8514 .manufacture_id = MACRONIX_ID,
8515 .model_id = MACRONIX_MX25L1605,
8516 .total_size = 2048,
8517 .page_size = 256,
8518 .feature_bits = FEATURE_WRSR_WREN,
8519 .tested = TEST_OK_PREW,
8520 .probe = probe_spi_rdid,
8521 .probe_timing = TIMING_ZERO,
8522 .block_erasers =
8523 {
8524 {
8525 .eraseblocks = { {4 * 1024, 512} },
8526 .block_erase = spi_block_erase_20,
8527 }, {
8528 .eraseblocks = { {64 * 1024, 32} },
8529 .block_erase = spi_block_erase_d8,
8530 }, {
8531 .eraseblocks = { {2 * 1024 * 1024, 1} },
8532 .block_erase = spi_block_erase_60,
8533 }, {
8534 .eraseblocks = { {2 * 1024 * 1024, 1} },
8535 .block_erase = spi_block_erase_c7,
8536 },
8537 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008538 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008539 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008540 .write = spi_chip_write_256,
8541 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008542 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008543 },
8544
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008545 {
8546 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008547 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008548 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008549 .manufacture_id = MACRONIX_ID,
8550 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008551 .total_size = 2048,
8552 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008553 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8554 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Ponsc2054872021-01-15 18:57:32 +01008555 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008556 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008557 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008558 .block_erasers =
8559 {
8560 {
8561 .eraseblocks = { {4 * 1024, 512} },
8562 .block_erase = spi_block_erase_20,
8563 }, {
8564 .eraseblocks = { {64 * 1024, 32} },
8565 .block_erase = spi_block_erase_d8,
8566 }, {
8567 .eraseblocks = { {2 * 1024 * 1024, 1} },
8568 .block_erase = spi_block_erase_60,
8569 }, {
8570 .eraseblocks = { {2 * 1024 * 1024, 1} },
8571 .block_erase = spi_block_erase_c7,
8572 }
8573 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008574 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008575 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008576 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008577 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008578 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008579 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00008580
Stephan Guillouxf5c70902009-04-19 23:04:00 +00008581 {
8582 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00008583 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008584 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008585 .manufacture_id = MACRONIX_ID,
8586 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008587 .total_size = 2048,
8588 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008589 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8590 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008591 .tested = TEST_UNTESTED,
8592 .probe = probe_spi_rdid,
8593 .probe_timing = TIMING_ZERO,
8594 .block_erasers =
8595 {
8596 {
8597 .eraseblocks = { {4 * 1024, 512} },
8598 .block_erase = spi_block_erase_20,
8599 }, {
8600 .eraseblocks = { {64 * 1024, 32} },
8601 .block_erase = spi_block_erase_d8,
8602 }, {
8603 .eraseblocks = { {2 * 1024 * 1024, 1} },
8604 .block_erase = spi_block_erase_60,
8605 }, {
8606 .eraseblocks = { {2 * 1024 * 1024, 1} },
8607 .block_erase = spi_block_erase_c7,
8608 }
8609 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008610 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008611 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00008612 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008613 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00008614 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00008615 },
8616
8617 {
8618 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008619 .name = "MX25L2005(C)/MX25L2006E",
8620 .bustype = BUS_SPI,
8621 .manufacture_id = MACRONIX_ID,
8622 .model_id = MACRONIX_MX25L2005,
8623 .total_size = 256,
8624 .page_size = 256,
8625 .feature_bits = FEATURE_WRSR_WREN,
8626 .tested = TEST_OK_PREW,
8627 .probe = probe_spi_rdid,
8628 .probe_timing = TIMING_ZERO,
8629 .block_erasers =
8630 {
8631 {
8632 .eraseblocks = { {4 * 1024, 64} },
8633 .block_erase = spi_block_erase_20,
8634 }, {
8635 .eraseblocks = { {64 * 1024, 4} },
8636 .block_erase = spi_block_erase_52,
8637 }, {
8638 .eraseblocks = { {64 * 1024, 4} },
8639 .block_erase = spi_block_erase_d8,
8640 }, {
8641 .eraseblocks = { {256 * 1024, 1} },
8642 .block_erase = spi_block_erase_60,
8643 }, {
8644 .eraseblocks = { {256 * 1024, 1} },
8645 .block_erase = spi_block_erase_c7,
8646 },
8647 },
8648 .printlock = spi_prettyprint_status_register_bp1_srwd,
8649 .unlock = spi_disable_blockprotect,
8650 .write = spi_chip_write_256,
8651 .read = spi_chip_read, /* Fast read (0x0B) supported */
8652 .voltage = {2700, 3600},
8653 },
8654
8655 {
8656 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10008657 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008658 .bustype = BUS_SPI,
8659 .manufacture_id = MACRONIX_ID,
8660 .model_id = MACRONIX_MX25L25635F,
8661 .total_size = 32768,
8662 .page_size = 256,
8663 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8664 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
8665 .tested = TEST_OK_PREW,
8666 .probe = probe_spi_rdid,
8667 .probe_timing = TIMING_ZERO,
8668 .block_erasers =
8669 {
8670 {
8671 .eraseblocks = { {4 * 1024, 8192} },
8672 .block_erase = spi_block_erase_21,
8673 }, {
8674 .eraseblocks = { {4 * 1024, 8192} },
8675 .block_erase = spi_block_erase_20,
8676 }, {
8677 .eraseblocks = { {32 * 1024, 1024} },
8678 .block_erase = spi_block_erase_5c,
8679 }, {
8680 .eraseblocks = { {32 * 1024, 1024} },
8681 .block_erase = spi_block_erase_52,
8682 }, {
8683 .eraseblocks = { {64 * 1024, 512} },
8684 .block_erase = spi_block_erase_dc,
8685 }, {
8686 .eraseblocks = { {64 * 1024, 512} },
8687 .block_erase = spi_block_erase_d8,
8688 }, {
8689 .eraseblocks = { {32 * 1024 * 1024, 1} },
8690 .block_erase = spi_block_erase_60,
8691 }, {
8692 .eraseblocks = { {32 * 1024 * 1024, 1} },
8693 .block_erase = spi_block_erase_c7,
8694 }
8695 },
8696 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8697 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8698 .unlock = spi_disable_blockprotect_bp3_srwd,
8699 .write = spi_chip_write_256,
8700 .read = spi_chip_read, /* Fast read (0x0B) supported */
8701 .voltage = {2700, 3600},
8702 },
8703
8704 {
8705 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00008706 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008707 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008708 .manufacture_id = MACRONIX_ID,
8709 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008710 .total_size = 4096,
8711 .page_size = 256,
David Hendricks67db2eb2010-09-03 03:35:48 +00008712 .feature_bits = FEATURE_WRSR_WREN,
David Hendricks22e05322010-12-13 23:54:59 +00008713 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008714 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008715 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00008716 .block_erasers =
8717 {
8718 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008719 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008720 .block_erase = spi_block_erase_20,
8721 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008722 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00008723 .block_erase = spi_block_erase_d8,
8724 }, {
8725 .eraseblocks = { {4 * 1024 * 1024, 1} },
8726 .block_erase = spi_block_erase_60,
8727 }, {
8728 .eraseblocks = { {4 * 1024 * 1024, 1} },
8729 .block_erase = spi_block_erase_c7,
8730 },
8731 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008732 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008733 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008734 .write = spi_chip_write_256,
Stefan Tauner226037d2013-03-16 01:22:12 +00008735 .read = spi_chip_read, /* Fast read (0x0B) supported */
8736 .voltage = {2700, 3600},
8737 },
8738
8739 {
8740 .vendor = "Macronix",
8741 .name = "MX25L3205D/MX25L3208D",
8742 .bustype = BUS_SPI,
8743 .manufacture_id = MACRONIX_ID,
8744 .model_id = MACRONIX_MX25L3205,
8745 .total_size = 4096,
8746 .page_size = 256,
8747 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8749 .tested = TEST_OK_PREW,
8750 .probe = probe_spi_rdid,
8751 .probe_timing = TIMING_ZERO,
8752 .block_erasers =
8753 {
8754 {
8755 .eraseblocks = { {4 * 1024, 1024} },
8756 .block_erase = spi_block_erase_20,
8757 }, {
8758 .eraseblocks = { {64 * 1024, 64} },
8759 .block_erase = spi_block_erase_d8,
8760 }, {
8761 .eraseblocks = { {4 * 1024 * 1024, 1} },
8762 .block_erase = spi_block_erase_60,
8763 }, {
8764 .eraseblocks = { {4 * 1024 * 1024, 1} },
8765 .block_erase = spi_block_erase_c7,
8766 },
8767 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008768 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008769 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008770 .write = spi_chip_write_256,
8771 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8772 .voltage = {2700, 3600},
8773 },
8774
8775 {
8776 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008777 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008778 .bustype = BUS_SPI,
8779 .manufacture_id = MACRONIX_ID,
8780 .model_id = MACRONIX_MX25L3205,
8781 .total_size = 4096,
8782 .page_size = 256,
8783 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8784 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8785 .tested = TEST_OK_PREW,
8786 .probe = probe_spi_rdid,
8787 .probe_timing = TIMING_ZERO,
8788 .block_erasers =
8789 {
8790 {
8791 .eraseblocks = { {4 * 1024, 1024} },
8792 .block_erase = spi_block_erase_20,
8793 }, {
8794 .eraseblocks = { {64 * 1024, 64} },
8795 .block_erase = spi_block_erase_d8,
8796 }, {
8797 .eraseblocks = { {64 * 1024, 64} },
8798 .block_erase = spi_block_erase_52,
8799 }, {
8800 .eraseblocks = { {4 * 1024 * 1024, 1} },
8801 .block_erase = spi_block_erase_60,
8802 }, {
8803 .eraseblocks = { {4 * 1024 * 1024, 1} },
8804 .block_erase = spi_block_erase_c7,
8805 },
8806 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008807 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008808 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00008809 .write = spi_chip_write_256,
8810 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008811 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008812 },
8813
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008814 {
8815 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008816 .name = "MX25L3235D",
8817 .bustype = BUS_SPI,
8818 .manufacture_id = MACRONIX_ID,
8819 .model_id = MACRONIX_MX25L3235D,
8820 .total_size = 4096,
8821 .page_size = 256,
8822 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
8823 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8824 .tested = TEST_UNTESTED,
8825 .probe = probe_spi_rdid,
8826 .probe_timing = TIMING_ZERO,
8827 .block_erasers =
8828 {
8829 {
8830 .eraseblocks = { {4 * 1024, 1024} },
8831 .block_erase = spi_block_erase_20,
8832 }, {
8833 .eraseblocks = { {64 * 1024, 64} },
8834 .block_erase = spi_block_erase_d8,
8835 }, {
8836 .eraseblocks = { {4 * 1024 * 1024, 1} },
8837 .block_erase = spi_block_erase_60,
8838 }, {
8839 .eraseblocks = { {4 * 1024 * 1024, 1} },
8840 .block_erase = spi_block_erase_c7,
8841 }
8842 },
8843 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8844 .unlock = spi_disable_blockprotect_bp3_srwd,
8845 .write = spi_chip_write_256,
8846 .read = spi_chip_read,
8847 .voltage = {2700, 3600},
8848 },
8849
8850 {
8851 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02008852 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008853 .bustype = BUS_SPI,
8854 .manufacture_id = MACRONIX_ID,
8855 .model_id = MACRONIX_MX25L3205,
8856 .total_size = 4096,
8857 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02008858 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008859 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008860 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008861 .probe = probe_spi_rdid,
8862 .probe_timing = TIMING_ZERO,
8863 .block_erasers =
8864 {
8865 {
8866 .eraseblocks = { {4 * 1024, 1024} },
8867 .block_erase = spi_block_erase_20,
8868 }, {
8869 .eraseblocks = { {32 * 1024, 128} },
8870 .block_erase = spi_block_erase_52,
8871 }, {
8872 .eraseblocks = { {64 * 1024, 64} },
8873 .block_erase = spi_block_erase_d8,
8874 }, {
8875 .eraseblocks = { {4 * 1024 * 1024, 1} },
8876 .block_erase = spi_block_erase_60,
8877 }, {
8878 .eraseblocks = { {4 * 1024 * 1024, 1} },
8879 .block_erase = spi_block_erase_c7,
8880 },
8881 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008882 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00008883 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008884 .write = spi_chip_write_256,
8885 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Nico Huberb6683e02021-04-21 13:04:29 +02008886 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008887 },
8888
8889 {
8890 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008891 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008892 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008893 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008894 .model_id = MACRONIX_MX25L4005,
8895 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008896 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008897 .feature_bits = FEATURE_WRSR_WREN,
8898 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008899 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008900 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00008901 .block_erasers =
8902 {
8903 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008904 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00008905 .block_erase = spi_block_erase_20,
8906 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008907 .eraseblocks = { {64 * 1024, 8} },
8908 .block_erase = spi_block_erase_52,
8909 }, {
8910 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00008911 .block_erase = spi_block_erase_d8,
8912 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008913 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00008914 .block_erase = spi_block_erase_60,
8915 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008916 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00008917 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008918 },
Sean Nelson54596372010-01-09 05:30:14 +00008919 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008920 .printlock = spi_prettyprint_status_register_bp2_srwd,
8921 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008922 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008923 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008924 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00008925 },
8926
8927 {
8928 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008929 .name = "MX25L512(E)/MX25V512(C)",
8930 .bustype = BUS_SPI,
8931 .manufacture_id = MACRONIX_ID,
8932 .model_id = MACRONIX_MX25L512,
8933 .total_size = 64,
8934 .page_size = 256,
8935 /* MX25L512E supports SFDP */
8936 .feature_bits = FEATURE_WRSR_WREN,
8937 .tested = TEST_OK_PREW,
8938 .probe = probe_spi_rdid,
8939 .probe_timing = TIMING_ZERO,
8940 .block_erasers =
8941 {
8942 {
8943 .eraseblocks = { {4 * 1024, 16} },
8944 .block_erase = spi_block_erase_20,
8945 }, {
8946 .eraseblocks = { {64 * 1024, 1} },
8947 .block_erase = spi_block_erase_52,
8948 }, {
8949 .eraseblocks = { {64 * 1024, 1} },
8950 .block_erase = spi_block_erase_d8,
8951 }, {
8952 .eraseblocks = { {64 * 1024, 1} },
8953 .block_erase = spi_block_erase_60,
8954 }, {
8955 .eraseblocks = { {64 * 1024, 1} },
8956 .block_erase = spi_block_erase_c7,
8957 },
8958 },
8959 .printlock = spi_prettyprint_status_register_bp1_srwd,
8960 .unlock = spi_disable_blockprotect,
8961 .write = spi_chip_write_256,
8962 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
8963 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
8964 },
8965
8966 {
8967 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02008968 .name = "MX25L5121E",
8969 .bustype = BUS_SPI,
8970 .manufacture_id = MACRONIX_ID,
8971 .model_id = MACRONIX_MX25L5121E,
8972 .total_size = 64,
8973 .page_size = 32,
8974 .feature_bits = FEATURE_WRSR_WREN,
8975 .tested = TEST_OK_PREW,
8976 .probe = probe_spi_rdid,
8977 .probe_timing = TIMING_ZERO,
8978 .block_erasers =
8979 {
8980 {
8981 .eraseblocks = { {4 * 1024, 16} },
8982 .block_erase = spi_block_erase_20,
8983 }, {
8984 .eraseblocks = { {64 * 1024, 1} },
8985 .block_erase = spi_block_erase_52,
8986 }, {
8987 .eraseblocks = { {64 * 1024, 1} },
8988 .block_erase = spi_block_erase_d8,
8989 }, {
8990 .eraseblocks = { {64 * 1024, 1} },
8991 .block_erase = spi_block_erase_60,
8992 }, {
8993 .eraseblocks = { {64 * 1024, 1} },
8994 .block_erase = spi_block_erase_c7,
8995 },
8996 },
8997 .printlock = spi_prettyprint_status_register_bp1_srwd,
8998 .unlock = spi_disable_blockprotect,
8999 .write = spi_chip_write_256,
9000 .read = spi_chip_read, /* Fast read (0x0B) supported */
9001 .voltage = {2700, 3600},
9002 },
9003
9004 {
9005 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009006 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009007 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009008 .manufacture_id = MACRONIX_ID,
9009 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009010 .total_size = 8192,
9011 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009012 /* Has an additional 512B EEPROM sector */
9013 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00009014 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009015 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009016 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009017 .block_erasers =
9018 {
9019 {
9020 .eraseblocks = { {64 * 1024, 128} },
9021 .block_erase = spi_block_erase_20,
9022 }, {
9023 .eraseblocks = { {64 * 1024, 128} },
9024 .block_erase = spi_block_erase_d8,
9025 }, {
9026 .eraseblocks = { {8 * 1024 * 1024, 1} },
9027 .block_erase = spi_block_erase_60,
9028 }, {
9029 .eraseblocks = { {8 * 1024 * 1024, 1} },
9030 .block_erase = spi_block_erase_c7,
9031 }
9032 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009033 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009034 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009035 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009036 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009037 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009038 },
9039
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009040 {
9041 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009042 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00009043 .bustype = BUS_SPI,
9044 .manufacture_id = MACRONIX_ID,
9045 .model_id = MACRONIX_MX25L6405,
9046 .total_size = 8192,
9047 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009048 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009049 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9050 .tested = TEST_OK_PREW,
9051 .probe = probe_spi_rdid,
9052 .probe_timing = TIMING_ZERO,
9053 .block_erasers =
9054 {
9055 {
9056 .eraseblocks = { {4 * 1024, 2048} },
9057 .block_erase = spi_block_erase_20,
9058 }, {
9059 .eraseblocks = { {64 * 1024, 128} },
9060 .block_erase = spi_block_erase_d8,
9061 }, {
9062 .eraseblocks = { {8 * 1024 * 1024, 1} },
9063 .block_erase = spi_block_erase_60,
9064 }, {
9065 .eraseblocks = { {8 * 1024 * 1024, 1} },
9066 .block_erase = spi_block_erase_c7,
9067 }
9068 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009069 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009070 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009071 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009072 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
Stefan Tauner226037d2013-03-16 01:22:12 +00009073 .voltage = {2700, 3600},
9074 },
9075
9076 {
9077 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009078 .name = "MX25L6406E/MX25L6408E",
9079 .bustype = BUS_SPI,
9080 .manufacture_id = MACRONIX_ID,
9081 .model_id = MACRONIX_MX25L6405,
9082 .total_size = 8192,
9083 .page_size = 256,
9084 /* MX25L6406E supports SFDP */
9085 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
9086 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9087 .tested = TEST_OK_PREW,
9088 .probe = probe_spi_rdid,
9089 .probe_timing = TIMING_ZERO,
9090 .block_erasers =
9091 {
9092 {
9093 .eraseblocks = { {4 * 1024, 2048} },
9094 .block_erase = spi_block_erase_20,
9095 }, {
9096 .eraseblocks = { {64 * 1024, 128} },
9097 .block_erase = spi_block_erase_52,
9098 }, {
9099 .eraseblocks = { {64 * 1024, 128} },
9100 .block_erase = spi_block_erase_d8,
9101 }, {
9102 .eraseblocks = { {8 * 1024 * 1024, 1} },
9103 .block_erase = spi_block_erase_60,
9104 }, {
9105 .eraseblocks = { {8 * 1024 * 1024, 1} },
9106 .block_erase = spi_block_erase_c7,
9107 }
9108 },
9109 .printlock = spi_prettyprint_status_register_bp3_srwd,
9110 .unlock = spi_disable_blockprotect_bp3_srwd,
9111 .write = spi_chip_write_256,
9112 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
9113 .voltage = {2700, 3600},
9114 },
9115
9116 {
9117 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01009118 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00009119 .bustype = BUS_SPI,
9120 .manufacture_id = MACRONIX_ID,
9121 .model_id = MACRONIX_MX25L6405,
9122 .total_size = 8192,
9123 .page_size = 256,
9124 /* supports SFDP */
9125 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9126 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9127 .tested = TEST_OK_PREW,
9128 .probe = probe_spi_rdid,
9129 .probe_timing = TIMING_ZERO,
9130 .block_erasers =
9131 {
9132 {
9133 .eraseblocks = { {4 * 1024, 2048} },
9134 .block_erase = spi_block_erase_20,
9135 }, {
9136 .eraseblocks = { {32 * 1024, 256} },
9137 .block_erase = spi_block_erase_52,
9138 }, {
9139 .eraseblocks = { {64 * 1024, 128} },
9140 .block_erase = spi_block_erase_d8,
9141 }, {
9142 .eraseblocks = { {8 * 1024 * 1024, 1} },
9143 .block_erase = spi_block_erase_60,
9144 }, {
9145 .eraseblocks = { {8 * 1024 * 1024, 1} },
9146 .block_erase = spi_block_erase_c7,
9147 }
9148 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009149 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009150 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009151 .write = spi_chip_write_256,
9152 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9153 .voltage = {2700, 3600},
9154 },
9155
9156 {
9157 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009158 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009159 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009160 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009161 .model_id = MACRONIX_MX25L6495F,
9162 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009163 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009164 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009165 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009166 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009167 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009168 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009169 .block_erasers =
9170 {
9171 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009172 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +00009173 .block_erase = spi_block_erase_20,
9174 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009175 .eraseblocks = { {32 * 1024, 256} },
9176 .block_erase = spi_block_erase_52,
9177 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309178 .eraseblocks = { {64 * 1024, 128} },
9179 .block_erase = spi_block_erase_d8,
9180 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009181 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009182 .block_erase = spi_block_erase_60,
9183 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009184 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009185 .block_erase = spi_block_erase_c7,
9186 }
9187 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009188 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009189 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009190 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009191 .voltage = {2700, 3600},
9192 },
9193
9194 {
9195 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009196 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +00009197 .bustype = BUS_SPI,
9198 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009199 .model_id = MACRONIX_MX25L8005,
9200 .total_size = 1024,
9201 .page_size = 256,
9202 /* MX25L8006E, MX25L8008E support SFDP */
9203 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
9204 .feature_bits = FEATURE_WRSR_WREN,
9205 .tested = TEST_OK_PREW,
9206 .probe = probe_spi_rdid,
9207 .probe_timing = TIMING_ZERO,
9208 .block_erasers =
9209 {
9210 {
9211 .eraseblocks = { {4 * 1024, 256} },
9212 .block_erase = spi_block_erase_20,
9213 }, {
9214 .eraseblocks = { {64 * 1024, 16} },
9215 .block_erase = spi_block_erase_52,
9216 }, {
9217 .eraseblocks = { {64 * 1024, 16} },
9218 .block_erase = spi_block_erase_d8,
9219 }, {
9220 .eraseblocks = { {1024 * 1024, 1} },
9221 .block_erase = spi_block_erase_60,
9222 }, {
9223 .eraseblocks = { {1024 * 1024, 1} },
9224 .block_erase = spi_block_erase_c7,
9225 },
9226 },
9227 .printlock = spi_prettyprint_status_register_bp2_srwd,
9228 .unlock = spi_disable_blockprotect,
9229 .write = spi_chip_write_256,
9230 .read = spi_chip_read, /* Fast read (0x0B) supported */
9231 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9232 },
9233
9234 {
9235 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +09009236 .name = "MX25R3235F",
9237 .bustype = BUS_SPI,
9238 .manufacture_id = MACRONIX_ID,
9239 .model_id = MACRONIX_MX25R3235F,
9240 .total_size = 4096,
9241 .page_size = 256,
9242 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9244 .tested = TEST_OK_PREW,
9245 .probe = probe_spi_rdid,
9246 .probe_timing = TIMING_ZERO,
9247 .block_erasers =
9248 {
9249 {
9250 .eraseblocks = { {4 * 1024, 1024} },
9251 .block_erase = spi_block_erase_20,
9252 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009253 .eraseblocks = { {32 * 1024, 128} },
9254 .block_erase = spi_block_erase_52,
9255 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309256 .eraseblocks = { {64 * 1024, 64} },
9257 .block_erase = spi_block_erase_d8,
9258 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009259 .eraseblocks = { {4 * 1024 * 1024, 1} },
9260 .block_erase = spi_block_erase_60,
9261 }, {
9262 .eraseblocks = { {4 * 1024 * 1024, 1} },
9263 .block_erase = spi_block_erase_c7,
9264 }
9265 },
9266 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit 6 is quad enable */
9267 .unlock = spi_disable_blockprotect_bp3_srwd,
9268 .write = spi_chip_write_256,
9269 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9270 .voltage = {1650, 3600},
9271 },
9272
9273 {
9274 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009275 .name = "MX25R6435F",
9276 .bustype = BUS_SPI,
9277 .manufacture_id = MACRONIX_ID,
9278 .model_id = MACRONIX_MX25R6435F,
9279 .total_size = 8192,
9280 .page_size = 256,
9281 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9282 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9283 .tested = TEST_OK_PREW,
9284 .probe = probe_spi_rdid,
9285 .probe_timing = TIMING_ZERO,
9286 .block_erasers =
9287 {
9288 {
9289 .eraseblocks = { {4 * 1024, 2048} },
9290 .block_erase = spi_block_erase_20,
9291 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009292 .eraseblocks = { {32 * 1024, 256} },
9293 .block_erase = spi_block_erase_52,
9294 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309295 .eraseblocks = { {64 * 1024, 128} },
9296 .block_erase = spi_block_erase_d8,
9297 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009298 .eraseblocks = { {8 * 1024 * 1024, 1} },
9299 .block_erase = spi_block_erase_60,
9300 }, {
9301 .eraseblocks = { {8 * 1024 * 1024, 1} },
9302 .block_erase = spi_block_erase_c7,
9303 }
9304 },
9305 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9306 .unlock = spi_disable_blockprotect_bp3_srwd,
9307 .write = spi_chip_write_256,
9308 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9309 .voltage = {1650, 3600},
9310 },
9311
9312 {
9313 .vendor = "Macronix",
9314 .name = "MX25U12835F",
9315 .bustype = BUS_SPI,
9316 .manufacture_id = MACRONIX_ID,
9317 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009318 .total_size = 16384,
9319 .page_size = 256,
9320 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009321 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009322 .tested = TEST_OK_PREW,
9323 .probe = probe_spi_rdid,
9324 .probe_timing = TIMING_ZERO,
9325 .block_erasers =
9326 {
9327 {
9328 .eraseblocks = { {4 * 1024, 4096} },
9329 .block_erase = spi_block_erase_20,
9330 }, {
9331 .eraseblocks = { {32 * 1024, 512} },
9332 .block_erase = spi_block_erase_52,
9333 }, {
9334 .eraseblocks = { {64 * 1024, 256} },
9335 .block_erase = spi_block_erase_d8,
9336 }, {
9337 .eraseblocks = { {16 * 1024 * 1024, 1} },
9338 .block_erase = spi_block_erase_60,
9339 }, {
9340 .eraseblocks = { {16 * 1024 * 1024, 1} },
9341 .block_erase = spi_block_erase_c7,
9342 }
9343 },
Angel Ponsf112e242018-09-30 20:14:17 +02009344 /* TODO: security register */
9345 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9346 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009347 .write = spi_chip_write_256, /* Multi I/O supported */
Angel Ponsf112e242018-09-30 20:14:17 +02009348 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9349 .voltage = {1650, 2000},
9350 },
9351
9352 {
9353 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00009354 .name = "MX25U1635E",
9355 .bustype = BUS_SPI,
9356 .manufacture_id = MACRONIX_ID,
9357 .model_id = MACRONIX_MX25U1635E,
9358 .total_size = 2048,
9359 .page_size = 256,
9360 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9361 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9362 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009363 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00009364 .probe = probe_spi_rdid,
9365 .probe_timing = TIMING_ZERO,
9366 .block_erasers =
9367 {
9368 {
9369 .eraseblocks = { {4 * 1024, 512} },
9370 .block_erase = spi_block_erase_20,
9371 }, {
9372 .eraseblocks = { {32 * 1024, 64} },
9373 .block_erase = spi_block_erase_52,
9374 }, {
9375 .eraseblocks = { {64 * 1024, 32} },
9376 .block_erase = spi_block_erase_d8,
9377 }, {
9378 .eraseblocks = { {2 * 1024 * 1024, 1} },
9379 .block_erase = spi_block_erase_60,
9380 }, {
9381 .eraseblocks = { {2 * 1024 * 1024, 1} },
9382 .block_erase = spi_block_erase_c7,
9383 }
9384 },
9385 /* TODO: security register */
Stefan Tauner12f3d512014-05-27 21:27:27 +00009386 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009387 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00009388 .write = spi_chip_write_256,
9389 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9390 .voltage = {1650, 2000},
9391 },
9392
9393 {
9394 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07009395 .name = "MX25U25635F",
9396 .bustype = BUS_SPI,
9397 .manufacture_id = MACRONIX_ID,
9398 .model_id = MACRONIX_MX25U25635F,
9399 .total_size = 32768,
9400 .page_size = 256,
9401 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9402 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
Nikolai Artemiev148254b2021-03-23 17:21:10 +11009403 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009404 .probe = probe_spi_rdid,
9405 .probe_timing = TIMING_ZERO,
9406 .block_erasers =
9407 {
9408 {
9409 .eraseblocks = { {4 * 1024, 8192} },
9410 .block_erase = spi_block_erase_21,
9411 }, {
9412 .eraseblocks = { {4 * 1024, 8192} },
9413 .block_erase = spi_block_erase_20,
9414 }, {
9415 .eraseblocks = { {32 * 1024, 1024} },
9416 .block_erase = spi_block_erase_5c,
9417 }, {
9418 .eraseblocks = { {32 * 1024, 1024} },
9419 .block_erase = spi_block_erase_52,
9420 }, {
9421 .eraseblocks = { {64 * 1024, 512} },
9422 .block_erase = spi_block_erase_dc,
9423 }, {
9424 .eraseblocks = { {64 * 1024, 512} },
9425 .block_erase = spi_block_erase_d8,
9426 }, {
9427 .eraseblocks = { {32 * 1024 * 1024, 1} },
9428 .block_erase = spi_block_erase_60,
9429 }, {
9430 .eraseblocks = { {32 * 1024 * 1024, 1} },
9431 .block_erase = spi_block_erase_c7,
9432 }
9433 },
9434 /* TODO: security register */
9435 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9436 .unlock = spi_disable_blockprotect_bp3_srwd,
9437 .write = spi_chip_write_256, /* Multi I/O supported */
9438 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9439 .voltage = {1650, 2000},
9440 },
9441
9442 {
9443 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009444 .name = "MX25U3235E/F",
9445 .bustype = BUS_SPI,
9446 .manufacture_id = MACRONIX_ID,
9447 .model_id = MACRONIX_MX25U3235E,
9448 .total_size = 4096,
9449 .page_size = 256,
9450 /* F model supports SFDP */
9451 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9452 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9453 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9454 .tested = TEST_OK_PREW,
9455 .probe = probe_spi_rdid,
9456 .probe_timing = TIMING_ZERO,
9457 .block_erasers =
9458 {
9459 {
9460 .eraseblocks = { {4 * 1024, 1024} },
9461 .block_erase = spi_block_erase_20,
9462 }, {
9463 .eraseblocks = { {32 * 1024, 128} },
9464 .block_erase = spi_block_erase_52,
9465 }, {
9466 .eraseblocks = { {64 * 1024, 64} },
9467 .block_erase = spi_block_erase_d8,
9468 }, {
9469 .eraseblocks = { {4 * 1024 * 1024, 1} },
9470 .block_erase = spi_block_erase_60,
9471 }, {
9472 .eraseblocks = { {4 * 1024 * 1024, 1} },
9473 .block_erase = spi_block_erase_c7,
9474 }
9475 },
9476 /* TODO: security register */
9477 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9478 .unlock = spi_disable_blockprotect_bp3_srwd,
9479 .write = spi_chip_write_256,
9480 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9481 .voltage = {1650, 2000},
9482 },
9483
9484 {
9485 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +01009486 .name = "MX25U51245G",
9487 .bustype = BUS_SPI,
9488 .manufacture_id = MACRONIX_ID,
9489 .model_id = MACRONIX_MX25U51245G,
9490 .total_size = 65536,
9491 .page_size = 256,
9492 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
9493 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
9494 .tested = TEST_OK_PREW,
9495 .probe = probe_spi_rdid,
9496 .probe_timing = TIMING_ZERO,
9497 .block_erasers =
9498 {
9499 {
9500 .eraseblocks = { {4 * 1024, 16384} },
9501 .block_erase = spi_block_erase_21,
9502 }, {
9503 .eraseblocks = { {4 * 1024, 16384} },
9504 .block_erase = spi_block_erase_20,
9505 }, {
9506 .eraseblocks = { {32 * 1024, 2048} },
9507 .block_erase = spi_block_erase_5c,
9508 }, {
9509 .eraseblocks = { {32 * 1024, 2048} },
9510 .block_erase = spi_block_erase_52,
9511 }, {
9512 .eraseblocks = { {64 * 1024, 1024} },
9513 .block_erase = spi_block_erase_dc,
9514 }, {
9515 .eraseblocks = { {64 * 1024, 1024} },
9516 .block_erase = spi_block_erase_d8,
9517 }, {
9518 .eraseblocks = { {64 * 1024 * 1024, 1} },
9519 .block_erase = spi_block_erase_60,
9520 }, {
9521 .eraseblocks = { {64 * 1024 * 1024, 1} },
9522 .block_erase = spi_block_erase_c7,
9523 }
9524 },
9525 /* TODO: security register */
9526 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9527 .unlock = spi_disable_blockprotect_bp3_srwd,
9528 .write = spi_chip_write_256, /* Multi I/O supported */
9529 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9530 .voltage = {1650, 2000},
9531 },
9532
9533 {
9534 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009535 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009536 .bustype = BUS_SPI,
9537 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009538 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009539 .total_size = 8192,
9540 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009541 /* F model supports SFDP */
9542 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9543 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9544 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009545 .tested = TEST_OK_PREW,
9546 .probe = probe_spi_rdid,
9547 .probe_timing = TIMING_ZERO,
9548 .block_erasers =
9549 {
9550 {
9551 .eraseblocks = { {4 * 1024, 2048} },
9552 .block_erase = spi_block_erase_20,
9553 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009554 .eraseblocks = { {32 * 1024, 256} },
9555 .block_erase = spi_block_erase_52,
9556 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009557 .eraseblocks = { {64 * 1024, 128} },
9558 .block_erase = spi_block_erase_d8,
9559 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +00009560 .eraseblocks = { {8 * 1024 * 1024, 1} },
9561 .block_erase = spi_block_erase_60,
9562 }, {
9563 .eraseblocks = { {8 * 1024 * 1024, 1} },
9564 .block_erase = spi_block_erase_c7,
9565 }
9566 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009567 /* TODO: security register */
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009568 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9569 .unlock = spi_disable_blockprotect_bp3_srwd,
9570 .write = spi_chip_write_256,
9571 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green1f9cc7d2019-07-01 11:10:45 +10009572 .voltage = {1650, 2000},
9573 },
9574
9575 {
9576 .vendor = "Macronix",
9577 .name = "MX25U8032E",
9578 .bustype = BUS_SPI,
9579 .manufacture_id = MACRONIX_ID,
9580 .model_id = MACRONIX_MX25U8032E,
9581 .total_size = 1024,
9582 .page_size = 256,
9583 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9584 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9585 .tested = TEST_OK_PREW,
9586 .probe = probe_spi_rdid,
9587 .probe_timing = TIMING_ZERO,
9588 .block_erasers =
9589 {
9590 {
9591 .eraseblocks = { {4 * 1024, 256} },
9592 .block_erase = spi_block_erase_20,
9593 }, {
9594 .eraseblocks = { {32 * 1024, 32} },
9595 .block_erase = spi_block_erase_52,
9596 }, {
9597 .eraseblocks = { {64 * 1024, 16} },
9598 .block_erase = spi_block_erase_d8,
9599 }, {
9600 .eraseblocks = { {1024 * 1024, 1} },
9601 .block_erase = spi_block_erase_60,
9602 }, {
9603 .eraseblocks = { {1024 * 1024, 1} },
9604 .block_erase = spi_block_erase_c7,
9605 }
9606 },
9607 /* TODO: security register */
9608 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9609 .unlock = spi_disable_blockprotect_bp3_srwd,
9610 .write = spi_chip_write_256,
9611 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9612 .voltage = {1650, 2000},
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +01009613 },
9614
9615 {
9616 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +00009617 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009618 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009619 .manufacture_id = MACRONIX_ID,
9620 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009621 .total_size = 128,
9622 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009623 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9624 .tested = TEST_UNTESTED,
9625 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009626 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009627 .block_erasers =
9628 {
9629 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009630 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009631 {8 * 1024, 1},
9632 {4 * 1024, 2},
9633 {8 * 1024, 2},
9634 {32 * 1024, 1},
9635 {64 * 1024, 1},
9636 },
Sean Nelson35727f72010-01-28 23:55:12 +00009637 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009638 }, {
9639 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009640 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009641 }
9642 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009643 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009644 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009645 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009646 },
9647
9648 {
9649 .vendor = "Macronix",
9650 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009651 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009652 .manufacture_id = MACRONIX_ID,
9653 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009654 .total_size = 128,
9655 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009656 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +00009657 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009658 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009659 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009660 .block_erasers =
9661 {
9662 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00009663 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +00009664 {64 * 1024, 1},
9665 {32 * 1024, 1},
9666 {8 * 1024, 2},
9667 {4 * 1024, 2},
9668 {8 * 1024, 1},
9669 },
Sean Nelson35727f72010-01-28 23:55:12 +00009670 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009671 }, {
9672 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009673 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +00009674 }
9675 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009676 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +00009677 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009678 .voltage = {4500, 5500},
Mark Panajotovic502a9132009-08-24 01:42:24 +00009679 },
9680
9681 {
9682 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009683 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009684 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009685 .manufacture_id = MACRONIX_ID,
9686 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009687 .total_size = 256,
9688 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009689 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009690 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +00009691 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009692 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009693 .block_erasers =
9694 {
9695 {
9696 .eraseblocks = {
9697 {16 * 1024, 1},
9698 {8 * 1024, 2},
9699 {32 * 1024, 1},
9700 {64 * 1024, 3},
9701 },
Sean Nelson35727f72010-01-28 23:55:12 +00009702 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009703 }, {
9704 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009705 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009706 },
9707 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009708 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009709 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009710 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009711 },
9712
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009713 {
9714 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +00009715 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009716 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009717 .manufacture_id = MACRONIX_ID,
9718 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009719 .total_size = 256,
9720 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00009721 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00009722 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +00009723 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00009724 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009725 .block_erasers =
9726 {
9727 {
9728 .eraseblocks = {
9729 {64 * 1024, 3},
9730 {32 * 1024, 1},
9731 {8 * 1024, 2},
9732 {16 * 1024, 1},
9733 },
Sean Nelson35727f72010-01-28 23:55:12 +00009734 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009735 }, {
9736 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00009737 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009738 },
9739 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00009740 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00009741 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009742 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +00009743 },
9744
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009745 {
9746 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +00009747 .name = "MX29F022(N)B",
9748 .bustype = BUS_PARALLEL,
9749 .manufacture_id = MACRONIX_ID,
9750 .model_id = MACRONIX_MX29F022B,
9751 .total_size = 256,
9752 .page_size = 0, /* unused */
9753 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9754 .tested = TEST_UNTESTED,
9755 .probe = probe_jedec,
9756 .probe_timing = TIMING_ZERO,
9757 .block_erasers =
9758 {
9759 {
9760 .eraseblocks = {
9761 {16 * 1024, 1},
9762 {8 * 1024, 2},
9763 {32 * 1024, 1},
9764 {64 * 1024, 3},
9765 },
9766 .block_erase = erase_sector_jedec,
9767 }, {
9768 .eraseblocks = { {256 * 1024, 1} },
9769 .block_erase = erase_chip_block_jedec,
9770 }
9771 },
9772 .write = write_jedec_1,
9773 .read = read_memmapped,
9774 .voltage = {4500, 5500},
9775 },
9776
9777 {
9778 .vendor = "Macronix",
9779 .name = "MX29F022(N)T",
9780 .bustype = BUS_PARALLEL,
9781 .manufacture_id = MACRONIX_ID,
9782 .model_id = MACRONIX_MX29F022T,
9783 .total_size = 256,
9784 .page_size = 0, /* unused */
9785 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9786 .tested = TEST_OK_PREW,
9787 .probe = probe_jedec,
9788 .probe_timing = TIMING_ZERO,
9789 .block_erasers =
9790 {
9791 {
9792 .eraseblocks = {
9793 {64 * 1024, 3},
9794 {32 * 1024, 1},
9795 {8 * 1024, 2},
9796 {16 * 1024, 1},
9797 },
9798 .block_erase = erase_sector_jedec,
9799 }, {
9800 .eraseblocks = { {256 * 1024, 1} },
9801 .block_erase = erase_chip_block_jedec,
9802 }
9803 },
9804 .write = write_jedec_1,
9805 .read = read_memmapped,
9806 .voltage = {4500, 5500},
9807 },
9808
9809 {
9810 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +00009811 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009812 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00009813 .manufacture_id = MACRONIX_ID,
9814 .model_id = MACRONIX_MX29F040,
9815 .total_size = 512,
9816 .page_size = 64 * 1024,
9817 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9818 .tested = TEST_UNTESTED,
9819 .probe = probe_jedec,
9820 .probe_timing = TIMING_ZERO,
9821 .block_erasers =
9822 {
9823 {
9824 .eraseblocks = { {64 * 1024, 8} },
9825 .block_erase = erase_sector_jedec,
9826 }, {
9827 .eraseblocks = { {512 * 1024, 1} },
9828 .block_erase = erase_chip_block_jedec,
9829 },
9830 },
9831 .write = write_jedec_1,
9832 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009833 .voltage = {4500, 5500},
Joshua Roysf1324e02010-09-16 00:51:51 +00009834 },
9835
9836 {
9837 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009838 .name = "MX29GL128F",
9839 .bustype = BUS_PARALLEL,
9840 .manufacture_id = MACRONIX_ID,
9841 .model_id = MACRONIX_MX29GL128F,
9842 .total_size = 16384,
9843 .page_size = 128 * 1024, /* actual page size is 16 */
9844 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9845 .tested = TEST_UNTESTED,
9846 .probe = probe_jedec_29gl,
9847 .probe_timing = TIMING_ZERO,
9848 .block_erasers =
9849 {
9850 {
9851 .eraseblocks = { {128 * 1024, 128} },
9852 .block_erase = erase_sector_jedec,
9853 }, {
9854 .eraseblocks = { {16 * 1024 * 1024, 1} },
9855 .block_erase = erase_chip_block_jedec,
9856 },
9857 },
9858 .write = write_jedec_1,
9859 .read = read_memmapped,
9860 .voltage = {2700, 3600},
9861 },
9862
9863 {
9864 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009865 .name = "MX29GL320EB",
9866 .bustype = BUS_PARALLEL,
9867 .manufacture_id = MACRONIX_ID,
9868 .model_id = MACRONIX_MX29GL320EB,
9869 .total_size = 4096,
9870 .page_size = 128 * 1024, /* actual page size is 16 */
9871 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9872 .tested = TEST_UNTESTED,
9873 .probe = probe_jedec_29gl,
9874 .probe_timing = TIMING_ZERO,
9875 .block_erasers =
9876 {
9877 {
9878 .eraseblocks = {
9879 {8 * 1024, 8},
9880 {64 * 1024, 63},
9881 },
9882 .block_erase = erase_sector_jedec,
9883 }, {
9884 .eraseblocks = { {4 * 1024 * 1024, 1} },
9885 .block_erase = erase_chip_block_jedec,
9886 },
9887 },
9888 .write = write_jedec_1,
9889 .read = read_memmapped,
9890 .voltage = {2700, 3600},
9891 },
9892
9893 {
9894 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009895 .name = "MX29GL320EH/L",
9896 .bustype = BUS_PARALLEL,
9897 .manufacture_id = MACRONIX_ID,
9898 .model_id = MACRONIX_MX29GL320EHL,
9899 .total_size = 4096,
9900 .page_size = 128 * 1024, /* actual page size is 16 */
9901 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9902 .tested = TEST_UNTESTED,
9903 .probe = probe_jedec_29gl,
9904 .probe_timing = TIMING_ZERO,
9905 .block_erasers =
9906 {
9907 {
9908 .eraseblocks = { {64 * 1024, 64} },
9909 .block_erase = erase_sector_jedec,
9910 }, {
9911 .eraseblocks = { {4 * 1024 * 1024, 1} },
9912 .block_erase = erase_chip_block_jedec,
9913 },
9914 },
9915 .write = write_jedec_1,
9916 .read = read_memmapped,
9917 .voltage = {2700, 3600},
9918 },
9919
9920 {
9921 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009922 .name = "MX29GL320ET",
9923 .bustype = BUS_PARALLEL,
9924 .manufacture_id = MACRONIX_ID,
9925 .model_id = MACRONIX_MX29GL320ET,
9926 .total_size = 4096,
9927 .page_size = 128 * 1024, /* actual page size is 16 */
9928 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9929 .tested = TEST_UNTESTED,
9930 .probe = probe_jedec_29gl,
9931 .probe_timing = TIMING_ZERO,
9932 .block_erasers =
9933 {
9934 {
9935 .eraseblocks = {
9936 {64 * 1024, 63},
9937 {8 * 1024, 8},
9938 },
9939 .block_erase = erase_sector_jedec,
9940 }, {
9941 .eraseblocks = { {4 * 1024 * 1024, 1} },
9942 .block_erase = erase_chip_block_jedec,
9943 },
9944 },
9945 .write = write_jedec_1,
9946 .read = read_memmapped,
9947 .voltage = {2700, 3600},
9948 },
9949
9950 {
9951 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00009952 .name = "MX29GL640EB",
9953 .bustype = BUS_PARALLEL,
9954 .manufacture_id = MACRONIX_ID,
9955 .model_id = MACRONIX_MX29GL640EB,
9956 .total_size = 8192,
9957 .page_size = 128 * 1024, /* actual page size is 16 */
9958 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9959 .tested = TEST_UNTESTED,
9960 .probe = probe_jedec_29gl,
9961 .probe_timing = TIMING_ZERO,
9962 .block_erasers =
9963 {
9964 {
9965 .eraseblocks = {
9966 {8 * 1024, 8},
9967 {64 * 1024, 127},
9968 },
9969 .block_erase = erase_sector_jedec,
9970 }, {
9971 .eraseblocks = { {8 * 1024 * 1024, 1} },
9972 .block_erase = erase_chip_block_jedec,
9973 },
9974 },
9975 .write = write_jedec_1,
9976 .read = read_memmapped,
9977 .voltage = {2700, 3600},
9978 },
9979
9980 {
9981 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009982 .name = "MX29GL640EH/L",
9983 .bustype = BUS_PARALLEL,
9984 .manufacture_id = MACRONIX_ID,
9985 .model_id = MACRONIX_MX29GL640EHL,
9986 .total_size = 8192,
9987 .page_size = 128 * 1024, /* actual page size is 16 */
9988 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9989 .tested = TEST_UNTESTED,
9990 .probe = probe_jedec_29gl,
9991 .probe_timing = TIMING_ZERO,
9992 .block_erasers =
9993 {
9994 {
9995 .eraseblocks = { {64 * 1024, 128} },
9996 .block_erase = erase_sector_jedec,
9997 }, {
9998 .eraseblocks = { {8 * 1024 * 1024, 1} },
9999 .block_erase = erase_chip_block_jedec,
10000 },
10001 },
10002 .write = write_jedec_1,
10003 .read = read_memmapped,
10004 .voltage = {2700, 3600},
10005 },
10006
10007 {
10008 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010009 .name = "MX29GL640ET",
10010 .bustype = BUS_PARALLEL,
10011 .manufacture_id = MACRONIX_ID,
10012 .model_id = MACRONIX_MX29GL640ET,
10013 .total_size = 8192,
10014 .page_size = 128 * 1024, /* actual page size is 16 */
10015 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10016 .tested = TEST_UNTESTED,
10017 .probe = probe_jedec_29gl,
10018 .probe_timing = TIMING_ZERO,
10019 .block_erasers =
10020 {
10021 {
10022 .eraseblocks = {
10023 {64 * 1024, 127},
10024 {8 * 1024, 8},
10025 },
10026 .block_erase = erase_sector_jedec,
10027 }, {
10028 .eraseblocks = { {8 * 1024 * 1024, 1} },
10029 .block_erase = erase_chip_block_jedec,
10030 },
10031 },
10032 .write = write_jedec_1,
10033 .read = read_memmapped,
10034 .voltage = {2700, 3600},
10035 },
10036
10037 {
10038 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000010039 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010040 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010041 .manufacture_id = MACRONIX_ID,
10042 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010043 .total_size = 512,
10044 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010045 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10046 .tested = TEST_UNTESTED,
10047 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010048 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010049 .block_erasers =
10050 {
10051 {
Stefan Tauner6697f712014-08-06 15:09:15 +000010052 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000010053 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010054 }, {
10055 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010056 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010057 },
10058 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010059 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010060 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010061 .voltage = {2700, 3600},
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000010062 },
10063
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010064 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010065 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020010066 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010067 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010068 .manufacture_id = MACRONIX_ID,
10069 .model_id = MACRONIX_MX66L51235F,
10070 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010071 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010072 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10073 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010074 .tested = TEST_OK_PREW,
10075 .probe = probe_spi_rdid,
10076 .probe_timing = TIMING_ZERO,
10077 .block_erasers =
10078 {
10079 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010080 .eraseblocks = { {4 * 1024, 16384} },
10081 .block_erase = spi_block_erase_21,
10082 }, {
10083 .eraseblocks = { {4 * 1024, 16384} },
10084 .block_erase = spi_block_erase_20,
10085 }, {
10086 .eraseblocks = { {32 * 1024, 2048} },
10087 .block_erase = spi_block_erase_5c,
10088 }, {
10089 .eraseblocks = { {32 * 1024, 2048} },
10090 .block_erase = spi_block_erase_52,
10091 }, {
10092 .eraseblocks = { {64 * 1024, 1024} },
10093 .block_erase = spi_block_erase_dc,
10094 }, {
10095 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010096 .block_erase = spi_block_erase_d8,
10097 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010098 .eraseblocks = { {64 * 1024 * 1024, 1} },
10099 .block_erase = spi_block_erase_60,
10100 }, {
10101 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010102 .block_erase = spi_block_erase_c7,
10103 }
10104 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010105 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10106 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010107 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010108 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010109 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010110 .voltage = {2700, 3600},
10111 },
10112
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010113 {
10114 .vendor = "Macronix",
10115 .name = "MX66L1G45G",
10116 .bustype = BUS_SPI,
10117 .manufacture_id = MACRONIX_ID,
10118 .model_id = MACRONIX_MX66L1G45G,
10119 .total_size = 131072,
10120 .page_size = 256,
10121 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10122 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
10123 .tested = TEST_OK_PREW,
10124 .probe = probe_spi_rdid,
10125 .probe_timing = TIMING_ZERO,
10126 .block_erasers =
10127 {
10128 {
10129 .eraseblocks = { {4 * 1024, 32768} },
10130 .block_erase = spi_block_erase_21,
10131 }, {
10132 .eraseblocks = { {4 * 1024, 32768} },
10133 .block_erase = spi_block_erase_20,
10134 }, {
10135 .eraseblocks = { {32 * 1024, 4096} },
10136 .block_erase = spi_block_erase_5c,
10137 }, {
10138 .eraseblocks = { {32 * 1024, 4096} },
10139 .block_erase = spi_block_erase_52,
10140 }, {
10141 .eraseblocks = { {64 * 1024, 2048} },
10142 .block_erase = spi_block_erase_dc,
10143 }, {
10144 .eraseblocks = { {64 * 1024, 2048} },
10145 .block_erase = spi_block_erase_d8,
10146 }, {
10147 .eraseblocks = { {128 * 1024 * 1024, 1} },
10148 .block_erase = spi_block_erase_60,
10149 }, {
10150 .eraseblocks = { {128 * 1024 * 1024, 1} },
10151 .block_erase = spi_block_erase_c7,
10152 }
10153 },
10154 /* TODO: security register and SBLK/SBULK, configuration register */
10155 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10156 .unlock = spi_disable_blockprotect_bp3_srwd,
10157 .write = spi_chip_write_256,
10158 .read = spi_chip_read, /* Fast read (0x0B) supported */
10159 .voltage = {2700, 3600},
10160 },
10161
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010162 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10163 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10164 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10165 * only is successful if RDID does not work.
10166 */
10167 {
10168 .vendor = "Micron/Numonyx/ST",
10169 .name = "M25P05",
10170 .bustype = BUS_SPI,
10171 .manufacture_id = 0, /* Not used. */
10172 .model_id = ST_M25P05_RES,
10173 .total_size = 64,
10174 .page_size = 256,
10175 .feature_bits = FEATURE_WRSR_WREN,
10176 .tested = TEST_UNTESTED,
10177 .probe = probe_spi_res1,
10178 .probe_timing = TIMING_ZERO,
10179 .block_erasers =
10180 {
10181 {
10182 .eraseblocks = { {32 * 1024, 2} },
10183 .block_erase = spi_block_erase_d8,
10184 }, {
10185 .eraseblocks = { {64 * 1024, 1} },
10186 .block_erase = spi_block_erase_c7,
10187 }
10188 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010189 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010190 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010191 .write = spi_chip_write_1, /* 128 */
10192 .read = spi_chip_read,
10193 .voltage = {2700, 3600},
10194 },
10195
10196 {
10197 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010198 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010199 .bustype = BUS_SPI,
10200 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010201 .model_id = ST_M25P05A,
10202 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010203 .page_size = 256,
10204 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010205 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010206 .probe = probe_spi_rdid,
10207 .probe_timing = TIMING_ZERO,
10208 .block_erasers =
10209 {
10210 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010211 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010212 .block_erase = spi_block_erase_d8,
10213 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010214 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010215 .block_erase = spi_block_erase_c7,
10216 }
10217 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010218 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010219 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010220 .write = spi_chip_write_256,
10221 .read = spi_chip_read,
10222 .voltage = {2700, 3600},
10223 },
10224
10225 /* The ST M25P10 has the same problem as the M25P05. */
10226 {
10227 .vendor = "Micron/Numonyx/ST",
10228 .name = "M25P10",
10229 .bustype = BUS_SPI,
10230 .manufacture_id = 0, /* Not used. */
10231 .model_id = ST_M25P10_RES,
10232 .total_size = 128,
10233 .page_size = 256,
10234 .feature_bits = FEATURE_WRSR_WREN,
10235 .tested = TEST_UNTESTED,
10236 .probe = probe_spi_res1,
10237 .probe_timing = TIMING_ZERO,
10238 .block_erasers =
10239 {
10240 {
10241 .eraseblocks = { {32 * 1024, 4} },
10242 .block_erase = spi_block_erase_d8,
10243 }, {
10244 .eraseblocks = { {128 * 1024, 1} },
10245 .block_erase = spi_block_erase_c7,
10246 }
10247 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010248 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010249 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010250 .write = spi_chip_write_1, /* 128 */
10251 .read = spi_chip_read,
10252 .voltage = {2700, 3600},
10253 },
10254
10255 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010256 .vendor = "Micron/Numonyx/ST",
10257 .name = "M25P10-A",
10258 .bustype = BUS_SPI,
10259 .manufacture_id = ST_ID,
10260 .model_id = ST_M25P10A,
10261 .total_size = 128,
10262 .page_size = 256,
10263 .feature_bits = FEATURE_WRSR_WREN,
10264 .tested = TEST_OK_PREW,
10265 .probe = probe_spi_rdid,
10266 .probe_timing = TIMING_ZERO,
10267 .block_erasers =
10268 {
10269 {
10270 .eraseblocks = { {32 * 1024, 4} },
10271 .block_erase = spi_block_erase_d8,
10272 }, {
10273 .eraseblocks = { {128 * 1024, 1} },
10274 .block_erase = spi_block_erase_c7,
10275 }
10276 },
10277 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10278 .unlock = spi_disable_blockprotect_bp3_srwd,
10279 .write = spi_chip_write_256,
10280 .read = spi_chip_read,
10281 .voltage = {2700, 3600},
10282 },
10283
10284 {
10285 .vendor = "Micron/Numonyx/ST",
10286 .name = "M25P128",
10287 .bustype = BUS_SPI,
10288 .manufacture_id = ST_ID,
10289 .model_id = ST_M25P128,
10290 .total_size = 16384,
10291 .page_size = 256,
10292 .feature_bits = FEATURE_WRSR_WREN,
10293 .tested = TEST_OK_PREW,
10294 .probe = probe_spi_rdid,
10295 .probe_timing = TIMING_ZERO,
10296 .block_erasers =
10297 {
10298 {
10299 .eraseblocks = { {256 * 1024, 64} },
10300 .block_erase = spi_block_erase_d8,
10301 }, {
10302 .eraseblocks = { {16 * 1024 * 1024, 1} },
10303 .block_erase = spi_block_erase_c7,
10304 }
10305 },
10306 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10307 .unlock = spi_disable_blockprotect_bp3_srwd,
10308 .write = spi_chip_write_256,
10309 .read = spi_chip_read,
10310 .voltage = {2700, 3600},
10311 },
10312
10313 {
10314 .vendor = "Micron/Numonyx/ST",
10315 .name = "M25P16",
10316 .bustype = BUS_SPI,
10317 .manufacture_id = ST_ID,
10318 .model_id = ST_M25P16,
10319 .total_size = 2048,
10320 .page_size = 256,
10321 .feature_bits = FEATURE_WRSR_WREN,
10322 .tested = TEST_OK_PREW,
10323 .probe = probe_spi_rdid,
10324 .probe_timing = TIMING_ZERO,
10325 .block_erasers =
10326 {
10327 {
10328 .eraseblocks = { {64 * 1024, 32} },
10329 .block_erase = spi_block_erase_d8,
10330 }, {
10331 .eraseblocks = { {2 * 1024 * 1024, 1} },
10332 .block_erase = spi_block_erase_c7,
10333 }
10334 },
10335 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10336 .unlock = spi_disable_blockprotect_bp3_srwd,
10337 .write = spi_chip_write_256,
10338 .read = spi_chip_read,
10339 .voltage = {2700, 3600},
10340 },
10341
10342 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010343 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10344 .name = "M25P20",
10345 .bustype = BUS_SPI,
10346 .manufacture_id = ST_ID,
10347 .model_id = ST_M25P20,
10348 .total_size = 256,
10349 .page_size = 256,
10350 .feature_bits = FEATURE_WRSR_WREN,
10351 .tested = TEST_UNTESTED,
10352 .probe = probe_spi_rdid,
10353 .probe_timing = TIMING_ZERO,
10354 .block_erasers =
10355 {
10356 {
10357 .eraseblocks = { {64 * 1024, 4} },
10358 .block_erase = spi_block_erase_d8,
10359 }, {
10360 .eraseblocks = { {256 * 1024, 1} },
10361 .block_erase = spi_block_erase_c7,
10362 }
10363 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010364 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010365 .unlock = spi_disable_blockprotect,
10366 .write = spi_chip_write_256,
10367 .read = spi_chip_read, /* Fast read (0x0B) supported */
10368 .voltage = {2700, 3600},
10369 },
10370
10371 {
10372 .vendor = "Micron/Numonyx/ST",
10373 .name = "M25P20-old",
10374 .bustype = BUS_SPI,
10375 .manufacture_id = 0, /* Not used. */
10376 .model_id = ST_M25P20_RES,
10377 .total_size = 256,
10378 .page_size = 256,
10379 .feature_bits = FEATURE_WRSR_WREN,
10380 .tested = TEST_OK_PREW,
10381 .probe = probe_spi_res1,
10382 .probe_timing = TIMING_ZERO,
10383 .block_erasers =
10384 {
10385 {
10386 .eraseblocks = { {64 * 1024, 4} },
10387 .block_erase = spi_block_erase_d8,
10388 }, {
10389 .eraseblocks = { {256 * 1024, 1} },
10390 .block_erase = spi_block_erase_c7,
10391 }
10392 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010393 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010394 .unlock = spi_disable_blockprotect,
10395 .write = spi_chip_write_256,
10396 .read = spi_chip_read, /* Fast read (0x0B) supported */
10397 .voltage = {2700, 3600},
10398 },
10399
10400 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010401 .vendor = "Micron/Numonyx/ST",
10402 .name = "M25P32",
10403 .bustype = BUS_SPI,
10404 .manufacture_id = ST_ID,
10405 .model_id = ST_M25P32,
10406 .total_size = 4096,
10407 .page_size = 256,
10408 .feature_bits = FEATURE_WRSR_WREN,
10409 .tested = TEST_OK_PREW,
10410 .probe = probe_spi_rdid,
10411 .probe_timing = TIMING_ZERO,
10412 .block_erasers =
10413 {
10414 {
10415 .eraseblocks = { {64 * 1024, 64} },
10416 .block_erase = spi_block_erase_d8,
10417 }, {
10418 .eraseblocks = { {4 * 1024 * 1024, 1} },
10419 .block_erase = spi_block_erase_c7,
10420 }
10421 },
10422 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10423 .unlock = spi_disable_blockprotect_bp3_srwd,
10424 .write = spi_chip_write_256,
10425 .read = spi_chip_read,
10426 .voltage = {2700, 3600},
10427 },
10428
10429 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010430 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10431 .name = "M25P40",
10432 .bustype = BUS_SPI,
10433 .manufacture_id = ST_ID,
10434 .model_id = ST_M25P40,
10435 .total_size = 512,
10436 .page_size = 256,
10437 .feature_bits = FEATURE_WRSR_WREN,
10438 .tested = TEST_OK_PREW,
10439 .probe = probe_spi_rdid,
10440 .probe_timing = TIMING_ZERO,
10441 .block_erasers =
10442 {
10443 {
10444 .eraseblocks = { {64 * 1024, 8} },
10445 .block_erase = spi_block_erase_d8,
10446 }, {
10447 .eraseblocks = { {512 * 1024, 1} },
10448 .block_erase = spi_block_erase_c7,
10449 }
10450 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010451 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010452 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010453 .write = spi_chip_write_256,
10454 .read = spi_chip_read,
10455 .voltage = {2700, 3600},
10456 },
10457
10458 {
10459 .vendor = "Micron/Numonyx/ST",
10460 .name = "M25P40-old",
10461 .bustype = BUS_SPI,
10462 .manufacture_id = 0, /* Not used. */
10463 .model_id = ST_M25P40_RES,
10464 .total_size = 512,
10465 .page_size = 256,
10466 .feature_bits = FEATURE_WRSR_WREN,
10467 .tested = TEST_UNTESTED,
10468 .probe = probe_spi_res1,
10469 .probe_timing = TIMING_ZERO,
10470 .block_erasers =
10471 {
10472 {
10473 .eraseblocks = { {64 * 1024, 8} },
10474 .block_erase = spi_block_erase_d8,
10475 }, {
10476 .eraseblocks = { {512 * 1024, 1} },
10477 .block_erase = spi_block_erase_c7,
10478 }
10479 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010480 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010481 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010482 .write = spi_chip_write_256,
10483 .read = spi_chip_read,
10484 },
10485
10486 {
10487 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010488 .name = "M25P64",
10489 .bustype = BUS_SPI,
10490 .manufacture_id = ST_ID,
10491 .model_id = ST_M25P64,
10492 .total_size = 8192,
10493 .page_size = 256,
10494 .feature_bits = FEATURE_WRSR_WREN,
10495 .tested = TEST_OK_PREW,
10496 .probe = probe_spi_rdid,
10497 .probe_timing = TIMING_ZERO,
10498 .block_erasers =
10499 {
10500 {
10501 .eraseblocks = { {64 * 1024, 128} },
10502 .block_erase = spi_block_erase_d8,
10503 }, {
10504 .eraseblocks = { {8 * 1024 * 1024, 1} },
10505 .block_erase = spi_block_erase_c7,
10506 }
10507 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010508 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010509 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010510 .write = spi_chip_write_256,
10511 .read = spi_chip_read,
10512 .voltage = {2700, 3600},
10513 },
10514
10515 {
10516 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010517 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010518 .bustype = BUS_SPI,
10519 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010520 .model_id = ST_M25P80,
10521 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010522 .page_size = 256,
10523 .feature_bits = FEATURE_WRSR_WREN,
10524 .tested = TEST_OK_PREW,
10525 .probe = probe_spi_rdid,
10526 .probe_timing = TIMING_ZERO,
10527 .block_erasers =
10528 {
10529 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010530 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010531 .block_erase = spi_block_erase_d8,
10532 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010533 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010534 .block_erase = spi_block_erase_c7,
10535 }
10536 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010537 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010538 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010539 .write = spi_chip_write_256,
10540 .read = spi_chip_read,
10541 .voltage = {2700, 3600},
10542 },
10543
10544 {
10545 .vendor = "Micron/Numonyx/ST",
10546 .name = "M25PE10",
10547 .bustype = BUS_SPI,
10548 .manufacture_id = ST_ID,
10549 .model_id = ST_M25PE10,
10550 .total_size = 128,
10551 .page_size = 256,
10552 .feature_bits = FEATURE_WRSR_WREN,
10553 .tested = TEST_UNTESTED,
10554 .probe = probe_spi_rdid,
10555 .probe_timing = TIMING_ZERO,
10556 .block_erasers =
10557 {
10558 {
10559 .eraseblocks = { {4 * 1024, 32} },
10560 .block_erase = spi_block_erase_20,
10561 }, {
10562 .eraseblocks = { {64 * 1024, 2} },
10563 .block_erase = spi_block_erase_d8,
10564 }, {
10565 .eraseblocks = { {128 * 1024, 1} },
10566 .block_erase = spi_block_erase_c7,
10567 }
10568 },
10569 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10570 .unlock = spi_disable_blockprotect,
10571 .write = spi_chip_write_256,
10572 .read = spi_chip_read,
10573 .voltage = {2700, 3600},
10574 },
10575
10576 {
10577 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010578 .name = "M25PE16",
10579 .bustype = BUS_SPI,
10580 .manufacture_id = ST_ID,
10581 .model_id = ST_M25PE16,
10582 .total_size = 2048,
10583 .page_size = 256,
10584 .feature_bits = FEATURE_WRSR_WREN,
10585 .tested = TEST_UNTESTED,
10586 .probe = probe_spi_rdid,
10587 .probe_timing = TIMING_ZERO,
10588 .block_erasers =
10589 {
10590 {
10591 .eraseblocks = { {4 * 1024, 512} },
10592 .block_erase = spi_block_erase_20,
10593 }, {
10594 .eraseblocks = { {64 * 1024, 32} },
10595 .block_erase = spi_block_erase_d8,
10596 }, {
10597 .eraseblocks = { {2 * 1024 * 1024, 1} },
10598 .block_erase = spi_block_erase_c7,
10599 }
10600 },
10601 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10602 .unlock = spi_disable_blockprotect,
10603 .write = spi_chip_write_256,
10604 .read = spi_chip_read,
10605 .voltage = {2700, 3600},
10606 },
10607
10608 {
10609 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010610 .name = "M25PE20",
10611 .bustype = BUS_SPI,
10612 .manufacture_id = ST_ID,
10613 .model_id = ST_M25PE20,
10614 .total_size = 256,
10615 .page_size = 256,
10616 .feature_bits = FEATURE_WRSR_WREN,
10617 .tested = TEST_UNTESTED,
10618 .probe = probe_spi_rdid,
10619 .probe_timing = TIMING_ZERO,
10620 .block_erasers =
10621 {
10622 {
10623 .eraseblocks = { {4 * 1024, 64} },
10624 .block_erase = spi_block_erase_20,
10625 }, {
10626 .eraseblocks = { {64 * 1024, 4} },
10627 .block_erase = spi_block_erase_d8,
10628 }, {
10629 .eraseblocks = { {256 * 1024, 1} },
10630 .block_erase = spi_block_erase_c7,
10631 }
10632 },
10633 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10634 .unlock = spi_disable_blockprotect,
10635 .write = spi_chip_write_256,
10636 .read = spi_chip_read,
10637 .voltage = {2700, 3600},
10638 },
10639
10640 {
10641 .vendor = "Micron/Numonyx/ST",
10642 .name = "M25PE40",
10643 .bustype = BUS_SPI,
10644 .manufacture_id = ST_ID,
10645 .model_id = ST_M25PE40,
10646 .total_size = 512,
10647 .page_size = 256,
10648 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010649 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010650 .probe = probe_spi_rdid,
10651 .probe_timing = TIMING_ZERO,
10652 .block_erasers =
10653 {
10654 {
10655 .eraseblocks = { {4 * 1024, 128} },
10656 .block_erase = spi_block_erase_20,
10657 }, {
10658 .eraseblocks = { {64 * 1024, 8} },
10659 .block_erase = spi_block_erase_d8,
10660 }, {
10661 .eraseblocks = { {512 * 1024, 1} },
10662 .block_erase = spi_block_erase_c7,
10663 }
10664 },
10665 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10666 .unlock = spi_disable_blockprotect,
10667 .write = spi_chip_write_256,
10668 .read = spi_chip_read,
10669 .voltage = {2700, 3600},
10670 },
10671
10672 {
10673 .vendor = "Micron/Numonyx/ST",
10674 .name = "M25PE80",
10675 .bustype = BUS_SPI,
10676 .manufacture_id = ST_ID,
10677 .model_id = ST_M25PE80,
10678 .total_size = 1024,
10679 .page_size = 256,
10680 .feature_bits = FEATURE_WRSR_WREN,
10681 .tested = TEST_OK_PREW,
10682 .probe = probe_spi_rdid,
10683 .probe_timing = TIMING_ZERO,
10684 .block_erasers =
10685 {
10686 {
10687 .eraseblocks = { {4 * 1024, 256} },
10688 .block_erase = spi_block_erase_20,
10689 }, {
10690 .eraseblocks = { {64 * 1024, 16} },
10691 .block_erase = spi_block_erase_d8,
10692 }, {
10693 .eraseblocks = { {1024 * 1024, 1} },
10694 .block_erase = spi_block_erase_c7,
10695 }
10696 },
10697 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
10698 .unlock = spi_disable_blockprotect,
10699 .write = spi_chip_write_256,
10700 .read = spi_chip_read,
10701 .voltage = {2700, 3600},
10702 },
10703
10704 {
10705 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010706 .name = "M25PX16",
10707 .bustype = BUS_SPI,
10708 .manufacture_id = ST_ID,
10709 .model_id = ST_M25PX16,
10710 .total_size = 2048,
10711 .page_size = 256,
10712 /* OTP: 64B total; read 0x4B; write 0x42 */
10713 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10714 .tested = TEST_OK_PREW,
10715 .probe = probe_spi_rdid,
10716 .probe_timing = TIMING_ZERO,
10717 .block_erasers =
10718 {
10719 {
10720 .eraseblocks = { { 4 * 1024, 512 } },
10721 .block_erase = spi_block_erase_20,
10722 }, {
10723 .eraseblocks = { {64 * 1024, 32} },
10724 .block_erase = spi_block_erase_d8,
10725 }, {
10726 .eraseblocks = { {2 * 1024 * 1024, 1} },
10727 .block_erase = spi_block_erase_c7,
10728 }
10729 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010730 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010731 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10732 .write = spi_chip_write_256,
10733 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010734 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010735 },
10736
10737 {
10738 .vendor = "Micron/Numonyx/ST",
10739 .name = "M25PX32",
10740 .bustype = BUS_SPI,
10741 .manufacture_id = ST_ID,
10742 .model_id = ST_M25PX32,
10743 .total_size = 4096,
10744 .page_size = 256,
10745 /* OTP: 64B total; read 0x4B; write 0x42 */
10746 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10747 .tested = TEST_OK_PRE,
10748 .probe = probe_spi_rdid,
10749 .probe_timing = TIMING_ZERO,
10750 .block_erasers =
10751 {
10752 {
10753 .eraseblocks = { { 4 * 1024, 1024 } },
10754 .block_erase = spi_block_erase_20,
10755 }, {
10756 .eraseblocks = { {64 * 1024, 64} },
10757 .block_erase = spi_block_erase_d8,
10758 }, {
10759 .eraseblocks = { {4 * 1024 * 1024, 1} },
10760 .block_erase = spi_block_erase_c7,
10761 }
10762 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010763 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010764 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10765 .write = spi_chip_write_256,
10766 .read = spi_chip_read,
10767 .voltage = {2700, 3600},
10768 },
10769
10770 {
10771 .vendor = "Micron/Numonyx/ST",
10772 .name = "M25PX64",
10773 .bustype = BUS_SPI,
10774 .manufacture_id = ST_ID,
10775 .model_id = ST_M25PX64,
10776 .total_size = 8192,
10777 .page_size = 256,
10778 /* OTP: 64B total; read 0x4B; write 0x42 */
10779 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010780 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010781 .probe = probe_spi_rdid,
10782 .probe_timing = TIMING_ZERO,
10783 .block_erasers =
10784 {
10785 {
10786 .eraseblocks = { { 4 * 1024, 2048 } },
10787 .block_erase = spi_block_erase_20,
10788 }, {
10789 .eraseblocks = { {64 * 1024, 128} },
10790 .block_erase = spi_block_erase_d8,
10791 }, {
10792 .eraseblocks = { {8 * 1024 * 1024, 1} },
10793 .block_erase = spi_block_erase_c7,
10794 }
10795 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010796 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010797 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10798 .write = spi_chip_write_256,
10799 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000010800 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010801 },
10802
10803 {
10804 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010805 .name = "M25PX80",
10806 .bustype = BUS_SPI,
10807 .manufacture_id = ST_ID,
10808 .model_id = ST_M25PX80,
10809 .total_size = 1024,
10810 .page_size = 256,
10811 /* OTP: 64B total; read 0x4B, write 0x42 */
10812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10813 .tested = TEST_OK_PREW,
10814 .probe = probe_spi_rdid,
10815 .probe_timing = TIMING_ZERO,
10816 .block_erasers =
10817 {
10818 {
10819 .eraseblocks = { { 4 * 1024, 256 } },
10820 .block_erase = spi_block_erase_20,
10821 }, {
10822 .eraseblocks = { {64 * 1024, 16} },
10823 .block_erase = spi_block_erase_d8,
10824 }, {
10825 .eraseblocks = { {1024 * 1024, 1} },
10826 .block_erase = spi_block_erase_c7,
10827 }
10828 },
10829 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10830 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10831 .write = spi_chip_write_256,
10832 .read = spi_chip_read,
10833 .voltage = {2700, 3600},
10834 },
10835
10836 {
10837 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010838 .name = "M45PE10",
10839 .bustype = BUS_SPI,
10840 .manufacture_id = ST_ID,
10841 .model_id = ST_M45PE10,
10842 .total_size = 128,
10843 .page_size = 256,
10844 .tested = TEST_UNTESTED,
10845 .probe = probe_spi_rdid,
10846 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010847 .block_erasers =
10848 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010849 {
10850 .eraseblocks = { {256, 512} },
10851 .block_erase = spi_block_erase_db,
10852 }, {
10853 .eraseblocks = { {64 * 1024, 2} },
10854 .block_erase = spi_block_erase_d8,
10855 }
10856 },
10857 .printlock = spi_prettyprint_status_register_default_welwip,
10858 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10859 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10860 .read = spi_chip_read, /* Fast read (0x0B) supported */
10861 .voltage = {2700, 3600},
10862 },
10863
10864 {
10865 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010866 .name = "M45PE16",
10867 .bustype = BUS_SPI,
10868 .manufacture_id = ST_ID,
10869 .model_id = ST_M45PE16,
10870 .total_size = 2048,
10871 .page_size = 256,
10872 .tested = TEST_UNTESTED,
10873 .probe = probe_spi_rdid,
10874 .probe_timing = TIMING_ZERO,
10875 .block_erasers =
10876 {
10877 {
10878 .eraseblocks = { {256, 8192} },
10879 .block_erase = spi_block_erase_db,
10880 }, {
10881 .eraseblocks = { {64 * 1024, 32} },
10882 .block_erase = spi_block_erase_d8,
10883 }
10884 },
10885 .printlock = spi_prettyprint_status_register_default_welwip,
10886 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10887 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10888 .read = spi_chip_read, /* Fast read (0x0B) supported */
10889 .voltage = {2700, 3600},
10890 },
10891
10892 {
10893 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010894 .name = "M45PE20",
10895 .bustype = BUS_SPI,
10896 .manufacture_id = ST_ID,
10897 .model_id = ST_M45PE20,
10898 .total_size = 256,
10899 .page_size = 256,
10900 .tested = TEST_UNTESTED,
10901 .probe = probe_spi_rdid,
10902 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010903 .block_erasers =
10904 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010905 {
10906 .eraseblocks = { {256, 1024} },
10907 .block_erase = spi_block_erase_db,
10908 }, {
10909 .eraseblocks = { {64 * 1024, 4} },
10910 .block_erase = spi_block_erase_d8,
10911 }
10912 },
10913 .printlock = spi_prettyprint_status_register_default_welwip,
10914 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10915 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10916 .read = spi_chip_read, /* Fast read (0x0B) supported */
10917 .voltage = {2700, 3600},
10918 },
10919
10920 {
10921 .vendor = "Micron/Numonyx/ST",
10922 .name = "M45PE40",
10923 .bustype = BUS_SPI,
10924 .manufacture_id = ST_ID,
10925 .model_id = ST_M45PE40,
10926 .total_size = 512,
10927 .page_size = 256,
10928 .tested = TEST_UNTESTED,
10929 .probe = probe_spi_rdid,
10930 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010931 .block_erasers =
10932 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010933 {
10934 .eraseblocks = { {256, 2048} },
10935 .block_erase = spi_block_erase_db,
10936 }, {
10937 .eraseblocks = { {64 * 1024, 8} },
10938 .block_erase = spi_block_erase_d8,
10939 }
10940 },
10941 .printlock = spi_prettyprint_status_register_default_welwip,
10942 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000010943 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010944 .read = spi_chip_read, /* Fast read (0x0B) supported */
10945 .voltage = {2700, 3600},
10946 },
10947
10948 {
10949 .vendor = "Micron/Numonyx/ST",
10950 .name = "M45PE80",
10951 .bustype = BUS_SPI,
10952 .manufacture_id = ST_ID,
10953 .model_id = ST_M45PE80,
10954 .total_size = 1024,
10955 .page_size = 256,
10956 .tested = TEST_UNTESTED,
10957 .probe = probe_spi_rdid,
10958 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100010959 .block_erasers =
10960 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010961 {
10962 .eraseblocks = { {256, 4096} },
10963 .block_erase = spi_block_erase_db,
10964 }, {
10965 .eraseblocks = { {64 * 1024, 16} },
10966 .block_erase = spi_block_erase_d8,
10967 }
10968 },
10969 .printlock = spi_prettyprint_status_register_default_welwip,
10970 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10971 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10972 .read = spi_chip_read, /* Fast read (0x0B) supported */
10973 .voltage = {2700, 3600},
10974 },
10975
10976 {
10977 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070010978 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10979 .bustype = BUS_SPI,
10980 .manufacture_id = ST_ID,
10981 .model_id = ST_N25Q00A__1G,
10982 .total_size = 131072,
10983 .page_size = 256,
10984 /* supports SFDP */
10985 /* OTP: 64B total; read 0x4B, write 0x42 */
10986 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10987 .tested = TEST_UNTESTED,
10988 .probe = probe_spi_rdid,
10989 .probe_timing = TIMING_ZERO,
10990 .block_erasers =
10991 {
10992 {
10993 .eraseblocks = { {4 * 1024, 32768} },
10994 .block_erase = spi_block_erase_21,
10995 }, {
10996 .eraseblocks = { {4 * 1024, 32768} },
10997 .block_erase = spi_block_erase_20,
10998 }, {
10999 .eraseblocks = { {64 * 1024, 2048} },
11000 .block_erase = spi_block_erase_dc,
11001 }, {
11002 .eraseblocks = { {64 * 1024, 2048} },
11003 .block_erase = spi_block_erase_d8,
11004 }, {
11005 .eraseblocks = { {32768 * 1024, 4} },
11006 .block_erase = spi_block_erase_c4,
11007 }
11008 },
11009 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11010 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11011 .write = spi_chip_write_256, /* Multi I/O supported */
11012 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11013 .voltage = {1700, 2000},
11014 },
11015
11016 {
11017 .vendor = "Micron/Numonyx/ST",
11018 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11019 .bustype = BUS_SPI,
11020 .manufacture_id = ST_ID,
11021 .model_id = ST_N25Q00A__3G,
11022 .total_size = 131072,
11023 .page_size = 256,
11024 /* supports SFDP */
11025 /* OTP: 64B total; read 0x4B, write 0x42 */
11026 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11027 .tested = TEST_UNTESTED,
11028 .probe = probe_spi_rdid,
11029 .probe_timing = TIMING_ZERO,
11030 .block_erasers =
11031 {
11032 {
11033 .eraseblocks = { {4 * 1024, 32768} },
11034 .block_erase = spi_block_erase_21,
11035 }, {
11036 .eraseblocks = { {4 * 1024, 32768} },
11037 .block_erase = spi_block_erase_20,
11038 }, {
11039 .eraseblocks = { {64 * 1024, 2048} },
11040 .block_erase = spi_block_erase_dc,
11041 }, {
11042 .eraseblocks = { {64 * 1024, 2048} },
11043 .block_erase = spi_block_erase_d8,
11044 }, {
11045 .eraseblocks = { {32768 * 1024, 4} },
11046 .block_erase = spi_block_erase_c4,
11047 }
11048 },
11049 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11050 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11051 .write = spi_chip_write_256, /* Multi I/O supported */
11052 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11053 .voltage = {2700, 3600},
11054 },
11055
11056 {
11057 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011058 .name = "N25Q016",
11059 .bustype = BUS_SPI,
11060 .manufacture_id = ST_ID,
11061 .model_id = ST_N25Q016__1E,
11062 .total_size = 2048,
11063 .page_size = 256,
11064 /* supports SFDP */
11065 /* OTP: 64B total; read 0x4B, write 0x42 */
11066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11067 .tested = TEST_UNTESTED,
11068 .probe = probe_spi_rdid,
11069 .probe_timing = TIMING_ZERO,
11070 .block_erasers =
11071 {
11072 {
11073 .eraseblocks = { {4 * 1024, 512} },
11074 .block_erase = spi_block_erase_20,
11075 }, {
11076 .eraseblocks = { {32 * 1024, 64} },
11077 .block_erase = spi_block_erase_52,
11078 }, {
11079 .eraseblocks = { {64 * 1024, 32} },
11080 .block_erase = spi_block_erase_d8,
11081 }, {
11082 .eraseblocks = { {2 * 1024 * 1024, 1} },
11083 .block_erase = spi_block_erase_c7,
11084 }
11085 },
11086 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11087 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11088 .write = spi_chip_write_256, /* Multi I/O supported */
11089 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11090 .voltage = {1700, 2000},
11091 },
11092
11093 {
11094 .vendor = "Micron/Numonyx/ST",
11095 .name = "N25Q032..1E",
11096 .bustype = BUS_SPI,
11097 .manufacture_id = ST_ID,
11098 .model_id = ST_N25Q032__1E,
11099 .total_size = 4096,
11100 .page_size = 256,
11101 /* supports SFDP */
11102 /* OTP: 64B total; read 0x4B, write 0x42 */
11103 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11104 .tested = TEST_UNTESTED,
11105 .probe = probe_spi_rdid,
11106 .probe_timing = TIMING_ZERO,
11107 .block_erasers =
11108 {
11109 {
11110 .eraseblocks = { {4 * 1024, 1024} },
11111 .block_erase = spi_block_erase_20,
11112 }, {
11113 .eraseblocks = { {64 * 1024, 64} },
11114 .block_erase = spi_block_erase_d8,
11115 }, {
11116 .eraseblocks = { {4 * 1024 * 1024, 1} },
11117 .block_erase = spi_block_erase_c7,
11118 }
11119 },
11120 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11121 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11122 .write = spi_chip_write_256, /* Multi I/O supported */
11123 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11124 .voltage = {1700, 2000},
11125 },
11126
11127 {
11128 .vendor = "Micron/Numonyx/ST",
11129 .name = "N25Q032..3E",
11130 .bustype = BUS_SPI,
11131 .manufacture_id = ST_ID,
11132 .model_id = ST_N25Q032__3E,
11133 .total_size = 4096,
11134 .page_size = 256,
11135 /* supports SFDP */
11136 /* OTP: 64B total; read 0x4B, write 0x42 */
11137 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11138 .tested = TEST_OK_PREW,
11139 .probe = probe_spi_rdid,
11140 .probe_timing = TIMING_ZERO,
11141 .block_erasers =
11142 {
11143 {
11144 .eraseblocks = { {4 * 1024, 1024} },
11145 .block_erase = spi_block_erase_20,
11146 }, {
11147 .eraseblocks = { {64 * 1024, 64} },
11148 .block_erase = spi_block_erase_d8,
11149 }, {
11150 .eraseblocks = { {4 * 1024 * 1024, 1} },
11151 .block_erase = spi_block_erase_c7,
11152 }
11153 },
11154 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11155 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11156 .write = spi_chip_write_256, /* Multi I/O supported */
11157 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11158 .voltage = {2700, 3600},
11159 },
11160
11161 {
11162 .vendor = "Micron/Numonyx/ST",
11163 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11164 .bustype = BUS_SPI,
11165 .manufacture_id = ST_ID,
11166 .model_id = ST_N25Q064__1E,
11167 .total_size = 8192,
11168 .page_size = 256,
11169 /* supports SFDP */
11170 /* OTP: 64B total; read 0x4B, write 0x42 */
11171 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011172 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011173 .probe = probe_spi_rdid,
11174 .probe_timing = TIMING_ZERO,
11175 .block_erasers =
11176 {
11177 {
11178 .eraseblocks = { {4 * 1024, 2048 } },
11179 .block_erase = spi_block_erase_20,
11180 }, {
11181 .eraseblocks = { {64 * 1024, 128} },
11182 .block_erase = spi_block_erase_d8,
11183 }, {
11184 .eraseblocks = { {8 * 1024 * 1024, 1} },
11185 .block_erase = spi_block_erase_c7,
11186 }
11187 },
11188 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11189 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11190 .write = spi_chip_write_256, /* Multi I/O supported */
11191 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11192 .voltage = {1700, 2000},
11193 },
11194
11195 {
11196 .vendor = "Micron/Numonyx/ST",
11197 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11198 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011199 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011200 .model_id = ST_N25Q064__3E,
11201 .total_size = 8192,
11202 .page_size = 256,
11203 /* supports SFDP */
11204 /* OTP: 64B total; read 0x4B, write 0x42 */
11205 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11206 .tested = TEST_OK_PREW,
11207 .probe = probe_spi_rdid,
11208 .probe_timing = TIMING_ZERO,
11209 .block_erasers =
11210 {
11211 {
11212 .eraseblocks = { {4 * 1024, 2048 } },
11213 .block_erase = spi_block_erase_20,
11214 }, {
11215 .eraseblocks = { {64 * 1024, 128} },
11216 .block_erase = spi_block_erase_d8,
11217 }, {
11218 .eraseblocks = { {8 * 1024 * 1024, 1} },
11219 .block_erase = spi_block_erase_c7,
11220 }
11221 },
11222 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11223 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11224 .write = spi_chip_write_256, /* Multi I/O supported */
11225 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11226 .voltage = {2700, 3600},
11227 },
11228
11229 {
11230 .vendor = "Micron/Numonyx/ST",
11231 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11232 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011233 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011234 .model_id = ST_N25Q128__1E,
11235 .total_size = 16384,
11236 .page_size = 256,
11237 /* supports SFDP */
11238 /* OTP: 64B total; read 0x4B, write 0x42 */
11239 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011240 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011241 .probe = probe_spi_rdid,
11242 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011243 .block_erasers =
11244 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011245 {
11246 .eraseblocks = { {4 * 1024, 4096 } },
11247 .block_erase = spi_block_erase_20,
11248 }, {
11249 .eraseblocks = { {64 * 1024, 256} },
11250 .block_erase = spi_block_erase_d8,
11251 }, {
11252 .eraseblocks = { {16384 * 1024, 1} },
11253 .block_erase = spi_block_erase_c7,
11254 }
11255 },
11256 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11257 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11258 .write = spi_chip_write_256, /* Multi I/O supported */
11259 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11260 .voltage = {1700, 2000},
11261 },
11262
11263 {
11264 .vendor = "Micron/Numonyx/ST",
11265 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11266 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011267 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011268 .model_id = ST_N25Q128__3E,
11269 .total_size = 16384,
11270 .page_size = 256,
11271 /* supports SFDP */
11272 /* OTP: 64B total; read 0x4B, write 0x42 */
11273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11274 .tested = TEST_OK_PREW,
11275 .probe = probe_spi_rdid,
11276 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011277 .block_erasers =
11278 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011279 {
11280 .eraseblocks = { {4 * 1024, 4096 } },
11281 .block_erase = spi_block_erase_20,
11282 }, {
11283 .eraseblocks = { {64 * 1024, 256} },
11284 .block_erase = spi_block_erase_d8,
11285 }, {
11286 .eraseblocks = { {16384 * 1024, 1} },
11287 .block_erase = spi_block_erase_c7,
11288 }
11289 },
11290 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11291 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11292 .write = spi_chip_write_256, /* Multi I/O supported */
11293 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11294 .voltage = {2700, 3600},
11295 },
11296
11297 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011298 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011299 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11300 .bustype = BUS_SPI,
11301 .manufacture_id = ST_ID,
11302 .model_id = ST_N25Q256__1E,
11303 .total_size = 32768,
11304 .page_size = 256,
11305 /* supports SFDP */
11306 /* OTP: 64B total; read 0x4B, write 0x42 */
11307 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11308 .tested = TEST_UNTESTED,
11309 .probe = probe_spi_rdid,
11310 .probe_timing = TIMING_ZERO,
11311 .block_erasers =
11312 {
11313 {
11314 .eraseblocks = { {4 * 1024, 8192} },
11315 .block_erase = spi_block_erase_21,
11316 }, {
11317 .eraseblocks = { {4 * 1024, 8192} },
11318 .block_erase = spi_block_erase_20,
11319 }, {
11320 .eraseblocks = { {64 * 1024, 512} },
11321 .block_erase = spi_block_erase_dc,
11322 }, {
11323 .eraseblocks = { {64 * 1024, 512} },
11324 .block_erase = spi_block_erase_d8,
11325 }, {
11326 .eraseblocks = { {32768 * 1024, 1} },
11327 .block_erase = spi_block_erase_c7,
11328 }
11329 },
11330 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11331 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11332 .write = spi_chip_write_256, /* Multi I/O supported */
11333 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11334 .voltage = {1700, 2000},
11335 },
11336
11337 {
11338 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011339 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11340 .bustype = BUS_SPI,
11341 .manufacture_id = ST_ID,
11342 .model_id = ST_N25Q256__3E,
11343 .total_size = 32768,
11344 .page_size = 256,
11345 /* supports SFDP */
11346 /* OTP: 64B total; read 0x4B, write 0x42 */
11347 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11348 .tested = TEST_UNTESTED,
11349 .probe = probe_spi_rdid,
11350 .probe_timing = TIMING_ZERO,
11351 .block_erasers =
11352 {
11353 {
11354 .eraseblocks = { {4 * 1024, 8192} },
11355 .block_erase = spi_block_erase_21,
11356 }, {
11357 .eraseblocks = { {4 * 1024, 8192} },
11358 .block_erase = spi_block_erase_20,
11359 }, {
11360 .eraseblocks = { {64 * 1024, 512} },
11361 .block_erase = spi_block_erase_dc,
11362 }, {
11363 .eraseblocks = { {64 * 1024, 512} },
11364 .block_erase = spi_block_erase_d8,
11365 }, {
11366 .eraseblocks = { {32768 * 1024, 1} },
11367 .block_erase = spi_block_erase_c7,
11368 }
11369 },
11370 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11371 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11372 .write = spi_chip_write_256, /* Multi I/O supported */
11373 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11374 .voltage = {2700, 3600},
11375 },
11376
11377 {
11378 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011379 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011380 .bustype = BUS_SPI,
11381 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011382 .model_id = ST_N25Q512__1G,
11383 .total_size = 65536,
11384 .page_size = 256,
11385 /* supports SFDP */
11386 /* OTP: 64B total; read 0x4B, write 0x42 */
11387 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11388 .tested = TEST_UNTESTED,
11389 .probe = probe_spi_rdid,
11390 .probe_timing = TIMING_ZERO,
11391 .block_erasers =
11392 {
11393 {
11394 .eraseblocks = { {4 * 1024, 16384} },
11395 .block_erase = spi_block_erase_21,
11396 }, {
11397 .eraseblocks = { {4 * 1024, 16384} },
11398 .block_erase = spi_block_erase_20,
11399 }, {
11400 .eraseblocks = { {64 * 1024, 1024} },
11401 .block_erase = spi_block_erase_dc,
11402 }, {
11403 .eraseblocks = { {64 * 1024, 1024} },
11404 .block_erase = spi_block_erase_d8,
11405 }, {
11406 .eraseblocks = { {32768 * 1024, 2} },
11407 .block_erase = spi_block_erase_c4,
11408 }
11409 },
11410 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11411 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11412 .write = spi_chip_write_256, /* Multi I/O supported */
11413 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11414 .voltage = {1700, 2000},
11415 },
11416
11417 {
11418 .vendor = "Micron/Numonyx/ST",
11419 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11420 .bustype = BUS_SPI,
11421 .manufacture_id = ST_ID,
11422 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011423 .total_size = 65536,
11424 .page_size = 256,
11425 /* supports SFDP */
11426 /* OTP: 64B total; read 0x4B, write 0x42 */
11427 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11428 .tested = TEST_OK_PREW,
11429 .probe = probe_spi_rdid,
11430 .probe_timing = TIMING_ZERO,
11431 .block_erasers =
11432 {
11433 {
11434 .eraseblocks = { {4 * 1024, 16384} },
11435 .block_erase = spi_block_erase_21,
11436 }, {
11437 .eraseblocks = { {4 * 1024, 16384} },
11438 .block_erase = spi_block_erase_20,
11439 }, {
11440 .eraseblocks = { {64 * 1024, 1024} },
11441 .block_erase = spi_block_erase_dc,
11442 }, {
11443 .eraseblocks = { {64 * 1024, 1024} },
11444 .block_erase = spi_block_erase_d8,
11445 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070011446 .eraseblocks = { {32768 * 1024, 2} },
11447 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011448 }
11449 },
11450 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11451 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11452 .write = spi_chip_write_256, /* Multi I/O supported */
11453 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11454 .voltage = {2700, 3600},
11455 },
11456
11457 {
Ed Swierk199ab392017-07-03 13:33:44 -070011458 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011459 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11460 .bustype = BUS_SPI,
11461 .manufacture_id = ST_ID,
11462 .model_id = ST_N25Q00A__3G,
11463 .total_size = 131072,
11464 .page_size = 256,
11465 /* supports SFDP */
11466 /* OTP: 64B total; read 0x4B, write 0x42 */
11467 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11468 .tested = TEST_OK_PREW,
11469 .probe = probe_spi_rdid,
11470 .probe_timing = TIMING_ZERO,
11471 .block_erasers =
11472 {
11473 {
11474 .eraseblocks = { {4 * 1024, 32768} },
11475 .block_erase = spi_block_erase_21,
11476 }, {
11477 .eraseblocks = { {4 * 1024, 32768} },
11478 .block_erase = spi_block_erase_20,
11479 }, {
11480 .eraseblocks = { {32 * 1024, 4096} },
11481 .block_erase = spi_block_erase_5c,
11482 }, {
11483 .eraseblocks = { {32 * 1024, 4096} },
11484 .block_erase = spi_block_erase_52,
11485 }, {
11486 .eraseblocks = { {64 * 1024, 2048} },
11487 .block_erase = spi_block_erase_dc,
11488 }, {
11489 .eraseblocks = { {64 * 1024, 2048} },
11490 .block_erase = spi_block_erase_d8,
11491 }, {
11492 .eraseblocks = { {65536 * 1024, 2} },
11493 .block_erase = spi_block_erase_c4,
11494 }
11495 },
11496 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11497 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11498 .write = spi_chip_write_256, /* Multi I/O supported */
11499 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11500 .voltage = {2700, 3600},
11501 },
11502
11503 {
11504 .vendor = "Micron",
11505 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11506 .bustype = BUS_SPI,
11507 .manufacture_id = ST_ID,
11508 .model_id = ST_N25Q00A__1G,
11509 .total_size = 131072,
11510 .page_size = 256,
11511 /* supports SFDP */
11512 /* OTP: 64B total; read 0x4B, write 0x42 */
11513 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11514 .tested = TEST_UNTESTED,
11515 .probe = probe_spi_rdid,
11516 .probe_timing = TIMING_ZERO,
11517 .block_erasers =
11518 {
11519 {
11520 .eraseblocks = { {4 * 1024, 32768} },
11521 .block_erase = spi_block_erase_21,
11522 }, {
11523 .eraseblocks = { {4 * 1024, 32768} },
11524 .block_erase = spi_block_erase_20,
11525 }, {
11526 .eraseblocks = { {32 * 1024, 4096} },
11527 .block_erase = spi_block_erase_5c,
11528 }, {
11529 .eraseblocks = { {32 * 1024, 4096} },
11530 .block_erase = spi_block_erase_52,
11531 }, {
11532 .eraseblocks = { {64 * 1024, 2048} },
11533 .block_erase = spi_block_erase_dc,
11534 }, {
11535 .eraseblocks = { {64 * 1024, 2048} },
11536 .block_erase = spi_block_erase_d8,
11537 }, {
11538 .eraseblocks = { {65536 * 1024, 2} },
11539 .block_erase = spi_block_erase_c4,
11540 }
11541 },
11542 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11543 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11544 .write = spi_chip_write_256, /* Multi I/O supported */
11545 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11546 .voltage = {1700, 2000},
11547 },
11548
11549 {
11550 .vendor = "Micron",
11551 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11552 .bustype = BUS_SPI,
11553 .manufacture_id = ST_ID,
11554 .model_id = ST_MT25QL02G,
11555 .total_size = 262144,
11556 .page_size = 256,
11557 /* supports SFDP */
11558 /* OTP: 64B total; read 0x4B, write 0x42 */
11559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11560 .tested = TEST_UNTESTED,
11561 .probe = probe_spi_rdid,
11562 .probe_timing = TIMING_ZERO,
11563 .block_erasers =
11564 {
11565 {
11566 .eraseblocks = { {4 * 1024, 65536} },
11567 .block_erase = spi_block_erase_21,
11568 }, {
11569 .eraseblocks = { {4 * 1024, 65536} },
11570 .block_erase = spi_block_erase_20,
11571 }, {
11572 .eraseblocks = { {32 * 1024, 8192} },
11573 .block_erase = spi_block_erase_5c,
11574 }, {
11575 .eraseblocks = { {32 * 1024, 8192} },
11576 .block_erase = spi_block_erase_52,
11577 }, {
11578 .eraseblocks = { {64 * 1024, 4096} },
11579 .block_erase = spi_block_erase_dc,
11580 }, {
11581 .eraseblocks = { {64 * 1024, 4096} },
11582 .block_erase = spi_block_erase_d8,
11583 }, {
11584 .eraseblocks = { {65536 * 1024, 4} },
11585 .block_erase = spi_block_erase_c4,
11586 }
11587 },
11588 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11589 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11590 .write = spi_chip_write_256, /* Multi I/O supported */
11591 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11592 .voltage = {2700, 3600},
11593 },
11594
11595 {
11596 .vendor = "Micron",
11597 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11598 .bustype = BUS_SPI,
11599 .manufacture_id = ST_ID,
11600 .model_id = ST_MT25QU02G,
11601 .total_size = 262144,
11602 .page_size = 256,
11603 /* supports SFDP */
11604 /* OTP: 64B total; read 0x4B, write 0x42 */
11605 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11606 .tested = TEST_UNTESTED,
11607 .probe = probe_spi_rdid,
11608 .probe_timing = TIMING_ZERO,
11609 .block_erasers =
11610 {
11611 {
11612 .eraseblocks = { {4 * 1024, 65536} },
11613 .block_erase = spi_block_erase_21,
11614 }, {
11615 .eraseblocks = { {4 * 1024, 65536} },
11616 .block_erase = spi_block_erase_20,
11617 }, {
11618 .eraseblocks = { {32 * 1024, 8192} },
11619 .block_erase = spi_block_erase_5c,
11620 }, {
11621 .eraseblocks = { {32 * 1024, 8192} },
11622 .block_erase = spi_block_erase_52,
11623 }, {
11624 .eraseblocks = { {64 * 1024, 4096} },
11625 .block_erase = spi_block_erase_dc,
11626 }, {
11627 .eraseblocks = { {64 * 1024, 4096} },
11628 .block_erase = spi_block_erase_d8,
11629 }, {
11630 .eraseblocks = { {65536 * 1024, 4} },
11631 .block_erase = spi_block_erase_c4,
11632 }
11633 },
11634 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11635 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11636 .write = spi_chip_write_256, /* Multi I/O supported */
11637 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11638 .voltage = {1700, 2000},
11639 },
11640
11641 {
11642 .vendor = "Micron",
11643 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11644 .bustype = BUS_SPI,
11645 .manufacture_id = ST_ID,
11646 .model_id = ST_N25Q128__1E,
11647 .total_size = 16384,
11648 .page_size = 256,
11649 /* supports SFDP */
11650 /* OTP: 64B total; read 0x4B, write 0x42 */
11651 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11652 .tested = TEST_UNTESTED,
11653 .probe = probe_spi_rdid,
11654 .probe_timing = TIMING_ZERO,
11655 .block_erasers =
11656 {
11657 {
11658 .eraseblocks = { {4 * 1024, 4096} },
11659 .block_erase = spi_block_erase_20,
11660 }, {
11661 .eraseblocks = { {32 * 1024, 512} },
11662 .block_erase = spi_block_erase_52,
11663 }, {
11664 .eraseblocks = { {64 * 1024, 256} },
11665 .block_erase = spi_block_erase_d8,
11666 }, {
11667 .eraseblocks = { {16384 * 1024, 1} },
11668 .block_erase = spi_block_erase_c7,
11669 }, {
11670 .eraseblocks = { {16384 * 1024, 1} },
11671 .block_erase = spi_block_erase_60,
11672 }
11673 },
11674 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11675 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11676 .write = spi_chip_write_256, /* Multi I/O supported */
11677 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11678 .voltage = {1700, 2000},
11679 },
11680
11681 {
11682 .vendor = "Micron",
11683 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11684 .bustype = BUS_SPI,
11685 .manufacture_id = ST_ID,
11686 .model_id = ST_N25Q128__3E,
11687 .total_size = 16384,
11688 .page_size = 256,
11689 /* supports SFDP */
11690 /* OTP: 64B total; read 0x4B, write 0x42 */
11691 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11692 .tested = TEST_UNTESTED,
11693 .probe = probe_spi_rdid,
11694 .probe_timing = TIMING_ZERO,
11695 .block_erasers =
11696 {
11697 {
11698 .eraseblocks = { {4 * 1024, 4096} },
11699 .block_erase = spi_block_erase_20,
11700 }, {
11701 .eraseblocks = { {32 * 1024, 512} },
11702 .block_erase = spi_block_erase_52,
11703 }, {
11704 .eraseblocks = { {64 * 1024, 256} },
11705 .block_erase = spi_block_erase_d8,
11706 }, {
11707 .eraseblocks = { {16384 * 1024, 1} },
11708 .block_erase = spi_block_erase_c7,
11709 }, {
11710 .eraseblocks = { {16384 * 1024, 1} },
11711 .block_erase = spi_block_erase_60,
11712 }
11713 },
11714 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11715 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11716 .write = spi_chip_write_256, /* Multi I/O supported */
11717 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11718 .voltage = {2700, 3600},
11719 },
11720
11721 {
11722 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011723 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070011724 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011725 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070011726 .model_id = ST_N25Q256__3E,
11727 .total_size = 32768,
11728 .page_size = 256,
11729 /* supports SFDP */
11730 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010011731 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010011732 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070011733 .probe = probe_spi_rdid,
11734 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011735 .block_erasers =
11736 {
Ed Swierk199ab392017-07-03 13:33:44 -070011737 {
11738 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011739 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070011740 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011741 .eraseblocks = { {4 * 1024, 8192} },
11742 .block_erase = spi_block_erase_20,
11743 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070011744 .eraseblocks = { {32 * 1024, 1024} },
11745 .block_erase = spi_block_erase_5c,
11746 }, {
11747 .eraseblocks = { {32 * 1024, 1024} },
11748 .block_erase = spi_block_erase_52,
11749 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011750 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011751 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070011752 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011753 .eraseblocks = { {64 * 1024, 512} },
11754 .block_erase = spi_block_erase_d8,
11755 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011756 .eraseblocks = { {32768 * 1024, 1} },
11757 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070011758 }, {
11759 .eraseblocks = { {32768 * 1024, 1} },
11760 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070011761 }
11762 },
11763 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11764 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11765 .write = spi_chip_write_256, /* Multi I/O supported */
11766 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11767 .voltage = {2700, 3600},
11768 },
11769
11770 {
11771 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011772 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11773 .bustype = BUS_SPI,
11774 .manufacture_id = ST_ID,
11775 .model_id = ST_N25Q256__1E,
11776 .total_size = 32768,
11777 .page_size = 256,
11778 /* supports SFDP */
11779 /* OTP: 64B total; read 0x4B, write 0x42 */
11780 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11781 .tested = TEST_UNTESTED,
11782 .probe = probe_spi_rdid,
11783 .probe_timing = TIMING_ZERO,
11784 .block_erasers =
11785 {
11786 {
11787 .eraseblocks = { {4 * 1024, 8192} },
11788 .block_erase = spi_block_erase_21,
11789 }, {
11790 .eraseblocks = { {4 * 1024, 8192} },
11791 .block_erase = spi_block_erase_20,
11792 }, {
11793 .eraseblocks = { {32 * 1024, 1024} },
11794 .block_erase = spi_block_erase_5c,
11795 }, {
11796 .eraseblocks = { {32 * 1024, 1024} },
11797 .block_erase = spi_block_erase_52,
11798 }, {
11799 .eraseblocks = { {64 * 1024, 512} },
11800 .block_erase = spi_block_erase_dc,
11801 }, {
11802 .eraseblocks = { {64 * 1024, 512} },
11803 .block_erase = spi_block_erase_d8,
11804 }, {
11805 .eraseblocks = { {32768 * 1024, 1} },
11806 .block_erase = spi_block_erase_c7,
11807 }, {
11808 .eraseblocks = { {32768 * 1024, 1} },
11809 .block_erase = spi_block_erase_60,
11810 }
11811 },
11812 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11813 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11814 .write = spi_chip_write_256, /* Multi I/O supported */
11815 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11816 .voltage = {1700, 2000},
11817 },
11818
11819 {
11820 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011821 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070011822 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011823 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011824 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070011825 .total_size = 65536,
11826 .page_size = 256,
11827 /* supports SFDP */
11828 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010011829 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020011830 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070011831 .probe = probe_spi_rdid,
11832 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011833 .block_erasers =
11834 {
Ed Swierk199ab392017-07-03 13:33:44 -070011835 {
11836 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011837 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070011838 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011839 .eraseblocks = { {4 * 1024, 16384} },
11840 .block_erase = spi_block_erase_20,
11841 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070011842 .eraseblocks = { {32 * 1024, 2048} },
11843 .block_erase = spi_block_erase_5c,
11844 }, {
11845 .eraseblocks = { {32 * 1024, 2048} },
11846 .block_erase = spi_block_erase_52,
11847 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011848 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020011849 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070011850 }, {
Nico Huberaac81422017-11-10 22:54:13 +010011851 .eraseblocks = { {64 * 1024, 1024} },
11852 .block_erase = spi_block_erase_d8,
11853 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070011854 .eraseblocks = { {65536 * 1024, 1} },
11855 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070011856 }, {
11857 .eraseblocks = { {65536 * 1024, 1} },
11858 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070011859 }
11860 },
11861 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11862 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11863 .write = spi_chip_write_256, /* Multi I/O supported */
11864 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11865 .voltage = {2700, 3600},
11866 },
11867
11868 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011869 .vendor = "Micron",
11870 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11871 .bustype = BUS_SPI,
11872 .manufacture_id = ST_ID,
11873 .model_id = ST_N25Q512__1G,
11874 .total_size = 65536,
11875 .page_size = 256,
11876 /* supports SFDP */
11877 /* OTP: 64B total; read 0x4B, write 0x42 */
11878 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11879 .tested = TEST_OK_PREW,
11880 .probe = probe_spi_rdid,
11881 .probe_timing = TIMING_ZERO,
11882 .block_erasers =
11883 {
11884 {
11885 .eraseblocks = { {4 * 1024, 16384} },
11886 .block_erase = spi_block_erase_21,
11887 }, {
11888 .eraseblocks = { {4 * 1024, 16384} },
11889 .block_erase = spi_block_erase_20,
11890 }, {
11891 .eraseblocks = { {32 * 1024, 2048} },
11892 .block_erase = spi_block_erase_5c,
11893 }, {
11894 .eraseblocks = { {32 * 1024, 2048} },
11895 .block_erase = spi_block_erase_52,
11896 }, {
11897 .eraseblocks = { {64 * 1024, 1024} },
11898 .block_erase = spi_block_erase_dc,
11899 }, {
11900 .eraseblocks = { {64 * 1024, 1024} },
11901 .block_erase = spi_block_erase_d8,
11902 }, {
11903 .eraseblocks = { {65536 * 1024, 1} },
11904 .block_erase = spi_block_erase_c7,
11905 }, {
11906 .eraseblocks = { {65536 * 1024, 1} },
11907 .block_erase = spi_block_erase_60,
11908 }
11909 },
11910 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11911 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11912 .write = spi_chip_write_256, /* Multi I/O supported */
11913 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11914 .voltage = {1700, 2000},
11915 },
11916
11917 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000011918 .vendor = "MoselVitelic",
11919 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011920 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011921 .manufacture_id = SYNCMOS_MVC_ID,
11922 .model_id = MVC_V29C51000B,
11923 .total_size = 64,
11924 .page_size = 512,
11925 .feature_bits = FEATURE_EITHER_RESET,
11926 .tested = TEST_UNTESTED,
11927 .probe = probe_jedec,
11928 .probe_timing = TIMING_ZERO,
11929 .block_erasers =
11930 {
11931 {
11932 .eraseblocks = { {512, 128} },
11933 .block_erase = erase_sector_jedec,
11934 }, {
11935 .eraseblocks = { {64 * 1024, 1} },
11936 .block_erase = erase_chip_block_jedec,
11937 },
11938 },
11939 .write = write_jedec_1,
11940 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011941 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011942 },
11943
11944 {
11945 .vendor = "MoselVitelic",
11946 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011947 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011948 .manufacture_id = SYNCMOS_MVC_ID,
11949 .model_id = MVC_V29C51000T,
11950 .total_size = 64,
11951 .page_size = 512,
11952 .feature_bits = FEATURE_EITHER_RESET,
11953 .tested = TEST_UNTESTED,
11954 .probe = probe_jedec,
11955 .probe_timing = TIMING_ZERO,
11956 .block_erasers =
11957 {
11958 {
11959 .eraseblocks = { {512, 128} },
11960 .block_erase = erase_sector_jedec,
11961 }, {
11962 .eraseblocks = { {64 * 1024, 1} },
11963 .block_erase = erase_chip_block_jedec,
11964 },
11965 },
11966 .write = write_jedec_1,
11967 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011968 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011969 },
11970
11971 {
11972 .vendor = "MoselVitelic",
11973 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000011974 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000011975 .manufacture_id = SYNCMOS_MVC_ID,
11976 .model_id = MVC_V29C51400B,
11977 .total_size = 512,
11978 .page_size = 1024,
11979 .feature_bits = FEATURE_EITHER_RESET,
11980 .tested = TEST_UNTESTED,
11981 .probe = probe_jedec,
11982 .probe_timing = TIMING_ZERO,
11983 .block_erasers =
11984 {
11985 {
11986 .eraseblocks = { {1024, 512} },
11987 .block_erase = erase_sector_jedec,
11988 }, {
11989 .eraseblocks = { {512 * 1024, 1} },
11990 .block_erase = erase_chip_block_jedec,
11991 },
11992 },
11993 .write = write_jedec_1,
11994 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000011995 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000011996 },
11997
11998 {
11999 .vendor = "MoselVitelic",
12000 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012001 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012002 .manufacture_id = SYNCMOS_MVC_ID,
12003 .model_id = MVC_V29C51400T,
12004 .total_size = 512,
12005 .page_size = 1024,
12006 .feature_bits = FEATURE_EITHER_RESET,
12007 .tested = TEST_UNTESTED,
12008 .probe = probe_jedec,
12009 .probe_timing = TIMING_ZERO,
12010 .block_erasers =
12011 {
12012 {
12013 .eraseblocks = { {1024, 512} },
12014 .block_erase = erase_sector_jedec,
12015 }, {
12016 .eraseblocks = { {512 * 1024, 1} },
12017 .block_erase = erase_chip_block_jedec,
12018 },
12019 },
12020 .write = write_jedec_1,
12021 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012022 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012023 },
12024
12025 {
12026 .vendor = "MoselVitelic",
12027 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012028 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012029 .manufacture_id = SYNCMOS_MVC_ID,
12030 .model_id = MVC_V29LC51000,
12031 .total_size = 64,
12032 .page_size = 512,
12033 .feature_bits = FEATURE_EITHER_RESET,
12034 .tested = TEST_UNTESTED,
12035 .probe = probe_jedec,
12036 .probe_timing = TIMING_ZERO,
12037 .block_erasers =
12038 {
12039 {
12040 .eraseblocks = { {512, 128} },
12041 .block_erase = erase_sector_jedec,
12042 }, {
12043 .eraseblocks = { {64 * 1024, 1} },
12044 .block_erase = erase_chip_block_jedec,
12045 },
12046 },
12047 .write = write_jedec_1,
12048 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012049 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012050 },
12051
12052 {
12053 .vendor = "MoselVitelic",
12054 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012055 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012056 .manufacture_id = SYNCMOS_MVC_ID,
12057 .model_id = MVC_V29LC51001,
12058 .total_size = 128,
12059 .page_size = 512,
12060 .feature_bits = FEATURE_EITHER_RESET,
12061 .tested = TEST_UNTESTED,
12062 .probe = probe_jedec,
12063 .probe_timing = TIMING_ZERO,
12064 .block_erasers =
12065 {
12066 {
12067 .eraseblocks = { {512, 256} },
12068 .block_erase = erase_sector_jedec,
12069 }, {
12070 .eraseblocks = { {128 * 1024, 1} },
12071 .block_erase = erase_chip_block_jedec,
12072 },
12073 },
12074 .write = write_jedec_1,
12075 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012076 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012077 },
12078
12079 {
12080 .vendor = "MoselVitelic",
12081 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012082 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012083 .manufacture_id = SYNCMOS_MVC_ID,
12084 .model_id = MVC_V29LC51002,
12085 .total_size = 256,
12086 .page_size = 512,
12087 .feature_bits = FEATURE_EITHER_RESET,
12088 .tested = TEST_UNTESTED,
12089 .probe = probe_jedec,
12090 .probe_timing = TIMING_ZERO,
12091 .block_erasers =
12092 {
12093 {
12094 .eraseblocks = { {512, 512} },
12095 .block_erase = erase_sector_jedec,
12096 }, {
12097 .eraseblocks = { {256 * 1024, 1} },
12098 .block_erase = erase_chip_block_jedec,
12099 },
12100 },
12101 .write = write_jedec_1,
12102 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012103 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000012104 },
12105
12106 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012107 .vendor = "Nantronics",
12108 .name = "N25S10",
12109 .bustype = BUS_SPI,
12110 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12111 .model_id = NANTRONICS_N25S10,
12112 .total_size = 128,
12113 .page_size = 256,
12114 .feature_bits = FEATURE_WRSR_WREN,
12115 .tested = TEST_UNTESTED,
12116 .probe = probe_spi_rdid,
12117 .probe_timing = TIMING_ZERO,
12118 .block_erasers =
12119 {
12120 {
12121 .eraseblocks = { {4 * 1024, 32} },
12122 .block_erase = spi_block_erase_20,
12123 }, {
12124 .eraseblocks = { {4 * 1024, 32} },
12125 .block_erase = spi_block_erase_d7,
12126 }, {
12127 .eraseblocks = { {32 * 1024, 4} },
12128 .block_erase = spi_block_erase_52,
12129 }, {
12130 .eraseblocks = { {64 * 1024, 2} },
12131 .block_erase = spi_block_erase_d8,
12132 }, {
12133 .eraseblocks = { {128 * 1024, 1} },
12134 .block_erase = spi_block_erase_60,
12135 }, {
12136 .eraseblocks = { {128 * 1024, 1} },
12137 .block_erase = spi_block_erase_c7,
12138 }
12139 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012140 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012141 .unlock = spi_disable_blockprotect_bp3_srwd,
12142 .write = spi_chip_write_256,
12143 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12144 .voltage = {2700, 3600},
12145 },
12146
12147 {
12148 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012149 .name = "N25S16",
12150 .bustype = BUS_SPI,
12151 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12152 .model_id = NANTRONICS_N25S16,
12153 .total_size = 2048,
12154 .page_size = 256,
12155 .feature_bits = FEATURE_WRSR_WREN,
12156 .tested = TEST_UNTESTED,
12157 .probe = probe_spi_rdid,
12158 .probe_timing = TIMING_ZERO,
12159 .block_erasers =
12160 {
12161 {
12162 .eraseblocks = { {4 * 1024, 512} },
12163 .block_erase = spi_block_erase_20,
12164 }, {
12165 .eraseblocks = { {64 * 1024, 32} },
12166 .block_erase = spi_block_erase_d8,
12167 }, {
12168 .eraseblocks = { {2048 * 1024, 1} },
12169 .block_erase = spi_block_erase_60,
12170 }, {
12171 .eraseblocks = { {2048 * 1024, 1} },
12172 .block_erase = spi_block_erase_c7,
12173 }
12174 },
12175 .printlock = spi_prettyprint_status_register_bp3_srwd,
12176 .unlock = spi_disable_blockprotect_bp3_srwd,
12177 .write = spi_chip_write_256,
12178 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12179 .voltage = {2700, 3600},
12180 },
12181
12182 {
12183 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012184 .name = "N25S20",
12185 .bustype = BUS_SPI,
12186 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12187 .model_id = NANTRONICS_N25S20,
12188 .total_size = 256,
12189 .page_size = 256,
12190 .feature_bits = FEATURE_WRSR_WREN,
12191 .tested = TEST_UNTESTED,
12192 .probe = probe_spi_rdid,
12193 .probe_timing = TIMING_ZERO,
12194 .block_erasers =
12195 {
12196 {
12197 .eraseblocks = { {4 * 1024, 64} },
12198 .block_erase = spi_block_erase_20,
12199 }, {
12200 .eraseblocks = { {4 * 1024, 64} },
12201 .block_erase = spi_block_erase_d7,
12202 }, {
12203 .eraseblocks = { {32 * 1024, 8} },
12204 .block_erase = spi_block_erase_52,
12205 }, {
12206 .eraseblocks = { {64 * 1024, 4} },
12207 .block_erase = spi_block_erase_d8,
12208 }, {
12209 .eraseblocks = { {256 * 1024, 1} },
12210 .block_erase = spi_block_erase_60,
12211 }, {
12212 .eraseblocks = { {256 * 1024, 1} },
12213 .block_erase = spi_block_erase_c7,
12214 }
12215 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012216 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012217 .unlock = spi_disable_blockprotect_bp3_srwd,
12218 .write = spi_chip_write_256,
12219 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12220 .voltage = {2700, 3600},
12221 },
12222
12223 {
12224 .vendor = "Nantronics",
12225 .name = "N25S40",
12226 .bustype = BUS_SPI,
12227 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12228 .model_id = NANTRONICS_N25S40,
12229 .total_size = 512,
12230 .page_size = 256,
12231 .feature_bits = FEATURE_WRSR_WREN,
12232 .tested = TEST_UNTESTED,
12233 .probe = probe_spi_rdid,
12234 .probe_timing = TIMING_ZERO,
12235 .block_erasers =
12236 {
12237 {
12238 .eraseblocks = { {4 * 1024, 128} },
12239 .block_erase = spi_block_erase_20,
12240 }, {
12241 .eraseblocks = { {4 * 1024, 128} },
12242 .block_erase = spi_block_erase_d7,
12243 }, {
12244 .eraseblocks = { {32 * 1024, 16} },
12245 .block_erase = spi_block_erase_52,
12246 }, {
12247 .eraseblocks = { {64 * 1024, 8} },
12248 .block_erase = spi_block_erase_d8,
12249 }, {
12250 .eraseblocks = { {512 * 1024, 1} },
12251 .block_erase = spi_block_erase_60,
12252 }, {
12253 .eraseblocks = { {512 * 1024, 1} },
12254 .block_erase = spi_block_erase_c7,
12255 }
12256 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012257 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012258 .unlock = spi_disable_blockprotect_bp3_srwd,
12259 .write = spi_chip_write_256,
12260 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12261 .voltage = {2700, 3600},
12262 },
12263
12264 {
12265 .vendor = "Nantronics",
12266 .name = "N25S80",
12267 .bustype = BUS_SPI,
12268 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12269 .model_id = NANTRONICS_N25S80,
12270 .total_size = 1024,
12271 .page_size = 256,
12272 .feature_bits = FEATURE_WRSR_WREN,
12273 .tested = TEST_UNTESTED,
12274 .probe = probe_spi_rdid,
12275 .probe_timing = TIMING_ZERO,
12276 .block_erasers =
12277 {
12278 {
12279 .eraseblocks = { {4 * 1024, 256} },
12280 .block_erase = spi_block_erase_20,
12281 }, {
12282 .eraseblocks = { {32 * 1024, 32} },
12283 .block_erase = spi_block_erase_52,
12284 }, {
12285 .eraseblocks = { {64 * 1024, 16} },
12286 .block_erase = spi_block_erase_d8,
12287 }, {
12288 .eraseblocks = { {1024 * 1024, 1} },
12289 .block_erase = spi_block_erase_60,
12290 }, {
12291 .eraseblocks = { {1024 * 1024, 1} },
12292 .block_erase = spi_block_erase_c7,
12293 }
12294 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012295 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012296 .unlock = spi_disable_blockprotect_bp3_srwd,
12297 .write = spi_chip_write_256,
12298 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12299 .voltage = {2700, 3600},
12300 },
12301
12302 {
Stefan Taunerf4451612013-04-19 01:59:15 +000012303 .vendor = "PMC",
12304 .name = "Pm25LD010(C)",
12305 .bustype = BUS_SPI,
12306 .manufacture_id = PMC_ID,
12307 .model_id = PMC_PM25LD010,
12308 .total_size = 128,
12309 .page_size = 256,
12310 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000012311 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012312 .probe = probe_spi_rdid,
12313 .probe_timing = TIMING_ZERO,
12314 .block_erasers =
12315 {
12316 {
12317 .eraseblocks = { {4 * 1024, 32} },
12318 .block_erase = spi_block_erase_20,
12319 }, {
12320 .eraseblocks = { {4 * 1024, 32} },
12321 .block_erase = spi_block_erase_d7,
12322 }, {
12323 .eraseblocks = { {32 * 1024, 4} },
12324 .block_erase = spi_block_erase_d8,
12325 }, {
12326 .eraseblocks = { {128 * 1024, 1} },
12327 .block_erase = spi_block_erase_60,
12328 }, {
12329 .eraseblocks = { {128 * 1024, 1} },
12330 .block_erase = spi_block_erase_c7,
12331 }
12332 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012333 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012334 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12335 .write = spi_chip_write_256,
12336 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12337 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
12338 },
12339
12340 {
12341 .vendor = "PMC",
12342 .name = "Pm25LD020(C)",
12343 .bustype = BUS_SPI,
12344 .manufacture_id = PMC_ID,
12345 .model_id = PMC_PM25LD020,
12346 .total_size = 256,
12347 .page_size = 256,
12348 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020012349 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012350 .probe = probe_spi_rdid,
12351 .probe_timing = TIMING_ZERO,
12352 .block_erasers =
12353 {
12354 {
12355 .eraseblocks = { {4 * 1024, 64} },
12356 .block_erase = spi_block_erase_20,
12357 }, {
12358 .eraseblocks = { {4 * 1024, 64} },
12359 .block_erase = spi_block_erase_d7,
12360 }, {
12361 .eraseblocks = { {64 * 1024, 4} },
12362 .block_erase = spi_block_erase_d8,
12363 }, {
12364 .eraseblocks = { {256 * 1024, 1} },
12365 .block_erase = spi_block_erase_60,
12366 }, {
12367 .eraseblocks = { {256 * 1024, 1} },
12368 .block_erase = spi_block_erase_c7,
12369 }
12370 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012371 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012372 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12373 .write = spi_chip_write_256,
12374 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12375 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
12376 },
12377
12378 {
12379 .vendor = "PMC",
12380 .name = "Pm25LD040(C)",
12381 .bustype = BUS_SPI,
12382 .manufacture_id = PMC_ID,
12383 .model_id = PMC_PM25LV040,
12384 .total_size = 512,
12385 .page_size = 256,
12386 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020012387 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000012388 .probe = probe_spi_rdid,
12389 .probe_timing = TIMING_ZERO,
12390 .block_erasers =
12391 {
12392 {
12393 .eraseblocks = { {4 * 1024, 128} },
12394 .block_erase = spi_block_erase_20,
12395 }, {
12396 .eraseblocks = { {4 * 1024, 128} },
12397 .block_erase = spi_block_erase_d7,
12398 }, {
12399 .eraseblocks = { {64 * 1024, 8} },
12400 .block_erase = spi_block_erase_d8,
12401 }, {
12402 .eraseblocks = { {512 * 1024, 1} },
12403 .block_erase = spi_block_erase_60,
12404 }, {
12405 .eraseblocks = { {512 * 1024, 1} },
12406 .block_erase = spi_block_erase_c7,
12407 }
12408 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012409 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000012410 .unlock = spi_disable_blockprotect,
12411 .write = spi_chip_write_256,
12412 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12413 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
12414 },
12415
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012416 {
12417 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012418 .name = "Pm25LD256C",
12419 .bustype = BUS_SPI,
12420 .manufacture_id = PMC_ID,
12421 .model_id = PMC_PM25LD256C,
12422 .total_size = 32,
12423 .page_size = 256,
12424 .feature_bits = FEATURE_WRSR_WREN,
12425 .tested = TEST_UNTESTED,
12426 .probe = probe_spi_rdid,
12427 .probe_timing = TIMING_ZERO,
12428 .block_erasers =
12429 {
12430 {
12431 .eraseblocks = { {4 * 1024, 8} },
12432 .block_erase = spi_block_erase_20,
12433 }, {
12434 .eraseblocks = { {4 * 1024, 8} },
12435 .block_erase = spi_block_erase_d7,
12436 }, {
12437 .eraseblocks = { {32 * 1024, 1} },
12438 .block_erase = spi_block_erase_d8,
12439 }, {
12440 .eraseblocks = { {32 * 1024, 1} },
12441 .block_erase = spi_block_erase_60,
12442 }, {
12443 .eraseblocks = { {32 * 1024, 1} },
12444 .block_erase = spi_block_erase_c7,
12445 }
12446 },
12447 .printlock = spi_prettyprint_status_register_bp2_srwd,
12448 .unlock = spi_disable_blockprotect,
12449 .write = spi_chip_write_256,
12450 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12451 .voltage = {2700, 3600},
12452 },
12453
12454 {
12455 .vendor = "PMC",
12456 .name = "Pm25LD512(C)",
12457 .bustype = BUS_SPI,
12458 .manufacture_id = PMC_ID,
12459 .model_id = PMC_PM25LD512,
12460 .total_size = 64,
12461 .page_size = 256,
12462 .feature_bits = FEATURE_WRSR_WREN,
12463 .tested = TEST_OK_PREW,
12464 .probe = probe_spi_rdid,
12465 .probe_timing = TIMING_ZERO,
12466 .block_erasers =
12467 {
12468 {
12469 .eraseblocks = { {4 * 1024, 16} },
12470 .block_erase = spi_block_erase_20,
12471 }, {
12472 .eraseblocks = { {4 * 1024, 16} },
12473 .block_erase = spi_block_erase_d7,
12474 }, {
12475 .eraseblocks = { {32 * 1024, 2} },
12476 .block_erase = spi_block_erase_d8,
12477 }, {
12478 .eraseblocks = { {64 * 1024, 1} },
12479 .block_erase = spi_block_erase_60,
12480 }, {
12481 .eraseblocks = { {64 * 1024, 1} },
12482 .block_erase = spi_block_erase_c7,
12483 }
12484 },
12485 .printlock = spi_prettyprint_status_register_bp2_srwd,
12486 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12487 .write = spi_chip_write_256,
12488 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12489 .voltage = {2300, 3600},
12490 },
12491
12492 {
12493 .vendor = "PMC",
12494 .name = "Pm25LQ016",
12495 .bustype = BUS_SPI,
12496 .manufacture_id = PMC_ID,
12497 .model_id = PMC_PM25LQ016,
12498 .total_size = 2048,
12499 .page_size = 256,
12500 /* OTP: 256B total; read 0x4B, write 0xB1 */
12501 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12502 .tested = TEST_UNTESTED,
12503 .probe = probe_spi_rdid,
12504 .probe_timing = TIMING_ZERO,
12505 .block_erasers =
12506 {
12507 {
12508 .eraseblocks = { {4 * 1024, 512} },
12509 .block_erase = spi_block_erase_20,
12510 }, {
12511 .eraseblocks = { {4 * 1024, 512} },
12512 .block_erase = spi_block_erase_d7,
12513 }, {
12514 .eraseblocks = { {64 * 1024, 32} },
12515 .block_erase = spi_block_erase_d8,
12516 }, {
12517 .eraseblocks = { {2048 * 1024, 1} },
12518 .block_erase = spi_block_erase_60,
12519 }, {
12520 .eraseblocks = { {2048 * 1024, 1} },
12521 .block_erase = spi_block_erase_c7,
12522 }
12523 },
12524 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12525 .unlock = spi_disable_blockprotect_bp3_srwd,
12526 .write = spi_chip_write_256,
12527 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12528 .voltage = {2300, 3600},
12529 },
12530
12531 {
12532 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012533 .name = "Pm25LQ020",
12534 .bustype = BUS_SPI,
12535 .manufacture_id = PMC_ID,
12536 .model_id = PMC_PM25LQ020,
12537 .total_size = 256,
12538 .page_size = 256,
12539 /* OTP: 256B total; read 0x4B, write 0xB1 */
12540 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12541 .tested = TEST_UNTESTED,
12542 .probe = probe_spi_rdid,
12543 .probe_timing = TIMING_ZERO,
12544 .block_erasers =
12545 {
12546 {
12547 .eraseblocks = { {4 * 1024, 64} },
12548 .block_erase = spi_block_erase_20,
12549 }, {
12550 .eraseblocks = { {4 * 1024, 64} },
12551 .block_erase = spi_block_erase_d7,
12552 }, {
12553 .eraseblocks = { {64 * 1024, 4} },
12554 .block_erase = spi_block_erase_d8,
12555 }, {
12556 .eraseblocks = { {256 * 1024, 1} },
12557 .block_erase = spi_block_erase_60,
12558 }, {
12559 .eraseblocks = { {256 * 1024, 1} },
12560 .block_erase = spi_block_erase_c7,
12561 }
12562 },
12563 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12564 .unlock = spi_disable_blockprotect_bp3_srwd,
12565 .write = spi_chip_write_256,
12566 .read = spi_chip_read,
12567 .voltage = {2300, 3600},
12568 },
12569
12570 {
12571 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012572 .name = "Pm25LQ032C",
12573 .bustype = BUS_SPI,
12574 .manufacture_id = PMC_ID,
12575 .model_id = PMC_PM25LQ032C,
12576 .total_size = 4096,
12577 .page_size = 256,
12578 /* OTP: 64B total; read 0x4B, write 0xB1 */
12579 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12580 .tested = TEST_OK_PREW,
12581 .probe = probe_spi_rdid,
12582 .probe_timing = TIMING_ZERO,
12583 .block_erasers =
12584 {
12585 {
12586 .eraseblocks = { {4 * 1024, 1024} },
12587 .block_erase = spi_block_erase_20,
12588 }, {
12589 .eraseblocks = { {4 * 1024, 1024} },
12590 .block_erase = spi_block_erase_d7,
12591 }, {
12592 .eraseblocks = { {64 * 1024, 64} },
12593 .block_erase = spi_block_erase_d8,
12594 }, {
12595 .eraseblocks = { {4096 * 1024, 1} },
12596 .block_erase = spi_block_erase_60,
12597 }, {
12598 .eraseblocks = { {4096 * 1024, 1} },
12599 .block_erase = spi_block_erase_c7,
12600 }
12601 },
12602 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12603 .unlock = spi_disable_blockprotect_bp3_srwd,
12604 .write = spi_chip_write_256,
12605 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12606 .voltage = {2700, 3600},
12607 },
12608
12609 {
12610 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000012611 .name = "Pm25LQ040",
12612 .bustype = BUS_SPI,
12613 .manufacture_id = PMC_ID,
12614 .model_id = PMC_PM25LQ040,
12615 .total_size = 512,
12616 .page_size = 256,
12617 /* OTP: 256B total; read 0x4B, write 0xB1 */
12618 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12619 .tested = TEST_UNTESTED,
12620 .probe = probe_spi_rdid,
12621 .probe_timing = TIMING_ZERO,
12622 .block_erasers =
12623 {
12624 {
12625 .eraseblocks = { {4 * 1024, 128} },
12626 .block_erase = spi_block_erase_20,
12627 }, {
12628 .eraseblocks = { {4 * 1024, 128} },
12629 .block_erase = spi_block_erase_d7,
12630 }, {
12631 .eraseblocks = { {64 * 1024, 8} },
12632 .block_erase = spi_block_erase_d8,
12633 }, {
12634 .eraseblocks = { {512 * 1024, 1} },
12635 .block_erase = spi_block_erase_60,
12636 }, {
12637 .eraseblocks = { {512 * 1024, 1} },
12638 .block_erase = spi_block_erase_c7,
12639 }
12640 },
12641 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12642 .unlock = spi_disable_blockprotect_bp3_srwd,
12643 .write = spi_chip_write_256,
12644 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12645 .voltage = {2300, 3600},
12646 },
12647
12648 {
12649 .vendor = "PMC",
12650 .name = "Pm25LQ080",
12651 .bustype = BUS_SPI,
12652 .manufacture_id = PMC_ID,
12653 .model_id = PMC_PM25LQ080,
12654 .total_size = 1024,
12655 .page_size = 256,
12656 /* OTP: 64B total; read 0x4B, write 0xB1 */
12657 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12658 .tested = TEST_UNTESTED,
12659 .probe = probe_spi_rdid,
12660 .probe_timing = TIMING_ZERO,
12661 .block_erasers =
12662 {
12663 {
12664 .eraseblocks = { {4 * 1024, 256} },
12665 .block_erase = spi_block_erase_20,
12666 }, {
12667 .eraseblocks = { {4 * 1024, 256} },
12668 .block_erase = spi_block_erase_d7,
12669 }, {
12670 .eraseblocks = { {64 * 1024, 16} },
12671 .block_erase = spi_block_erase_d8,
12672 }, {
12673 .eraseblocks = { {1024 * 1024, 1} },
12674 .block_erase = spi_block_erase_60,
12675 }, {
12676 .eraseblocks = { {1024 * 1024, 1} },
12677 .block_erase = spi_block_erase_c7,
12678 }
12679 },
12680 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12681 .unlock = spi_disable_blockprotect_bp3_srwd,
12682 .write = spi_chip_write_256,
12683 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12684 .voltage = {2300, 3600},
12685 },
12686
12687 {
12688 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012689 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012690 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000012691 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012692 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012693 .total_size = 128,
12694 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012695 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000012696 .tested = TEST_OK_PREW,
12697 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012698 .probe_timing = TIMING_ZERO,
12699 .block_erasers =
12700 {
12701 {
12702 .eraseblocks = { {4 * 1024, 32} },
12703 .block_erase = spi_block_erase_d7,
12704 }, {
12705 .eraseblocks = { {32 * 1024, 4} },
12706 .block_erase = spi_block_erase_d8,
12707 }, {
12708 .eraseblocks = { {128 * 1024, 1} },
12709 .block_erase = spi_block_erase_c7,
12710 }
12711 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012712 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012713 .unlock = spi_disable_blockprotect,
12714 .write = spi_chip_write_256,
12715 .read = spi_chip_read, /* Fast read (0x0B) supported */
12716 .voltage = {2700, 3600},
12717 },
12718
12719 {
12720 .vendor = "PMC",
12721 .name = "Pm25LV010A",
12722 .bustype = BUS_SPI,
12723 .manufacture_id = PMC_ID,
12724 .model_id = PMC_PM25LV010,
12725 .total_size = 128,
12726 .page_size = 256,
12727 .feature_bits = FEATURE_WRSR_WREN,
12728 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012729 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012730 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012731 .block_erasers =
12732 {
12733 {
12734 .eraseblocks = { {4 * 1024, 32} },
12735 .block_erase = spi_block_erase_d7,
12736 }, {
12737 .eraseblocks = { {32 * 1024, 4} },
12738 .block_erase = spi_block_erase_d8,
12739 }, {
12740 .eraseblocks = { {128 * 1024, 1} },
12741 .block_erase = spi_block_erase_c7,
12742 }
12743 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012744 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012745 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012746 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012747 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000012748 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012749 },
12750
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012751 {
12752 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012753 .name = "Pm25LV016B",
12754 .bustype = BUS_SPI,
12755 .manufacture_id = PMC_ID,
12756 .model_id = PMC_PM25LV016B,
12757 .total_size = 2048,
12758 .page_size = 256,
12759 .feature_bits = FEATURE_WRSR_WREN,
12760 .tested = TEST_UNTESTED,
12761 .probe = probe_spi_rdid,
12762 .probe_timing = TIMING_ZERO,
12763 .block_erasers =
12764 {
12765 {
12766 .eraseblocks = { {4 * 1024, 512} },
12767 .block_erase = spi_block_erase_d7,
12768 }, {
12769 .eraseblocks = { {4 * 1024, 512} },
12770 .block_erase = spi_block_erase_20,
12771 }, {
12772 .eraseblocks = { {64 * 1024, 32} },
12773 .block_erase = spi_block_erase_d8,
12774 }, {
12775 .eraseblocks = { {2 * 1024 * 1024, 1} },
12776 .block_erase = spi_block_erase_60,
12777 }, {
12778 .eraseblocks = { {2 * 1024 * 1024, 1} },
12779 .block_erase = spi_block_erase_c7,
12780 }
12781 },
12782 .printlock = spi_prettyprint_status_register_bp2_srwd,
12783 .unlock = spi_disable_blockprotect,
12784 .write = spi_chip_write_256,
12785 .read = spi_chip_read, /* Fast read (0x0B) supported */
12786 .voltage = {2700, 3600},
12787 },
12788
12789 {
12790 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012791 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012792 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012793 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012794 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012795 .total_size = 256,
12796 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012797 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012798 .tested = TEST_UNTESTED,
12799 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012800 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012801 .block_erasers =
12802 {
12803 {
12804 .eraseblocks = { {4 * 1024, 64} },
12805 .block_erase = spi_block_erase_d7,
12806 }, {
12807 .eraseblocks = { {64 * 1024, 4} },
12808 .block_erase = spi_block_erase_d8,
12809 }, {
12810 .eraseblocks = { {256 * 1024, 1} },
12811 .block_erase = spi_block_erase_c7,
12812 }
12813 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012814 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012815 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012816 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012817 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012818 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012819 },
12820
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012821 {
12822 .vendor = "PMC",
12823 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012824 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012825 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012826 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012827 .total_size = 512,
12828 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012829 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000012830 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012831 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012832 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012833 .block_erasers =
12834 {
12835 {
12836 .eraseblocks = { {4 * 1024, 128} },
12837 .block_erase = spi_block_erase_d7,
12838 }, {
12839 .eraseblocks = { {64 * 1024, 8} },
12840 .block_erase = spi_block_erase_d8,
12841 }, {
12842 .eraseblocks = { {512 * 1024, 1} },
12843 .block_erase = spi_block_erase_c7,
12844 }
12845 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012846 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012847 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012848 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012849 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012850 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012851 },
12852
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012853 {
12854 .vendor = "PMC",
12855 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012856 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012857 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012858 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012859 .total_size = 1024,
12860 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012861 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012862 .tested = TEST_UNTESTED,
12863 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012864 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012865 .block_erasers =
12866 {
12867 {
12868 .eraseblocks = { {4 * 1024, 256} },
12869 .block_erase = spi_block_erase_d7,
12870 }, {
12871 .eraseblocks = { {4 * 1024, 256} },
12872 .block_erase = spi_block_erase_20,
12873 }, {
12874 .eraseblocks = { {64 * 1024, 16} },
12875 .block_erase = spi_block_erase_d8,
12876 }, {
12877 .eraseblocks = { {1024 * 1024, 1} },
12878 .block_erase = spi_block_erase_60,
12879 }, {
12880 .eraseblocks = { {1024 * 1024, 1} },
12881 .block_erase = spi_block_erase_c7,
12882 }
12883 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012884 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012885 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012886 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012887 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012888 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012889 },
12890
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012891 {
12892 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012893 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012894 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100012895 .manufacture_id = PMC_ID_NOPREFIX,
12896 .model_id = PMC_PM25LV512,
12897 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012898 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000012899 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100012900 .tested = TEST_OK_PREW,
12901 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000012902 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000012903 .block_erasers =
12904 {
12905 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012906 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000012907 .block_erase = spi_block_erase_d7,
12908 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012909 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000012910 .block_erase = spi_block_erase_d8,
12911 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100012912 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000012913 .block_erase = spi_block_erase_c7,
12914 }
12915 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100012916 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000012917 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000012918 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000012919 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000012920 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000012921 },
12922
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000012923 {
12924 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000012925 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012926 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012927 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012928 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012929 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000012930 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000012931 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012932 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000012933 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000012934 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000012935 .block_erasers =
12936 {
12937 {
12938 .eraseblocks = {
12939 {16 * 1024, 1},
12940 {8 * 1024, 2},
12941 {96 * 1024, 1},
12942 {128 * 1024, 1},
12943 },
Sean Nelson35727f72010-01-28 23:55:12 +000012944 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000012945 }, {
12946 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000012947 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000012948 },
12949 },
Sean Nelson35727f72010-01-28 23:55:12 +000012950 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012951 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012952 .voltage = {4500, 5500},
Uwe Hermannf983d9f2009-06-14 21:53:26 +000012953 },
12954
12955 {
12956 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012957 .name = "Pm29F002T",
12958 .bustype = BUS_PARALLEL,
12959 .manufacture_id = PMC_ID_NOPREFIX,
12960 .model_id = PMC_PM29F002T,
12961 .total_size = 256,
12962 .page_size = 8 * 1024,
12963 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12964 .tested = TEST_OK_PREW,
12965 .probe = probe_jedec,
12966 .probe_timing = TIMING_FIXME,
12967 .block_erasers =
12968 {
12969 {
12970 .eraseblocks = {
12971 {128 * 1024, 1},
12972 {96 * 1024, 1},
12973 {8 * 1024, 2},
12974 {16 * 1024, 1},
12975 },
12976 .block_erase = erase_sector_jedec,
12977 }, {
12978 .eraseblocks = { {256 * 1024, 1} },
12979 .block_erase = erase_chip_block_jedec,
12980 },
12981 },
12982 .write = write_jedec_1,
12983 .read = read_memmapped,
12984 .voltage = {4500, 5500},
12985 },
12986
12987 {
12988 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012989 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012990 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012991 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000012992 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012993 .total_size = 128,
12994 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000012995 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000012996 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000012997 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000012998 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000012999 .block_erasers =
13000 {
13001 {
13002 .eraseblocks = { {4 * 1024, 32} },
13003 .block_erase = erase_sector_jedec,
13004 }, {
13005 .eraseblocks = { {64 * 1024, 2} },
13006 .block_erase = erase_block_jedec,
13007 }, {
13008 .eraseblocks = { {128 * 1024, 1} },
13009 .block_erase = erase_chip_block_jedec,
13010 }
13011 },
Sean Nelson35727f72010-01-28 23:55:12 +000013012 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013013 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013014 .voltage = {2700, 3600},
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013015 },
13016
13017 {
13018 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013019 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013020 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013021 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013022 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013023 .total_size = 256,
13024 .page_size = 4096,
13025 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13026 .tested = TEST_UNTESTED,
13027 .probe = probe_jedec,
13028 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013029 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013030 {
13031 {
13032 .eraseblocks = { {4 * 1024, 64} },
13033 .block_erase = erase_sector_jedec,
13034 }, {
13035 .eraseblocks = { {64 * 1024, 4} },
13036 .block_erase = erase_block_jedec,
13037 }, {
13038 .eraseblocks = { {256 * 1024, 1} },
13039 .block_erase = erase_chip_block_jedec,
13040 }
13041 },
13042 .write = write_jedec_1,
13043 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013044 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013045 },
13046
13047 {
13048 .vendor = "PMC",
13049 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013050 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013051 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013052 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013053 .total_size = 512,
13054 .page_size = 4096,
13055 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013056 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013057 .probe = probe_jedec,
13058 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013059 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013060 {
13061 {
13062 .eraseblocks = { {4 * 1024, 128} },
13063 .block_erase = erase_sector_jedec,
13064 }, {
13065 .eraseblocks = { {64 * 1024, 8} },
13066 .block_erase = erase_block_jedec,
13067 }, {
13068 .eraseblocks = { {512 * 1024, 1} },
13069 .block_erase = erase_chip_block_jedec,
13070 }
13071 },
13072 .write = write_jedec_1,
13073 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013074 .voltage = {2700, 3600},
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013075 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013076
13077 {
13078 .vendor = "PMC",
13079 .name = "Pm39LV512",
13080 .bustype = BUS_PARALLEL,
13081 .manufacture_id = PMC_ID_NOPREFIX,
13082 .model_id = PMC_PM39LV512,
13083 .total_size = 64,
13084 .page_size = 4096,
13085 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13086 .tested = TEST_OK_PREW,
13087 .probe = probe_jedec,
13088 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13089 .block_erasers =
13090 {
13091 {
13092 .eraseblocks = { {4 * 1024, 16} },
13093 .block_erase = erase_sector_jedec,
13094 }, {
13095 .eraseblocks = { {64 * 1024, 1} },
13096 .block_erase = erase_block_jedec,
13097 }, {
13098 .eraseblocks = { {64 * 1024, 1} },
13099 .block_erase = erase_chip_block_jedec,
13100 }
13101 },
13102 .write = write_jedec_1,
13103 .read = read_memmapped,
13104 .voltage = {2700, 3600},
13105 },
13106
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013107 {
13108 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013109 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013110 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013111 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013112 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013113 .total_size = 256,
13114 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013115 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013116 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013117 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013118 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000013119 .block_erasers =
13120 {
13121 {
13122 .eraseblocks = { {4 * 1024, 64} },
13123 .block_erase = erase_sector_jedec,
13124 }, {
13125 .eraseblocks = { {16 * 1024, 16} },
13126 .block_erase = erase_block_jedec,
13127 }, {
13128 .eraseblocks = { {256 * 1024, 1} },
13129 .block_erase = erase_chip_block_jedec,
13130 }
13131 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013132 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000013133 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013134 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013135 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013136 },
13137
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013138 {
13139 .vendor = "PMC",
13140 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013141 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013142 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013143 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013144 .total_size = 512,
13145 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013146 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013147 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013148 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013149 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013150 .block_erasers =
13151 {
13152 {
13153 .eraseblocks = { {4 * 1024, 128} },
13154 .block_erase = erase_sector_jedec,
13155 }, {
13156 .eraseblocks = { {64 * 1024, 8} },
13157 .block_erase = erase_block_jedec,
13158 }, {
13159 .eraseblocks = { {512 * 1024, 1} },
13160 .block_erase = erase_chip_block_jedec,
13161 }
13162 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013163 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000013164 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013165 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013166 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013167 },
13168
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013169 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013170 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013171 .name = "SST25LF020A",
13172 .bustype = BUS_SPI,
13173 .manufacture_id = SST_ID,
13174 .model_id = SST_SST25VF020_REMS,
13175 .total_size = 256,
13176 .page_size = 256,
13177 .feature_bits = FEATURE_WRSR_EWSR,
13178 .tested = TEST_OK_PREW,
13179 .probe = probe_spi_rems,
13180 .probe_timing = TIMING_ZERO,
13181 .block_erasers =
13182 {
13183 {
13184 .eraseblocks = { {4 * 1024, 64} },
13185 .block_erase = spi_block_erase_20,
13186 }, {
13187 .eraseblocks = { {32 * 1024, 8} },
13188 .block_erase = spi_block_erase_52,
13189 }, {
13190 .eraseblocks = { {256 * 1024, 1} },
13191 .block_erase = spi_block_erase_60,
13192 },
13193 },
13194 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13195 .unlock = spi_disable_blockprotect,
13196 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13197 .read = spi_chip_read, /* Fast read (0x0B) supported */
13198 .voltage = {2700, 3600},
13199 },
13200
13201 {
13202 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013203 .name = "SST25LF040A",
13204 .bustype = BUS_SPI,
13205 .manufacture_id = SST_ID,
13206 .model_id = SST_SST25VF040_REMS,
13207 .total_size = 512,
13208 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013209 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013210 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013211 .probe = probe_spi_res2,
13212 .probe_timing = TIMING_ZERO,
13213 .block_erasers =
13214 {
13215 {
13216 .eraseblocks = { {4 * 1024, 128} },
13217 .block_erase = spi_block_erase_20,
13218 }, {
13219 .eraseblocks = { {32 * 1024, 16} },
13220 .block_erase = spi_block_erase_52,
13221 }, {
13222 .eraseblocks = { {512 * 1024, 1} },
13223 .block_erase = spi_block_erase_60,
13224 },
13225 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013226 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013227 .unlock = spi_disable_blockprotect,
13228 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13229 .read = spi_chip_read,
13230 .voltage = {3000, 3600},
13231 },
13232
13233 {
13234 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013235 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013236 .bustype = BUS_SPI,
13237 .manufacture_id = SST_ID,
13238 .model_id = SST_SST25VF080_REMS,
13239 .total_size = 1024,
13240 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013241 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013242 .tested = TEST_UNTESTED,
13243 .probe = probe_spi_res2,
13244 .probe_timing = TIMING_ZERO,
13245 .block_erasers =
13246 {
13247 {
13248 .eraseblocks = { {4 * 1024, 256} },
13249 .block_erase = spi_block_erase_20,
13250 }, {
13251 .eraseblocks = { {32 * 1024, 32} },
13252 .block_erase = spi_block_erase_52,
13253 }, {
13254 .eraseblocks = { {1024 * 1024, 1} },
13255 .block_erase = spi_block_erase_60,
13256 },
13257 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013258 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013259 .unlock = spi_disable_blockprotect,
13260 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13261 .read = spi_chip_read,
13262 .voltage = {3000, 3600},
13263 },
13264
13265 {
13266 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013267 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013268 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013269 .manufacture_id = SST_ID,
13270 .model_id = SST_SST25VF010_REMS,
13271 .total_size = 128,
13272 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013273 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000013274 .tested = TEST_OK_PREW,
13275 .probe = probe_spi_rems,
13276 .probe_timing = TIMING_ZERO,
13277 .block_erasers =
13278 {
13279 {
13280 .eraseblocks = { {4 * 1024, 32} },
13281 .block_erase = spi_block_erase_20,
13282 }, {
13283 .eraseblocks = { {32 * 1024, 4} },
13284 .block_erase = spi_block_erase_52,
13285 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000013286 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013287 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013288 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000013289 .eraseblocks = { {128 * 1024, 1} },
13290 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000013291 }, {
13292 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000013293 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013294 },
13295 },
13296 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13297 .unlock = spi_disable_blockprotect,
13298 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000013299 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000013300 .voltage = {2700, 3600},
13301 },
13302
13303 {
13304 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013305 .name = "SST25VF016B",
13306 .bustype = BUS_SPI,
13307 .manufacture_id = SST_ID,
13308 .model_id = SST_SST25VF016B,
13309 .total_size = 2048,
13310 .page_size = 256,
13311 .feature_bits = FEATURE_WRSR_EITHER,
13312 .tested = TEST_OK_PREW,
13313 .probe = probe_spi_rdid,
13314 .probe_timing = TIMING_ZERO,
13315 .block_erasers =
13316 {
13317 {
13318 .eraseblocks = { {4 * 1024, 512} },
13319 .block_erase = spi_block_erase_20,
13320 }, {
13321 .eraseblocks = { {32 * 1024, 64} },
13322 .block_erase = spi_block_erase_52,
13323 }, {
13324 .eraseblocks = { {64 * 1024, 32} },
13325 .block_erase = spi_block_erase_d8,
13326 }, {
13327 .eraseblocks = { {2 * 1024 * 1024, 1} },
13328 .block_erase = spi_block_erase_60,
13329 }, {
13330 .eraseblocks = { {2 * 1024 * 1024, 1} },
13331 .block_erase = spi_block_erase_c7,
13332 },
13333 },
13334 .printlock = spi_prettyprint_status_register_sst25vf016,
13335 .unlock = spi_disable_blockprotect,
13336 .write = spi_aai_write,
13337 .read = spi_chip_read,
13338 .voltage = {2700, 3600},
13339 },
13340
13341 {
13342 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013343 .name = "SST25VF020",
13344 .bustype = BUS_SPI,
13345 .manufacture_id = SST_ID,
13346 .model_id = SST_SST25VF020_REMS,
13347 .total_size = 256,
13348 .page_size = 256,
13349 .feature_bits = FEATURE_WRSR_EWSR,
13350 .tested = TEST_UNTESTED,
13351 .probe = probe_spi_rems,
13352 .probe_timing = TIMING_ZERO,
13353 .block_erasers =
13354 {
13355 {
13356 .eraseblocks = { {4 * 1024, 64} },
13357 .block_erase = spi_block_erase_20,
13358 }, {
13359 .eraseblocks = { {32 * 1024, 8} },
13360 .block_erase = spi_block_erase_52,
13361 }, {
13362 .eraseblocks = { {256 * 1024, 1} },
13363 .block_erase = spi_block_erase_60,
13364 },
13365 },
13366 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13367 .unlock = spi_disable_blockprotect,
13368 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13369 .read = spi_chip_read, /* only */
13370 .voltage = {2700, 3600},
13371 },
13372
13373 {
13374 .vendor = "SST",
13375 .name = "SST25VF020B",
13376 .bustype = BUS_SPI,
13377 .manufacture_id = SST_ID,
13378 .model_id = SST_SST25VF020B,
13379 .total_size = 256,
13380 .page_size = 256,
13381 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013382 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000013383 .probe = probe_spi_rdid,
13384 .probe_timing = TIMING_ZERO,
13385 .block_erasers =
13386 {
13387 {
13388 .eraseblocks = { {4 * 1024, 64} },
13389 .block_erase = spi_block_erase_20,
13390 }, {
13391 .eraseblocks = { {32 * 1024, 8} },
13392 .block_erase = spi_block_erase_52,
13393 }, {
13394 .eraseblocks = { {64 * 1024, 4} },
13395 .block_erase = spi_block_erase_d8,
13396 }, {
13397 .eraseblocks = { {256 * 1024, 1} },
13398 .block_erase = spi_block_erase_60,
13399 }, {
13400 .eraseblocks = { {256 * 1024, 1} },
13401 .block_erase = spi_block_erase_c7,
13402 },
13403 },
13404 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13405 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13406 .write = spi_aai_write, /* AAI supported (0xAD) */
13407 .read = spi_chip_read, /* Fast read (0x0B) supported */
13408 .voltage = {2700, 3600},
13409 },
13410
13411 {
13412 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013413 .name = "SST25VF032B",
13414 .bustype = BUS_SPI,
13415 .manufacture_id = SST_ID,
13416 .model_id = SST_SST25VF032B,
13417 .total_size = 4096,
13418 .page_size = 256,
13419 .feature_bits = FEATURE_WRSR_EWSR,
13420 .tested = TEST_OK_PREW,
13421 .probe = probe_spi_rdid,
13422 .probe_timing = TIMING_ZERO,
13423 .block_erasers =
13424 {
13425 {
13426 .eraseblocks = { {4 * 1024, 1024} },
13427 .block_erase = spi_block_erase_20,
13428 }, {
13429 .eraseblocks = { {32 * 1024, 128} },
13430 .block_erase = spi_block_erase_52,
13431 }, {
13432 .eraseblocks = { {64 * 1024, 64} },
13433 .block_erase = spi_block_erase_d8,
13434 }, {
13435 .eraseblocks = { {4 * 1024 * 1024, 1} },
13436 .block_erase = spi_block_erase_60,
13437 }, {
13438 .eraseblocks = { {4 * 1024 * 1024, 1} },
13439 .block_erase = spi_block_erase_c7,
13440 },
13441 },
13442 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13443 .unlock = spi_disable_blockprotect,
13444 .write = spi_aai_write,
13445 .read = spi_chip_read,
13446 .voltage = {2700, 3600},
13447 },
13448
13449 {
13450 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013451 .name = "SST25VF040",
13452 .bustype = BUS_SPI,
13453 .manufacture_id = SST_ID,
13454 .model_id = SST_SST25VF040_REMS,
13455 .total_size = 512,
13456 .page_size = 256,
13457 .feature_bits = FEATURE_WRSR_EWSR,
13458 .tested = TEST_OK_PR,
13459 .probe = probe_spi_rems,
13460 .probe_timing = TIMING_ZERO,
13461 .block_erasers =
13462 {
13463 {
13464 .eraseblocks = { {4 * 1024, 128} },
13465 .block_erase = spi_block_erase_20,
13466 }, {
13467 .eraseblocks = { {32 * 1024, 16} },
13468 .block_erase = spi_block_erase_52,
13469 }, {
13470 .eraseblocks = { {512 * 1024, 1} },
13471 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000013472 },
13473 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013474 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000013475 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000013476 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13477 .read = spi_chip_read,
13478 .voltage = {2700, 3600},
13479 },
13480
13481 {
13482 .vendor = "SST",
13483 .name = "SST25VF040B",
13484 .bustype = BUS_SPI,
13485 .manufacture_id = SST_ID,
13486 .model_id = SST_SST25VF040B,
13487 .total_size = 512,
13488 .page_size = 256,
13489 .feature_bits = FEATURE_WRSR_EWSR,
13490 .tested = TEST_OK_PREW,
13491 .probe = probe_spi_rdid,
13492 .probe_timing = TIMING_ZERO,
13493 .block_erasers =
13494 {
13495 {
13496 .eraseblocks = { {4 * 1024, 128} },
13497 .block_erase = spi_block_erase_20,
13498 }, {
13499 .eraseblocks = { {32 * 1024, 16} },
13500 .block_erase = spi_block_erase_52,
13501 }, {
13502 .eraseblocks = { {64 * 1024, 8} },
13503 .block_erase = spi_block_erase_d8,
13504 }, {
13505 .eraseblocks = { {512 * 1024, 1} },
13506 .block_erase = spi_block_erase_60,
13507 }, {
13508 .eraseblocks = { {512 * 1024, 1} },
13509 .block_erase = spi_block_erase_c7,
13510 },
13511 },
13512 .printlock = spi_prettyprint_status_register_sst25vf040b,
13513 .unlock = spi_disable_blockprotect,
13514 .write = spi_aai_write, /* AAI supported (0xAD) */
13515 .read = spi_chip_read, /* Fast read (0x0B) supported */
13516 .voltage = {2700, 3600},
13517 },
13518
13519 {
13520 .vendor = "SST",
13521 .name = "SST25VF040B.REMS",
13522 .bustype = BUS_SPI,
13523 .manufacture_id = SST_ID,
13524 .model_id = SST_SST25VF040B_REMS,
13525 .total_size = 512,
13526 .page_size = 256,
13527 .feature_bits = FEATURE_WRSR_EWSR,
13528 .tested = TEST_OK_PREW,
13529 .probe = probe_spi_rems,
13530 .probe_timing = TIMING_ZERO,
13531 .block_erasers =
13532 {
13533 {
13534 .eraseblocks = { {4 * 1024, 128} },
13535 .block_erase = spi_block_erase_20,
13536 }, {
13537 .eraseblocks = { {32 * 1024, 16} },
13538 .block_erase = spi_block_erase_52,
13539 }, {
13540 .eraseblocks = { {64 * 1024, 8} },
13541 .block_erase = spi_block_erase_d8,
13542 }, {
13543 .eraseblocks = { {512 * 1024, 1} },
13544 .block_erase = spi_block_erase_60,
13545 }, {
13546 .eraseblocks = { {512 * 1024, 1} },
13547 .block_erase = spi_block_erase_c7,
13548 },
13549 },
13550 .printlock = spi_prettyprint_status_register_sst25vf040b,
13551 .unlock = spi_disable_blockprotect,
13552 .write = spi_aai_write,
13553 .read = spi_chip_read,
13554 .voltage = {2700, 3600},
13555 },
13556
13557 {
13558 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013559 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000013560 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013561 .manufacture_id = SST_ID,
13562 .model_id = SST_SST25VF064C,
13563 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013564 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013565 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013566 .tested = TEST_OK_PREW,
13567 .probe = probe_spi_rdid,
13568 .probe_timing = TIMING_ZERO,
13569 .block_erasers =
13570 {
13571 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013572 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013573 .block_erase = spi_block_erase_20,
13574 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013575 .eraseblocks = { {32 * 1024, 256} },
13576 .block_erase = spi_block_erase_52,
13577 }, {
13578 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013579 .block_erase = spi_block_erase_d8,
13580 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013581 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013582 .block_erase = spi_block_erase_60,
13583 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013584 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000013585 .block_erase = spi_block_erase_c7,
13586 },
13587 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013588 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13589 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000013590 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013591 .read = spi_chip_read,
13592 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000013593 },
13594
13595 {
13596 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000013597 .name = "SST25VF080B",
13598 .bustype = BUS_SPI,
13599 .manufacture_id = SST_ID,
13600 .model_id = SST_SST25VF080B,
13601 .total_size = 1024,
13602 .page_size = 256,
13603 .feature_bits = FEATURE_WRSR_EWSR,
13604 .tested = TEST_OK_PREW,
13605 .probe = probe_spi_rdid,
13606 .probe_timing = TIMING_ZERO,
13607 .block_erasers =
13608 {
13609 {
13610 .eraseblocks = { {4 * 1024, 256} },
13611 .block_erase = spi_block_erase_20,
13612 }, {
13613 .eraseblocks = { {32 * 1024, 32} },
13614 .block_erase = spi_block_erase_52,
13615 }, {
13616 .eraseblocks = { {64 * 1024, 16} },
13617 .block_erase = spi_block_erase_d8,
13618 }, {
13619 .eraseblocks = { {1024 * 1024, 1} },
13620 .block_erase = spi_block_erase_60,
13621 }, {
13622 .eraseblocks = { {1024 * 1024, 1} },
13623 .block_erase = spi_block_erase_c7,
13624 },
13625 },
13626 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13627 .unlock = spi_disable_blockprotect,
13628 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000013629 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000013630 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000013631 },
13632
13633 {
13634 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013635 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013636 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013637 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013638 .model_id = SST_SST25VF512_REMS,
13639 .total_size = 64,
13640 .page_size = 256,
13641 .feature_bits = FEATURE_WRSR_EWSR,
13642 .tested = TEST_OK_PREW,
13643 .probe = probe_spi_rems,
13644 .probe_timing = TIMING_ZERO,
13645 .block_erasers =
13646 {
13647 {
13648 .eraseblocks = { {4 * 1024, 16} },
13649 .block_erase = spi_block_erase_20,
13650 }, {
13651 .eraseblocks = { {32 * 1024, 2} },
13652 .block_erase = spi_block_erase_52,
13653 }, {
13654 .eraseblocks = { {32 * 1024, 2} },
13655 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
13656 }, {
13657 .eraseblocks = { {64 * 1024, 1} },
13658 .block_erase = spi_block_erase_60,
13659 }, {
13660 .eraseblocks = { {64 * 1024, 1} },
13661 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
13662 },
13663 },
13664 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13665 .unlock = spi_disable_blockprotect,
13666 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13667 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
13668 .voltage = {2700, 3600},
13669 },
13670
13671 {
13672 .vendor = "SST",
13673 .name = "SST25WF010",
13674 .bustype = BUS_SPI,
13675 .manufacture_id = SST_ID,
13676 .model_id = SST_SST25WF010,
13677 .total_size = 128,
13678 .page_size = 256,
13679 .feature_bits = FEATURE_WRSR_EITHER,
13680 .tested = TEST_UNTESTED,
13681 .probe = probe_spi_rdid,
13682 .probe_timing = TIMING_ZERO,
13683 .block_erasers =
13684 {
13685 {
13686 .eraseblocks = { {4 * 1024, 32} },
13687 .block_erase = spi_block_erase_20,
13688 }, {
13689 .eraseblocks = { {32 * 1024, 4} },
13690 .block_erase = spi_block_erase_52,
13691 }, {
13692 .eraseblocks = { {1024 * 128, 1} },
13693 .block_erase = spi_block_erase_60,
13694 }, {
13695 .eraseblocks = { {1024 * 128, 1} },
13696 .block_erase = spi_block_erase_c7,
13697 },
13698 },
13699 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13700 .unlock = spi_disable_blockprotect_bp2_srwd,
13701 .write = spi_aai_write,
13702 .read = spi_chip_read, /* Fast read (0x0B) supported */
13703 .voltage = {1650, 1950},
13704 },
13705
13706 {
13707 .vendor = "SST",
13708 .name = "SST25WF020",
13709 .bustype = BUS_SPI,
13710 .manufacture_id = SST_ID,
13711 .model_id = SST_SST25WF020,
13712 .total_size = 256,
13713 .page_size = 256,
13714 .feature_bits = FEATURE_WRSR_EITHER,
13715 .tested = TEST_UNTESTED,
13716 .probe = probe_spi_rdid,
13717 .probe_timing = TIMING_ZERO,
13718 .block_erasers =
13719 {
13720 {
13721 .eraseblocks = { {4 * 1024, 64} },
13722 .block_erase = spi_block_erase_20,
13723 }, {
13724 .eraseblocks = { {32 * 1024, 8} },
13725 .block_erase = spi_block_erase_52,
13726 }, {
13727 .eraseblocks = { {64 * 1024, 4} },
13728 .block_erase = spi_block_erase_d8,
13729 }, {
13730 .eraseblocks = { {1024 * 256, 1} },
13731 .block_erase = spi_block_erase_60,
13732 }, {
13733 .eraseblocks = { {1024 * 256, 1} },
13734 .block_erase = spi_block_erase_c7,
13735 },
13736 },
13737 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13738 .unlock = spi_disable_blockprotect_bp2_srwd,
13739 .write = spi_aai_write,
13740 .read = spi_chip_read, /* Fast read (0x0B) supported */
13741 .voltage = {1650, 1950},
13742 },
13743
13744 {
13745 .vendor = "SST",
13746 .name = "SST25WF020A",
13747 .bustype = BUS_SPI,
13748 .manufacture_id = SANYO_ID, /* See flashchips.h */
13749 .model_id = SST_SST25WF020A,
13750 .total_size = 256,
13751 .page_size = 256,
13752 .feature_bits = FEATURE_WRSR_WREN,
13753 .tested = TEST_UNTESTED,
13754 .probe = probe_spi_rdid,
13755 .probe_timing = TIMING_ZERO,
13756 .block_erasers =
13757 {
13758 {
13759 .eraseblocks = { {4 * 1024, 64} },
13760 .block_erase = spi_block_erase_20,
13761 }, {
13762 .eraseblocks = { {64 * 1024, 4} },
13763 .block_erase = spi_block_erase_d8,
13764 }, {
13765 .eraseblocks = { {256 * 1024, 1} },
13766 .block_erase = spi_block_erase_60,
13767 }, {
13768 .eraseblocks = { {256 * 1024, 1} },
13769 .block_erase = spi_block_erase_c7,
13770 },
13771 },
13772 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13773 .unlock = spi_disable_blockprotect_bp2_srwd,
13774 .write = spi_chip_write_256,
13775 .read = spi_chip_read, /* Fast read (0x0B) supported */
13776 .voltage = {1650, 1950},
13777 },
13778
13779 {
13780 .vendor = "SST",
13781 .name = "SST25WF040",
13782 .bustype = BUS_SPI,
13783 .manufacture_id = SST_ID,
13784 .model_id = SST_SST25WF040,
13785 .total_size = 512,
13786 .page_size = 256,
13787 .feature_bits = FEATURE_WRSR_EITHER,
13788 .tested = TEST_UNTESTED,
13789 .probe = probe_spi_rdid,
13790 .probe_timing = TIMING_ZERO,
13791 .block_erasers =
13792 {
13793 {
13794 .eraseblocks = { {4 * 1024, 128} },
13795 .block_erase = spi_block_erase_20,
13796 }, {
13797 .eraseblocks = { {32 * 1024, 16} },
13798 .block_erase = spi_block_erase_52,
13799 }, {
13800 .eraseblocks = { {64 * 1024, 8} },
13801 .block_erase = spi_block_erase_d8,
13802 }, {
13803 .eraseblocks = { {1024 * 512, 1} },
13804 .block_erase = spi_block_erase_60,
13805 }, {
13806 .eraseblocks = { {1024 * 512, 1} },
13807 .block_erase = spi_block_erase_c7,
13808 },
13809 },
13810 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13811 .unlock = spi_disable_blockprotect_bp2_srwd,
13812 .write = spi_aai_write,
13813 .read = spi_chip_read, /* Fast read (0x0B) supported */
13814 .voltage = {1650, 1950},
13815 },
13816
13817 {
13818 .vendor = "SST",
13819 .name = "SST25WF040B",
13820 .bustype = BUS_SPI,
13821 .manufacture_id = SANYO_ID, /* See flashchips.h */
13822 .model_id = SST_SST25WF040B,
13823 .total_size = 512,
13824 .page_size = 256,
13825 .feature_bits = FEATURE_WRSR_WREN,
13826 .tested = TEST_UNTESTED,
13827 .probe = probe_spi_rdid,
13828 .probe_timing = TIMING_ZERO,
13829 .block_erasers =
13830 {
13831 {
13832 .eraseblocks = { {4 * 1024, 128} },
13833 .block_erase = spi_block_erase_20,
13834 }, {
13835 .eraseblocks = { {64 * 1024, 8} },
13836 .block_erase = spi_block_erase_d8,
13837 }, {
13838 .eraseblocks = { {512 * 1024, 1} },
13839 .block_erase = spi_block_erase_60,
13840 }, {
13841 .eraseblocks = { {512 * 1024, 1} },
13842 .block_erase = spi_block_erase_c7,
13843 },
13844 },
13845 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13846 .unlock = spi_disable_blockprotect_bp2_srwd,
13847 .write = spi_chip_write_256,
13848 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13849 .voltage = {1650, 1950},
13850 },
13851
13852 {
13853 .vendor = "SST",
13854 .name = "SST25WF080",
13855 .bustype = BUS_SPI,
13856 .manufacture_id = SST_ID,
13857 .model_id = SST_SST25WF080,
13858 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013859 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013860 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000013861 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013862 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013863 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013864 .block_erasers =
13865 {
13866 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013867 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013868 .block_erase = spi_block_erase_20,
13869 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013870 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013871 .block_erase = spi_block_erase_52,
13872 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013873 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013874 .block_erase = spi_block_erase_d8,
13875 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013876 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013877 .block_erase = spi_block_erase_60,
13878 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013879 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013880 .block_erase = spi_block_erase_c7,
13881 },
13882 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013883 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13884 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000013885 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013886 .read = spi_chip_read, /* Fast read (0x0B) supported */
13887 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000013888 },
13889
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013890 {
13891 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013892 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013893 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013894 .manufacture_id = SANYO_ID, /* See flashchips.h */
13895 .model_id = SST_SST25WF080B,
13896 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013897 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013898 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000013899 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013900 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013901 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013902 .block_erasers =
13903 {
13904 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013905 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013906 .block_erase = spi_block_erase_20,
13907 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013908 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013909 .block_erase = spi_block_erase_d8,
13910 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013911 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013912 .block_erase = spi_block_erase_60,
13913 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013914 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000013915 .block_erase = spi_block_erase_c7,
13916 },
13917 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013918 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13919 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000013920 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013921 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13922 .voltage = {1650, 1950},
13923 },
13924
13925 {
13926 .vendor = "SST",
13927 .name = "SST25WF512",
13928 .bustype = BUS_SPI,
13929 .manufacture_id = SST_ID,
13930 .model_id = SST_SST25WF512,
13931 .total_size = 64,
13932 .page_size = 256,
13933 .feature_bits = FEATURE_WRSR_EITHER,
13934 .tested = TEST_UNTESTED,
13935 .probe = probe_spi_rdid,
13936 .probe_timing = TIMING_ZERO,
13937 .block_erasers =
13938 {
13939 {
13940 .eraseblocks = { {4 * 1024, 16} },
13941 .block_erase = spi_block_erase_20,
13942 }, {
13943 .eraseblocks = { {32 * 1024, 2} },
13944 .block_erase = spi_block_erase_52,
13945 }, {
13946 .eraseblocks = { {1024 * 64, 1} },
13947 .block_erase = spi_block_erase_60,
13948 }, {
13949 .eraseblocks = { {1024 * 64, 1} },
13950 .block_erase = spi_block_erase_c7,
13951 },
13952 },
13953 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13954 .unlock = spi_disable_blockprotect_bp2_srwd,
13955 .write = spi_aai_write,
13956 .read = spi_chip_read, /* Fast read (0x0B) supported */
13957 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000013958 },
13959
13960 {
13961 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070013962 .name = "SST26VF016B(A)",
13963 .bustype = BUS_SPI,
13964 .manufacture_id = SST_ID,
13965 .model_id = SST_SST26VF016B,
13966 .total_size = 2048,
13967 .page_size = 256,
13968 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13969 .tested = TEST_OK_PREW,
13970 .probe = probe_spi_rdid,
13971 .probe_timing = TIMING_ZERO,
13972 .block_erasers =
13973 {
13974 {
13975 .eraseblocks = { {4 * 1024, 512} },
13976 .block_erase = spi_block_erase_20,
13977 }, {
13978 .eraseblocks = {
13979 {8 * 1024, 4},
13980 {32 * 1024, 1},
13981 {64 * 1024, 30},
13982 {32 * 1024, 1},
13983 {8 * 1024, 4},
13984 },
13985 .block_erase = spi_block_erase_d8,
13986 }, {
13987 .eraseblocks = { {2 * 1024 * 1024, 1} },
13988 .block_erase = spi_block_erase_c7,
13989 },
13990 },
13991 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13992 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13993 .write = spi_chip_write_256, /* Multi I/O supported */
13994 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13995 .voltage = {2700, 3600},
13996 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100013997
Wei Hu25584de2018-04-30 14:02:08 -070013998 {
13999 .vendor = "SST",
14000 .name = "SST26VF032B(A)",
14001 .bustype = BUS_SPI,
14002 .manufacture_id = SST_ID,
14003 .model_id = SST_SST26VF032B,
14004 .total_size = 4096,
14005 .page_size = 256,
14006 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14007 .tested = TEST_UNTESTED,
14008 .probe = probe_spi_rdid,
14009 .probe_timing = TIMING_ZERO,
14010 .block_erasers =
14011 {
14012 {
14013 .eraseblocks = { {4 * 1024, 1024} },
14014 .block_erase = spi_block_erase_20,
14015 }, {
14016 .eraseblocks = {
14017 {8 * 1024, 4},
14018 {32 * 1024, 1},
14019 {64 * 1024, 62},
14020 {32 * 1024, 1},
14021 {8 * 1024, 4},
14022 },
14023 .block_erase = spi_block_erase_d8,
14024 }, {
14025 .eraseblocks = { {4 * 1024 * 1024, 1} },
14026 .block_erase = spi_block_erase_c7,
14027 },
14028 },
14029 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14030 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14031 .write = spi_chip_write_256, /* Multi I/O supported */
14032 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14033 .voltage = {2700, 3600},
14034 },
14035
Wei Hu25584de2018-04-30 14:02:08 -070014036 {
14037 .vendor = "SST",
14038 .name = "SST26VF064B(A)",
14039 .bustype = BUS_SPI,
14040 .manufacture_id = SST_ID,
14041 .model_id = SST_SST26VF064B,
14042 .total_size = 8192,
14043 .page_size = 256,
14044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14045 .tested = TEST_OK_PREW,
14046 .probe = probe_spi_rdid,
14047 .probe_timing = TIMING_ZERO,
14048 .block_erasers =
14049 {
14050 {
14051 .eraseblocks = { {4 * 1024, 2048} },
14052 .block_erase = spi_block_erase_20,
14053 }, {
14054 .eraseblocks = {
14055 {8 * 1024, 4},
14056 {32 * 1024, 1},
14057 {64 * 1024, 126},
14058 {32 * 1024, 1},
14059 {8 * 1024, 4},
14060 },
14061 .block_erase = spi_block_erase_d8,
14062 }, {
14063 .eraseblocks = { {8 * 1024 * 1024, 1} },
14064 .block_erase = spi_block_erase_c7,
14065 },
14066 },
14067 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14068 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14069 .write = spi_chip_write_256, /* Multi I/O supported */
14070 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14071 .voltage = {2700, 3600},
14072 },
14073
14074 {
14075 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014076 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014077 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014078 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014079 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014080 .total_size = 512,
14081 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000014082 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014083 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014084 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014085 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014086 .block_erasers =
14087 {
14088 {
14089 .eraseblocks = { {128, 4096} },
14090 .block_erase = erase_sector_28sf040,
14091 }, {
14092 .eraseblocks = { {512 * 1024, 1} },
14093 .block_erase = erase_chip_28sf040,
14094 }
14095 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014096 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014097 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014098 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014099 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014100 },
14101
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014102 {
14103 .vendor = "SST",
14104 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014105 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014106 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014107 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014108 .total_size = 128,
14109 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014110 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014111 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014112 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014113 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014114 .block_erasers =
14115 {
14116 {
14117 .eraseblocks = { {128 * 1024, 1} },
14118 .block_erase = erase_chip_block_jedec,
14119 }
14120 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014121 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014122 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014123 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014124 },
14125
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014126 {
14127 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014128 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014129 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014130 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014131 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014132 .total_size = 256,
14133 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014134 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014135 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014136 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014137 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014138 .block_erasers =
14139 {
14140 {
14141 .eraseblocks = { {256 * 1024, 1} },
14142 .block_erase = erase_chip_block_jedec,
14143 }
14144 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014145 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014146 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014147 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014148 },
14149
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014150 {
14151 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014152 .name = "SST29LE010",
14153 .bustype = BUS_PARALLEL,
14154 .manufacture_id = SST_ID,
14155 .model_id = SST_SST29LE010,
14156 .total_size = 128,
14157 .page_size = 128,
14158 .feature_bits = FEATURE_LONG_RESET,
14159 .tested = TEST_UNTESTED,
14160 .probe = probe_jedec,
14161 .probe_timing = 10,
14162 .block_erasers =
14163 {
14164 {
14165 .eraseblocks = { {128 * 1024, 1} },
14166 .block_erase = erase_chip_block_jedec,
14167 }
14168 },
14169 .write = write_jedec,
14170 .read = read_memmapped,
14171 .voltage = {3000, 3600},
14172 },
14173
14174 {
14175 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014176 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014177 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014178 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014179 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014180 .total_size = 256,
14181 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014182 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014183 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014184 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014185 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014186 .block_erasers =
14187 {
14188 {
14189 .eraseblocks = { {256 * 1024, 1} },
14190 .block_erase = erase_chip_block_jedec,
14191 }
14192 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014193 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014194 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014195 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014196 },
14197
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014198 {
14199 .vendor = "SST",
14200 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014201 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014202 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014203 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014204 .total_size = 128,
14205 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014206 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000014207 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014208 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014209 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014210 .block_erasers =
14211 {
14212 {
14213 .eraseblocks = { {4 * 1024, 32} },
14214 .block_erase = erase_sector_jedec,
14215 }, {
14216 .eraseblocks = { {128 * 1024, 1} },
14217 .block_erase = erase_chip_block_jedec,
14218 }
14219 },
Sean Nelson35727f72010-01-28 23:55:12 +000014220 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014221 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014222 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014223 },
14224
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014225 {
14226 .vendor = "SST",
14227 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014228 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014229 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014230 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014231 .total_size = 256,
14232 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014233 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000014234 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014235 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014236 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014237 .block_erasers =
14238 {
14239 {
14240 .eraseblocks = { {4 * 1024, 64} },
14241 .block_erase = erase_sector_jedec,
14242 }, {
14243 .eraseblocks = { {256 * 1024, 1} },
14244 .block_erase = erase_chip_block_jedec,
14245 }
14246 },
Sean Nelson35727f72010-01-28 23:55:12 +000014247 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014248 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014249 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014250 },
14251
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014252 {
14253 .vendor = "SST",
14254 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014255 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014256 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014257 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014258 .total_size = 512,
14259 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014260 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000014261 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014262 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014263 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014264 .block_erasers =
14265 {
14266 {
14267 .eraseblocks = { {4 * 1024, 128} },
14268 .block_erase = erase_sector_jedec,
14269 }, {
14270 .eraseblocks = { {512 * 1024, 1} },
14271 .block_erase = erase_chip_block_jedec,
14272 }
14273 },
Sean Nelson35727f72010-01-28 23:55:12 +000014274 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014275 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014276 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014277 },
14278
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014279 {
14280 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014281 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014282 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014283 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014284 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014285 .total_size = 64,
14286 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014287 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000014288 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014289 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014290 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014291 .block_erasers =
14292 {
14293 {
14294 .eraseblocks = { {4 * 1024, 16} },
14295 .block_erase = erase_sector_jedec,
14296 }, {
14297 .eraseblocks = { {64 * 1024, 1} },
14298 .block_erase = erase_chip_block_jedec,
14299 }
14300 },
Sean Nelson35727f72010-01-28 23:55:12 +000014301 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014302 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014303 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014304 },
14305
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014306 {
14307 .vendor = "SST",
14308 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014309 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014310 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014311 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014312 .total_size = 128,
14313 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014314 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000014315 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014316 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014317 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014318 .block_erasers =
14319 {
14320 {
14321 .eraseblocks = { {4 * 1024, 32} },
14322 .block_erase = erase_sector_jedec,
14323 }, {
14324 .eraseblocks = { {128 * 1024, 1} },
14325 .block_erase = erase_chip_block_jedec,
14326 }
14327 },
Sean Nelson35727f72010-01-28 23:55:12 +000014328 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014329 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014330 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014331 },
14332
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014333 {
14334 .vendor = "SST",
14335 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014336 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014337 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014338 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014339 .total_size = 256,
14340 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014341 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000014342 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014343 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014344 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014345 .block_erasers =
14346 {
14347 {
14348 .eraseblocks = { {4 * 1024, 64} },
14349 .block_erase = erase_sector_jedec,
14350 }, {
14351 .eraseblocks = { {256 * 1024, 1} },
14352 .block_erase = erase_chip_block_jedec,
14353 }
14354 },
Sean Nelson35727f72010-01-28 23:55:12 +000014355 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014356 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014357 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014358 },
14359
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014360 {
14361 .vendor = "SST",
14362 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014363 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014364 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014365 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014366 .total_size = 512,
14367 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014368 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014369 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014370 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014371 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014372 .block_erasers =
14373 {
14374 {
14375 .eraseblocks = { {4 * 1024, 128} },
14376 .block_erase = erase_sector_jedec,
14377 }, {
14378 .eraseblocks = { {512 * 1024, 1} },
14379 .block_erase = erase_chip_block_jedec,
14380 }
14381 },
Sean Nelson35727f72010-01-28 23:55:12 +000014382 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014383 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014384 .voltage = {2700, 3600},
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000014385 },
FENG yu ningff692fb2008-12-08 18:15:10 +000014386
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014387 {
14388 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000014389 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014390 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000014391 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014392 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000014393 .total_size = 1024,
14394 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014395 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000014396 .tested = TEST_UNTESTED,
14397 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014398 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014399 .block_erasers =
14400 {
14401 {
14402 .eraseblocks = { {4 * 1024, 256} },
14403 .block_erase = erase_sector_jedec,
14404 }, {
14405 .eraseblocks = { {64 * 1024, 16} },
14406 .block_erase = erase_block_jedec,
14407 }, {
14408 .eraseblocks = { {1024 * 1024, 1} },
14409 .block_erase = erase_chip_block_jedec,
14410 }
14411 },
Sean Nelson35727f72010-01-28 23:55:12 +000014412 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014413 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014414 .voltage = {2700, 3600},
Peter Stuge8440cc02009-01-25 23:55:12 +000014415 },
14416
14417 {
14418 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014419 .name = "SST39VF512",
14420 .bustype = BUS_PARALLEL,
14421 .manufacture_id = SST_ID,
14422 .model_id = SST_SST39VF512,
14423 .total_size = 64,
14424 .page_size = 4096,
14425 .feature_bits = FEATURE_EITHER_RESET,
14426 .tested = TEST_OK_PREW,
14427 .probe = probe_jedec,
14428 .probe_timing = 1, /* 150 ns */
14429 .block_erasers =
14430 {
14431 {
14432 .eraseblocks = { {4 * 1024, 16} },
14433 .block_erase = erase_sector_jedec,
14434 }, {
14435 .eraseblocks = { {64 * 1024, 1} },
14436 .block_erase = erase_chip_block_jedec,
14437 }
14438 },
14439 .write = write_jedec_1,
14440 .read = read_memmapped,
14441 .voltage = {2700, 3600},
14442 },
14443
14444 {
14445 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014446 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014447 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014448 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014449 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014450 .total_size = 256,
14451 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014452 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014453 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014454 .probe = probe_jedec,
14455 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014456 .block_erasers =
14457 {
14458 {
14459 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014460 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014461 }, {
14462 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014463 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014464 }, {
14465 .eraseblocks = { {256 * 1024, 1} },
14466 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14467 }
14468 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014469 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014470 .unlock = unlock_sst_fwhub,
14471 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014472 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014473 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014474 },
14475
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014476 {
14477 .vendor = "SST",
14478 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014479 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014480 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014481 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014482 .total_size = 384,
14483 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014484 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000014485 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014486 .probe = probe_jedec,
14487 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014488 .block_erasers =
14489 {
14490 {
14491 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014492 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014493 }, {
14494 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014495 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014496 }, {
14497 .eraseblocks = { {384 * 1024, 1} },
14498 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14499 }
14500 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014501 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014502 .unlock = unlock_sst_fwhub,
14503 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014504 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014505 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014506 },
14507
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014508 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014509 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14510 * and is only honored for 64k block erase, but not 4k sector erase.
14511 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014512 .vendor = "SST",
14513 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014514 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014515 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014516 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014517 .total_size = 512,
14518 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014519 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000014520 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014521 .probe = probe_jedec,
14522 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014523 .block_erasers =
14524 {
14525 {
14526 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014527 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014528 }, {
14529 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014530 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014531 }, {
14532 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000014533 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000014534 },
14535 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014536 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014537 .unlock = unlock_sst_fwhub,
14538 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014539 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014540 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014541 },
14542
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014543 {
14544 .vendor = "SST",
14545 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014546 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014547 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014548 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014549 .total_size = 512,
14550 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014551 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014552 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014553 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014554 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014555 .block_erasers =
14556 {
14557 {
14558 .eraseblocks = { {4 * 1024, 128} },
14559 .block_erase = erase_sector_49lfxxxc,
14560 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014561 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014562 {64 * 1024, 7},
14563 {32 * 1024, 1},
14564 {8 * 1024, 2},
14565 {16 * 1024, 1},
14566 },
Sean Nelson69e58112010-03-23 17:10:28 +000014567 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014568 }
14569 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014570 .printlock = printlock_regspace2_block_eraser_1,
14571 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014572 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014573 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014574 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014575 },
14576
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014577 {
14578 .vendor = "SST",
14579 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014580 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014581 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014582 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014583 .total_size = 1024,
14584 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014585 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000014586 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014587 .probe = probe_jedec,
14588 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014589 .block_erasers =
14590 {
14591 {
14592 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014593 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014594 }, {
14595 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014596 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014597 }, {
14598 .eraseblocks = { {1024 * 1024, 1} },
14599 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14600 }
14601 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014602 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000014603 .unlock = unlock_sst_fwhub,
14604 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014605 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014606 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014607 },
14608
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014609 {
14610 .vendor = "SST",
14611 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014612 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014613 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014614 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014615 .total_size = 1024,
14616 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014617 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014618 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014619 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014620 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014621 .block_erasers =
14622 {
14623 {
14624 .eraseblocks = { {4 * 1024, 256} },
14625 .block_erase = erase_sector_49lfxxxc,
14626 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014627 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014628 {64 * 1024, 15},
14629 {32 * 1024, 1},
14630 {8 * 1024, 2},
14631 {16 * 1024, 1},
14632 },
Sean Nelson69e58112010-03-23 17:10:28 +000014633 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014634 }
14635 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014636 .printlock = printlock_regspace2_block_eraser_1,
14637 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014638 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014639 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014640 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014641 },
14642
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014643 {
14644 .vendor = "SST",
14645 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014646 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014647 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014648 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014649 .total_size = 2048,
14650 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014651 .feature_bits = FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014652 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014653 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014654 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014655 .block_erasers =
14656 {
14657 {
14658 .eraseblocks = { {4 * 1024, 512} },
14659 .block_erase = erase_sector_49lfxxxc,
14660 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014661 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014662 {64 * 1024, 31},
14663 {32 * 1024, 1},
14664 {8 * 1024, 2},
14665 {16 * 1024, 1},
14666 },
Sean Nelson69e58112010-03-23 17:10:28 +000014667 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014668 }
14669 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014670 .printlock = printlock_regspace2_block_eraser_1,
14671 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014672 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014673 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014674 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014675 },
14676
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014677 {
14678 .vendor = "SST",
14679 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014680 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014681 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014682 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014683 .total_size = 256,
14684 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014685 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000014686 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014687 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014688 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014689 .block_erasers =
14690 {
14691 {
14692 .eraseblocks = { {4 * 1024, 64} },
14693 .block_erase = erase_sector_jedec,
14694 }, {
14695 .eraseblocks = { {16 * 1024, 16} },
14696 .block_erase = erase_block_jedec,
14697 }, {
14698 .eraseblocks = { {256 * 1024, 1} },
14699 .block_erase = NULL,
14700 }
14701 },
Sean Nelson35727f72010-01-28 23:55:12 +000014702 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014703 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014704 .voltage = {3000, 3600},
Sven Schnellec208dfb2009-01-07 12:35:09 +000014705 },
14706
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014707 {
14708 .vendor = "SST",
14709 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014710 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014711 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014712 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014713 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000014714 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014715 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014716 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014717 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014718 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014719 .block_erasers =
14720 {
14721 {
14722 .eraseblocks = { {4 * 1024, 64} },
14723 .block_erase = erase_sector_jedec,
14724 }, {
14725 .eraseblocks = { {16 * 1024, 16} },
14726 .block_erase = erase_block_jedec,
14727 }, {
14728 .eraseblocks = { {256 * 1024, 1} },
14729 .block_erase = NULL,
14730 }
14731 },
Sean Nelson35727f72010-01-28 23:55:12 +000014732 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014733 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014734 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014735 },
14736
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014737 {
14738 .vendor = "SST",
14739 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014740 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014741 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014742 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014743 .total_size = 512,
14744 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014745 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014746 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014747 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000014748 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014749 .block_erasers =
14750 {
14751 {
14752 .eraseblocks = { {4 * 1024, 128} },
14753 .block_erase = erase_sector_jedec,
14754 }, {
14755 .eraseblocks = { {64 * 1024, 8} },
14756 .block_erase = erase_block_jedec,
14757 }, {
14758 .eraseblocks = { {512 * 1024, 1} },
14759 .block_erase = NULL,
14760 }
14761 },
Sean Nelson35727f72010-01-28 23:55:12 +000014762 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014763 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014764 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014765 },
14766
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014767 {
14768 .vendor = "SST",
14769 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014770 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014771 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014772 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014773 .total_size = 512,
14774 .page_size = 64 * 1024,
Joshua Roysa84b0bd2010-08-16 22:12:39 +000014775 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000014776 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014777 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014778 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014779 .block_erasers =
14780 {
14781 {
14782 .eraseblocks = { {4 * 1024, 128} },
14783 .block_erase = erase_sector_jedec,
14784 }, {
14785 .eraseblocks = { {64 * 1024, 8} },
14786 .block_erase = erase_block_jedec,
14787 }, {
14788 .eraseblocks = { {512 * 1024, 1} },
14789 .block_erase = NULL,
14790 }
14791 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014792 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000014793 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014794 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014795 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014796 },
14797
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014798 {
14799 .vendor = "SST",
14800 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014801 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014802 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020014803 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014804 .total_size = 1024,
14805 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000014806 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000014807 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014808 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014809 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014810 .block_erasers =
14811 {
14812 {
14813 .eraseblocks = { {4 * 1024, 256} },
14814 .block_erase = erase_sector_jedec,
14815 }, {
14816 .eraseblocks = { {64 * 1024, 16} },
14817 .block_erase = erase_block_jedec,
14818 }, {
14819 .eraseblocks = { {1024 * 1024, 1} },
14820 .block_erase = NULL,
14821 }
14822 },
Sean Nelson35727f72010-01-28 23:55:12 +000014823 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014824 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014825 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014826 },
14827
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014828 {
14829 .vendor = "SST",
14830 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014831 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014832 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014833 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014834 .total_size = 2048,
14835 .page_size = 4 * 1024,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014836 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014837 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014838 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014839 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014840 .block_erasers =
14841 {
14842 {
14843 .eraseblocks = { {4 * 1024, 512} },
14844 .block_erase = erase_sector_49lfxxxc,
14845 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000014846 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000014847 {64 * 1024, 31},
14848 {32 * 1024, 1},
14849 {8 * 1024, 2},
14850 {16 * 1024, 1},
14851 },
Sean Nelson69e58112010-03-23 17:10:28 +000014852 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014853 }
14854 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000014855 .printlock = printlock_regspace2_block_eraser_1,
14856 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014857 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014858 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014859 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000014860 },
14861
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014862 {
14863 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014864 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014865 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014866 .manufacture_id = ST_ID,
14867 .model_id = ST_M29F002B,
14868 .total_size = 256,
14869 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014870 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014871 .tested = TEST_UNTESTED,
14872 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014873 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014874 .block_erasers =
14875 {
14876 {
14877 .eraseblocks = {
14878 {16 * 1024, 1},
14879 {8 * 1024, 2},
14880 {32 * 1024, 1},
14881 {64 * 1024, 3},
14882 },
14883 .block_erase = erase_sector_jedec,
14884 }, {
14885 .eraseblocks = { {256 * 1024, 1} },
14886 .block_erase = erase_chip_block_jedec,
14887 }
14888 },
Sean Nelson35727f72010-01-28 23:55:12 +000014889 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014890 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014891 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014892 },
14893
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014894 {
14895 .vendor = "ST",
14896 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014897 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014898 .manufacture_id = ST_ID,
14899 .model_id = ST_M29F002T,
14900 .total_size = 256,
14901 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014902 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014903 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014904 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014905 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000014906 .block_erasers =
14907 {
14908 {
14909 .eraseblocks = {
14910 {64 * 1024, 3},
14911 {32 * 1024, 1},
14912 {8 * 1024, 2},
14913 {16 * 1024, 1},
14914 },
14915 .block_erase = erase_sector_jedec,
14916 }, {
14917 .eraseblocks = { {256 * 1024, 1} },
14918 .block_erase = erase_chip_block_jedec,
14919 }
14920 },
Sean Nelson35727f72010-01-28 23:55:12 +000014921 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014922 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014923 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
FENG yu ningff692fb2008-12-08 18:15:10 +000014924 },
14925
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014926 {
14927 .vendor = "ST",
14928 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014929 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014930 .manufacture_id = ST_ID,
14931 .model_id = ST_M29F040B,
14932 .total_size = 512,
14933 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000014934 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14935 .tested = TEST_UNTESTED,
14936 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000014937 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000014938 .block_erasers =
14939 {
14940 {
Stefan Tauner6697f712014-08-06 15:09:15 +000014941 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000014942 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014943 }, {
14944 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000014945 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000014946 }
14947 },
Sean Nelson35727f72010-01-28 23:55:12 +000014948 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014949 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014950 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000014951 },
14952
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014953 {
Sean Nelson35727f72010-01-28 23:55:12 +000014954 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014955 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014956 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014957 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014958 .manufacture_id = ST_ID,
14959 .model_id = ST_M29F400BB,
14960 .total_size = 512,
14961 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014962 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014963 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014964 .probe = probe_jedec,
14965 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014966 .block_erasers =
14967 {
14968 {
14969 .eraseblocks = {
14970 {16 * 1024, 1},
14971 {8 * 1024, 2},
14972 {32 * 1024, 1},
14973 {64 * 1024, 7},
14974 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014975 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014976 }, {
14977 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014978 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014979 }
14980 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014981 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014982 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014983 .voltage = {4500, 5500},
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014984 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014985
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000014986 {
14987 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14988 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014989 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014990 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014991 .manufacture_id = ST_ID,
14992 .model_id = ST_M29F400BT,
14993 .total_size = 512,
14994 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014995 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014996 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000014997 .probe = probe_jedec,
14998 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000014999 .block_erasers =
15000 {
15001 {
15002 .eraseblocks = {
15003 {64 * 1024, 7},
15004 {32 * 1024, 1},
15005 {8 * 1024, 2},
15006 {16 * 1024, 1},
15007 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015008 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015009 }, {
15010 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015011 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015012 }
15013 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015014 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015015 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015016 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000015017 },
15018
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015019 {
15020 .vendor = "ST",
15021 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015022 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015023 .manufacture_id = ST_ID,
15024 .model_id = ST_M29W010B,
15025 .total_size = 128,
15026 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015027 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015028 .tested = TEST_UNTESTED,
15029 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015030 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015031 .block_erasers =
15032 {
15033 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015034 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015035 .block_erase = erase_sector_jedec,
15036 }, {
15037 .eraseblocks = { {128 * 1024, 1} },
15038 .block_erase = erase_chip_block_jedec,
15039 }
15040 },
Sean Nelson35727f72010-01-28 23:55:12 +000015041 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015042 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015043 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015044 },
15045
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015046 {
15047 .vendor = "ST",
15048 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015049 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015050 .manufacture_id = ST_ID,
15051 .model_id = ST_M29W040B,
15052 .total_size = 512,
15053 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015054 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015055 .tested = TEST_UNTESTED,
15056 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015057 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015058 .block_erasers =
15059 {
15060 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015061 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015062 .block_erase = erase_sector_jedec,
15063 }, {
15064 .eraseblocks = { {512 * 1024, 1} },
15065 .block_erase = erase_chip_block_jedec,
15066 }
15067 },
Sean Nelson35727f72010-01-28 23:55:12 +000015068 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015069 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015070 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000015071 },
15072
Stefan Taunereb582572012-09-21 12:52:50 +000015073 {
15074 .vendor = "ST",
15075 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015076 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100015077 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000015078 .model_id = ST_M29W512B,
15079 .total_size = 64,
15080 .page_size = 64 * 1024,
15081 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015082 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000015083 .probe = probe_jedec,
15084 .probe_timing = TIMING_ZERO,
15085 .block_erasers =
15086 {
15087 {
15088 .eraseblocks = { {64 * 1024, 1} },
15089 .block_erase = erase_chip_block_jedec,
15090 }
15091 },
15092 .write = write_jedec_1,
15093 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015094 .voltage = {2700, 3600},
Stefan Taunereb582572012-09-21 12:52:50 +000015095 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000015096
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015097 {
15098 .vendor = "ST",
15099 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015100 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015101 .manufacture_id = ST_ID,
15102 .model_id = ST_M50FLW040A,
15103 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015104 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015105 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015106 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015107 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015108 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015109 .block_erasers =
15110 {
15111 {
Sean Nelson329bde72010-01-19 16:39:19 +000015112 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015113 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015114 {64 * 1024, 5}, /* block */
15115 {4 * 1024, 16}, /* sector */
15116 {4 * 1024, 16}, /* sector */
15117 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015118 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015119 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015120 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015121 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015122 }
15123 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015124 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015125 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015126 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015127 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015128 },
15129
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015130 {
15131 .vendor = "ST",
15132 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015133 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015134 .manufacture_id = ST_ID,
15135 .model_id = ST_M50FLW040B,
15136 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015137 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015138 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015139 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015140 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015141 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015142 .block_erasers =
15143 {
15144 {
Sean Nelson329bde72010-01-19 16:39:19 +000015145 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015146 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015147 {4 * 1024, 16}, /* sector */
15148 {64 * 1024, 5}, /* block */
15149 {4 * 1024, 16}, /* sector */
15150 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015151 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015152 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015153 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015154 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015155 }
15156 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015157 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015158 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015159 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015160 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015161 },
15162
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015163 {
15164 .vendor = "ST",
15165 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015166 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015167 .manufacture_id = ST_ID,
15168 .model_id = ST_M50FLW080A,
15169 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015170 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015171 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015172 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015173 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015174 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015175 .block_erasers =
15176 {
15177 {
Sean Nelson329bde72010-01-19 16:39:19 +000015178 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015179 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015180 {64 * 1024, 13}, /* block */
15181 {4 * 1024, 16}, /* sector */
15182 {4 * 1024, 16}, /* sector */
15183 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015184 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015185 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015186 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015187 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015188 }
15189 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015190 .printlock = printlock_regspace2_block_eraser_0,
15191 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015192 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015193 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015194 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015195 },
15196
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015197 {
15198 .vendor = "ST",
15199 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015200 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015201 .manufacture_id = ST_ID,
15202 .model_id = ST_M50FLW080B,
15203 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015204 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015205 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015206 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015207 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015208 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015209 .block_erasers =
15210 {
15211 {
Sean Nelson329bde72010-01-19 16:39:19 +000015212 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015213 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015214 {4 * 1024, 16}, /* sector */
15215 {64 * 1024, 13}, /* block */
15216 {4 * 1024, 16}, /* sector */
15217 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015218 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015219 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015220 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015221 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015222 }
15223 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015224 .printlock = printlock_regspace2_block_eraser_0,
15225 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015226 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015227 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015228 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015229 },
15230
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015231 {
15232 .vendor = "ST",
15233 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015234 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015235 .manufacture_id = ST_ID,
15236 .model_id = ST_M50FW002,
15237 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000015238 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015239 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015240 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000015241 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015242 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015243 .block_erasers =
15244 {
15245 {
15246 .eraseblocks = {
15247 {64 * 1024, 3},
15248 {32 * 1024, 1},
15249 {8 * 1024, 2},
15250 {16 * 1024, 1},
15251 },
Sean Nelson28accc22010-03-19 18:47:06 +000015252 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015253 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000015254 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015255 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000015256 }
15257 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015258 .printlock = printlock_regspace2_block_eraser_0,
15259 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015260 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015261 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015262 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015263 },
15264
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015265 {
15266 .vendor = "ST",
15267 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015268 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015269 .manufacture_id = ST_ID,
15270 .model_id = ST_M50FW016,
15271 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015272 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015273 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015274 .tested = TEST_UNTESTED,
15275 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015276 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015277 .block_erasers =
15278 {
15279 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015280 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000015281 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015282 }
15283 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015284 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015285 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015286 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015287 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015288 },
15289
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015290 {
15291 .vendor = "ST",
15292 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015293 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015294 .manufacture_id = ST_ID,
15295 .model_id = ST_M50FW040,
15296 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015297 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015298 .feature_bits = FEATURE_REGISTERMAP,
Sean Nelson28accc22010-03-19 18:47:06 +000015299 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015300 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015301 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015302 .block_erasers =
15303 {
15304 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015305 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015306 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015307 }
15308 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015309 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015310 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015311 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015312 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015313 },
15314
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015315 {
15316 .vendor = "ST",
15317 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015318 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015319 .manufacture_id = ST_ID,
15320 .model_id = ST_M50FW080,
15321 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000015322 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015323 .feature_bits = FEATURE_REGISTERMAP,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015324 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015325 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015326 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000015327 .block_erasers =
15328 {
15329 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015330 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000015331 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015332 }
15333 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015334 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000015335 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015336 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015337 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015338 },
15339
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015340 {
15341 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015342 .name = "M50LPW080",
15343 .bustype = BUS_LPC, /* A/A Mux */
15344 .manufacture_id = ST_ID,
15345 .model_id = ST_M50LPW080,
15346 .total_size = 1024,
15347 .page_size = 0,
15348 .feature_bits = FEATURE_REGISTERMAP,
15349 .tested = TEST_UNTESTED,
15350 .probe = probe_82802ab,
15351 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15352 .block_erasers =
15353 {
15354 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015355 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015356 .block_erase = erase_block_82802ab,
15357 }
15358 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015359 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000015360 .write = write_82802ab,
15361 .read = read_memmapped,
15362 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15363 },
15364
15365 {
15366 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015367 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015368 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015369 .manufacture_id = ST_ID,
15370 .model_id = ST_M50LPW116,
15371 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000015372 .page_size = 0,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015373 .feature_bits = FEATURE_REGISTERMAP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015374 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015375 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000015376 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015377 .block_erasers =
15378 {
15379 {
15380 .eraseblocks = {
15381 {4 * 1024, 16},
15382 {64 * 1024, 30},
15383 {32 * 1024, 1},
15384 {8 * 1024, 2},
15385 {16 * 1024, 1},
15386 },
Sean Nelson28accc22010-03-19 18:47:06 +000015387 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015388 }
15389 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015390 .printlock = printlock_regspace2_block_eraser_0,
15391 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000015392 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015393 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015394 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
FENG yu ningff692fb2008-12-08 18:15:10 +000015395 },
15396
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015397 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030015398 .vendor = "ST",
15399 .name = "M95M02",
15400 .bustype = BUS_SPI,
15401 .manufacture_id = ST_ID,
15402 .model_id = ST_M95M02,
15403 .total_size = 256,
15404 .page_size = 256,
15405 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
15406 .tested = TEST_OK_PREW,
15407 .probe = probe_spi_st95,
15408 .probe_timing = TIMING_ZERO,
15409 .block_erasers =
15410 {
15411 {
15412 .eraseblocks = { {256 * 1024, 1} },
15413 .block_erase = spi_block_erase_emulation,
15414 }
15415 },
15416
15417 .printlock = spi_prettyprint_status_register_bp1_srwd,
15418 .unlock = spi_disable_blockprotect_bp1_srwd,
15419 .write = spi_chip_write_256,
15420 .read = spi_chip_read,
15421 .voltage = {2500, 5500},
15422 },
15423
15424 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100015425 .vendor = "Sanyo",
15426 .name = "LE25FU106B",
15427 .bustype = BUS_SPI,
15428 .manufacture_id = SANYO_ID,
15429 .model_id = SANYO_LE25FU106B,
15430 .total_size = 128,
15431 .page_size = 256,
15432 .feature_bits = FEATURE_WRSR_WREN,
15433 .tested = TEST_UNTESTED,
15434 .probe = probe_spi_res2,
15435 .probe_timing = TIMING_ZERO,
15436 .block_erasers =
15437 {
15438 /* FIXME: Is this correct?
15439 {
15440 .eraseblocks = { {2 * 1024, 64} },
15441 .block_erase = spi_block_erase_d7,
15442 },*/
15443 {
15444 .eraseblocks = { {32 * 1024, 4} },
15445 .block_erase = spi_block_erase_d8,
15446 }, {
15447 .eraseblocks = { {128 * 1024, 1} },
15448 .block_erase = spi_block_erase_c7,
15449 }
15450 },
15451 .printlock = spi_prettyprint_status_register_bp1_srwd,
15452 .unlock = spi_disable_blockprotect_bp1_srwd,
15453 .write = spi_chip_write_256,
15454 .read = spi_chip_read,
15455 .voltage = {2300, 3600},
15456 },
15457
15458 {
15459 .vendor = "Sanyo",
15460 .name = "LE25FU206",
15461 .bustype = BUS_SPI,
15462 .manufacture_id = SANYO_ID,
15463 .model_id = SANYO_LE25FU206,
15464 .total_size = 256,
15465 .page_size = 256,
15466 .feature_bits = FEATURE_WRSR_WREN,
15467 .tested = TEST_UNTESTED,
15468 .probe = probe_spi_res2,
15469 .probe_timing = TIMING_ZERO,
15470 .block_erasers =
15471 {
15472 {
15473 .eraseblocks = { {4 * 1024, 64} },
15474 .block_erase = spi_block_erase_d7,
15475 }, {
15476 .eraseblocks = { {64 * 1024, 4} },
15477 .block_erase = spi_block_erase_d8,
15478 }, {
15479 .eraseblocks = { {256 * 1024, 1} },
15480 .block_erase = spi_block_erase_c7,
15481 }
15482 },
15483 .printlock = spi_prettyprint_status_register_bp1_srwd,
15484 .unlock = spi_disable_blockprotect_bp1_srwd,
15485 .write = spi_chip_write_256,
15486 .read = spi_chip_read,
15487 .voltage = {2300, 3600},
15488 },
15489
15490 {
15491 .vendor = "Sanyo",
15492 .name = "LE25FU206A",
15493 .bustype = BUS_SPI,
15494 .manufacture_id = SANYO_ID,
15495 .model_id = SANYO_LE25FU206A,
15496 .total_size = 256,
15497 .page_size = 256,
15498 .tested = TEST_UNTESTED,
15499 .probe = probe_spi_rdid,
15500 .probe_timing = TIMING_ZERO,
15501 .block_erasers =
15502 {
15503 {
15504 .eraseblocks = { {4 * 1024, 64} },
15505 .block_erase = spi_block_erase_20,
15506 }, {
15507 .eraseblocks = { {4 * 1024, 64} },
15508 .block_erase = spi_block_erase_d7,
15509 }, {
15510 .eraseblocks = { {64 * 1024, 4} },
15511 .block_erase = spi_block_erase_d8,
15512 }, {
15513 .eraseblocks = { {256 * 1024, 1} },
15514 .block_erase = spi_block_erase_60,
15515 }, {
15516 .eraseblocks = { {256 * 1024, 1} },
15517 .block_erase = spi_block_erase_c7,
15518 }
15519 },
15520 .printlock = spi_prettyprint_status_register_bp2_srwd,
15521 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15522 .write = spi_chip_write_256,
15523 .read = spi_chip_read,
15524 .voltage = {2300, 3600},
15525 },
15526
15527 {
15528 .vendor = "Sanyo",
15529 .name = "LE25FU406B",
15530 .bustype = BUS_SPI,
15531 .manufacture_id = SANYO_ID,
15532 .model_id = SANYO_LE25FU406B,
15533 .total_size = 512,
15534 .page_size = 256,
15535 .feature_bits = FEATURE_WRSR_WREN,
15536 .tested = TEST_OK_PREW,
15537 .probe = probe_spi_res2,
15538 .probe_timing = TIMING_ZERO,
15539 .block_erasers =
15540 {
15541 {
15542 .eraseblocks = { {4 * 1024, 128} },
15543 .block_erase = spi_block_erase_d7,
15544 }, {
15545 .eraseblocks = { {64 * 1024, 8} },
15546 .block_erase = spi_block_erase_d8,
15547 }, {
15548 .eraseblocks = { {512 * 1024, 1} },
15549 .block_erase = spi_block_erase_c7,
15550 }
15551 },
15552 .printlock = spi_prettyprint_status_register_bp2_srwd,
15553 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15554 .write = spi_chip_write_256,
15555 .read = spi_chip_read,
15556 .voltage = {2300, 3600},
15557 },
15558
15559 {
15560 .vendor = "Sanyo",
15561 .name = "LE25FU406C/LE25U40CMC",
15562 .bustype = BUS_SPI,
15563 .manufacture_id = SANYO_ID,
15564 .model_id = SANYO_LE25FU406C,
15565 .total_size = 512,
15566 .page_size = 256,
15567 .feature_bits = FEATURE_WRSR_WREN,
15568 .tested = TEST_OK_PREW,
15569 .probe = probe_spi_rdid,
15570 .probe_timing = TIMING_ZERO,
15571 .block_erasers =
15572 {
15573 {
15574 .eraseblocks = { {4 * 1024, 128} },
15575 .block_erase = spi_block_erase_20,
15576 }, {
15577 .eraseblocks = { {4 * 1024, 128} },
15578 .block_erase = spi_block_erase_d7,
15579 }, {
15580 .eraseblocks = { {64 * 1024, 8} },
15581 .block_erase = spi_block_erase_d8,
15582 }, {
15583 .eraseblocks = { {512 * 1024, 1} },
15584 .block_erase = spi_block_erase_60,
15585 }, {
15586 .eraseblocks = { {512 * 1024, 1} },
15587 .block_erase = spi_block_erase_c7,
15588 }
15589 },
15590 .printlock = spi_prettyprint_status_register_bp2_srwd,
15591 .unlock = spi_disable_blockprotect_bp2_srwd,
15592 .write = spi_chip_write_256,
15593 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
15594 .voltage = {2300, 3600},
15595 },
15596
15597 {
15598 .vendor = "Sanyo",
15599 .name = "LE25FW106",
15600 .bustype = BUS_SPI,
15601 .manufacture_id = SANYO_ID,
15602 .model_id = SANYO_LE25FW106,
15603 .total_size = 128,
15604 .page_size = 256,
15605 .feature_bits = FEATURE_WRSR_WREN,
15606 .tested = TEST_OK_PREW,
15607 .probe = probe_spi_res2,
15608 .probe_timing = TIMING_ZERO,
15609 .block_erasers =
15610 {
15611 {
15612 .eraseblocks = { {2 * 1024, 64} },
15613 .block_erase = spi_block_erase_d7,
15614 }, {
15615 .eraseblocks = { {32 * 1024, 4} },
15616 .block_erase = spi_block_erase_d8,
15617 }, {
15618 .eraseblocks = { {128 * 1024, 1} },
15619 .block_erase = spi_block_erase_c7,
15620 }
15621 },
15622 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
15623 .unlock = spi_disable_blockprotect_bp1_srwd,
15624 .write = spi_chip_write_256,
15625 .read = spi_chip_read,
15626 .voltage = {2700, 3600},
15627 },
15628
15629 {
15630 .vendor = "Sanyo",
15631 .name = "LE25FW203A",
15632 .bustype = BUS_SPI,
15633 .manufacture_id = SANYO_ID,
15634 .model_id = SANYO_LE25FW203A,
15635 .total_size = 256,
15636 .page_size = 256,
15637 .tested = TEST_UNTESTED,
15638 .probe = probe_spi_rdid,
15639 .probe_timing = TIMING_ZERO,
15640 .block_erasers =
15641 {
15642 {
15643 .eraseblocks = { {256, 1024} },
15644 .block_erase = spi_block_erase_db,
15645 }, {
15646 .eraseblocks = { {64 * 1024, 4} },
15647 .block_erase = spi_block_erase_d8,
15648 }, {
15649 .eraseblocks = { {256 * 1024, 1} },
15650 .block_erase = spi_block_erase_c7,
15651 }
15652 },
15653 .printlock = spi_prettyprint_status_register_default_welwip,
15654 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15655 .write = spi_chip_write_256,
15656 .read = spi_chip_read,
15657 .voltage = {2700, 3600},
15658 },
15659
15660 {
15661 .vendor = "Sanyo",
15662 .name = "LE25FW403A",
15663 .bustype = BUS_SPI,
15664 .manufacture_id = SANYO_ID,
15665 .model_id = SANYO_LE25FW403A,
15666 .total_size = 512,
15667 .page_size = 256,
15668 .tested = TEST_UNTESTED,
15669 .probe = probe_spi_rdid,
15670 .probe_timing = TIMING_ZERO,
15671 .block_erasers =
15672 {
15673 {
15674 .eraseblocks = { {256, 2 * 1024} },
15675 .block_erase = spi_block_erase_db,
15676 }, {
15677 .eraseblocks = { {64 * 1024, 8} },
15678 .block_erase = spi_block_erase_d8,
15679 }, {
15680 .eraseblocks = { {512 * 1024, 1} },
15681 .block_erase = spi_block_erase_c7,
15682 }
15683 },
15684 .printlock = spi_prettyprint_status_register_default_welwip,
15685 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15686 .write = spi_chip_write_256,
15687 .read = spi_chip_read,
15688 .voltage = {2700, 3600},
15689 },
15690
15691 {
15692 .vendor = "Sanyo",
15693 .name = "LE25FW406A",
15694 .bustype = BUS_SPI,
15695 .manufacture_id = SANYO_ID,
15696 .model_id = SANYO_LE25FW406A,
15697 .total_size = 512,
15698 .page_size = 256,
15699 .feature_bits = FEATURE_WRSR_WREN,
15700 .tested = TEST_OK_PREW,
15701 .probe = probe_spi_res2,
15702 .probe_timing = TIMING_ZERO,
15703 .block_erasers =
15704 {
15705 {
15706 .eraseblocks = { {4 * 1024, 128} },
15707 .block_erase = spi_block_erase_d7,
15708 }, {
15709 .eraseblocks = { {64 * 1024, 8} },
15710 .block_erase = spi_block_erase_d8,
15711 }, {
15712 .eraseblocks = { {512 * 1024, 1} },
15713 .block_erase = spi_block_erase_c7,
15714 }
15715 },
15716 .printlock = spi_prettyprint_status_register_plain,
15717 .unlock = spi_disable_blockprotect,
15718 .write = spi_chip_write_256,
15719 .read = spi_chip_read,
15720 .voltage = {2700, 3600},
15721 },
15722
15723 {
15724 .vendor = "Sanyo",
15725 .name = "LE25FW418A",
15726 .bustype = BUS_SPI,
15727 .manufacture_id = SANYO_ID,
15728 .model_id = SANYO_LE25FW418A,
15729 .total_size = 512,
15730 .page_size = 256,
15731 .feature_bits = FEATURE_WRSR_WREN,
15732 .tested = TEST_UNTESTED,
15733 .probe = probe_spi_res2,
15734 .probe_timing = TIMING_ZERO,
15735 .block_erasers =
15736 {
15737 {
15738 .eraseblocks = { {4 * 1024, 128} },
15739 .block_erase = spi_block_erase_d7,
15740 }, {
15741 .eraseblocks = { {64 * 1024, 8} },
15742 .block_erase = spi_block_erase_d8,
15743 }, {
15744 .eraseblocks = { {512 * 1024, 1} },
15745 .block_erase = spi_block_erase_c7,
15746 }
15747 },
15748 .printlock = spi_prettyprint_status_register_bp2_srwd,
15749 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15750 .write = spi_chip_write_256,
15751 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15752 .voltage = {2700, 3600},
15753 },
15754
15755 {
15756 .vendor = "Sanyo",
15757 .name = "LE25FW806",
15758 .bustype = BUS_SPI,
15759 .manufacture_id = SANYO_ID,
15760 .model_id = SANYO_LE25FW806,
15761 .total_size = 1024,
15762 .page_size = 256,
15763 .feature_bits = FEATURE_WRSR_WREN,
15764 .tested = TEST_UNTESTED,
15765 .probe = probe_spi_res2,
15766 .probe_timing = TIMING_ZERO,
15767 .block_erasers =
15768 {
15769 {
15770 .eraseblocks = { {4 * 1024, 256} },
15771 .block_erase = spi_block_erase_20,
15772 }, {
15773 .eraseblocks = { {4 * 1024, 256} },
15774 .block_erase = spi_block_erase_d7,
15775 }, {
15776 .eraseblocks = { {64 * 1024, 16} },
15777 .block_erase = spi_block_erase_d8,
15778 }, {
15779 .eraseblocks = { {1024 * 1024, 1} },
15780 .block_erase = spi_block_erase_c7,
15781 }
15782 },
15783 .printlock = spi_prettyprint_status_register_bp2_srwd,
15784 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15785 .write = spi_chip_write_256,
15786 .read = spi_chip_read,
15787 .voltage = {2700, 3600},
15788 },
15789
15790 {
15791 .vendor = "Sanyo",
15792 .name = "LE25FW808",
15793 .bustype = BUS_SPI,
15794 .manufacture_id = SANYO_ID,
15795 .model_id = SANYO_LE25FW808,
15796 .total_size = 1024,
15797 .page_size = 256,
15798 .feature_bits = FEATURE_WRSR_WREN,
15799 .tested = TEST_UNTESTED,
15800 .probe = probe_spi_res2,
15801 .probe_timing = TIMING_ZERO,
15802 .block_erasers =
15803 {
15804 {
15805 .eraseblocks = { {8 * 1024, 128} },
15806 .block_erase = spi_block_erase_d7,
15807 }, {
15808 .eraseblocks = { {64 * 1024, 16} },
15809 .block_erase = spi_block_erase_d8,
15810 }, {
15811 .eraseblocks = { {1024 * 1024, 1} },
15812 .block_erase = spi_block_erase_c7,
15813 }
15814 },
15815 .printlock = spi_prettyprint_status_register_bp2_srwd,
15816 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15817 .write = spi_chip_write_256,
15818 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15819 .voltage = {2700, 3600},
15820 },
15821
15822 {
15823 .vendor = "Sharp",
15824 .name = "LH28F008BJT-BTLZ1",
15825 .bustype = BUS_PARALLEL,
15826 .manufacture_id = SHARP_ID,
15827 .model_id = SHARP_LH28F008BJ__PB,
15828 .total_size = 1024,
15829 .page_size = 64 * 1024,
15830 .tested = TEST_OK_PREW,
15831 .probe = probe_82802ab,
15832 .probe_timing = TIMING_ZERO,
15833 .block_erasers =
15834 {
15835 {
15836 .eraseblocks = {
15837 {8 * 1024, 8},
15838 {64 * 1024, 15}
15839 },
15840 .block_erase = erase_block_82802ab,
15841 }, {
15842 .eraseblocks = { {1024 * 1024, 1} },
15843 .block_erase = erase_sector_49lfxxxc,
15844 }
15845 },
15846 .unlock = unlock_lh28f008bjt,
15847 .write = write_82802ab,
15848 .read = read_memmapped,
15849 .voltage = {2700, 3600},
15850 },
15851
15852 {
15853 .vendor = "Sharp",
15854 .name = "LHF00L04",
15855 .bustype = BUS_FWH, /* A/A Mux */
15856 .manufacture_id = SHARP_ID,
15857 .model_id = SHARP_LHF00L04,
15858 .total_size = 1024,
15859 .page_size = 64 * 1024,
15860 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
15861 .tested = TEST_UNTESTED,
15862 .probe = probe_82802ab,
15863 .probe_timing = TIMING_ZERO,
15864 .block_erasers =
15865 {
15866 {
15867 .eraseblocks = {
15868 {64 * 1024, 15},
15869 {8 * 1024, 8}
15870 },
15871 .block_erase = erase_block_82802ab,
15872 }, {
15873 .eraseblocks = {
15874 {1024 * 1024, 1}
15875 },
15876 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
15877 },
15878 },
15879 .unlock = unlock_regspace2_uniform_64k,
15880 .write = write_82802ab,
15881 .read = read_memmapped,
15882 .voltage = {3000, 3600},
15883 },
15884
15885 {
15886 .vendor = "Spansion",
15887 .name = "S25FL004A",
15888 .bustype = BUS_SPI,
15889 .manufacture_id = SPANSION_ID,
15890 .model_id = SPANSION_S25FL004A,
15891 .total_size = 512,
15892 .page_size = 256,
15893 .feature_bits = FEATURE_WRSR_WREN,
15894 .tested = TEST_UNTESTED,
15895 .probe = probe_spi_rdid,
15896 .probe_timing = TIMING_ZERO,
15897 .block_erasers =
15898 {
15899 {
15900 .eraseblocks = { {64 * 1024, 8} },
15901 .block_erase = spi_block_erase_d8,
15902 }, {
15903 .eraseblocks = { {512 * 1024, 1} },
15904 .block_erase = spi_block_erase_c7,
15905 }
15906 },
15907 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15908 .unlock = spi_disable_blockprotect,
15909 .write = spi_chip_write_256,
15910 .read = spi_chip_read,
15911 .voltage = {2700, 3600},
15912 },
15913
15914 {
15915 .vendor = "Spansion",
15916 .name = "S25FL008A",
15917 .bustype = BUS_SPI,
15918 .manufacture_id = SPANSION_ID,
15919 .model_id = SPANSION_S25FL008A,
15920 .total_size = 1024,
15921 .page_size = 256,
15922 .feature_bits = FEATURE_WRSR_WREN,
15923 .tested = TEST_OK_PRE,
15924 .probe = probe_spi_rdid,
15925 .probe_timing = TIMING_ZERO,
15926 .block_erasers =
15927 {
15928 {
15929 .eraseblocks = { {64 * 1024, 16} },
15930 .block_erase = spi_block_erase_d8,
15931 }, {
15932 .eraseblocks = { {1024 * 1024, 1} },
15933 .block_erase = spi_block_erase_c7,
15934 }
15935 },
15936 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15937 .unlock = spi_disable_blockprotect,
15938 .write = spi_chip_write_256,
15939 .read = spi_chip_read,
15940 .voltage = {2700, 3600},
15941 },
15942
15943 {
15944 .vendor = "Spansion",
15945 .name = "S25FL016A",
15946 .bustype = BUS_SPI,
15947 .manufacture_id = SPANSION_ID,
15948 .model_id = SPANSION_S25FL016A,
15949 .total_size = 2048,
15950 .page_size = 256,
15951 .feature_bits = FEATURE_WRSR_WREN,
15952 .tested = TEST_OK_PREW,
15953 .probe = probe_spi_rdid,
15954 .probe_timing = TIMING_ZERO,
15955 .block_erasers =
15956 {
15957 {
15958 .eraseblocks = { {64 * 1024, 32} },
15959 .block_erase = spi_block_erase_d8,
15960 }, {
15961 .eraseblocks = { {2 * 1024 * 1024, 1} },
15962 .block_erase = spi_block_erase_c7,
15963 }
15964 },
15965 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15966 .unlock = spi_disable_blockprotect,
15967 .write = spi_chip_write_256,
15968 .read = spi_chip_read,
15969 .voltage = {2700, 3600},
15970 },
15971
15972 {
15973 .vendor = "Spansion",
15974 .name = "S25FL032A/P",
15975 .bustype = BUS_SPI,
15976 .manufacture_id = SPANSION_ID,
15977 .model_id = SPANSION_S25FL032A,
15978 .total_size = 4096,
15979 .page_size = 256,
15980 .feature_bits = FEATURE_WRSR_WREN,
15981 .tested = TEST_OK_PREW,
15982 .probe = probe_spi_rdid,
15983 .probe_timing = TIMING_ZERO,
15984 .block_erasers =
15985 {
15986 {
15987 .eraseblocks = { {64 * 1024, 64} },
15988 .block_erase = spi_block_erase_d8,
15989 }, {
15990 .eraseblocks = { {4 * 1024 * 1024, 1} },
15991 .block_erase = spi_block_erase_c7,
15992 }
15993 },
15994 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
15995 .unlock = spi_disable_blockprotect,
15996 .write = spi_chip_write_256,
15997 .read = spi_chip_read,
15998 .voltage = {2700, 3600},
15999 },
16000
16001 {
16002 .vendor = "Spansion",
16003 .name = "S25FL064A/P",
16004 .bustype = BUS_SPI,
16005 .manufacture_id = SPANSION_ID,
16006 .model_id = SPANSION_S25FL064A,
16007 .total_size = 8192,
16008 .page_size = 256,
16009 .feature_bits = FEATURE_WRSR_WREN,
16010 .tested = TEST_OK_PREW,
16011 .probe = probe_spi_rdid,
16012 .probe_timing = TIMING_ZERO,
16013 .block_erasers =
16014 {
16015 {
16016 .eraseblocks = { {64 * 1024, 128} },
16017 .block_erase = spi_block_erase_d8,
16018 }, {
16019 .eraseblocks = { {8 * 1024 * 1024, 1} },
16020 .block_erase = spi_block_erase_c7,
16021 }
16022 },
16023 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16024 .unlock = spi_disable_blockprotect,
16025 .write = spi_chip_write_256,
16026 .read = spi_chip_read,
16027 .voltage = {2700, 3600},
16028 },
16029
16030 {
16031 .vendor = "Spansion",
16032 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
16033 .bustype = BUS_SPI,
16034 .manufacture_id = SPANSION_ID,
16035 .model_id = SPANSION_S25FL216,
16036 .total_size = 2048,
16037 .page_size = 256,
16038 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
16039 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16040 .tested = TEST_UNTESTED,
16041 .probe = probe_spi_rdid,
16042 .probe_timing = TIMING_ZERO,
16043 .block_erasers =
16044 {
16045 {
16046 .eraseblocks = { {4 * 1024, 512} },
16047 .block_erase = spi_block_erase_20,
16048 }, {
16049 .eraseblocks = { {64 * 1024, 32} },
16050 .block_erase = spi_block_erase_d8,
16051 }, {
16052 .eraseblocks = { { 2048 * 1024, 1} },
16053 .block_erase = spi_block_erase_60,
16054 }, {
16055 .eraseblocks = { { 2048 * 1024, 1} },
16056 .block_erase = spi_block_erase_c7,
16057 }
16058 },
16059 .printlock = spi_prettyprint_status_register_bp3_srwd,
16060 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16061 .write = spi_chip_write_256,
16062 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16063 .voltage = {2700, 3600},
16064 },
16065
16066 {
16067 .vendor = "Spansion",
16068 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
16069 .bustype = BUS_SPI,
16070 .manufacture_id = SPANSION_ID,
16071 .model_id = SPANSION_S25FL128,
16072 .total_size = 16384,
16073 .page_size = 512,
16074 /* supports 4B addressing */
16075 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16076 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16077 .tested = TEST_UNTESTED,
16078 .probe = probe_spi_rdid,
16079 .probe_timing = TIMING_ZERO,
16080 .block_erasers =
16081 {
16082 {
16083 .eraseblocks = { {256 * 1024, 64} },
16084 .block_erase = spi_block_erase_d8,
16085 }, {
16086 .eraseblocks = { { 16384 * 1024, 1} },
16087 .block_erase = spi_block_erase_60,
16088 }, {
16089 .eraseblocks = { { 16384 * 1024, 1} },
16090 .block_erase = spi_block_erase_c7,
16091 }
16092 },
16093 .printlock = spi_prettyprint_status_register_bp2_srwd,
16094 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16095 .write = spi_chip_write_256, /* Multi I/O supported */
16096 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16097 .voltage = {2700, 3600},
16098 },
16099
16100 {
16101 .vendor = "Spansion",
16102 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16103 .bustype = BUS_SPI,
16104 .manufacture_id = SPANSION_ID,
16105 .model_id = SPANSION_S25FL128,
16106 .total_size = 16384,
16107 .page_size = 256,
16108 /* supports 4B addressing */
16109 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16110 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16111 .tested = TEST_OK_PREW,
16112 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
16113 .probe = probe_spi_rdid,
16114 .probe_timing = TIMING_ZERO,
16115 .block_erasers =
16116 {
16117 {
16118 /* This chip supports erasing of 32 so-called "parameter sectors" with
16119 * opcode 0x20 which may be configured to be on top or bottom of the address
16120 * space. Trying to access an address outside these 4kB blocks does have no
16121 * effect on the memory contents, e.g.
16122 .eraseblocks = {
16123 {4 * 1024, 32},
16124 {64 * 1024, 254} // inaccessible
16125 },
16126 .block_erase = spi_block_erase_20,
16127 }, { */
16128 .eraseblocks = { { 64 * 1024, 256} },
16129 .block_erase = spi_block_erase_d8,
16130 }, {
16131 .eraseblocks = { { 16384 * 1024, 1} },
16132 .block_erase = spi_block_erase_60,
16133 }, {
16134 .eraseblocks = { { 16384 * 1024, 1} },
16135 .block_erase = spi_block_erase_c7,
16136 }
16137 },
16138 .printlock = spi_prettyprint_status_register_bp2_srwd,
16139 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16140 .write = spi_chip_write_256, /* Multi I/O supported */
16141 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16142 .voltage = {2700, 3600},
16143 },
16144
16145 {
16146 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020016147 .name = "S25FL128L",
16148 .bustype = BUS_SPI,
16149 .manufacture_id = SPANSION_ID,
16150 .model_id = SPANSION_S25FL128L,
16151 .total_size = 16384,
16152 .page_size = 256,
16153 /* 4 x 256B Security Region (OTP) */
16154 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP,
16155 .tested = TEST_UNTESTED,
16156 .probe = probe_spi_rdid,
16157 .probe_timing = TIMING_ZERO,
16158 .block_erasers =
16159 {
16160 {
16161 .eraseblocks = { {4 * 1024, 4096} },
16162 .block_erase = spi_block_erase_20,
16163 }, {
16164 .eraseblocks = { {32 * 1024, 512} },
16165 .block_erase = spi_block_erase_52,
16166 }, {
16167 .eraseblocks = { {64 * 1024, 256} },
16168 .block_erase = spi_block_erase_d8,
16169 }, {
16170 .eraseblocks = { {16384 * 1024, 1} },
16171 .block_erase = spi_block_erase_60,
16172 }, {
16173 .eraseblocks = { {16384 * 1024, 1} },
16174 .block_erase = spi_block_erase_c7,
16175 }
16176 },
16177 .printlock = spi_prettyprint_status_register_bp2_srwd,
16178 .unlock = spi_disable_blockprotect_bp2_srwd,
16179 .write = spi_chip_write_256,
16180 .read = spi_chip_read, /* Fast read (0x0B) supported */
16181 .voltage = {2700, 3600},
16182 .reg_bits =
16183 {
16184 /*
16185 * Note: This chip has a read-only Status Register 2 that is not
16186 * counted here. Registers are mapped as follows:
16187 * STATUS1 ... Status Register 1
16188 * STATUS2 ... Configuration Register 1
16189 * STATUS3 ... Configuration Register 2
16190 */
16191 .srp = {STATUS1, 7, RW},
16192 .srl = {STATUS2, 0, RW},
16193 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
16194 .tb = {STATUS1, 5, RW},
16195 .sec = {STATUS1, 6, RW},
16196 .cmp = {STATUS2, 6, RW},
16197 .wps = {STATUS3, 2, RW},
16198 },
16199 .decode_range = decode_range_spi25,
16200 },
16201
16202 {
16203 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016204 .name = "S25FL128P......0", /* uniform 64 kB sectors */
16205 .bustype = BUS_SPI,
16206 .manufacture_id = SPANSION_ID,
16207 .model_id = SPANSION_S25FL128,
16208 .total_size = 16384,
16209 .page_size = 256,
16210 .feature_bits = FEATURE_WRSR_WREN,
16211 .tested = TEST_OK_PREW,
16212 .probe = probe_spi_rdid,
16213 .probe_timing = TIMING_ZERO,
16214 .block_erasers =
16215 {
16216 {
16217 .eraseblocks = { {64 * 1024, 256} },
16218 .block_erase = spi_block_erase_20,
16219 }, {
16220 .eraseblocks = { {64 * 1024, 256} },
16221 .block_erase = spi_block_erase_d8,
16222 }, {
16223 .eraseblocks = { { 16384 * 1024, 1} },
16224 .block_erase = spi_block_erase_60,
16225 }, {
16226 .eraseblocks = { { 16384 * 1024, 1} },
16227 .block_erase = spi_block_erase_c7,
16228 }
16229 },
16230 .printlock = spi_prettyprint_status_register_bp3_srwd,
16231 .unlock = spi_disable_blockprotect_bp3_srwd,
16232 .write = spi_chip_write_256,
16233 .read = spi_chip_read, /* Fast read (0x0B) supported */
16234 .voltage = {2700, 3600},
16235 },
16236
16237 {
16238 .vendor = "Spansion",
16239 .name = "S25FL128P......1", /* uniform 256kB sectors */
16240 .bustype = BUS_SPI,
16241 .manufacture_id = SPANSION_ID,
16242 .model_id = SPANSION_S25FL128,
16243 .total_size = 16384,
16244 .page_size = 256,
16245 .feature_bits = FEATURE_WRSR_WREN,
16246 .tested = TEST_UNTESTED,
16247 .probe = probe_spi_rdid,
16248 .probe_timing = TIMING_ZERO,
16249 .block_erasers =
16250 {
16251 {
16252 .eraseblocks = { {256 * 1024, 64} },
16253 .block_erase = spi_block_erase_d8,
16254 }, {
16255 .eraseblocks = { { 16384 * 1024, 1} },
16256 .block_erase = spi_block_erase_c7,
16257 }
16258 },
16259 .printlock = spi_prettyprint_status_register_bp2_srwd,
16260 .unlock = spi_disable_blockprotect_bp2_srwd,
16261 .write = spi_chip_write_256,
16262 .read = spi_chip_read, /* Fast read (0x0B) supported */
16263 .voltage = {2700, 3600},
16264 },
16265
16266 {
16267 .vendor = "Spansion",
16268 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16269 .bustype = BUS_SPI,
16270 .manufacture_id = SPANSION_ID,
16271 .model_id = SPANSION_S25FL128,
16272 .total_size = 16384,
16273 .page_size = 256,
16274 /* supports 4B addressing */
16275 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16276 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16277 .tested = TEST_OK_PREW,
16278 .probe = probe_spi_rdid,
16279 .probe_timing = TIMING_ZERO,
16280 .block_erasers =
16281 {
16282 {
16283 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16284 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16285 * have no effect on the memory contents, but sets a flag in the SR.
16286 .eraseblocks = {
16287 {4 * 1024, 32},
16288 {64 * 1024, 254} // inaccessible
16289 },
16290 .block_erase = spi_block_erase_20,
16291 }, { */
16292 .eraseblocks = { { 64 * 1024, 256} },
16293 .block_erase = spi_block_erase_d8,
16294 }, {
16295 .eraseblocks = { { 16384 * 1024, 1} },
16296 .block_erase = spi_block_erase_60,
16297 }, {
16298 .eraseblocks = { { 16384 * 1024, 1} },
16299 .block_erase = spi_block_erase_c7,
16300 }
16301 },
16302 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16303 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16304 .write = spi_chip_write_256, /* Multi I/O supported */
16305 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16306 .voltage = {2700, 3600},
16307 },
16308
16309 {
16310 .vendor = "Spansion",
16311 .name = "S25FL128S......1", /* uniform 256 kB sectors */
16312 .bustype = BUS_SPI,
16313 .manufacture_id = SPANSION_ID,
16314 .model_id = SPANSION_S25FL128,
16315 .total_size = 16384,
16316 .page_size = 512,
16317 /* supports 4B addressing */
16318 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16320 .tested = TEST_UNTESTED,
16321 .probe = probe_spi_rdid,
16322 .probe_timing = TIMING_ZERO,
16323 .block_erasers =
16324 {
16325 {
16326 .eraseblocks = { {256 * 1024, 64} },
16327 .block_erase = spi_block_erase_d8,
16328 }, {
16329 .eraseblocks = { { 16384 * 1024, 1} },
16330 .block_erase = spi_block_erase_60,
16331 }, {
16332 .eraseblocks = { { 16384 * 1024, 1} },
16333 .block_erase = spi_block_erase_c7,
16334 }
16335 },
16336 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16337 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16338 .write = spi_chip_write_256, /* Multi I/O supported */
16339 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16340 .voltage = {2700, 3600},
16341 },
16342
16343 {
16344 .vendor = "Spansion",
16345 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16346 .bustype = BUS_SPI,
16347 .manufacture_id = SPANSION_ID,
16348 .model_id = SPANSION_S25FL128,
16349 .total_size = 16384,
16350 .page_size = 256,
16351 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16352 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16353 .tested = TEST_OK_PREW,
16354 .probe = probe_spi_rdid,
16355 .probe_timing = TIMING_ZERO,
16356 .block_erasers =
16357 {
16358 {
16359 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
16360 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
16361 * effect on the memory contents, but sets a flag in the SR.
16362 .eraseblocks = {
16363 {4 * 1024, 32},
16364 {64 * 1024, 254} // inaccessible
16365 },
16366 .block_erase = spi_block_erase_20,
16367 }, { */
16368 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
16369 .eraseblocks = {
16370 {8 * 1024, 16},
16371 {64 * 1024, 254} // inaccessible
16372 },
16373 .block_erase = spi_block_erase_40,
16374 }, { */
16375 .eraseblocks = { { 64 * 1024, 256} },
16376 .block_erase = spi_block_erase_d8,
16377 }, {
16378 .eraseblocks = { { 16384 * 1024, 1} },
16379 .block_erase = spi_block_erase_60,
16380 }, {
16381 .eraseblocks = { { 16384 * 1024, 1} },
16382 .block_erase = spi_block_erase_c7,
16383 }
16384 },
16385 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16386 .unlock = spi_disable_blockprotect_bp2_srwd,
16387 .write = spi_chip_write_256, /* Multi I/O supported */
16388 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16389 .voltage = {2700, 3600},
16390 },
16391
16392 {
16393 .vendor = "Spansion",
16394 .name = "S25FL129P......1", /* uniform 256 kB sectors */
16395 .bustype = BUS_SPI,
16396 .manufacture_id = SPANSION_ID,
16397 .model_id = SPANSION_S25FL128,
16398 .total_size = 16384,
16399 .page_size = 256,
16400 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16401 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16402 .tested = TEST_UNTESTED,
16403 .probe = probe_spi_rdid,
16404 .probe_timing = TIMING_ZERO,
16405 .block_erasers =
16406 {
16407 {
16408 .eraseblocks = { {256 * 1024, 64} },
16409 .block_erase = spi_block_erase_d8,
16410 }, {
16411 .eraseblocks = { { 16384 * 1024, 1} },
16412 .block_erase = spi_block_erase_60,
16413 }, {
16414 .eraseblocks = { { 16384 * 1024, 1} },
16415 .block_erase = spi_block_erase_c7,
16416 }
16417 },
16418 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16419 .unlock = spi_disable_blockprotect_bp2_srwd,
16420 .write = spi_chip_write_256, /* Multi I/O supported */
16421 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16422 .voltage = {2700, 3600},
16423 },
16424
16425 {
16426 .vendor = "Spansion",
16427 .name = "S25FL132K",
16428 .bustype = BUS_SPI,
16429 .manufacture_id = SPANSION_ID,
16430 .model_id = SPANSION_S25FL132K,
16431 .total_size = 4096,
16432 .page_size = 256,
16433 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16434 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16435 .tested = TEST_UNTESTED,
16436 .probe = probe_spi_rdid,
16437 .probe_timing = TIMING_ZERO,
16438 .block_erasers =
16439 {
16440 {
16441 .eraseblocks = { {4 * 1024, 1024} },
16442 .block_erase = spi_block_erase_20,
16443 }, {
16444 .eraseblocks = { {64 * 1024, 64} },
16445 .block_erase = spi_block_erase_d8,
16446 }, {
16447 .eraseblocks = { { 4096 * 1024, 1} },
16448 .block_erase = spi_block_erase_60,
16449 }, {
16450 .eraseblocks = { { 4096 * 1024, 1} },
16451 .block_erase = spi_block_erase_c7,
16452 }
16453 },
16454 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16455 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16456 .write = spi_chip_write_256,
16457 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16458 .voltage = {2700, 3600},
16459 },
16460
16461 {
16462 .vendor = "Spansion",
16463 .name = "S25FL164K",
16464 .bustype = BUS_SPI,
16465 .manufacture_id = SPANSION_ID,
16466 .model_id = SPANSION_S25FL164K,
16467 .total_size = 8192,
16468 .page_size = 256,
16469 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16470 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16471 .tested = TEST_OK_PREW,
16472 .probe = probe_spi_rdid,
16473 .probe_timing = TIMING_ZERO,
16474 .block_erasers =
16475 {
16476 {
16477 .eraseblocks = { {4 * 1024, 2048} },
16478 .block_erase = spi_block_erase_20,
16479 }, {
16480 .eraseblocks = { {64 * 1024, 128} },
16481 .block_erase = spi_block_erase_d8,
16482 }, {
16483 .eraseblocks = { { 8192 * 1024, 1} },
16484 .block_erase = spi_block_erase_60,
16485 }, {
16486 .eraseblocks = { { 8192 * 1024, 1} },
16487 .block_erase = spi_block_erase_c7,
16488 }
16489 },
16490 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16491 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16492 .write = spi_chip_write_256,
16493 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16494 .voltage = {2700, 3600},
16495 },
16496
16497 {
16498 .vendor = "Spansion",
16499 .name = "S25FL204K",
16500 .bustype = BUS_SPI,
16501 .manufacture_id = SPANSION_ID,
16502 .model_id = SPANSION_S25FL204,
16503 .total_size = 512,
16504 .page_size = 256,
16505 .feature_bits = FEATURE_WRSR_WREN,
16506 .tested = TEST_OK_PR,
16507 .probe = probe_spi_rdid,
16508 .probe_timing = TIMING_ZERO,
16509 .block_erasers =
16510 {
16511 {
16512 .eraseblocks = { {4 * 1024, 128} },
16513 .block_erase = spi_block_erase_20,
16514 }, {
16515 .eraseblocks = { {64 * 1024, 8} },
16516 .block_erase = spi_block_erase_d8,
16517 }, {
16518 .eraseblocks = { { 512 * 1024, 1} },
16519 .block_erase = spi_block_erase_60,
16520 }, {
16521 .eraseblocks = { { 512 * 1024, 1} },
16522 .block_erase = spi_block_erase_c7,
16523 }
16524 },
16525 .printlock = spi_prettyprint_status_register_bp3_srwd,
16526 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16527 .write = spi_chip_write_256,
16528 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16529 .voltage = {2700, 3600},
16530 },
16531
16532 {
16533 .vendor = "Spansion",
16534 .name = "S25FL208K",
16535 .bustype = BUS_SPI,
16536 .manufacture_id = SPANSION_ID,
16537 .model_id = SPANSION_S25FL208,
16538 .total_size = 1024,
16539 .page_size = 256,
16540 .feature_bits = FEATURE_WRSR_WREN,
16541 .tested = TEST_OK_PREW,
16542 .probe = probe_spi_rdid,
16543 .probe_timing = TIMING_ZERO,
16544 .block_erasers =
16545 {
16546 {
16547 .eraseblocks = { {4 * 1024, 256} },
16548 .block_erase = spi_block_erase_20,
16549 }, {
16550 .eraseblocks = { {64 * 1024, 16} },
16551 .block_erase = spi_block_erase_d8,
16552 }, {
16553 .eraseblocks = { { 1024 * 1024, 1} },
16554 .block_erase = spi_block_erase_60,
16555 }, {
16556 .eraseblocks = { { 1024 * 1024, 1} },
16557 .block_erase = spi_block_erase_c7,
16558 }
16559 },
16560 .printlock = spi_prettyprint_status_register_bp3_srwd,
16561 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16562 .write = spi_chip_write_256,
16563 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16564 .voltage = {2700, 3600},
16565 },
16566
16567 {
16568 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020016569 .name = "S25FL256L",
16570 .bustype = BUS_SPI,
16571 .manufacture_id = SPANSION_ID,
16572 .model_id = SPANSION_S25FL256L,
16573 .total_size = 32768,
16574 .page_size = 256,
16575 /* 4 x 256B Security Region (OTP) */
16576 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP |
16577 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE,
16578 .tested = TEST_UNTESTED,
16579 .probe = probe_spi_rdid,
16580 .probe_timing = TIMING_ZERO,
16581 .block_erasers =
16582 {
16583 {
16584 .eraseblocks = { {4 * 1024, 8192} },
16585 .block_erase = spi_block_erase_21,
16586 }, {
16587 .eraseblocks = { {4 * 1024, 8192} },
16588 .block_erase = spi_block_erase_20,
16589 }, {
16590 .eraseblocks = { {32 * 1024, 1024} },
16591 .block_erase = spi_block_erase_53,
16592 }, {
16593 .eraseblocks = { {32 * 1024, 1024} },
16594 .block_erase = spi_block_erase_52,
16595 }, {
16596 .eraseblocks = { {64 * 1024, 512} },
16597 .block_erase = spi_block_erase_dc,
16598 }, {
16599 .eraseblocks = { {64 * 1024, 512} },
16600 .block_erase = spi_block_erase_d8,
16601 }, {
16602 .eraseblocks = { {32768 * 1024, 1} },
16603 .block_erase = spi_block_erase_60,
16604 }, {
16605 .eraseblocks = { {32768 * 1024, 1} },
16606 .block_erase = spi_block_erase_c7,
16607 }
16608 },
16609 .printlock = spi_prettyprint_status_register_bp3_srwd,
16610 .unlock = spi_disable_blockprotect_bp3_srwd,
16611 .write = spi_chip_write_256,
16612 .read = spi_chip_read, /* Fast read (0x0B) supported */
16613 .voltage = {2700, 3600},
16614 .reg_bits =
16615 {
16616 /*
16617 * Note: This chip has a read-only Status Register 2 that is not
16618 * counted here. Registers are mapped as follows:
16619 * STATUS1 ... Status Register 1
16620 * STATUS2 ... Configuration Register 1
16621 * STATUS3 ... Configuration Register 2
16622 */
16623 .srp = {STATUS1, 7, RW},
16624 .srl = {STATUS2, 0, RW},
16625 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
16626 .tb = {STATUS1, 6, RW},
16627 .cmp = {STATUS2, 6, RW},
16628 .wps = {STATUS3, 2, RW},
16629 },
16630 .decode_range = decode_range_spi25,
16631 },
16632
16633 {
16634 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016635 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16636 .bustype = BUS_SPI,
16637 .manufacture_id = SPANSION_ID,
16638 .model_id = SPANSION_S25FL256,
16639 .total_size = 32768,
16640 .page_size = 256,
16641 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
16643 .tested = TEST_OK_PREW,
16644 .probe = probe_spi_rdid,
16645 .probe_timing = TIMING_ZERO,
16646 .block_erasers =
16647 {
16648 {
16649 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16650 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16651 * have no effect on the memory contents, but sets a flag in the SR.
16652 .eraseblocks = {
16653 {4 * 1024, 32},
16654 {64 * 1024, 254} // inaccessible
16655 },
16656 .block_erase = spi_block_erase_20,
16657 }, { */
16658 .eraseblocks = { { 64 * 1024, 512} },
16659 .block_erase = spi_block_erase_dc,
16660 }, {
16661 .eraseblocks = { { 64 * 1024, 512} },
16662 .block_erase = spi_block_erase_d8,
16663 }, {
16664 .eraseblocks = { { 32768 * 1024, 1} },
16665 .block_erase = spi_block_erase_60,
16666 }, {
16667 .eraseblocks = { { 32768 * 1024, 1} },
16668 .block_erase = spi_block_erase_c7,
16669 }
16670 },
16671 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16672 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16673 .write = spi_chip_write_256, /* Multi I/O supported */
16674 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16675 .voltage = {2700, 3600},
16676 .wrea_override = 0x17,
16677 },
16678
16679 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010016680 .vendor = "Spansion",
16681 .name = "S25FL512S",
16682 .bustype = BUS_SPI,
16683 .manufacture_id = SPANSION_ID,
16684 .model_id = SPANSION_S25FL512,
16685 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
16686 .page_size = 256,
16687 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16688 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE,
16689 .tested = TEST_OK_PREW,
16690 .probe = probe_spi_rdid,
16691 .probe_timing = TIMING_ZERO,
16692 .block_erasers =
16693 {
16694 {
16695 .eraseblocks = { { 256 * 1024, 256} },
16696 .block_erase = spi_block_erase_dc,
16697 }, {
16698 .eraseblocks = { { 65536 * 1024, 1} },
16699 .block_erase = spi_block_erase_60,
16700 }, {
16701 .eraseblocks = { { 65536 * 1024, 1} },
16702 .block_erase = spi_block_erase_c7,
16703 }
16704 },
16705 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16706 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16707 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
16708 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16709 .voltage = {2700, 3600},
16710 },
16711
16712 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016713 .vendor = "SyncMOS/MoselVitelic",
16714 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016715 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016716 .manufacture_id = SYNCMOS_MVC_ID,
16717 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016718 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016719 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000016720 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016721 .tested = TEST_UNTESTED,
16722 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016723 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016724 .block_erasers =
16725 {
16726 {
16727 .eraseblocks = { {512, 256} },
16728 .block_erase = erase_sector_jedec,
16729 }, {
16730 .eraseblocks = { {128 * 1024, 1} },
16731 .block_erase = erase_chip_block_jedec,
16732 },
16733 },
Sean Nelson35727f72010-01-28 23:55:12 +000016734 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016735 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016736 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000016737 },
16738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016739 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016740 .vendor = "SyncMOS/MoselVitelic",
16741 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016742 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016743 .manufacture_id = SYNCMOS_MVC_ID,
16744 .model_id = SM_MVC_29C51001T,
16745 .total_size = 128,
16746 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000016747 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016748 .tested = TEST_UNTESTED,
16749 .probe = probe_jedec,
16750 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16751 .block_erasers =
16752 {
16753 {
16754 .eraseblocks = { {512, 256} },
16755 .block_erase = erase_sector_jedec,
16756 }, {
16757 .eraseblocks = { {128 * 1024, 1} },
16758 .block_erase = erase_chip_block_jedec,
16759 },
16760 },
16761 .write = write_jedec_1,
16762 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016763 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016764 },
16765
16766 {
16767 .vendor = "SyncMOS/MoselVitelic",
16768 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016769 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016770 .manufacture_id = SYNCMOS_MVC_ID,
16771 .model_id = SM_MVC_29C51002B,
16772 .total_size = 256,
16773 .page_size = 512,
16774 .feature_bits = FEATURE_EITHER_RESET,
16775 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016776 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016777 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016778 .block_erasers =
16779 {
16780 {
16781 .eraseblocks = { {512, 512} },
16782 .block_erase = erase_sector_jedec,
16783 }, {
16784 .eraseblocks = { {256 * 1024, 1} },
16785 .block_erase = erase_chip_block_jedec,
16786 },
16787 },
Sean Nelson35727f72010-01-28 23:55:12 +000016788 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016789 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000016790 },
16791
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016792 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016793 .vendor = "SyncMOS/MoselVitelic",
16794 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016795 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016796 .manufacture_id = SYNCMOS_MVC_ID,
16797 .model_id = SM_MVC_29C51002T,
16798 .total_size = 256,
16799 .page_size = 512,
16800 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000016801 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016802 .probe = probe_jedec,
16803 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16804 .block_erasers =
16805 {
16806 {
16807 .eraseblocks = { {512, 512} },
16808 .block_erase = erase_sector_jedec,
16809 }, {
16810 .eraseblocks = { {256 * 1024, 1} },
16811 .block_erase = erase_chip_block_jedec,
16812 },
16813 },
16814 .write = write_jedec_1,
16815 .read = read_memmapped,
16816 },
16817
16818 {
16819 .vendor = "SyncMOS/MoselVitelic",
16820 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016821 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016822 .manufacture_id = SYNCMOS_MVC_ID,
16823 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016824 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016825 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000016826 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016827 .tested = TEST_UNTESTED,
16828 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016829 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000016830 .block_erasers =
16831 {
16832 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000016833 .eraseblocks = { {1024, 512} },
16834 .block_erase = erase_sector_jedec,
16835 }, {
16836 .eraseblocks = { {512 * 1024, 1} },
16837 .block_erase = erase_chip_block_jedec,
16838 },
16839 },
16840 .write = write_jedec_1,
16841 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016842 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016843 },
16844
16845 {
16846 .vendor = "SyncMOS/MoselVitelic",
16847 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016848 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016849 .manufacture_id = SYNCMOS_MVC_ID,
16850 .model_id = SM_MVC_29C51004T,
16851 .total_size = 512,
16852 .page_size = 1024,
16853 .feature_bits = FEATURE_EITHER_RESET,
16854 .tested = TEST_UNTESTED,
16855 .probe = probe_jedec,
16856 .probe_timing = TIMING_ZERO,
16857 .block_erasers =
16858 {
16859 {
16860 .eraseblocks = { {1024, 512} },
16861 .block_erase = erase_sector_jedec,
16862 }, {
16863 .eraseblocks = { {512 * 1024, 1} },
16864 .block_erase = erase_chip_block_jedec,
16865 },
16866 },
16867 .write = write_jedec_1,
16868 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016869 .voltage = {4500, 5500},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016870 },
16871
16872 {
16873 .vendor = "SyncMOS/MoselVitelic",
16874 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016875 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016876 .manufacture_id = SYNCMOS_MVC_ID,
16877 .model_id = SM_MVC_29C31004B,
16878 .total_size = 512,
16879 .page_size = 1024,
16880 .feature_bits = FEATURE_EITHER_RESET,
16881 .tested = TEST_UNTESTED,
16882 .probe = probe_jedec,
16883 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16884 .block_erasers =
16885 {
16886 {
16887 .eraseblocks = { {1024, 512} },
16888 .block_erase = erase_sector_jedec,
16889 }, {
16890 .eraseblocks = { {512 * 1024, 1} },
16891 .block_erase = erase_chip_block_jedec,
16892 },
16893 },
16894 .write = write_jedec_1,
16895 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016896 .voltage = {3000, 3600},
Mattias Mattsson4c066502010-07-29 20:01:13 +000016897 },
16898
16899 {
16900 .vendor = "SyncMOS/MoselVitelic",
16901 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016902 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000016903 .manufacture_id = SYNCMOS_MVC_ID,
16904 .model_id = SM_MVC_29C31004T,
16905 .total_size = 512,
16906 .page_size = 1024,
16907 .feature_bits = FEATURE_EITHER_RESET,
16908 .tested = TEST_UNTESTED,
16909 .probe = probe_jedec,
16910 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16911 .block_erasers =
16912 {
16913 {
16914 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000016915 .block_erase = erase_sector_jedec,
16916 }, {
16917 .eraseblocks = { {512 * 1024, 1} },
16918 .block_erase = erase_chip_block_jedec,
16919 },
16920 },
Sean Nelson35727f72010-01-28 23:55:12 +000016921 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016922 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016923 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000016924 },
16925
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016926 {
Uwe Hermanna106d152009-05-27 23:17:40 +000016927 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016928 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016929 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016930 .manufacture_id = TI_OLD_ID,
16931 .model_id = TI_TMS29F002RB,
16932 .total_size = 256,
16933 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000016934 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016935 .tested = TEST_UNTESTED,
16936 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016937 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016938 .block_erasers =
16939 {
16940 {
16941 .eraseblocks = {
16942 {16 * 1024, 1},
16943 {8 * 1024, 2},
16944 {32 * 1024, 1},
16945 {64 * 1024, 3},
16946 },
16947 .block_erase = erase_sector_jedec,
16948 }, {
16949 .eraseblocks = { {256 * 1024, 1} },
16950 .block_erase = erase_chip_block_jedec,
16951 },
16952 },
Sean Nelson35727f72010-01-28 23:55:12 +000016953 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016954 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016955 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016956 },
16957
16958 {
Uwe Hermanna106d152009-05-27 23:17:40 +000016959 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016960 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016961 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016962 .manufacture_id = TI_OLD_ID,
16963 .model_id = TI_TMS29F002RT,
16964 .total_size = 256,
16965 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000016966 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016967 .tested = TEST_UNTESTED,
16968 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000016969 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016970 .block_erasers =
16971 {
16972 {
16973 .eraseblocks = {
16974 {64 * 1024, 3},
16975 {32 * 1024, 1},
16976 {8 * 1024, 2},
16977 {16 * 1024, 1},
16978 },
16979 .block_erase = erase_sector_jedec,
16980 }, {
16981 .eraseblocks = { {256 * 1024, 1} },
16982 .block_erase = erase_chip_block_jedec,
16983 },
16984 },
Sean Nelson35727f72010-01-28 23:55:12 +000016985 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016986 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016987 .voltage = {4500, 5500},
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000016988 },
16989
16990 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016991 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100016992 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016993 .bustype = BUS_SPI,
16994 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016995 .model_id = WINBOND_NEX_W25P16,
16996 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000016997 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016998 .feature_bits = FEATURE_WRSR_WREN,
16999 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017000 .probe = probe_spi_rdid,
17001 .probe_timing = TIMING_ZERO,
17002 .block_erasers =
17003 {
17004 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017005 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017006 .block_erase = spi_block_erase_d8,
17007 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017008 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017009 .block_erase = spi_block_erase_c7,
17010 }
17011 },
17012 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17013 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017014 .write = spi_chip_write_256,
17015 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017016 .voltage = {2700, 3600},
17017 },
17018
17019 {
17020 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017021 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017022 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017023 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017024 .model_id = WINBOND_NEX_W25P32,
17025 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017026 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017027 .feature_bits = FEATURE_WRSR_WREN,
17028 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017029 .probe = probe_spi_rdid,
17030 .probe_timing = TIMING_ZERO,
17031 .block_erasers =
17032 {
17033 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017034 .eraseblocks = { {64 * 1024, 64} },
17035 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017036 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017037 .eraseblocks = { {4096 * 1024, 1} },
17038 .block_erase = spi_block_erase_c7,
17039 }
17040 },
17041 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17042 .unlock = spi_disable_blockprotect,
17043 .write = spi_chip_write_256,
17044 .read = spi_chip_read, /* Fast read (0x0B) supported */
17045 .voltage = {2700, 3600},
17046 },
17047
17048 {
17049 .vendor = "Winbond",
17050 .name = "W25P80",
17051 .bustype = BUS_SPI,
17052 .manufacture_id = WINBOND_NEX_ID,
17053 .model_id = WINBOND_NEX_W25P80,
17054 .total_size = 1024,
17055 .page_size = 256,
17056 .feature_bits = FEATURE_WRSR_WREN,
17057 .tested = TEST_UNTESTED,
17058 .probe = probe_spi_rdid,
17059 .probe_timing = TIMING_ZERO,
17060 .block_erasers =
17061 {
17062 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000017063 .eraseblocks = { {64 * 1024, 16} },
17064 .block_erase = spi_block_erase_d8,
17065 }, {
17066 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000017067 .block_erase = spi_block_erase_c7,
17068 }
17069 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000017070 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000017071 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017072 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017073 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017074 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000017075 },
17076
17077 {
17078 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017079 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017080 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017081 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017082 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017083 .total_size = 16384,
17084 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017085 /* supports SFDP */
17086 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber3f3c1f32022-05-28 16:48:26 +020017087 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17088 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Stefan Tauner0554ca52013-07-25 22:54:25 +000017089 .tested = TEST_OK_PREW,
Antony Rheneus0fbba982011-05-26 14:28:51 +000017090 .probe = probe_spi_rdid,
17091 .probe_timing = TIMING_ZERO,
17092 .block_erasers =
17093 {
17094 {
17095 .eraseblocks = { {4 * 1024, 4096} },
17096 .block_erase = spi_block_erase_20,
17097 }, {
17098 .eraseblocks = { {32 * 1024, 512} },
17099 .block_erase = spi_block_erase_52,
17100 }, {
17101 .eraseblocks = { {64 * 1024, 256} },
17102 .block_erase = spi_block_erase_d8,
17103 }, {
17104 .eraseblocks = { {16 * 1024 * 1024, 1} },
17105 .block_erase = spi_block_erase_60,
17106 }, {
17107 .eraseblocks = { {16 * 1024 * 1024, 1} },
17108 .block_erase = spi_block_erase_c7,
17109 }
17110 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000017111 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000017112 .unlock = spi_disable_blockprotect,
17113 .write = spi_chip_write_256,
17114 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017115 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017116 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
17117 .reg_bits =
17118 {
17119 .srp = {STATUS1, 7, RW},
17120 .srl = {STATUS2, 0, RW},
17121 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17122 .tb = {STATUS1, 5, RW},
17123 .sec = {STATUS1, 6, RW},
17124 .cmp = {STATUS2, 6, RW},
17125 .wps = {STATUS3, 2, RW},
17126 },
17127 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017128 },
17129
17130 {
17131 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020017132 .name = "W25Q128.V..M",
17133 .bustype = BUS_SPI,
17134 .manufacture_id = WINBOND_NEX_ID,
17135 .model_id = WINBOND_NEX_W25Q128_V_M,
17136 .total_size = 16384,
17137 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017138 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Patrick Rudolph34323492018-10-04 14:59:40 +020017139 .tested = TEST_OK_PREW,
17140 .probe = probe_spi_rdid,
17141 .probe_timing = TIMING_ZERO,
17142 .block_erasers =
17143 {
17144 {
17145 .eraseblocks = { {4 * 1024, 4096} },
17146 .block_erase = spi_block_erase_20,
17147 }, {
17148 .eraseblocks = { {32 * 1024, 512} },
17149 .block_erase = spi_block_erase_52,
17150 }, {
17151 .eraseblocks = { {64 * 1024, 256} },
17152 .block_erase = spi_block_erase_d8,
17153 }, {
17154 .eraseblocks = { {16 * 1024 * 1024, 1} },
17155 .block_erase = spi_block_erase_60,
17156 }, {
17157 .eraseblocks = { {16 * 1024 * 1024, 1} },
17158 .block_erase = spi_block_erase_c7,
17159 }
17160 },
Alan Greena1fc01d2019-09-23 17:12:44 +100017161 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020017162 .unlock = spi_disable_blockprotect,
17163 .write = spi_chip_write_256,
17164 .read = spi_chip_read,
17165 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017166 .reg_bits =
17167 {
17168 .srp = {STATUS1, 7, RW},
17169 .srl = {STATUS2, 0, RW},
17170 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17171 .tb = {STATUS1, 5, RW},
17172 .sec = {STATUS1, 6, RW},
17173 .cmp = {STATUS2, 6, RW},
17174 },
17175 .decode_range = decode_range_spi25,
Patrick Rudolph34323492018-10-04 14:59:40 +020017176 },
17177
17178 {
17179 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017180 .name = "W25Q128.W",
17181 .bustype = BUS_SPI,
17182 .manufacture_id = WINBOND_NEX_ID,
17183 .model_id = WINBOND_NEX_W25Q128_W,
17184 .total_size = 16384,
17185 .page_size = 256,
17186 /* supports SFDP */
17187 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017188 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017189 .tested = TEST_OK_PREW,
17190 .probe = probe_spi_rdid,
17191 .probe_timing = TIMING_ZERO,
17192 .block_erasers =
17193 {
17194 {
17195 .eraseblocks = { {4 * 1024, 4096} },
17196 .block_erase = spi_block_erase_20,
17197 }, {
17198 .eraseblocks = { {32 * 1024, 512} },
17199 .block_erase = spi_block_erase_52,
17200 }, {
17201 .eraseblocks = { {64 * 1024, 256} },
17202 .block_erase = spi_block_erase_d8,
17203 }, {
17204 .eraseblocks = { {16 * 1024 * 1024, 1} },
17205 .block_erase = spi_block_erase_60,
17206 }, {
17207 .eraseblocks = { {16 * 1024 * 1024, 1} },
17208 .block_erase = spi_block_erase_c7,
17209 }
17210 },
17211 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17212 .unlock = spi_disable_blockprotect,
17213 .write = spi_chip_write_256,
17214 .read = spi_chip_read,
17215 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017216 .reg_bits =
17217 {
17218 .srp = {STATUS1, 7, RW},
17219 .srl = {STATUS2, 0, RW},
17220 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17221 .tb = {STATUS1, 5, RW},
17222 .sec = {STATUS1, 6, RW},
17223 .cmp = {STATUS2, 6, RW},
17224 },
17225 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017226 },
17227
17228 {
17229 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080017230 .name = "W25Q128.JW.DTR",
17231 .bustype = BUS_SPI,
17232 .manufacture_id = WINBOND_NEX_ID,
17233 .model_id = WINBOND_NEX_W25Q128_DTR,
17234 .total_size = 16384,
17235 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017236 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Peichao Wang1a119492019-11-11 15:26:41 +080017237 .tested = TEST_OK_PREW,
17238 .probe = probe_spi_rdid,
17239 .probe_timing = TIMING_ZERO,
17240 .block_erasers =
17241 {
17242 {
17243 .eraseblocks = { {4 * 1024, 4096} },
17244 .block_erase = spi_block_erase_20,
17245 }, {
17246 .eraseblocks = { {32 * 1024, 512} },
17247 .block_erase = spi_block_erase_52,
17248 }, {
17249 .eraseblocks = { {64 * 1024, 256} },
17250 .block_erase = spi_block_erase_d8,
17251 }, {
17252 .eraseblocks = { {16 * 1024 * 1024, 1} },
17253 .block_erase = spi_block_erase_60,
17254 }, {
17255 .eraseblocks = { {16 * 1024 * 1024, 1} },
17256 .block_erase = spi_block_erase_c7,
17257 }
17258 },
17259 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17260 .unlock = spi_disable_blockprotect,
17261 .write = spi_chip_write_256,
17262 .read = spi_chip_read,
17263 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017264 .reg_bits =
17265 {
17266 .srp = {STATUS1, 7, RW},
17267 .srl = {STATUS2, 0, RW},
17268 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17269 .tb = {STATUS1, 5, RW},
17270 .sec = {STATUS1, 6, RW},
17271 .cmp = {STATUS2, 6, RW},
17272 },
17273 .decode_range = decode_range_spi25,
Peichao Wang1a119492019-11-11 15:26:41 +080017274 },
17275
17276 {
17277 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017278 .name = "W25Q16.V",
17279 .bustype = BUS_SPI,
17280 .manufacture_id = WINBOND_NEX_ID,
17281 .model_id = WINBOND_NEX_W25Q16_V,
17282 .total_size = 2048,
17283 .page_size = 256,
17284 /* supports SFDP */
17285 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17286 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17287 .tested = TEST_OK_PREW,
17288 .probe = probe_spi_rdid,
17289 .probe_timing = TIMING_ZERO,
17290 .block_erasers =
17291 {
17292 {
17293 .eraseblocks = { {4 * 1024, 512} },
17294 .block_erase = spi_block_erase_20,
17295 }, {
17296 .eraseblocks = { {32 * 1024, 64} },
17297 .block_erase = spi_block_erase_52,
17298 }, {
17299 .eraseblocks = { {64 * 1024, 32} },
17300 .block_erase = spi_block_erase_d8,
17301 }, {
17302 .eraseblocks = { {2 * 1024 * 1024, 1} },
17303 .block_erase = spi_block_erase_60,
17304 }, {
17305 .eraseblocks = { {2 * 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},
17314 },
17315
17316 {
17317 .vendor = "Winbond",
17318 .name = "W25Q16.W",
17319 .bustype = BUS_SPI,
17320 .manufacture_id = WINBOND_NEX_ID,
17321 .model_id = WINBOND_NEX_W25Q16_W,
17322 .total_size = 2048,
17323 .page_size = 256,
17324 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17325 /* QPI enable 0x38, disable 0xFF */
17326 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17327 .tested = TEST_UNTESTED,
17328 .probe = probe_spi_rdid,
17329 .probe_timing = TIMING_ZERO,
17330 .block_erasers =
17331 {
17332 {
17333 .eraseblocks = { {4 * 1024, 512} },
17334 .block_erase = spi_block_erase_20,
17335 }, {
17336 .eraseblocks = { {32 * 1024, 64} },
17337 .block_erase = spi_block_erase_52,
17338 }, {
17339 .eraseblocks = { {64 * 1024, 32} },
17340 .block_erase = spi_block_erase_d8,
17341 }, {
17342 .eraseblocks = { {2 * 1024 * 1024, 1} },
17343 .block_erase = spi_block_erase_60,
17344 }, {
17345 .eraseblocks = { {2 * 1024 * 1024, 1} },
17346 .block_erase = spi_block_erase_c7,
17347 }
17348 },
17349 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17350 .unlock = spi_disable_blockprotect,
17351 .write = spi_chip_write_256,
17352 .read = spi_chip_read,
17353 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17354 },
17355
17356 {
17357 .vendor = "Winbond",
17358 .name = "W25Q20.W",
17359 .bustype = BUS_SPI,
17360 .manufacture_id = WINBOND_NEX_ID,
17361 .model_id = WINBOND_NEX_W25Q20_W,
17362 .total_size = 256,
17363 .page_size = 256,
17364 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17365 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17366 .tested = TEST_UNTESTED,
17367 .probe = probe_spi_rdid,
17368 .probe_timing = TIMING_ZERO,
17369 .block_erasers =
17370 {
17371 {
17372 .eraseblocks = { {4 * 1024, 64} },
17373 .block_erase = spi_block_erase_20,
17374 }, {
17375 .eraseblocks = { {32 * 1024, 8} },
17376 .block_erase = spi_block_erase_52,
17377 }, {
17378 .eraseblocks = { {64 * 1024, 4} },
17379 .block_erase = spi_block_erase_d8,
17380 }, {
17381 .eraseblocks = { {256 * 1024, 1} },
17382 .block_erase = spi_block_erase_60,
17383 }, {
17384 .eraseblocks = { {256 * 1024, 1} },
17385 .block_erase = spi_block_erase_c7,
17386 }
17387 },
17388 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17389 .unlock = spi_disable_blockprotect,
17390 .write = spi_chip_write_256,
17391 .read = spi_chip_read,
17392 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17393 },
17394
17395 {
17396 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020017397 .name = "W25Q256FV",
Boris Baykovaa6c3742016-06-11 18:29:01 +020017398 .bustype = BUS_SPI,
17399 .manufacture_id = WINBOND_NEX_ID,
17400 .model_id = WINBOND_NEX_W25Q256_V,
17401 .total_size = 32768,
17402 .page_size = 256,
17403 /* supports SFDP */
17404 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017405 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN |
Nico Huber542b1f02022-05-24 14:30:12 +020017406 FEATURE_4BA_EAR_C5C8 | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017407 FEATURE_WRSR2,
Angel Pons3130cbd2018-09-30 19:32:30 +020017408 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017409 .probe = probe_spi_rdid,
17410 .probe_timing = TIMING_ZERO,
17411 .block_erasers =
17412 {
17413 {
17414 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020017415 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017416 }, {
17417 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020017418 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017419 }, {
17420 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020017421 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017422 }, {
17423 .eraseblocks = { {32 * 1024 * 1024, 1} },
17424 .block_erase = spi_block_erase_60,
17425 }, {
17426 .eraseblocks = { {32 * 1024 * 1024, 1} },
17427 .block_erase = spi_block_erase_c7,
17428 }
17429 },
17430 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17431 .unlock = spi_disable_blockprotect,
17432 .write = spi_chip_write_256,
17433 .read = spi_chip_read,
17434 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017435 .reg_bits =
17436 {
17437 .srp = {STATUS1, 7, RW},
17438 .srl = {STATUS2, 0, RW},
17439 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17440 .tb = {STATUS1, 6, RW},
17441 .cmp = {STATUS2, 6, RW},
17442 },
17443 .decode_range = decode_range_spi25,
Boris Baykovaa6c3742016-06-11 18:29:01 +020017444 },
17445
17446 {
17447 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020017448 .name = "W25Q256JV_Q",
17449 .bustype = BUS_SPI,
17450 .manufacture_id = WINBOND_NEX_ID,
17451 .model_id = WINBOND_NEX_W25Q256_V,
17452 .total_size = 32768,
17453 .page_size = 256,
17454 /* supports SFDP */
17455 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17456 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2,
17457 .tested = TEST_UNTESTED,
17458 .probe = probe_spi_rdid,
17459 .probe_timing = TIMING_ZERO,
17460 .block_erasers =
17461 {
17462 {
17463 .eraseblocks = { {4 * 1024, 8192} },
17464 .block_erase = spi_block_erase_21,
17465 }, {
17466 .eraseblocks = { {4 * 1024, 8192} },
17467 .block_erase = spi_block_erase_20,
17468 }, {
17469 .eraseblocks = { {32 * 1024, 1024} },
17470 .block_erase = spi_block_erase_52,
17471 }, {
17472 .eraseblocks = { {64 * 1024, 512} },
17473 .block_erase = spi_block_erase_dc,
17474 }, {
17475 .eraseblocks = { {64 * 1024, 512} },
17476 .block_erase = spi_block_erase_d8,
17477 }, {
17478 .eraseblocks = { {32 * 1024 * 1024, 1} },
17479 .block_erase = spi_block_erase_60,
17480 }, {
17481 .eraseblocks = { {32 * 1024 * 1024, 1} },
17482 .block_erase = spi_block_erase_c7,
17483 }
17484 },
17485 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17486 .unlock = spi_disable_blockprotect,
17487 .write = spi_chip_write_256,
17488 .read = spi_chip_read,
17489 .voltage = {2700, 3600},
17490 .reg_bits =
17491 {
17492 .srp = {STATUS1, 7, RW},
17493 .srl = {STATUS2, 0, RW},
17494 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17495 .tb = {STATUS1, 6, RW},
17496 .cmp = {STATUS2, 6, RW},
17497 },
17498 .decode_range = decode_range_spi25,
17499 },
17500
17501 {
17502 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000017503 .name = "W25Q256JV_M",
17504 .bustype = BUS_SPI,
17505 .manufacture_id = WINBOND_NEX_ID,
17506 .model_id = WINBOND_NEX_W25Q256JV_M,
17507 .total_size = 32768,
17508 .page_size = 256,
17509 /* supports SFDP */
17510 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017511 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_WRSR2,
David Hendricks49876792018-10-27 20:19:42 +000017512 .tested = TEST_OK_PREW,
17513 .probe = probe_spi_rdid,
17514 .probe_timing = TIMING_ZERO,
17515 .block_erasers =
17516 {
17517 {
17518 .eraseblocks = { {4 * 1024, 8192} },
17519 .block_erase = spi_block_erase_21,
17520 }, {
17521 .eraseblocks = { {4 * 1024, 8192} },
17522 .block_erase = spi_block_erase_20,
17523 }, {
17524 .eraseblocks = { {32 * 1024, 1024} },
17525 .block_erase = spi_block_erase_52,
17526 }, {
17527 .eraseblocks = { {64 * 1024, 512} },
17528 .block_erase = spi_block_erase_dc,
17529 }, {
17530 .eraseblocks = { {64 * 1024, 512} },
17531 .block_erase = spi_block_erase_d8,
17532 }, {
17533 .eraseblocks = { {32 * 1024 * 1024, 1} },
17534 .block_erase = spi_block_erase_60,
17535 }, {
17536 .eraseblocks = { {32 * 1024 * 1024, 1} },
17537 .block_erase = spi_block_erase_c7,
17538 }
17539 },
17540 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17541 .unlock = spi_disable_blockprotect,
17542 .write = spi_chip_write_256,
17543 .read = spi_chip_read,
17544 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110017545 .reg_bits =
17546 {
17547 .srp = {STATUS1, 7, RW},
17548 .srl = {STATUS2, 0, RW},
17549 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17550 .tb = {STATUS1, 6, RW},
17551 .cmp = {STATUS2, 6, RW},
17552 },
17553 .decode_range = decode_range_spi25,
David Hendricks49876792018-10-27 20:19:42 +000017554 },
17555
17556 {
17557 .vendor = "Winbond",
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020017558 .name = "W25Q256JW",
el-coderon01209852020-04-29 12:12:53 +020017559 .bustype = BUS_SPI,
17560 .manufacture_id = WINBOND_NEX_ID,
17561 .model_id = WINBOND_NEX_W25Q256_W,
17562 .total_size = 32768,
17563 .page_size = 256,
17564 /* supports SFDP */
17565 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020017566 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
el-coderon01209852020-04-29 12:12:53 +020017567 .tested = TEST_OK_PREW,
17568 .probe = probe_spi_rdid,
17569 .probe_timing = TIMING_ZERO,
17570 .block_erasers =
17571 {
17572 {
17573 .eraseblocks = { {4 * 1024, 8192} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020017574 .block_erase = spi_block_erase_21,
17575 }, {
17576 .eraseblocks = { {4 * 1024, 8192} },
el-coderon01209852020-04-29 12:12:53 +020017577 .block_erase = spi_block_erase_20,
17578 }, {
17579 .eraseblocks = { {32 * 1024, 1024} },
17580 .block_erase = spi_block_erase_52,
17581 }, {
17582 .eraseblocks = { {64 * 1024, 512} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020017583 .block_erase = spi_block_erase_dc,
17584 }, {
17585 .eraseblocks = { {64 * 1024, 512} },
el-coderon01209852020-04-29 12:12:53 +020017586 .block_erase = spi_block_erase_d8,
17587 }, {
17588 .eraseblocks = { {32 * 1024 * 1024, 1} },
17589 .block_erase = spi_block_erase_60,
17590 }, {
17591 .eraseblocks = { {32 * 1024 * 1024, 1} },
17592 .block_erase = spi_block_erase_c7,
17593 }
17594 },
17595 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17596 .unlock = spi_disable_blockprotect,
17597 .write = spi_chip_write_256,
17598 .read = spi_chip_read,
17599 .voltage = {1650, 1950},
17600 },
17601
17602 {
17603 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070017604 .name = "W25Q256JW_DTR",
17605 .bustype = BUS_SPI,
17606 .manufacture_id = WINBOND_NEX_ID,
17607 .model_id = WINBOND_NEX_W25Q256_DTR,
17608 .total_size = 32768,
17609 .page_size = 256,
17610 /* supports SFDP */
17611 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
David Hendricks31532602020-08-16 17:14:56 -070017612 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17613 .tested = TEST_OK_PREW,
17614 .probe = probe_spi_rdid,
17615 .probe_timing = TIMING_ZERO,
17616 .block_erasers =
17617 {
17618 {
17619 .eraseblocks = { {4 * 1024, 8192} },
17620 .block_erase = spi_block_erase_21,
17621 }, {
17622 .eraseblocks = { {4 * 1024, 8192} },
17623 .block_erase = spi_block_erase_20,
17624 }, {
17625 .eraseblocks = { {32 * 1024, 1024} },
17626 .block_erase = spi_block_erase_52,
17627 }, {
17628 .eraseblocks = { {64 * 1024, 512} },
17629 .block_erase = spi_block_erase_dc,
17630 }, {
17631 .eraseblocks = { {64 * 1024, 512} },
17632 .block_erase = spi_block_erase_d8,
17633 }, {
17634 .eraseblocks = { {32 * 1024 * 1024, 1} },
17635 .block_erase = spi_block_erase_60,
17636 }, {
17637 .eraseblocks = { {32 * 1024 * 1024, 1} },
17638 .block_erase = spi_block_erase_c7,
17639 }
17640 },
17641 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17642 .unlock = spi_disable_blockprotect,
17643 .write = spi_chip_write_256,
17644 .read = spi_chip_read,
17645 .voltage = {1700, 1950},
17646 },
17647
17648 {
17649 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017650 .name = "W25Q32.V",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017651 .bustype = BUS_SPI,
17652 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017653 .model_id = WINBOND_NEX_W25Q32_V,
17654 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017655 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017656 /* supports SFDP */
17657 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017658 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017659 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017660 .probe = probe_spi_rdid,
17661 .probe_timing = TIMING_ZERO,
17662 .block_erasers =
17663 {
17664 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017665 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017666 .block_erase = spi_block_erase_20,
17667 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017668 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017669 .block_erase = spi_block_erase_52,
17670 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017671 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017672 .block_erase = spi_block_erase_d8,
17673 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017674 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017675 .block_erase = spi_block_erase_60,
17676 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017677 .eraseblocks = { {4 * 1024 * 1024, 1} },
17678 .block_erase = spi_block_erase_c7,
17679 }
17680 },
17681 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17682 .unlock = spi_disable_blockprotect,
17683 .write = spi_chip_write_256,
17684 .read = spi_chip_read,
17685 .voltage = {2700, 3600},
17686 },
17687
17688 {
17689 .vendor = "Winbond",
17690 .name = "W25Q32.W",
17691 .bustype = BUS_SPI,
17692 .manufacture_id = WINBOND_NEX_ID,
17693 .model_id = WINBOND_NEX_W25Q32_W,
17694 .total_size = 4096,
17695 .page_size = 256,
17696 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17697 /* QPI enable 0x38, disable 0xFF */
17698 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17699 .tested = TEST_OK_PREW,
17700 .probe = probe_spi_rdid,
17701 .probe_timing = TIMING_ZERO,
17702 .block_erasers =
17703 {
17704 {
17705 .eraseblocks = { {4 * 1024, 1024} },
17706 .block_erase = spi_block_erase_20,
17707 }, {
17708 .eraseblocks = { {32 * 1024, 128} },
17709 .block_erase = spi_block_erase_52,
17710 }, {
17711 .eraseblocks = { {64 * 1024, 64} },
17712 .block_erase = spi_block_erase_d8,
17713 }, {
17714 .eraseblocks = { {4 * 1024 * 1024, 1} },
17715 .block_erase = spi_block_erase_60,
17716 }, {
17717 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017718 .block_erase = spi_block_erase_c7,
17719 }
17720 },
17721 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17722 .unlock = spi_disable_blockprotect,
17723 .write = spi_chip_write_256,
17724 .read = spi_chip_read,
17725 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17726 },
17727
17728 {
17729 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100017730 .name = "W25Q32JW...M",
17731 .bustype = BUS_SPI,
17732 .manufacture_id = WINBOND_NEX_ID,
17733 .model_id = WINBOND_NEX_W25Q32JW_M,
17734 .total_size = 4096,
17735 .page_size = 256,
17736 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17737 .tested = TEST_OK_PREW,
17738 .probe = probe_spi_rdid,
17739 .probe_timing = TIMING_ZERO,
17740 .block_erasers =
17741 {
17742 {
17743 .eraseblocks = { {4 * 1024, 1024} },
17744 .block_erase = spi_block_erase_20,
17745 }, {
17746 .eraseblocks = { {32 * 1024, 128} },
17747 .block_erase = spi_block_erase_52,
17748 }, {
17749 .eraseblocks = { {64 * 1024, 64} },
17750 .block_erase = spi_block_erase_d8,
17751 }, {
17752 .eraseblocks = { {4 * 1024 * 1024, 1} },
17753 .block_erase = spi_block_erase_60,
17754 }, {
17755 .eraseblocks = { {4 * 1024 * 1024, 1} },
17756 .block_erase = spi_block_erase_c7,
17757 }
17758 },
17759 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
17760 .unlock = spi_disable_blockprotect_bp2_srwd,
17761 .write = spi_chip_write_256,
17762 .read = spi_chip_read,
17763 .voltage = {1700, 1950},
17764 },
17765
17766 {
17767 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017768 .name = "W25Q40.V",
17769 .bustype = BUS_SPI,
17770 .manufacture_id = WINBOND_NEX_ID,
17771 .model_id = WINBOND_NEX_W25Q40_V,
17772 .total_size = 512,
17773 .page_size = 256,
17774 /* supports SFDP */
17775 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17776 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17777 .tested = TEST_OK_PREW,
17778 .probe = probe_spi_rdid,
17779 .probe_timing = TIMING_ZERO,
17780 .block_erasers =
17781 {
17782 {
17783 .eraseblocks = { {4 * 1024, 128} },
17784 .block_erase = spi_block_erase_20,
17785 }, {
17786 .eraseblocks = { {32 * 1024, 16} },
17787 .block_erase = spi_block_erase_52,
17788 }, {
17789 .eraseblocks = { {64 * 1024, 8} },
17790 .block_erase = spi_block_erase_d8,
17791 }, {
17792 .eraseblocks = { {512 * 1024, 1} },
17793 .block_erase = spi_block_erase_60,
17794 }, {
17795 .eraseblocks = { {512 * 1024, 1} },
17796 .block_erase = spi_block_erase_c7,
17797 }
17798 },
17799 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17800 .unlock = spi_disable_blockprotect,
17801 .write = spi_chip_write_256, /* Multi I/O supported */
17802 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17803 .voltage = {2700, 3600},
17804 },
17805
17806 {
17807 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020017808 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017809 .bustype = BUS_SPI,
17810 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020017811 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017812 .total_size = 512,
17813 .page_size = 256,
17814 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17815 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons3164a0c2018-09-30 20:26:06 +020017816 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017817 .probe = probe_spi_rdid,
17818 .probe_timing = TIMING_ZERO,
17819 .block_erasers =
17820 {
17821 {
17822 .eraseblocks = { {4 * 1024, 128} },
17823 .block_erase = spi_block_erase_20,
17824 }, {
17825 .eraseblocks = { {32 * 1024, 16} },
17826 .block_erase = spi_block_erase_52,
17827 }, {
17828 .eraseblocks = { {64 * 1024, 8} },
17829 .block_erase = spi_block_erase_d8,
17830 }, {
17831 .eraseblocks = { {512 * 1024, 1} },
17832 .block_erase = spi_block_erase_60,
17833 }, {
17834 .eraseblocks = { {512 * 1024, 1} },
17835 .block_erase = spi_block_erase_c7,
17836 }
17837 },
17838 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17839 .unlock = spi_disable_blockprotect,
17840 .write = spi_chip_write_256,
17841 .read = spi_chip_read,
17842 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17843 },
17844
17845 {
17846 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020017847 .name = "W25Q40EW",
17848 .bustype = BUS_SPI,
17849 .manufacture_id = WINBOND_NEX_ID,
17850 .model_id = WINBOND_NEX_W25Q40EW,
17851 .total_size = 512,
17852 .page_size = 256,
17853 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17854 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green07b8a172019-09-23 16:47:05 +100017855 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020017856 .probe = probe_spi_rdid,
17857 .probe_timing = TIMING_ZERO,
17858 .block_erasers =
17859 {
17860 {
17861 .eraseblocks = { {4 * 1024, 128} },
17862 .block_erase = spi_block_erase_20,
17863 }, {
17864 .eraseblocks = { {32 * 1024, 16} },
17865 .block_erase = spi_block_erase_52,
17866 }, {
17867 .eraseblocks = { {64 * 1024, 8} },
17868 .block_erase = spi_block_erase_d8,
17869 }, {
17870 .eraseblocks = { {512 * 1024, 1} },
17871 .block_erase = spi_block_erase_60,
17872 }, {
17873 .eraseblocks = { {512 * 1024, 1} },
17874 .block_erase = spi_block_erase_c7,
17875 }
17876 },
17877 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17878 .unlock = spi_disable_blockprotect,
17879 .write = spi_chip_write_256,
17880 .read = spi_chip_read,
17881 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
17882 },
17883
Stanislav Sedovf5775442018-03-07 14:16:51 -080017884 {
17885 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093017886 .name = "W25Q512JV",
17887 .bustype = BUS_SPI,
17888 .manufacture_id = WINBOND_NEX_ID,
17889 .model_id = WINBOND_NEX_W25Q512JV,
17890 .total_size = 64 * 1024,
17891 .page_size = 256,
17892 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17893 .tested = TEST_OK_PREW,
17894 .probe = probe_spi_rdid,
17895 .probe_timing = TIMING_ZERO,
17896 .block_erasers =
17897 {
17898 {
17899 .eraseblocks = { {4 * 1024, 16384} },
17900 .block_erase = spi_block_erase_21,
17901 }, {
17902 .eraseblocks = { {4 * 1024, 16384} },
17903 .block_erase = spi_block_erase_20,
17904 }, {
17905 .eraseblocks = { {32 * 1024, 2048} },
17906 .block_erase = spi_block_erase_52,
17907 }, {
17908 .eraseblocks = { {64 * 1024, 1024} },
17909 .block_erase = spi_block_erase_dc,
17910 }, {
17911 .eraseblocks = { {64 * 1024, 1024} },
17912 .block_erase = spi_block_erase_d8,
17913 }, {
17914 .eraseblocks = { {64 * 1024 * 1024, 1} },
17915 .block_erase = spi_block_erase_60,
17916 }, {
17917 .eraseblocks = { {64 * 1024 * 1024, 1} },
17918 .block_erase = spi_block_erase_c7,
17919 }
17920 },
17921 .printlock = spi_prettyprint_status_register_plain,
17922 .unlock = spi_disable_blockprotect,
17923 .write = spi_chip_write_256,
17924 .read = spi_chip_read,
17925 .voltage = {2700, 3600},
17926 },
17927
17928 {
Atul Dhudase2502dbd2021-09-21 10:02:20 +053017929 .vendor = "Winbond",
17930 .name = "W25Q512NW-IM",
17931 .bustype = BUS_SPI,
17932 .manufacture_id = WINBOND_NEX_ID,
17933 .model_id = WINBOND_NEX_W25Q512NW_IM,
17934 .total_size = 64 * 1024,
17935 .page_size = 256,
17936 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17937 .tested = TEST_OK_PREW,
17938 .probe = probe_spi_rdid,
17939 .probe_timing = TIMING_ZERO,
17940 .block_erasers =
17941 {
17942 {
17943 .eraseblocks = { {4 * 1024, 16384} },
17944 .block_erase = spi_block_erase_21,
17945 }, {
17946 .eraseblocks = { {4 * 1024, 16384} },
17947 .block_erase = spi_block_erase_20,
17948 }, {
17949 .eraseblocks = { {32 * 1024, 2048} },
17950 .block_erase = spi_block_erase_52,
17951 }, {
17952 .eraseblocks = { {64 * 1024, 1024} },
17953 .block_erase = spi_block_erase_dc,
17954 }, {
17955 .eraseblocks = { {64 * 1024, 1024} },
17956 .block_erase = spi_block_erase_d8,
17957 }, {
17958 .eraseblocks = { {64 * 1024 * 1024, 1} },
17959 .block_erase = spi_block_erase_60,
17960 }, {
17961 .eraseblocks = { {64 * 1024 * 1024, 1} },
17962 .block_erase = spi_block_erase_c7,
17963 }
17964 },
17965 .unlock = spi_disable_blockprotect,
17966 .write = spi_chip_write_256,
17967 .read = spi_chip_read,
17968 .voltage = {1650, 1950},
17969 },
17970
17971 {
Joel Stanley55439612019-07-27 19:25:35 +093017972 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017973 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080017974 .bustype = BUS_SPI,
17975 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017976 .model_id = WINBOND_NEX_W25Q64_V,
17977 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080017978 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017979 /* supports SFDP */
17980 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020017981 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_WRSR2,
Stanislav Sedovf5775442018-03-07 14:16:51 -080017982 .tested = TEST_OK_PREW,
17983 .probe = probe_spi_rdid,
17984 .probe_timing = TIMING_ZERO,
17985 .block_erasers =
17986 {
17987 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017988 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017989 .block_erase = spi_block_erase_20,
17990 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017991 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017992 .block_erase = spi_block_erase_52,
17993 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017994 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017995 .block_erase = spi_block_erase_d8,
17996 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017997 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080017998 .block_erase = spi_block_erase_60,
17999 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018000 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080018001 .block_erase = spi_block_erase_c7,
18002 }
18003 },
18004 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18005 .unlock = spi_disable_blockprotect,
18006 .write = spi_chip_write_256,
18007 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018008 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018009 .reg_bits =
18010 {
18011 .srp = {STATUS1, 7, RW},
18012 .srl = {STATUS2, 0, RW},
18013 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18014 .tb = {STATUS1, 5, RW},
18015 .sec = {STATUS1, 6, RW},
18016 .cmp = {STATUS2, 6, RW},
18017 },
18018 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018019 },
18020
18021 {
18022 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018023 .name = "W25Q64JV-.Q",
18024 .bustype = BUS_SPI,
18025 .manufacture_id = WINBOND_NEX_ID,
18026 .model_id = WINBOND_NEX_W25Q64_V,
18027 .total_size = 8192,
18028 .page_size = 256,
18029 /* supports SFDP */
18030 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber3f3c1f32022-05-28 16:48:26 +020018031 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
18032 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018033 .tested = TEST_OK_PREW,
18034 .probe = probe_spi_rdid,
18035 .probe_timing = TIMING_ZERO,
18036 .block_erasers =
18037 {
18038 {
18039 .eraseblocks = { {4 * 1024, 2048} },
18040 .block_erase = spi_block_erase_20,
18041 }, {
18042 .eraseblocks = { {32 * 1024, 256} },
18043 .block_erase = spi_block_erase_52,
18044 }, {
18045 .eraseblocks = { {64 * 1024, 128} },
18046 .block_erase = spi_block_erase_d8,
18047 }, {
18048 .eraseblocks = { {8 * 1024 * 1024, 1} },
18049 .block_erase = spi_block_erase_60,
18050 }, {
18051 .eraseblocks = { {8 * 1024 * 1024, 1} },
18052 .block_erase = spi_block_erase_c7,
18053 }
18054 },
18055 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18056 .unlock = spi_disable_blockprotect,
18057 .write = spi_chip_write_256,
18058 .read = spi_chip_read,
18059 .voltage = {2700, 3600},
18060 .reg_bits =
18061 {
18062 .srp = {STATUS1, 7, RW},
18063 .srl = {STATUS2, 0, RW},
18064 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18065 .tb = {STATUS1, 5, RW},
18066 .sec = {STATUS1, 6, RW},
18067 .cmp = {STATUS2, 6, RW},
18068 .wps = {STATUS3, 2, RW},
18069 },
18070 .decode_range = decode_range_spi25,
18071 },
18072
18073 {
18074 .vendor = "Winbond",
18075 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010018076 .bustype = BUS_SPI,
18077 .manufacture_id = WINBOND_NEX_ID,
18078 .model_id = WINBOND_NEX_W25Q64JV,
18079 .total_size = 8192,
18080 .page_size = 256,
18081 /* supports SFDP */
18082 /* QPI enable 0x38 */
18083 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
18084 .tested = TEST_OK_PREW,
18085 .probe = probe_spi_rdid,
18086 .probe_timing = TIMING_ZERO,
18087 .block_erasers =
18088 {
18089 {
18090 .eraseblocks = { {4 * 1024, 2048} },
18091 .block_erase = spi_block_erase_20,
18092 }, {
18093 .eraseblocks = { {32 * 1024, 256} },
18094 .block_erase = spi_block_erase_52,
18095 }, {
18096 .eraseblocks = { {64 * 1024, 128} },
18097 .block_erase = spi_block_erase_d8,
18098 }, {
18099 .eraseblocks = { {8 * 1024 * 1024, 1} },
18100 .block_erase = spi_block_erase_60,
18101 }, {
18102 .eraseblocks = { {8 * 1024 * 1024, 1} },
18103 .block_erase = spi_block_erase_c7,
18104 }
18105 },
18106 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
18107 .unlock = spi_disable_blockprotect_bp2_srwd,
18108 .write = spi_chip_write_256,
18109 .read = spi_chip_read,
18110 .voltage = {2700, 3600},
18111 },
18112
18113 {
18114 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018115 .name = "W25Q64.W",
18116 .bustype = BUS_SPI,
18117 .manufacture_id = WINBOND_NEX_ID,
18118 .model_id = WINBOND_NEX_W25Q64_W,
18119 .total_size = 8192,
18120 .page_size = 256,
18121 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18122 /* QPI enable 0x38, disable 0xFF */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018123 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
Stefan Tauner0554ca52013-07-25 22:54:25 +000018124 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018125 .probe = probe_spi_rdid,
18126 .probe_timing = TIMING_ZERO,
18127 .block_erasers =
18128 {
18129 {
18130 .eraseblocks = { {4 * 1024, 2048} },
18131 .block_erase = spi_block_erase_20,
18132 }, {
18133 .eraseblocks = { {32 * 1024, 256} },
18134 .block_erase = spi_block_erase_52,
18135 }, {
18136 .eraseblocks = { {64 * 1024, 128} },
18137 .block_erase = spi_block_erase_d8,
18138 }, {
18139 .eraseblocks = { {8 * 1024 * 1024, 1} },
18140 .block_erase = spi_block_erase_60,
18141 }, {
18142 .eraseblocks = { {8 * 1024 * 1024, 1} },
18143 .block_erase = spi_block_erase_c7,
18144 }
18145 },
18146 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18147 .unlock = spi_disable_blockprotect,
18148 .write = spi_chip_write_256,
18149 .read = spi_chip_read,
18150 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018151 .reg_bits =
18152 {
18153 .srp = {STATUS1, 7, RW},
18154 .srl = {STATUS2, 0, RW},
18155 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18156 .tb = {STATUS1, 5, RW},
18157 .sec = {STATUS1, 6, RW},
18158 .cmp = {STATUS2, 6, RW},
18159 },
18160 .decode_range = decode_range_spi25,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018161 },
18162
18163 {
18164 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100018165 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080018166 .bustype = BUS_SPI,
18167 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100018168 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080018169 .total_size = 8192,
18170 .page_size = 256,
18171 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18172 /* QPI enable 0x38, disable 0xFF */
18173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
18174 .tested = TEST_OK_PREW,
18175 .probe = probe_spi_rdid,
18176 .probe_timing = TIMING_ZERO,
18177 .block_erasers =
18178 {
18179 {
18180 .eraseblocks = { {4 * 1024, 2048} },
18181 .block_erase = spi_block_erase_20,
18182 }, {
18183 .eraseblocks = { {32 * 1024, 256} },
18184 .block_erase = spi_block_erase_52,
18185 }, {
18186 .eraseblocks = { {64 * 1024, 128} },
18187 .block_erase = spi_block_erase_d8,
18188 }, {
18189 .eraseblocks = { {8 * 1024 * 1024, 1} },
18190 .block_erase = spi_block_erase_60,
18191 }, {
18192 .eraseblocks = { {8 * 1024 * 1024, 1} },
18193 .block_erase = spi_block_erase_c7,
18194 }
18195 },
18196 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18197 .unlock = spi_disable_blockprotect,
18198 .write = spi_chip_write_256,
18199 .read = spi_chip_read,
18200 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18201 },
18202
18203 {
18204 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018205 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020018206 .bustype = BUS_SPI,
18207 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018208 .model_id = WINBOND_NEX_W25Q80_V,
18209 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020018210 .page_size = 256,
18211 /* supports SFDP */
18212 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green1f9cc7d2019-07-01 11:10:45 +100018213 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks48729d32017-12-08 14:44:07 -080018214 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020018215 .probe = probe_spi_rdid,
18216 .probe_timing = TIMING_ZERO,
18217 .block_erasers =
18218 {
18219 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018220 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018221 .block_erase = spi_block_erase_20,
18222 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018223 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018224 .block_erase = spi_block_erase_52,
18225 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018226 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018227 .block_erase = spi_block_erase_d8,
18228 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018229 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018230 .block_erase = spi_block_erase_60,
18231 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018232 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020018233 .block_erase = spi_block_erase_c7,
18234 }
18235 },
18236 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18237 .unlock = spi_disable_blockprotect,
18238 .write = spi_chip_write_256,
18239 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018240 .voltage = {2700, 3600},
18241 },
18242
18243 {
18244 .vendor = "Winbond",
18245 .name = "W25Q80BW",
18246 .bustype = BUS_SPI,
18247 .manufacture_id = WINBOND_NEX_ID,
18248 .model_id = WINBOND_NEX_W25Q80BW,
18249 .total_size = 1024,
18250 .page_size = 256,
18251 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
18253 .tested = TEST_OK_PREW,
18254 .probe = probe_spi_rdid,
18255 .probe_timing = TIMING_ZERO,
18256 .block_erasers =
18257 {
18258 {
18259 .eraseblocks = { {4 * 1024, 256} },
18260 .block_erase = spi_block_erase_20,
18261 }, {
18262 .eraseblocks = { {32 * 1024, 32} },
18263 .block_erase = spi_block_erase_52,
18264 }, {
18265 .eraseblocks = { {64 * 1024, 16} },
18266 .block_erase = spi_block_erase_d8,
18267 }, {
18268 .eraseblocks = { {1 * 1024 * 1024, 1} },
18269 .block_erase = spi_block_erase_60,
18270 }, {
18271 .eraseblocks = { {1 * 1024 * 1024, 1} },
18272 .block_erase = spi_block_erase_c7,
18273 }
18274 },
18275 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18276 .unlock = spi_disable_blockprotect,
18277 .write = spi_chip_write_256,
18278 .read = spi_chip_read,
18279 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
18280 },
18281
18282 {
18283 .vendor = "Winbond",
18284 .name = "W25Q80EW",
18285 .bustype = BUS_SPI,
18286 .manufacture_id = WINBOND_NEX_ID,
18287 .model_id = WINBOND_NEX_W25Q80EW,
18288 .total_size = 1024,
18289 .page_size = 256,
18290 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18291 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
18292 .tested = TEST_OK_PREW,
18293 .probe = probe_spi_rdid,
18294 .probe_timing = TIMING_ZERO,
18295 .block_erasers =
18296 {
18297 {
18298 .eraseblocks = { {4 * 1024, 256} },
18299 .block_erase = spi_block_erase_20,
18300 }, {
18301 .eraseblocks = { {32 * 1024, 32} },
18302 .block_erase = spi_block_erase_52,
18303 }, {
18304 .eraseblocks = { {64 * 1024, 16} },
18305 .block_erase = spi_block_erase_d8,
18306 }, {
18307 .eraseblocks = { {1 * 1024 * 1024, 1} },
18308 .block_erase = spi_block_erase_60,
18309 }, {
18310 .eraseblocks = { {1 * 1024 * 1024, 1} },
18311 .block_erase = spi_block_erase_c7,
18312 }
18313 },
18314 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18315 .unlock = spi_disable_blockprotect,
18316 .write = spi_chip_write_256,
18317 .read = spi_chip_read,
18318 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
Nico Huber70eed9f2017-04-24 22:19:27 +020018319 },
18320
18321 {
18322 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040018323 .name = "W25X05",
18324 .bustype = BUS_SPI,
18325 .manufacture_id = WINBOND_NEX_ID,
18326 .model_id = WINBOND_NEX_W25X05,
18327 .total_size = 64,
18328 .page_size = 256,
18329 .feature_bits = FEATURE_WRSR_WREN,
18330 .tested = TEST_OK_PREW,
18331 .probe = probe_spi_rdid,
18332 .probe_timing = TIMING_ZERO,
18333 .block_erasers =
18334 {
18335 {
18336 .eraseblocks = { {4 * 1024, 16} },
18337 .block_erase = spi_block_erase_20,
18338 }, {
18339 .eraseblocks = { {32 * 1024, 2} },
18340 .block_erase = spi_block_erase_52,
18341 }, {
18342 .eraseblocks = { {64 * 1024, 1} },
18343 .block_erase = spi_block_erase_d8,
18344 }
18345 },
18346 .printlock = spi_prettyprint_status_register_plain,
18347 .unlock = spi_disable_blockprotect,
18348 .write = spi_chip_write_256,
18349 .read = spi_chip_read,
18350 .voltage = {2300, 3600},
18351 },
18352
18353 {
18354 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018355 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018356 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018357 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018358 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018359 .total_size = 128,
18360 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018361 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +000018362 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018363 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000018364 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018365 .block_erasers =
18366 {
18367 {
18368 .eraseblocks = { {4 * 1024, 32} },
18369 .block_erase = spi_block_erase_20,
18370 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018371 .eraseblocks = { {64 * 1024, 2} },
18372 .block_erase = spi_block_erase_d8,
18373 }, {
18374 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018375 .block_erase = spi_block_erase_c7,
18376 }
18377 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018378 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018379 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000018380 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018381 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018382 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000018383 },
18384
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018385 {
18386 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018387 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018388 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000018389 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018390 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000018391 .total_size = 2048,
18392 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018393 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner8179be52011-06-04 13:13:34 +000018394 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000018395 .probe = probe_spi_rdid,
18396 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018397 .block_erasers =
18398 {
18399 {
18400 .eraseblocks = { {4 * 1024, 512} },
18401 .block_erase = spi_block_erase_20,
18402 }, {
18403 .eraseblocks = { {32 * 1024, 64} },
18404 .block_erase = spi_block_erase_52,
18405 }, {
18406 .eraseblocks = { {64 * 1024, 32} },
18407 .block_erase = spi_block_erase_d8,
18408 }, {
18409 .eraseblocks = { {2 * 1024 * 1024, 1} },
18410 .block_erase = spi_block_erase_60,
18411 }, {
18412 .eraseblocks = { {2 * 1024 * 1024, 1} },
18413 .block_erase = spi_block_erase_c7,
18414 }
18415 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018416 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018417 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000018418 .write = spi_chip_write_256,
18419 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018420 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000018421 },
18422
18423 {
18424 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018425 .name = "W25X20",
18426 .bustype = BUS_SPI,
18427 .manufacture_id = WINBOND_NEX_ID,
18428 .model_id = WINBOND_NEX_W25X20,
18429 .total_size = 256,
18430 .page_size = 256,
18431 .feature_bits = FEATURE_WRSR_WREN,
18432 .tested = TEST_OK_PREW,
18433 .probe = probe_spi_rdid,
18434 .probe_timing = TIMING_ZERO,
18435 .block_erasers =
18436 {
18437 {
18438 .eraseblocks = { {4 * 1024, 64} },
18439 .block_erase = spi_block_erase_20,
18440 }, {
18441 .eraseblocks = { {64 * 1024, 4} },
18442 .block_erase = spi_block_erase_d8,
18443 }, {
18444 .eraseblocks = { {256 * 1024, 1} },
18445 .block_erase = spi_block_erase_c7,
18446 }
18447 },
18448 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18449 .unlock = spi_disable_blockprotect,
18450 .write = spi_chip_write_256,
18451 .read = spi_chip_read,
18452 .voltage = {2700, 3600},
18453 },
18454
18455 {
18456 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018457 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018458 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000018459 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018460 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000018461 .total_size = 4096,
18462 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018463 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000018464 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000018465 .probe = probe_spi_rdid,
18466 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018467 .block_erasers =
18468 {
18469 {
18470 .eraseblocks = { {4 * 1024, 1024} },
18471 .block_erase = spi_block_erase_20,
18472 }, {
18473 .eraseblocks = { {32 * 1024, 128} },
18474 .block_erase = spi_block_erase_52,
18475 }, {
18476 .eraseblocks = { {64 * 1024, 64} },
18477 .block_erase = spi_block_erase_d8,
18478 }, {
18479 .eraseblocks = { {4 * 1024 * 1024, 1} },
18480 .block_erase = spi_block_erase_60,
18481 }, {
18482 .eraseblocks = { {4 * 1024 * 1024, 1} },
18483 .block_erase = spi_block_erase_c7,
18484 }
18485 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018486 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018487 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000018488 .write = spi_chip_write_256,
18489 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018490 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000018491 },
18492
18493 {
18494 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018495 .name = "W25X40",
18496 .bustype = BUS_SPI,
18497 .manufacture_id = WINBOND_NEX_ID,
18498 .model_id = WINBOND_NEX_W25X40,
18499 .total_size = 512,
18500 .page_size = 256,
18501 .feature_bits = FEATURE_WRSR_WREN,
18502 .tested = TEST_OK_PREW,
18503 .probe = probe_spi_rdid,
18504 .probe_timing = TIMING_ZERO,
18505 .block_erasers =
18506 {
18507 {
18508 .eraseblocks = { {4 * 1024, 128} },
18509 .block_erase = spi_block_erase_20,
18510 }, {
18511 .eraseblocks = { {64 * 1024, 8} },
18512 .block_erase = spi_block_erase_d8,
18513 }, {
18514 .eraseblocks = { {512 * 1024, 1} },
18515 .block_erase = spi_block_erase_c7,
18516 }
18517 },
18518 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18519 .unlock = spi_disable_blockprotect,
18520 .write = spi_chip_write_256,
18521 .read = spi_chip_read,
18522 .voltage = {2700, 3600},
18523 },
18524
18525 {
18526 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018527 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018528 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000018529 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018530 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000018531 .total_size = 8192,
18532 .page_size = 256,
David Hendricks2cbb7222010-09-03 03:06:07 +000018533 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000018534 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000018535 .probe = probe_spi_rdid,
18536 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018537 .block_erasers =
18538 {
18539 {
18540 .eraseblocks = { {4 * 1024, 2048} },
18541 .block_erase = spi_block_erase_20,
18542 }, {
18543 .eraseblocks = { {32 * 1024, 256} },
18544 .block_erase = spi_block_erase_52,
18545 }, {
18546 .eraseblocks = { {64 * 1024, 128} },
18547 .block_erase = spi_block_erase_d8,
18548 }, {
18549 .eraseblocks = { {8 * 1024 * 1024, 1} },
18550 .block_erase = spi_block_erase_60,
18551 }, {
18552 .eraseblocks = { {8 * 1024 * 1024, 1} },
18553 .block_erase = spi_block_erase_c7,
18554 }
18555 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018556 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000018557 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000018558 .write = spi_chip_write_256,
18559 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018560 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000018561 },
18562
18563 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100018564 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018565 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100018566 .bustype = BUS_SPI,
18567 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018568 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018569 .total_size = 1024,
18570 .page_size = 256,
18571 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018572 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018573 .probe = probe_spi_rdid,
18574 .probe_timing = TIMING_ZERO,
18575 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018576 {
18577 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018578 .eraseblocks = { {4 * 1024, 256} },
18579 .block_erase = spi_block_erase_20,
18580 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018581 .eraseblocks = { {64 * 1024, 16} },
18582 .block_erase = spi_block_erase_d8,
18583 }, {
18584 .eraseblocks = { {1024 * 1024, 1} },
18585 .block_erase = spi_block_erase_c7,
18586 }
18587 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100018588 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18589 .unlock = spi_disable_blockprotect,
18590 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018591 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100018592 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080018593 },
18594
Alan Greenf29ea362019-06-27 17:14:02 +100018595 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
18596 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000018597 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018598 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018599 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018600 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018601 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018602 .total_size = 128,
18603 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000018604 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000018605 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018606 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000018607 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018608 .block_erasers =
18609 {
18610 {
18611 .eraseblocks = { {128 * 1024, 1} },
18612 .block_erase = erase_chip_block_jedec,
18613 }
18614 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018615 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018616 .read = read_memmapped,
FENG yu ningff692fb2008-12-08 18:15:10 +000018617 },
18618
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018619 {
18620 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018621 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
18622 .bustype = BUS_PARALLEL,
18623 .manufacture_id = WINBOND_ID,
18624 .model_id = WINBOND_W29C010,
18625 .total_size = 128,
18626 .page_size = 128,
18627 .feature_bits = FEATURE_LONG_RESET,
18628 .tested = TEST_OK_PREW,
18629 .probe = probe_w29ee011,
18630 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
18631 .block_erasers =
18632 {
18633 {
18634 .eraseblocks = { {128 * 1024, 1} },
18635 .block_erase = erase_chip_block_jedec,
18636 }
18637 },
18638 .write = write_jedec,
18639 .read = read_memmapped,
18640 },
18641
18642 {
18643 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018644 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018645 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018646 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018647 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018648 .total_size = 256,
18649 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000018650 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018651 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018652 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000018653 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018654 .block_erasers =
18655 {
18656 {
18657 .eraseblocks = { {256 * 1024, 1} },
18658 .block_erase = erase_chip_block_jedec,
18659 }
18660 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018661 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018662 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018663 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000018664 },
18665
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018666 {
18667 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000018668 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018669 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018670 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000018671 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018672 .total_size = 512,
18673 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000018674 .feature_bits = FEATURE_LONG_RESET,
18675 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018676 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000018677 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000018678 .block_erasers =
18679 {
18680 {
18681 .eraseblocks = { {512 * 1024, 1} },
18682 .block_erase = erase_chip_block_jedec,
18683 }
18684 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018685 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000018686 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000018687 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000018688 },
18689
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000018690 {
18691 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018692 .name = "W29C512A/W29EE512",
18693 .bustype = BUS_PARALLEL,
18694 .manufacture_id = WINBOND_ID,
18695 .model_id = WINBOND_W29C512A,
18696 .total_size = 64,
18697 .page_size = 128,
18698 .feature_bits = FEATURE_LONG_RESET,
18699 .tested = TEST_OK_PREW,
18700 .probe = probe_jedec,
18701 .probe_timing = 10,
18702 .block_erasers =
18703 {
18704 {
18705 .eraseblocks = { {64 * 1024, 1} },
18706 .block_erase = erase_chip_block_jedec,
18707 }
18708 },
18709 .write = write_jedec,
18710 .read = read_memmapped,
18711 .voltage = {4500, 5500},
18712 },
18713
18714 {
18715 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018716 .name = "W29GL032CB",
18717 .bustype = BUS_PARALLEL,
18718 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18719 .model_id = WINBOND_W29GL032CB,
18720 .total_size = 4096,
18721 .page_size = 128 * 1024, /* actual page size is 16 */
18722 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18723 .tested = TEST_UNTESTED,
18724 .probe = probe_jedec_29gl,
18725 .probe_timing = TIMING_ZERO,
18726 .block_erasers =
18727 {
18728 {
18729 .eraseblocks = {
18730 {8 * 1024, 8},
18731 {64 * 1024, 63},
18732 },
18733 .block_erase = erase_sector_jedec,
18734 }, {
18735 .eraseblocks = { {4 * 1024 * 1024, 1} },
18736 .block_erase = erase_chip_block_jedec,
18737 },
18738 },
18739 .write = write_jedec_1,
18740 .read = read_memmapped,
18741 .voltage = {2700, 3600},
18742 },
18743
18744 {
18745 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018746 .name = "W29GL032CH/L",
18747 .bustype = BUS_PARALLEL,
18748 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18749 .model_id = WINBOND_W29GL032CHL,
18750 .total_size = 4096,
18751 .page_size = 128 * 1024, /* actual page size is 16 */
18752 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18753 .tested = TEST_UNTESTED,
18754 .probe = probe_jedec_29gl,
18755 .probe_timing = TIMING_ZERO,
18756 .block_erasers =
18757 {
18758 {
18759 .eraseblocks = { {64 * 1024, 64} },
18760 .block_erase = erase_sector_jedec,
18761 }, {
18762 .eraseblocks = { {4 * 1024 * 1024, 1} },
18763 .block_erase = erase_chip_block_jedec,
18764 },
18765 },
18766 .write = write_jedec_1,
18767 .read = read_memmapped,
18768 .voltage = {2700, 3600},
18769 },
18770
18771 {
18772 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018773 .name = "W29GL032CT",
18774 .bustype = BUS_PARALLEL,
18775 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18776 .model_id = WINBOND_W29GL032CT,
18777 .total_size = 4096,
18778 .page_size = 128 * 1024, /* actual page size is 16 */
18779 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18780 .tested = TEST_UNTESTED,
18781 .probe = probe_jedec_29gl,
18782 .probe_timing = TIMING_ZERO,
18783 .block_erasers =
18784 {
18785 {
18786 .eraseblocks = {
18787 {64 * 1024, 63},
18788 {8 * 1024, 8},
18789 },
18790 .block_erase = erase_sector_jedec,
18791 }, {
18792 .eraseblocks = { {4 * 1024 * 1024, 1} },
18793 .block_erase = erase_chip_block_jedec,
18794 },
18795 },
18796 .write = write_jedec_1,
18797 .read = read_memmapped,
18798 .voltage = {2700, 3600},
18799 },
18800
18801 {
18802 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018803 .name = "W29GL064CB",
18804 .bustype = BUS_PARALLEL,
18805 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18806 .model_id = WINBOND_W29GL064CB,
18807 .total_size = 8192,
18808 .page_size = 128 * 1024, /* actual page size is 16 */
18809 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18810 .tested = TEST_UNTESTED,
18811 .probe = probe_jedec_29gl,
18812 .probe_timing = TIMING_ZERO,
18813 .block_erasers =
18814 {
18815 {
18816 .eraseblocks = {
18817 {8 * 1024, 8},
18818 {64 * 1024, 127},
18819 },
18820 .block_erase = erase_sector_jedec,
18821 }, {
18822 .eraseblocks = { {8 * 1024 * 1024, 1} },
18823 .block_erase = erase_chip_block_jedec,
18824 },
18825 },
18826 .write = write_jedec_1,
18827 .read = read_memmapped,
18828 .voltage = {2700, 3600},
18829 },
18830
18831 {
18832 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018833 .name = "W29GL064CH/L",
18834 .bustype = BUS_PARALLEL,
18835 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18836 .model_id = WINBOND_W29GL064CHL,
18837 .total_size = 8192,
18838 .page_size = 128 * 1024, /* actual page size is 16 */
18839 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18840 .tested = TEST_UNTESTED,
18841 .probe = probe_jedec_29gl,
18842 .probe_timing = TIMING_ZERO,
18843 .block_erasers =
18844 {
18845 {
18846 .eraseblocks = { {64 * 1024, 128} },
18847 .block_erase = erase_sector_jedec,
18848 }, {
18849 .eraseblocks = { {8 * 1024 * 1024, 1} },
18850 .block_erase = erase_chip_block_jedec,
18851 },
18852 },
18853 .write = write_jedec_1,
18854 .read = read_memmapped,
18855 .voltage = {2700, 3600},
18856 },
18857
18858 {
18859 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018860 .name = "W29GL064CT",
18861 .bustype = BUS_PARALLEL,
18862 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18863 .model_id = WINBOND_W29GL064CT,
18864 .total_size = 8192,
18865 .page_size = 128 * 1024, /* actual page size is 16 */
18866 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18867 .tested = TEST_UNTESTED,
18868 .probe = probe_jedec_29gl,
18869 .probe_timing = TIMING_ZERO,
18870 .block_erasers =
18871 {
18872 {
18873 .eraseblocks = {
18874 {64 * 1024, 127},
18875 {8 * 1024, 8},
18876 },
18877 .block_erase = erase_sector_jedec,
18878 }, {
18879 .eraseblocks = { {8 * 1024 * 1024, 1} },
18880 .block_erase = erase_chip_block_jedec,
18881 },
18882 },
18883 .write = write_jedec_1,
18884 .read = read_memmapped,
18885 .voltage = {2700, 3600},
18886 },
18887
18888 {
18889 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000018890 .name = "W29GL128C",
18891 .bustype = BUS_PARALLEL,
18892 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18893 .model_id = WINBOND_W29GL128CHL,
18894 .total_size = 16384,
18895 .page_size = 128 * 1024, /* actual page size is 16 */
18896 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18897 .tested = TEST_UNTESTED,
18898 .probe = probe_jedec_29gl,
18899 .probe_timing = TIMING_ZERO,
18900 .block_erasers =
18901 {
18902 {
18903 .eraseblocks = { {128 * 1024, 128} },
18904 .block_erase = erase_sector_jedec,
18905 }, {
18906 .eraseblocks = { {16 * 1024 * 1024, 1} },
18907 .block_erase = erase_chip_block_jedec,
18908 },
18909 },
18910 .write = write_jedec_1,
18911 .read = read_memmapped,
18912 .voltage = {2700, 3600},
18913 },
18914
18915 {
18916 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000018917 .name = "W39F010",
18918 .bustype = BUS_PARALLEL,
18919 .manufacture_id = WINBOND_ID,
18920 .model_id = WINBOND_W39F010,
18921 .total_size = 128,
18922 .page_size = 4 * 1024,
18923 .feature_bits = FEATURE_EITHER_RESET,
18924 .tested = TEST_OK_PREW,
18925 .probe = probe_jedec,
18926 .probe_timing = 10,
18927 .block_erasers =
18928 {
18929 {
18930 .eraseblocks = { {4 * 1024, 32} },
18931 .block_erase = erase_block_jedec,
18932 }, {
18933 .eraseblocks = { {128 * 1024, 1} },
18934 .block_erase = erase_chip_block_jedec,
18935 }
18936 },
18937 .printlock = printlock_w39f010,
18938 .write = write_jedec_1,
18939 .read = read_memmapped,
18940 .voltage = {4500, 5500},
18941 },
18942
18943 {
18944 .vendor = "Winbond",
18945 .name = "W39L010",
18946 .bustype = BUS_PARALLEL,
18947 .manufacture_id = WINBOND_ID,
18948 .model_id = WINBOND_W39L010,
18949 .total_size = 128,
18950 .page_size = 4 * 1024,
18951 .feature_bits = FEATURE_EITHER_RESET,
18952 .tested = TEST_UNTESTED,
18953 .probe = probe_jedec,
18954 .probe_timing = 10,
18955 .block_erasers =
18956 {
18957 {
18958 .eraseblocks = { {4 * 1024, 32} },
18959 .block_erase = erase_block_jedec,
18960 }, {
18961 .eraseblocks = { {128 * 1024, 1} },
18962 .block_erase = erase_chip_block_jedec,
18963 }
18964 },
18965 .printlock = printlock_w39l010,
18966 .write = write_jedec_1,
18967 .read = read_memmapped,
18968 .voltage = {3000, 3600},
18969 },
18970
18971 {
18972 .vendor = "Winbond",
18973 .name = "W39L020",
18974 .bustype = BUS_PARALLEL,
18975 .manufacture_id = WINBOND_ID,
18976 .model_id = WINBOND_W39L020,
18977 .total_size = 256,
18978 .page_size = 4 * 1024,
18979 .feature_bits = FEATURE_EITHER_RESET,
18980 .tested = TEST_UNTESTED,
18981 .probe = probe_jedec,
18982 .probe_timing = 10,
18983 .block_erasers =
18984 {
18985 {
18986 .eraseblocks = { {4 * 1024, 64} },
18987 .block_erase = erase_block_jedec,
18988 }, {
18989 .eraseblocks = { {64 * 1024, 4} },
18990 .block_erase = erase_sector_jedec,
18991 }, {
18992 .eraseblocks = { {256 * 1024, 1} },
18993 .block_erase = erase_chip_block_jedec,
18994 }
18995 },
18996 .printlock = printlock_w39l020,
18997 .write = write_jedec_1,
18998 .read = read_memmapped,
18999 .voltage = {3000, 3600},
19000 },
19001
19002 {
19003 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000019004 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019005 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000019006 .manufacture_id = WINBOND_ID,
19007 .model_id = WINBOND_W39L040,
19008 .total_size = 512,
19009 .page_size = 64 * 1024,
19010 .feature_bits = FEATURE_EITHER_RESET,
19011 .tested = TEST_OK_PR,
19012 .probe = probe_jedec,
19013 .probe_timing = 10,
19014 .block_erasers =
19015 {
19016 {
19017 .eraseblocks = { {4 * 1024, 128} },
19018 .block_erase = erase_block_jedec,
19019 }, {
19020 .eraseblocks = { {64 * 1024, 8} },
19021 .block_erase = erase_sector_jedec,
19022 }, {
19023 .eraseblocks = { {512 * 1024, 1} },
19024 .block_erase = erase_chip_block_jedec,
19025 }
19026 },
19027 .printlock = printlock_w39l040,
19028 .write = write_jedec_1,
19029 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000019030 .voltage = {3000, 3600},
Michael Karcher19e0aac2011-03-06 17:58:05 +000019031 },
19032
19033 {
19034 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019035 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019036 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019037 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019038 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019039 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000019040 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000019041 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000019042 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019043 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000019044 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019045 .block_erasers =
19046 {
19047 {
19048 .eraseblocks = { {64 * 1024, 8} },
19049 .block_erase = erase_sector_jedec,
19050 }, {
19051 .eraseblocks = { {512 * 1024, 1} },
19052 .block_erase = erase_chip_block_jedec,
19053 }
19054 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019055 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000019056 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019057 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019058 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019059 },
19060
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019061 {
19062 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019063 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019064 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019065 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019066 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019067 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000019068 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000019069 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000019070 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019071 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000019072 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019073 .block_erasers =
19074 {
19075 {
19076 .eraseblocks = { {64 * 1024, 8} },
19077 .block_erase = erase_sector_jedec,
19078 }, {
19079 .eraseblocks = { {512 * 1024, 1} },
19080 .block_erase = erase_chip_block_jedec,
19081 }
19082 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019083 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000019084 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019085 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019086 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019087 },
19088
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019089 {
19090 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019091 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019092 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019093 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019094 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019095 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000019096 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000019097 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000019098 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000019099 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019100 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019101 .block_erasers =
19102 {
19103 {
19104 .eraseblocks = { {64 * 1024, 8} },
19105 .block_erase = erase_sector_jedec,
19106 }, {
19107 .eraseblocks = { {512 * 1024, 1} },
19108 .block_erase = erase_chip_block_jedec,
19109 }
19110 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000019111 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000019112 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019113 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019114 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019115 },
19116
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019117 {
19118 .vendor = "Winbond",
19119 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019120 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019121 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019122 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019123 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000019124 .page_size = 64 * 1024,
Michael Karcherc9b63412010-05-30 16:55:18 +000019125 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000019126 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019127 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000019128 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019129 .block_erasers =
19130 {
19131 {
19132 .eraseblocks = { {4 * 1024, 128} },
19133 .block_erase = erase_block_jedec,
19134 }, {
19135 .eraseblocks = { {64 * 1024, 8} },
19136 .block_erase = erase_sector_jedec,
19137 }, {
19138 .eraseblocks = { {512 * 1024, 1} },
19139 .block_erase = erase_chip_block_jedec,
19140 }
19141 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019142 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000019143 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000019144 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019145 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019146 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019147 },
19148
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019149 {
19150 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019151 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019152 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019153 .manufacture_id = WINBOND_ID,
19154 .model_id = WINBOND_W39V040B,
19155 .total_size = 512,
19156 .page_size = 64 * 1024,
19157 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000019158 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019159 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000019160 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019161 .block_erasers =
19162 {
19163 {
19164 .eraseblocks = { {64 * 1024, 8} },
19165 .block_erase = erase_sector_jedec,
19166 }, {
19167 .eraseblocks = { {512 * 1024, 1} },
19168 .block_erase = erase_chip_block_jedec,
19169 }
19170 },
19171 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000019172 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019173 .write = write_jedec_1,
19174 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000019175 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019176 },
19177
19178 {
19179 .vendor = "Winbond",
19180 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019181 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019182 .manufacture_id = WINBOND_ID,
19183 .model_id = WINBOND_W39V040C,
19184 .total_size = 512,
19185 .page_size = 64 * 1024,
19186 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000019187 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019188 .probe = probe_jedec,
19189 .probe_timing = 10,
19190 .block_erasers =
19191 {
19192 {
19193 .eraseblocks = { {64 * 1024, 8} },
19194 .block_erase = erase_sector_jedec,
19195 }, {
19196 .eraseblocks = { {512 * 1024, 1} },
19197 .block_erase = erase_chip_block_jedec,
19198 }
19199 },
19200 .printlock = printlock_w39v040fc,
19201 .write = write_jedec_1,
19202 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000019203 .voltage = {3000, 3600}, /* Also has 12V fast program */
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019204 },
19205
19206 {
19207 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019208 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019209 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019210 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019211 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019212 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000019213 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000019214 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000019215 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019216 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000019217 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019218 .block_erasers =
19219 {
19220 {
19221 .eraseblocks = { {64 * 1024, 16} },
19222 .block_erase = erase_sector_jedec,
19223 }, {
19224 .eraseblocks = { {1024 * 1024, 1} },
19225 .block_erase = erase_chip_block_jedec,
19226 }
19227 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000019228 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000019229 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019230 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019231 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019232 },
19233
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019234 {
19235 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019236 .name = "W39V080FA",
19237 .bustype = BUS_FWH,
19238 .manufacture_id = WINBOND_ID,
19239 .model_id = WINBOND_W39V080FA,
19240 .total_size = 1024,
19241 .page_size = 64 * 1024,
19242 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
19243 .tested = TEST_OK_PREW,
19244 .probe = probe_jedec,
19245 .probe_timing = 10,
19246 .block_erasers =
19247 {
19248 {
19249 .eraseblocks = { {64 * 1024, 16} },
19250 .block_erase = erase_sector_jedec,
19251 }, {
19252 .eraseblocks = { {1024 * 1024, 1} },
19253 .block_erase = erase_chip_block_jedec,
19254 }
19255 },
19256 .printlock = printlock_w39v080fa,
19257 .unlock = unlock_regspace2_uniform_64k,
19258 .write = write_jedec_1,
19259 .read = read_memmapped,
19260 .voltage = {3000, 3600}, /* Also has 12V fast program */
19261 },
19262
19263 {
19264 .vendor = "Winbond",
19265 .name = "W39V080FA (dual mode)",
19266 .bustype = BUS_FWH,
19267 .manufacture_id = WINBOND_ID,
19268 .model_id = WINBOND_W39V080FA_DM,
19269 .total_size = 512,
19270 .page_size = 64 * 1024,
19271 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
19272 .tested = TEST_UNTESTED,
19273 .probe = probe_jedec,
19274 .probe_timing = 10,
19275 .block_erasers =
19276 {
19277 {
19278 .eraseblocks = { {64 * 1024, 8} },
19279 .block_erase = erase_sector_jedec,
19280 }, {
19281 .eraseblocks = { {512 * 1024, 1} },
19282 .block_erase = erase_chip_block_jedec,
19283 }
19284 },
19285 .printlock = printlock_w39v080fa_dual,
19286 .write = write_jedec_1,
19287 .read = read_memmapped,
19288 .voltage = {3000, 3600}, /* Also has 12V fast program */
19289 },
19290
19291 {
19292 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000019293 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019294 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019295 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019296 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019297 .total_size = 256,
19298 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019299 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000019300 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019301 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000019302 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019303 .block_erasers =
19304 {
19305 {
19306 .eraseblocks = {
19307 {128 * 1024, 1},
19308 {96 * 1024, 1},
19309 {8 * 1024, 2},
19310 {16 * 1024, 1},
19311 },
19312 .block_erase = erase_sector_jedec,
19313 }, {
19314 .eraseblocks = { {256 * 1024, 1} },
19315 .block_erase = erase_chip_block_jedec,
19316 }
19317 },
Sean Nelson35727f72010-01-28 23:55:12 +000019318 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019319 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019320 .voltage = {4500, 5500},
FENG yu ningff692fb2008-12-08 18:15:10 +000019321 },
19322
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019323 {
19324 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019325 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019326 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019327 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019328 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019329 .total_size = 256,
19330 .page_size = 128,
19331 .feature_bits = FEATURE_EITHER_RESET,
19332 .tested = TEST_OK_PROBE,
19333 .probe = probe_jedec,
19334 .probe_timing = 10,
19335 .block_erasers =
19336 {
19337 {
19338 .eraseblocks = { {256 * 1024, 1} },
19339 .block_erase = erase_chip_block_jedec,
19340 }
19341 },
19342 .write = write_jedec_1,
19343 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019344 .voltage = {4500, 5500},
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000019345 },
19346
19347 {
19348 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019349 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019350 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019351 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019352 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019353 .total_size = 256,
19354 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019355 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019356 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019357 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019358 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019359 .block_erasers =
19360 {
19361 {
19362 .eraseblocks = {
19363 {64 * 1024, 3},
19364 {32 * 1024, 1},
19365 {8 * 1024, 2},
19366 {16 * 1024, 1},
19367 },
19368 .block_erase = erase_sector_jedec,
19369 }, {
19370 .eraseblocks = { {256 * 1024, 1} },
19371 .block_erase = erase_chip_block_jedec,
19372 }
19373 },
Sean Nelson35727f72010-01-28 23:55:12 +000019374 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019375 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019376 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019377 },
19378
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019379 {
19380 .vendor = "Winbond",
19381 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019382 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019383 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019384 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019385 .total_size = 256,
19386 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000019387 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000019388 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019389 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000019390 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019391 .block_erasers =
19392 {
19393 {
19394 .eraseblocks = {
19395 {64 * 1024, 3},
19396 {32 * 1024, 1},
19397 {8 * 1024, 2},
19398 {16 * 1024, 1},
19399 },
19400 .block_erase = erase_sector_jedec,
19401 }, {
19402 .eraseblocks = { {256 * 1024, 1} },
19403 .block_erase = erase_chip_block_jedec,
19404 }
19405 },
Sean Nelson35727f72010-01-28 23:55:12 +000019406 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019407 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019408 .voltage = {3000, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019409 },
19410
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019411 {
luke heef884232020-12-28 18:22:21 +080019412 .vendor = "XMC",
19413 .name = "XM25QH128C",
19414 .bustype = BUS_SPI,
19415 .manufacture_id = ST_ID,
19416 .model_id = XMC_XM25QH128C,
19417 .total_size = 16384,
19418 .page_size = 256,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019419 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080019420 .tested = TEST_UNTESTED,
19421 .probe = probe_spi_rdid,
19422 .probe_timing = TIMING_ZERO,
19423 .block_erasers =
19424 {
19425 {
19426 .eraseblocks = { {4 * 1024, 4096} },
19427 .block_erase = spi_block_erase_20,
19428 }, {
19429 .eraseblocks = { {32 * 1024, 512} },
19430 .block_erase = spi_block_erase_52,
19431 }, {
19432 .eraseblocks = { {64 * 1024, 256} },
19433 .block_erase = spi_block_erase_d8,
19434 }, {
19435 .eraseblocks = { {16 * 1024 * 1024, 1} },
19436 .block_erase = spi_block_erase_60,
19437 }, {
19438 .eraseblocks = { {16 * 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 = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019447 .reg_bits =
19448 {
19449 .srp = {STATUS1, 7, RW},
19450 .srl = {STATUS2, 0, RW},
19451 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19452 .tb = {STATUS1, 5, RW},
19453 .sec = {STATUS1, 6, RW},
19454 .cmp = {STATUS2, 6, RW},
19455 },
19456 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080019457 },
19458
19459 {
19460 .vendor = "XMC",
19461 .name = "XM25QH256C",
19462 .bustype = BUS_SPI,
19463 .manufacture_id = ST_ID,
19464 .model_id = XMC_XM25QH256C,
19465 .total_size = 32768,
19466 .page_size = 256,
19467 /* supports SFDP */
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019468 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN | FEATURE_WRSR2,
luke heef884232020-12-28 18:22:21 +080019469 .tested = TEST_UNTESTED,
19470 .probe = probe_spi_rdid,
19471 .probe_timing = TIMING_ZERO,
19472 .block_erasers =
19473 {
19474 {
19475 .eraseblocks = { {4 * 1024, 8192} },
19476 .block_erase = spi_block_erase_21,
19477 }, {
19478 .eraseblocks = { {4 * 1024, 8192} },
19479 .block_erase = spi_block_erase_20,
19480 }, {
19481 .eraseblocks = { {32 * 1024, 1024} },
19482 .block_erase = spi_block_erase_52,
19483 }, {
19484 .eraseblocks = { {64 * 1024, 512} },
19485 .block_erase = spi_block_erase_dc,
19486 }, {
19487 .eraseblocks = { {64 * 1024, 512} },
19488 .block_erase = spi_block_erase_d8,
19489 }, {
19490 .eraseblocks = { {32 * 1024 * 1024, 1} },
19491 .block_erase = spi_block_erase_60,
19492 }, {
19493 .eraseblocks = { {32 * 1024 * 1024, 1} },
19494 .block_erase = spi_block_erase_c7,
19495 }
19496 },
19497 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19498 .unlock = spi_disable_blockprotect,
19499 .write = spi_chip_write_256,
19500 .read = spi_chip_read,
19501 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019502 .reg_bits =
19503 {
19504 .srp = {STATUS1, 7, RW},
19505 .srl = {STATUS2, 0, RW},
19506 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19507 .tb = {STATUS1, 6, RW},
19508 },
19509 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080019510 },
19511
19512 {
19513 .vendor = "XMC",
19514 .name = "XM25QH64C",
19515 .bustype = BUS_SPI,
19516 .manufacture_id = ST_ID,
19517 .model_id = XMC_XM25QH64C,
19518 .total_size = 8192,
19519 .page_size = 256,
19520 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19521 .tested = TEST_UNTESTED,
19522 .probe = probe_spi_rdid,
19523 .probe_timing = TIMING_ZERO,
19524 .block_erasers =
19525 {
19526 {
19527 .eraseblocks = { {4 * 1024, 2048} },
19528 .block_erase = spi_block_erase_20,
19529 }, {
19530 .eraseblocks = { {32 * 1024, 256} },
19531 .block_erase = spi_block_erase_52,
19532 }, {
19533 .eraseblocks = { {64 * 1024, 128} },
19534 .block_erase = spi_block_erase_d8,
19535 }, {
19536 .eraseblocks = { {8 * 1024 * 1024, 1} },
19537 .block_erase = spi_block_erase_60,
19538 }, {
19539 .eraseblocks = { {8 * 1024 * 1024, 1} },
19540 .block_erase = spi_block_erase_c7,
19541 }
19542 },
19543 .printlock = spi_prettyprint_status_register_plain,
19544 .unlock = spi_disable_blockprotect,
19545 .write = spi_chip_write_256,
19546 .read = spi_chip_read,
19547 .voltage = {2700, 3600},
19548 },
19549
19550 {
19551 .vendor = "XMC",
19552 .name = "XM25QU128C",
19553 .bustype = BUS_SPI,
19554 .manufacture_id = ST_ID,
19555 .model_id = XMC_XM25QU128C,
19556 .total_size = 16384,
19557 .page_size = 256,
19558 /* supports SFDP */
19559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19560 .tested = TEST_UNTESTED,
19561 .probe = probe_spi_rdid,
19562 .probe_timing = TIMING_ZERO,
19563 .block_erasers =
19564 {
19565 {
19566 .eraseblocks = { {4 * 1024, 4096} },
19567 .block_erase = spi_block_erase_20,
19568 }, {
19569 .eraseblocks = { {32 * 1024, 512} },
19570 .block_erase = spi_block_erase_52,
19571 }, {
19572 .eraseblocks = { {64 * 1024, 256} },
19573 .block_erase = spi_block_erase_d8,
19574 }, {
19575 .eraseblocks = { {16 * 1024 * 1024, 1} },
19576 .block_erase = spi_block_erase_60,
19577 }, {
19578 .eraseblocks = { {16 * 1024 * 1024, 1} },
19579 .block_erase = spi_block_erase_c7,
19580 }
19581 },
19582 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19583 .unlock = spi_disable_blockprotect,
19584 .write = spi_chip_write_256,
19585 .read = spi_chip_read,
19586 .voltage = {1650, 1950},
19587 },
19588
19589 {
19590 .vendor = "XMC",
19591 .name = "XM25QU256C",
19592 .bustype = BUS_SPI,
19593 .manufacture_id = ST_ID,
19594 .model_id = XMC_XM25QU256C,
19595 .total_size = 32768,
19596 .page_size = 256,
19597 /* supports SFDP */
19598 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
19599 .tested = TEST_UNTESTED,
19600 .probe = probe_spi_rdid,
19601 .probe_timing = TIMING_ZERO,
19602 .block_erasers =
19603 {
19604 {
19605 .eraseblocks = { {4 * 1024, 8192} },
19606 .block_erase = spi_block_erase_21,
19607 }, {
19608 .eraseblocks = { {4 * 1024, 8192} },
19609 .block_erase = spi_block_erase_20,
19610 }, {
19611 .eraseblocks = { {32 * 1024, 1024} },
19612 .block_erase = spi_block_erase_52,
19613 }, {
19614 .eraseblocks = { {64 * 1024, 512} },
19615 .block_erase = spi_block_erase_dc,
19616 }, {
19617 .eraseblocks = { {64 * 1024, 512} },
19618 .block_erase = spi_block_erase_d8,
19619 }, {
19620 .eraseblocks = { {32 * 1024 * 1024, 1} },
19621 .block_erase = spi_block_erase_60,
19622 }, {
19623 .eraseblocks = { {32 * 1024 * 1024, 1} },
19624 .block_erase = spi_block_erase_c7,
19625 }
19626 },
19627 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19628 .unlock = spi_disable_blockprotect,
19629 .write = spi_chip_write_256,
19630 .read = spi_chip_read,
19631 .voltage = {1650, 1950},
19632 },
19633
19634 {
19635 .vendor = "XMC",
19636 .name = "XM25QU64C",
19637 .bustype = BUS_SPI,
19638 .manufacture_id = ST_ID,
19639 .model_id = XMC_XM25QU64C,
19640 .total_size = 8192,
19641 .page_size = 256,
19642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19643 .tested = TEST_UNTESTED,
19644 .probe = probe_spi_rdid,
19645 .probe_timing = TIMING_ZERO,
19646 .block_erasers =
19647 {
19648 {
19649 .eraseblocks = { {4 * 1024, 2048} },
19650 .block_erase = spi_block_erase_20,
19651 }, {
19652 .eraseblocks = { {32 * 1024, 256} },
19653 .block_erase = spi_block_erase_52,
19654 }, {
19655 .eraseblocks = { {64 * 1024, 128} },
19656 .block_erase = spi_block_erase_d8,
19657 }, {
19658 .eraseblocks = { {8 * 1024 * 1024, 1} },
19659 .block_erase = spi_block_erase_60,
19660 }, {
19661 .eraseblocks = { {8 * 1024 * 1024, 1} },
19662 .block_erase = spi_block_erase_c7,
19663 }
19664 },
19665 .printlock = spi_prettyprint_status_register_plain,
19666 .unlock = spi_disable_blockprotect,
19667 .write = spi_chip_write_256,
19668 .read = spi_chip_read,
19669 .voltage = {1650, 1950},
19670 },
19671
19672 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100019673 .vendor = "Zetta Device",
19674 .name = "ZD25D20",
19675 .bustype = BUS_SPI,
19676 .manufacture_id = ZETTADEVICE_ID,
19677 .model_id = ZETTADEVICE_ZD25D20,
19678 .total_size = 256,
19679 .page_size = 256,
19680 .feature_bits = FEATURE_WRSR_WREN,
19681 .tested = TEST_UNTESTED,
19682 .probe = probe_spi_rdid,
19683 .probe_timing = TIMING_ZERO,
19684 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080019685 {
19686 {
19687 .eraseblocks = { {4 * 1024, 64} },
19688 .block_erase = spi_block_erase_20,
19689 }, {
19690 .eraseblocks = { {32 * 1024, 8} },
19691 .block_erase = spi_block_erase_52,
19692 }, {
19693 .eraseblocks = { {64 * 1024, 4} },
19694 .block_erase = spi_block_erase_d8,
19695 }, {
19696 .eraseblocks = { {256 * 1024, 1} },
19697 .block_erase = spi_block_erase_60,
19698 }, {
19699 .eraseblocks = { {256 * 1024, 1} },
19700 .block_erase = spi_block_erase_c7,
19701 }
19702 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100019703 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19704 .unlock = spi_disable_blockprotect,
19705 .write = spi_chip_write_256,
19706 .read = spi_chip_read,
19707 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080019708 },
19709
19710 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100019711 .vendor = "Zetta Device",
19712 .name = "ZD25D40",
19713 .bustype = BUS_SPI,
19714 .manufacture_id = ZETTADEVICE_ID,
19715 .model_id = ZETTADEVICE_ZD25D40,
19716 .total_size = 512,
19717 .page_size = 256,
19718 .feature_bits = FEATURE_WRSR_WREN,
19719 .tested = TEST_UNTESTED,
19720 .probe = probe_spi_rdid,
19721 .probe_timing = TIMING_ZERO,
19722 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080019723 {
19724 {
19725 .eraseblocks = { {4 * 1024, 128} },
19726 .block_erase = spi_block_erase_20,
19727 }, {
19728 .eraseblocks = { {32 * 1024, 16} },
19729 .block_erase = spi_block_erase_52,
19730 }, {
19731 .eraseblocks = { {64 * 1024, 8} },
19732 .block_erase = spi_block_erase_d8,
19733 }, {
19734 .eraseblocks = { {512 * 1024, 1} },
19735 .block_erase = spi_block_erase_60,
19736 }, {
19737 .eraseblocks = { {512 * 1024, 1} },
19738 .block_erase = spi_block_erase_c7,
19739 }
19740 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100019741 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19742 .unlock = spi_disable_blockprotect,
19743 .write = spi_chip_write_256,
19744 .read = spi_chip_read,
19745 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080019746 },
19747
Stefan Taunerac1b4c82012-02-17 14:51:04 +000019748 {
Alan Greendd592202019-08-23 10:11:37 +100019749 .vendor = "Unknown",
19750 .name = "SFDP-capable chip",
19751 .bustype = BUS_SPI,
19752 .manufacture_id = GENERIC_MANUF_ID,
19753 .model_id = SFDP_DEVICE_ID,
19754 .total_size = 0, /* set by probing function */
19755 .page_size = 0, /* set by probing function */
19756 .feature_bits = 0, /* set by probing function */
19757 /* We present our own "report this" text hence we do not */
19758 /* want the default "This flash part has status UNTESTED..." */
19759 /* text to be printed. */
19760 .tested = TEST_OK_PREW,
19761 .probe = probe_spi_sfdp,
19762 .block_erasers = {}, /* set by probing function */
19763 .unlock = spi_disable_blockprotect, /* is this safe? */
19764 .write = NULL, /* set by probing function */
19765 .read = spi_chip_read,
19766 /* FIXME: some vendor extensions define this */
19767 .voltage = {0},
19768 },
19769
19770 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000019771 .vendor = "Programmer",
19772 .name = "Opaque flash chip",
19773 .bustype = BUS_PROG,
19774 .manufacture_id = PROGMANUF_ID,
19775 .model_id = PROGDEV_ID,
19776 .total_size = 0,
19777 .page_size = 256,
19778 /* probe is assumed to work, rest will be filled in by probe */
19779 .tested = TEST_OK_PROBE,
19780 .probe = probe_opaque,
19781 /* eraseblock sizes will be set by the probing function */
19782 .block_erasers =
19783 {
19784 {
19785 .block_erase = erase_opaque,
19786 }
19787 },
19788 .write = write_opaque,
19789 .read = read_opaque,
19790 },
19791
19792 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000019793 .vendor = "AMIC",
19794 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019795 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000019796 .manufacture_id = AMIC_ID,
19797 .model_id = GENERIC_DEVICE_ID,
19798 .total_size = 0,
19799 .page_size = 256,
19800 .tested = TEST_BAD_PREW,
19801 .probe = probe_spi_rdid4,
19802 .probe_timing = TIMING_ZERO,
19803 .write = NULL,
19804 .read = NULL,
19805 },
19806
19807 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019808 .vendor = "Atmel",
19809 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019810 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019811 .manufacture_id = ATMEL_ID,
19812 .model_id = GENERIC_DEVICE_ID,
19813 .total_size = 0,
19814 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019815 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019816 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019817 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019818 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019819 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019820 },
19821
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019822 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000019823 .vendor = "Eon",
19824 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019825 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019826 .manufacture_id = EON_ID_NOPREFIX,
19827 .model_id = GENERIC_DEVICE_ID,
19828 .total_size = 0,
19829 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019830 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019831 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019832 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019833 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019834 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019835 },
19836
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019837 {
19838 .vendor = "Macronix",
19839 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019840 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000019841 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019842 .model_id = GENERIC_DEVICE_ID,
19843 .total_size = 0,
19844 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019845 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019846 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019847 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019848 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019849 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019850 },
19851
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019852 {
19853 .vendor = "PMC",
19854 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019855 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019856 .manufacture_id = PMC_ID,
19857 .model_id = GENERIC_DEVICE_ID,
19858 .total_size = 0,
19859 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019860 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019861 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019862 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019863 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019864 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019865 },
19866
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019867 {
19868 .vendor = "SST",
19869 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019870 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019871 .manufacture_id = SST_ID,
19872 .model_id = GENERIC_DEVICE_ID,
19873 .total_size = 0,
19874 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019875 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019876 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019877 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019878 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019879 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019880 },
19881
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019882 {
19883 .vendor = "ST",
19884 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019885 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019886 .manufacture_id = ST_ID,
19887 .model_id = GENERIC_DEVICE_ID,
19888 .total_size = 0,
19889 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000019890 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019891 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019892 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019893 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000019894 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000019895 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000019896
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019897 {
Sean Nelson118e1d62009-11-24 02:08:11 +000019898 .vendor = "Sanyo",
19899 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019900 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000019901 .manufacture_id = SANYO_ID,
19902 .model_id = GENERIC_DEVICE_ID,
19903 .total_size = 0,
19904 .page_size = 256,
19905 .tested = TEST_BAD_PREW,
19906 .probe = probe_spi_rdid,
19907 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000019908 .write = NULL,
19909 .read = NULL,
19910 },
19911
19912 {
Stefan Taunereb582572012-09-21 12:52:50 +000019913 .vendor = "Winbond",
19914 .name = "unknown Winbond (ex Nexcom) SPI chip",
19915 .bustype = BUS_SPI,
19916 .manufacture_id = WINBOND_NEX_ID,
19917 .model_id = GENERIC_DEVICE_ID,
19918 .total_size = 0,
19919 .page_size = 256,
19920 .tested = TEST_BAD_PREW,
19921 .probe = probe_spi_rdid,
19922 .probe_timing = TIMING_ZERO,
19923 .write = NULL,
19924 .read = NULL,
19925 },
19926
19927 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019928 .vendor = "Generic",
19929 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019930 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019931 .manufacture_id = GENERIC_MANUF_ID,
19932 .model_id = GENERIC_DEVICE_ID,
19933 .total_size = 0,
19934 .page_size = 256,
19935 .tested = TEST_BAD_PREW,
19936 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019937 .write = NULL,
19938 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000019939
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019940 {
19941 .vendor = "Generic",
19942 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019943 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019944 .manufacture_id = GENERIC_MANUF_ID,
19945 .model_id = GENERIC_DEVICE_ID,
19946 .total_size = 0,
19947 .page_size = 256,
19948 .tested = TEST_BAD_PREW,
19949 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000019950 .write = NULL,
19951 },
19952
Stefan Tauner96658be2014-05-26 22:05:31 +000019953 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000019954};
Stefan Tauner96658be2014-05-26 22:05:31 +000019955
19956const unsigned int flashchips_size = ARRAY_SIZE(flashchips);