blob: 451fb560352ce4c59b35e9daeef01b7da9d3298f [file] [log] [blame]
ollie6a600992005-11-26 21:55:36 +00001/*
uweb25f1ea2007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
ollie6a600992005-11-26 21:55:36 +00003 *
uwe555dd972007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
stepan0ac57fd2008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
hailfingerf60abdb2009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
snelson63133f92010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
uweb25f1ea2007-08-29 17:52:32 +00009 *
stepan7cd945e2007-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.
ollie6a600992005-11-26 21:55:36 +000014 *
stepan7cd945e2007-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.
ollie6a600992005-11-26 21:55:36 +000019 *
ollie6a600992005-11-26 21:55:36 +000020 */
21
David Hendricks8c084212015-11-17 22:29:36 -080022#include <stdlib.h>
23#include <string.h>
24
ollie6a600992005-11-26 21:55:36 +000025#include "flash.h"
hailfinger66966da2009-06-15 14:14:48 +000026#include "flashchips.h"
snelson8913d082010-02-26 05:48:29 +000027#include "chipdrivers.h"
David Hendricks23cd7782010-08-25 12:42:38 -070028#include "writeprotect.h"
ollie6a600992005-11-26 21:55:36 +000029
uwec93fbdb2008-03-16 02:06:25 +000030/**
uwe3cfe8a52009-05-21 15:55:46 +000031 * List of supported flash chips.
uwec93fbdb2008-03-16 02:06:25 +000032 *
33 * Please keep the list sorted by vendor name and chip name, so that
34 * the output of 'flashrom -L' is alphabetically sorted.
35 */
hailfinger48ed3e22011-05-04 00:39:50 +000036const struct flashchip flashchips[] = {
uwec93fbdb2008-03-16 02:06:25 +000037
hailfinger3000b1f2009-07-23 12:42:01 +000038 /*
39 * .vendor = Vendor name
40 * .name = Chip name
41 * .bustype = Supported flash bus types (Parallel, LPC...)
42 * .manufacture_id = Manufacturer chip ID
43 * .model_id = Model chip ID
44 * .total_size = Total size in (binary) kbytes
45 * .page_size = Page or eraseblock(?) size in bytes
46 * .tested = Test status
47 * .probe = Probe function
48 * .probe_timing = Probe function delay
hailfinger91cf1032009-10-01 13:15:01 +000049 * .block_erasers[] = Array of erase layouts and erase functions
50 * {
51 * .eraseblocks[] = Array of { blocksize, blockcount }
52 * .block_erase = Block erase function
53 * }
snelson1ee293c2010-02-19 00:52:10 +000054 * .printlock = Chip lock status function
55 * .unlock = Chip unlock function
hailfinger3000b1f2009-07-23 12:42:01 +000056 * .write = Chip write function
57 * .read = Chip read function
stefanct7e00e222011-06-03 07:26:31 +000058 * .voltage = Voltage range in millivolt
stepanaa1b6a22008-12-08 18:15:10 +000059 */
60
hailfinger286829b2009-01-08 03:40:17 +000061 {
62 .vendor = "AMD",
63 .name = "Am29F002(N)BB",
hailfingere1e41ea2011-07-27 07:13:06 +000064 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000065 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000066 .model_id = AMD_AM29F002BB,
hailfinger286829b2009-01-08 03:40:17 +000067 .total_size = 256,
68 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000069 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
hailfinger286829b2009-01-08 03:40:17 +000070 .tested = TEST_UNTESTED,
71 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000072 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +000073 .block_erasers =
74 {
75 {
76 .eraseblocks = {
77 {16 * 1024, 1},
78 {8 * 1024, 2},
79 {32 * 1024, 1},
80 {64 * 1024, 3},
81 },
82 .block_erase = erase_sector_jedec,
83 }, {
84 .eraseblocks = { {256 * 1024, 1} },
85 .block_erase = erase_chip_block_jedec,
86 },
87 },
hailfingerfff99532009-11-27 17:49:42 +000088 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000089 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000090 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000091 },
92
hailfinger286829b2009-01-08 03:40:17 +000093 {
94 .vendor = "AMD",
95 .name = "Am29F002(N)BT",
hailfingere1e41ea2011-07-27 07:13:06 +000096 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000097 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000098 .model_id = AMD_AM29F002BT,
hailfinger286829b2009-01-08 03:40:17 +000099 .total_size = 256,
100 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +0000101 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
102 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +0000103 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000104 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000105 .block_erasers =
106 {
107 {
108 .eraseblocks = {
109 {64 * 1024, 3},
110 {32 * 1024, 1},
111 {8 * 1024, 2},
112 {16 * 1024, 1},
113 },
114 .block_erase = erase_sector_jedec,
115 }, {
116 .eraseblocks = { {256 * 1024, 1} },
117 .block_erase = erase_chip_block_jedec,
118 },
119 },
hailfingerfff99532009-11-27 17:49:42 +0000120 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000121 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000122 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +0000123 },
124
hailfinger286829b2009-01-08 03:40:17 +0000125 {
126 .vendor = "AMD",
Alan Greend76dc1f2019-06-26 15:38:19 +1000127 .name = "Am29F010A/B",
128 .bustype = BUS_PARALLEL,
129 .manufacture_id = AMD_ID,
130 .model_id = AMD_AM29F010, /* Same as Am29F010A */
131 .total_size = 128,
132 .page_size = 16 * 1024,
133 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
134 .tested = TEST_OK_PRE,
135 .probe = probe_jedec,
136 .probe_timing = TIMING_ZERO,
137 .block_erasers =
138 {
139 {
140 .eraseblocks = { {16 * 1024, 8} },
141 .block_erase = erase_sector_jedec,
142 }, {
143 .eraseblocks = { {128 * 1024, 1} },
144 .block_erase = erase_chip_block_jedec,
145 },
146 },
147 .write = write_jedec_1,
148 .read = read_memmapped,
149 .voltage = {4500, 5500},
150 },
151
152 {
153 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000154 .name = "Am29F016D",
hailfingere1e41ea2011-07-27 07:13:06 +0000155 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000156 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000157 .model_id = AMD_AM29F016D,
hailfingerc43afc92009-12-22 22:15:33 +0000158 .total_size = 2 * 1024,
hailfinger286829b2009-01-08 03:40:17 +0000159 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000160 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +0000161 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000162 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000163 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000164 .block_erasers =
165 {
166 {
167 .eraseblocks = { {64 * 1024, 32} },
snelsonc6855342010-01-28 23:55:12 +0000168 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000169 }, {
170 .eraseblocks = { {2048 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000171 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000172 },
173 },
snelsonc6855342010-01-28 23:55:12 +0000174 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000175 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000176 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000177 },
178
hailfinger286829b2009-01-08 03:40:17 +0000179 {
180 .vendor = "AMD",
181 .name = "Am29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000182 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000183 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100184 .model_id = AMD_AM29F040,
hailfinger286829b2009-01-08 03:40:17 +0000185 .total_size = 512,
186 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000187 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
188 .tested = TEST_UNTESTED,
189 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000190 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000191 .block_erasers =
192 {
193 {
194 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000195 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000196 }, {
197 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000198 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000199 },
200 },
snelsonc6855342010-01-28 23:55:12 +0000201 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000202 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000203 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000204 },
205
hailfinger286829b2009-01-08 03:40:17 +0000206 {
207 .vendor = "AMD",
stuged9f66152009-01-25 23:55:12 +0000208 .name = "Am29F080B",
hailfingere1e41ea2011-07-27 07:13:06 +0000209 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000210 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100211 .model_id = AMD_AM29F080,
stuged9f66152009-01-25 23:55:12 +0000212 .total_size = 1024,
213 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000214 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stuged9f66152009-01-25 23:55:12 +0000215 .tested = TEST_UNTESTED,
216 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000217 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000218 .block_erasers =
219 {
220 {
221 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000222 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000223 }, {
224 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000225 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000226 },
227 },
snelsonc6855342010-01-28 23:55:12 +0000228 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000229 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000230 .voltage = {4500, 5500},
stuged9f66152009-01-25 23:55:12 +0000231 },
232
233 {
234 .vendor = "AMD",
hailfinger5a8bd5a2011-02-05 12:11:17 +0000235 .name = "Am29LV001BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000236 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000237 .manufacture_id = AMD_ID,
238 .model_id = AMD_AM29LV001BB,
239 .total_size = 128,
240 .page_size = 64 * 1024, /* unused */
241 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
242 .tested = TEST_OK_PREW,
243 .probe = probe_jedec,
244 .probe_timing = TIMING_ZERO,
245 .block_erasers =
246 {
247 {
248 .eraseblocks = {
249 {8 * 1024, 1},
250 {4 * 1024, 2},
251 {16 * 1024, 7},
252 },
253 .block_erase = erase_sector_jedec,
254 }, {
255 .eraseblocks = { {128 * 1024, 1} },
256 .block_erase = erase_chip_block_jedec,
257 },
258 },
259 .write = write_jedec_1,
260 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000261 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000262 },
263
264 {
265 .vendor = "AMD",
266 .name = "Am29LV001BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000267 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000268 .manufacture_id = AMD_ID,
269 .model_id = AMD_AM29LV001BT,
270 .total_size = 128,
271 .page_size = 64 * 1024, /* unused */
272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
273 .tested = TEST_UNTESTED,
274 .probe = probe_jedec,
275 .probe_timing = TIMING_ZERO,
276 .block_erasers =
277 {
278 {
279 .eraseblocks = {
280 {16 * 1024, 7},
281 {4 * 1024, 2},
282 {8 * 1024, 1},
283 },
284 .block_erase = erase_sector_jedec,
285 }, {
286 .eraseblocks = { {128 * 1024, 1} },
287 .block_erase = erase_chip_block_jedec,
288 },
289 },
290 .write = write_jedec_1,
291 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000292 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000293 },
294
295 {
296 .vendor = "AMD",
297 .name = "Am29LV002BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000298 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000299 .manufacture_id = AMD_ID,
300 .model_id = AMD_AM29LV002BB,
301 .total_size = 256,
302 .page_size = 64 * 1024, /* unused */
303 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
304 .tested = TEST_UNTESTED,
305 .probe = probe_jedec,
306 .probe_timing = TIMING_ZERO,
307 .block_erasers =
308 {
309 {
310 .eraseblocks = {
311 {16 * 1024, 1},
312 {8 * 1024, 2},
313 {32 * 1024, 1},
314 {64 * 1024, 3},
315 },
316 .block_erase = erase_sector_jedec,
317 }, {
318 .eraseblocks = { {256 * 1024, 1} },
319 .block_erase = erase_chip_block_jedec,
320 },
321 },
322 .write = write_jedec_1,
323 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000324 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000325 },
326
327 {
328 .vendor = "AMD",
329 .name = "Am29LV002BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000330 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000331 .manufacture_id = AMD_ID,
332 .model_id = AMD_AM29LV002BT,
333 .total_size = 256,
334 .page_size = 64 * 1024, /* unused */
335 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
336 .tested = TEST_UNTESTED,
337 .probe = probe_jedec,
338 .probe_timing = TIMING_ZERO,
339 .block_erasers =
340 {
341 {
342 .eraseblocks = {
343 {64 * 1024, 3},
344 {32 * 1024, 1},
345 {8 * 1024, 2},
346 {16 * 1024, 1},
347 },
348 .block_erase = erase_sector_jedec,
349 }, {
350 .eraseblocks = { {256 * 1024, 1} },
351 .block_erase = erase_chip_block_jedec,
352 },
353 },
354 .write = write_jedec_1,
355 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000356 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000357 },
358
359 {
360 .vendor = "AMD",
361 .name = "Am29LV004BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000362 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000363 .manufacture_id = AMD_ID,
364 .model_id = AMD_AM29LV004BB,
365 .total_size = 512,
366 .page_size = 64 * 1024, /* unused */
367 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
368 .tested = TEST_UNTESTED,
369 .probe = probe_jedec,
370 .probe_timing = TIMING_ZERO,
371 .block_erasers =
372 {
373 {
374 .eraseblocks = {
375 {16 * 1024, 1},
376 {8 * 1024, 2},
377 {32 * 1024, 1},
378 {64 * 1024, 7},
379 },
380 .block_erase = erase_sector_jedec,
381 }, {
382 .eraseblocks = { {512 * 1024, 1} },
383 .block_erase = erase_chip_block_jedec,
384 },
385 },
386 .write = write_jedec_1,
387 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000388 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000389 },
390
391 {
392 .vendor = "AMD",
393 .name = "Am29LV004BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000394 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000395 .manufacture_id = AMD_ID,
396 .model_id = AMD_AM29LV004BT,
397 .total_size = 512,
398 .page_size = 64 * 1024, /* unused */
399 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
400 .tested = TEST_UNTESTED,
401 .probe = probe_jedec,
402 .probe_timing = TIMING_ZERO,
403 .block_erasers =
404 {
405 {
406 .eraseblocks = {
407 {64 * 1024, 7},
408 {32 * 1024, 1},
409 {8 * 1024, 2},
410 {16 * 1024, 1},
411 },
412 .block_erase = erase_sector_jedec,
413 }, {
414 .eraseblocks = { {512 * 1024, 1} },
415 .block_erase = erase_chip_block_jedec,
416 },
417 },
418 .write = write_jedec_1,
419 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000420 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000421 },
422
423 {
424 .vendor = "AMD",
425 .name = "Am29LV008BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000426 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000427 .manufacture_id = AMD_ID,
428 .model_id = AMD_AM29LV008BB,
429 .total_size = 1024,
430 .page_size = 64 * 1024, /* unused */
431 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
uwe67f685c2011-08-25 22:54:23 +0000432 .tested = TEST_OK_PREW,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000433 .probe = probe_jedec,
434 .probe_timing = TIMING_ZERO,
435 .block_erasers =
436 {
437 {
438 .eraseblocks = {
439 {16 * 1024, 1},
440 {8 * 1024, 2},
441 {32 * 1024, 1},
442 {64 * 1024, 15},
443 },
444 .block_erase = erase_sector_jedec,
445 }, {
446 .eraseblocks = { {1024 * 1024, 1} },
447 .block_erase = erase_chip_block_jedec,
448 },
449 },
450 .write = write_jedec_1,
451 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000452 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000453 },
454
455 {
456 .vendor = "AMD",
457 .name = "Am29LV008BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000458 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000459 .manufacture_id = AMD_ID,
460 .model_id = AMD_AM29LV008BT,
461 .total_size = 1024,
462 .page_size = 64 * 1024, /* unused */
463 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
464 .tested = TEST_UNTESTED,
465 .probe = probe_jedec,
466 .probe_timing = TIMING_ZERO,
467 .block_erasers =
468 {
469 {
470 .eraseblocks = {
471 {64 * 1024, 15},
472 {32 * 1024, 1},
473 {8 * 1024, 2},
474 {16 * 1024, 1},
475 },
476 .block_erase = erase_sector_jedec,
477 }, {
478 .eraseblocks = { {1024 * 1024, 1} },
479 .block_erase = erase_chip_block_jedec,
480 },
481 },
482 .write = write_jedec_1,
483 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000484 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000485 },
486
487 {
488 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000489 .name = "Am29LV040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000490 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000491 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000492 .model_id = AMD_AM29LV040B,
hailfinger286829b2009-01-08 03:40:17 +0000493 .total_size = 512,
494 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000495 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfingerd217d122010-10-08 18:52:29 +0000496 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +0000497 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000498 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000499 .block_erasers =
500 {
501 {
502 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000503 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000504 }, {
505 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000506 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000507 },
508 },
snelsonc6855342010-01-28 23:55:12 +0000509 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000510 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000511 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
stepanaa1b6a22008-12-08 18:15:10 +0000512 },
513
hailfinger286829b2009-01-08 03:40:17 +0000514 {
stuged9f66152009-01-25 23:55:12 +0000515 .vendor = "AMD",
516 .name = "Am29LV081B",
hailfingere1e41ea2011-07-27 07:13:06 +0000517 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000518 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000519 .model_id = AMD_AM29LV080B,
stuged9f66152009-01-25 23:55:12 +0000520 .total_size = 1024,
521 .page_size = 64 * 1024,
hailfinger8ddaff32010-12-04 03:26:40 +0000522 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
stuged9f66152009-01-25 23:55:12 +0000523 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000524 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000525 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000526 .block_erasers =
527 {
528 {
529 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000530 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000531 }, {
532 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000533 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000534 },
535 },
snelsonc6855342010-01-28 23:55:12 +0000536 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000537 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000538 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
stuged9f66152009-01-25 23:55:12 +0000539 },
540
541 {
hailfinger61958912010-07-28 22:20:20 +0000542 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000543 .name = "A25L010",
544 .bustype = BUS_SPI,
545 .manufacture_id = AMIC_ID_NOPREFIX,
546 .model_id = AMIC_A25L010,
547 .total_size = 128,
548 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000549 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000550 .tested = TEST_UNTESTED,
551 .probe = probe_spi_rdid,
552 .probe_timing = TIMING_ZERO,
553 .block_erasers =
554 {
555 {
556 .eraseblocks = { { 4 * 1024, 32 } },
557 .block_erase = spi_block_erase_20,
558 }, {
559 .eraseblocks = { { 64 * 1024, 2 } },
560 .block_erase = spi_block_erase_d8,
561 }, {
562 .eraseblocks = { { 128 * 1024, 1 } },
563 .block_erase = spi_block_erase_c7,
564 }
565 },
Alan Green0c65ed02019-07-26 08:07:01 +1000566 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000567 .unlock = spi_disable_blockprotect,
568 .write = spi_chip_write_256,
569 .read = spi_chip_read,
570 .voltage = {2700, 3600},
571 },
572
573 {
574 .vendor = "AMIC",
575 .name = "A25L016",
576 .bustype = BUS_SPI,
577 .manufacture_id = AMIC_ID_NOPREFIX,
578 .model_id = AMIC_A25L016,
579 .total_size = 2048,
580 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000581 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000582 .tested = TEST_UNTESTED,
583 .probe = probe_spi_rdid,
584 .probe_timing = TIMING_ZERO,
585 .block_erasers =
586 {
587 {
588 .eraseblocks = { { 4 * 1024, 512 } },
589 .block_erase = spi_block_erase_20,
590 }, {
591 .eraseblocks = { { 64 * 1024, 32 } },
592 .block_erase = spi_block_erase_d8,
593 }, {
594 .eraseblocks = { { 2048 * 1024, 1 } },
595 .block_erase = spi_block_erase_c7,
596 }
597 },
Alan Green0c65ed02019-07-26 08:07:01 +1000598 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000599 .unlock = spi_disable_blockprotect,
600 .write = spi_chip_write_256,
601 .read = spi_chip_read,
602 .voltage = {2700, 3600},
603 },
604
605 {
606 .vendor = "AMIC",
607 .name = "A25L020",
608 .bustype = BUS_SPI,
609 .manufacture_id = AMIC_ID_NOPREFIX,
610 .model_id = AMIC_A25L020,
611 .total_size = 256,
612 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000613 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000614 .tested = TEST_UNTESTED,
615 .probe = probe_spi_rdid,
616 .probe_timing = TIMING_ZERO,
617 .block_erasers =
618 {
619 {
620 .eraseblocks = { { 4 * 1024, 64 } },
621 .block_erase = spi_block_erase_20,
622 }, {
623 .eraseblocks = { { 64 * 1024, 4 } },
624 .block_erase = spi_block_erase_d8,
625 }, {
626 .eraseblocks = { { 256 * 1024, 1 } },
627 .block_erase = spi_block_erase_c7,
628 }
629 },
Alan Green0c65ed02019-07-26 08:07:01 +1000630 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000631 .unlock = spi_disable_blockprotect,
632 .write = spi_chip_write_256,
633 .read = spi_chip_read,
634 .voltage = {2700, 3600},
635 },
636
637 {
638 .vendor = "AMIC",
639 .name = "A25L032",
640 .bustype = BUS_SPI,
641 .manufacture_id = AMIC_ID_NOPREFIX,
642 .model_id = AMIC_A25L032,
643 .total_size = 4096,
644 .page_size = 256,
645 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +1000646 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greena3e041d2019-07-26 08:24:53 +1000647 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +1000648 .probe = probe_spi_rdid,
649 .probe_timing = TIMING_ZERO,
650 .block_erasers =
651 {
652 {
653 .eraseblocks = { { 4 * 1024, 1024 } },
654 .block_erase = spi_block_erase_20,
655 }, {
656 .eraseblocks = { { 64 * 1024, 64 } },
657 .block_erase = spi_block_erase_52,
658 }, {
659 .eraseblocks = { { 64 * 1024, 64 } },
660 .block_erase = spi_block_erase_d8,
661 }, {
662 .eraseblocks = { { 4096 * 1024, 1 } },
663 .block_erase = spi_block_erase_60,
664 }, {
665 .eraseblocks = { { 4096 * 1024, 1 } },
666 .block_erase = spi_block_erase_c7,
667 }
668 },
Alan Greena3e041d2019-07-26 08:24:53 +1000669 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
670 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +1000671 .write = spi_chip_write_256,
672 .read = spi_chip_read,
673 .voltage = {2700, 3600},
674 },
675
676 {
677 .vendor = "AMIC",
678 .name = "A25L040",
679 .bustype = BUS_SPI,
680 .manufacture_id = AMIC_ID_NOPREFIX,
681 .model_id = AMIC_A25L040,
682 .total_size = 512,
683 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000684 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000685 .tested = TEST_UNTESTED,
686 .probe = probe_spi_rdid,
687 .probe_timing = TIMING_ZERO,
688 .block_erasers =
689 {
690 {
691 .eraseblocks = { { 4 * 1024, 128 } },
692 .block_erase = spi_block_erase_20,
693 }, {
694 .eraseblocks = { { 64 * 1024, 8 } },
695 .block_erase = spi_block_erase_d8,
696 }, {
697 .eraseblocks = { { 512 * 1024, 1 } },
698 .block_erase = spi_block_erase_c7,
699 }
700 },
Alan Green0c65ed02019-07-26 08:07:01 +1000701 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000702 .unlock = spi_disable_blockprotect,
703 .write = spi_chip_write_256,
704 .read = spi_chip_read,
705 .voltage = {2700, 3600},
706 .wp = &wp_w25,
707 },
708
709 {
710 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000711 .name = "A25L05PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000712 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000713 .manufacture_id = AMIC_ID,
714 .model_id = AMIC_A25L05PT,
715 .total_size = 64,
716 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000717 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000718 .tested = TEST_UNTESTED,
719 .probe = probe_spi_rdid4,
720 .probe_timing = TIMING_ZERO,
721 .block_erasers =
722 {
723 {
724 .eraseblocks = {
725 {32 * 1024, 1},
726 {16 * 1024, 1},
727 {8 * 1024, 1},
728 {4 * 1024, 2},
729 },
730 .block_erase = spi_block_erase_d8,
731 }, {
732 .eraseblocks = { {64 * 1024, 1} },
733 .block_erase = spi_block_erase_c7,
734 }
735 },
Alan Green1ca1c862019-07-26 08:35:15 +1000736 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000737 .unlock = spi_disable_blockprotect,
738 .write = spi_chip_write_256,
739 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000740 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000741 },
742
743 {
744 .vendor = "AMIC",
745 .name = "A25L05PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000746 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000747 .manufacture_id = AMIC_ID,
748 .model_id = AMIC_A25L05PU,
749 .total_size = 64,
750 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000751 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000752 .tested = TEST_UNTESTED,
753 .probe = probe_spi_rdid4,
754 .probe_timing = TIMING_ZERO,
755 .block_erasers =
756 {
757 {
758 .eraseblocks = {
759 {4 * 1024, 2},
760 {8 * 1024, 1},
761 {16 * 1024, 1},
762 {32 * 1024, 1},
763 },
764 .block_erase = spi_block_erase_d8,
765 }, {
766 .eraseblocks = { {64 * 1024, 1} },
767 .block_erase = spi_block_erase_c7,
768 }
769 },
Alan Green1ca1c862019-07-26 08:35:15 +1000770 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000771 .unlock = spi_disable_blockprotect,
772 .write = spi_chip_write_256,
773 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +0000774 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000775 },
776
777 {
778 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000779 .name = "A25L080",
780 .bustype = BUS_SPI,
781 .manufacture_id = AMIC_ID_NOPREFIX,
782 .model_id = AMIC_A25L080,
783 .total_size = 1024,
784 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000785 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000786 .tested = TEST_UNTESTED,
787 .probe = probe_spi_rdid,
788 .probe_timing = TIMING_ZERO,
789 .block_erasers =
790 {
791 {
792 .eraseblocks = { { 4 * 1024, 256 } },
793 .block_erase = spi_block_erase_20,
794 }, {
795 .eraseblocks = { { 64 * 1024, 16 } },
796 .block_erase = spi_block_erase_d8,
797 }, {
798 .eraseblocks = { { 1024 * 1024, 1 } },
799 .block_erase = spi_block_erase_c7,
800 }
801 },
Alan Green0c65ed02019-07-26 08:07:01 +1000802 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000803 .unlock = spi_disable_blockprotect,
804 .write = spi_chip_write_256,
805 .read = spi_chip_read,
806 .voltage = {2700, 3600},
807 },
808
809 {
810 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000811 .name = "A25L10PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000812 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000813 .manufacture_id = AMIC_ID,
814 .model_id = AMIC_A25L10PT,
815 .total_size = 128,
816 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000817 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000818 .tested = TEST_UNTESTED,
819 .probe = probe_spi_rdid4,
820 .probe_timing = TIMING_ZERO,
821 .block_erasers =
822 {
823 {
824 .eraseblocks = {
825 {64 * 1024, 1},
826 {32 * 1024, 1},
827 {16 * 1024, 1},
828 {8 * 1024, 1},
829 {4 * 1024, 2},
830 },
831 .block_erase = spi_block_erase_d8,
832 }, {
833 .eraseblocks = { {128 * 1024, 1} },
834 .block_erase = spi_block_erase_c7,
835 }
836 },
Alan Green1ca1c862019-07-26 08:35:15 +1000837 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000838 .unlock = spi_disable_blockprotect,
839 .write = spi_chip_write_256,
840 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000841 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000842 },
843
844 {
845 .vendor = "AMIC",
846 .name = "A25L10PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000847 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000848 .manufacture_id = AMIC_ID,
849 .model_id = AMIC_A25L10PU,
850 .total_size = 128,
851 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000852 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000853 .tested = TEST_UNTESTED,
854 .probe = probe_spi_rdid4,
855 .probe_timing = TIMING_ZERO,
856 .block_erasers =
857 {
858 {
859 .eraseblocks = {
860 {4 * 1024, 2},
861 {8 * 1024, 1},
862 {16 * 1024, 1},
863 {32 * 1024, 1},
864 {64 * 1024, 1},
865 },
866 .block_erase = spi_block_erase_d8,
867 }, {
868 .eraseblocks = { {128 * 1024, 1} },
869 .block_erase = spi_block_erase_c7,
870 }
871 },
Alan Green1ca1c862019-07-26 08:35:15 +1000872 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000873 .unlock = spi_disable_blockprotect,
874 .write = spi_chip_write_256,
875 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000876 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000877 },
878
879 {
880 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000881 .name = "A25L16PT",
882 .bustype = BUS_SPI,
883 .manufacture_id = AMIC_ID,
884 .model_id = AMIC_A25L16PT,
885 .total_size = 2048,
886 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000887 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000888 .tested = TEST_UNTESTED,
889 .probe = probe_spi_rdid4,
890 .probe_timing = TIMING_ZERO,
891 .block_erasers =
892 {
893 {
894 .eraseblocks = {
895 {64 * 1024, 31},
896 {32 * 1024, 1},
897 {16 * 1024, 1},
898 {8 * 1024, 1},
899 {4 * 1024, 2},
900 },
901 .block_erase = spi_block_erase_d8,
902 }, {
903 .eraseblocks = { {2048 * 1024, 1} },
904 .block_erase = spi_block_erase_60,
905 }, {
906 .eraseblocks = { {2048 * 1024, 1} },
907 .block_erase = spi_block_erase_c7,
908 }
909 },
Alan Green0c65ed02019-07-26 08:07:01 +1000910 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000911 .unlock = spi_disable_blockprotect,
912 .write = spi_chip_write_256,
913 .read = spi_chip_read,
914 .voltage = {2700, 3600},
915 },
916
917 {
918 .vendor = "AMIC",
919 .name = "A25L16PU",
920 .bustype = BUS_SPI,
921 .manufacture_id = AMIC_ID,
922 .model_id = AMIC_A25L16PU,
923 .total_size = 2048,
924 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000925 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +1000926 .tested = TEST_OK_PR,
Alan Greend76dc1f2019-06-26 15:38:19 +1000927 .probe = probe_spi_rdid4,
928 .probe_timing = TIMING_ZERO,
929 .block_erasers =
930 {
931 {
932 .eraseblocks = {
933 {4 * 1024, 2},
934 {8 * 1024, 1},
935 {16 * 1024, 1},
936 {32 * 1024, 1},
937 {64 * 1024, 31},
938 },
939 .block_erase = spi_block_erase_d8,
940 }, {
941 .eraseblocks = { {2048 * 1024, 1} },
942 .block_erase = spi_block_erase_60,
943 }, {
944 .eraseblocks = { {2048 * 1024, 1} },
945 .block_erase = spi_block_erase_c7,
946 }
947 },
Alan Green0c65ed02019-07-26 08:07:01 +1000948 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000949 .unlock = spi_disable_blockprotect,
950 .write = spi_chip_write_256,
951 .read = spi_chip_read,
952 .voltage = {2700, 3600},
953 },
954
955 {
956 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000957 .name = "A25L20PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000958 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000959 .manufacture_id = AMIC_ID,
960 .model_id = AMIC_A25L20PT,
961 .total_size = 256,
962 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000963 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000964 .tested = TEST_UNTESTED,
965 .probe = probe_spi_rdid4,
966 .probe_timing = TIMING_ZERO,
967 .block_erasers =
968 {
969 {
970 .eraseblocks = {
971 {64 * 1024, 3},
972 {32 * 1024, 1},
973 {16 * 1024, 1},
974 {8 * 1024, 1},
975 {4 * 1024, 2},
976 },
977 .block_erase = spi_block_erase_d8,
978 }, {
979 .eraseblocks = { {256 * 1024, 1} },
980 .block_erase = spi_block_erase_c7,
981 }
982 },
Alan Green1ca1c862019-07-26 08:35:15 +1000983 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000984 .unlock = spi_disable_blockprotect,
985 .write = spi_chip_write_256,
986 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000987 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000988 },
989
990 {
991 .vendor = "AMIC",
992 .name = "A25L20PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000993 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000994 .manufacture_id = AMIC_ID,
995 .model_id = AMIC_A25L20PU,
996 .total_size = 256,
997 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000998 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000999 .tested = TEST_UNTESTED,
1000 .probe = probe_spi_rdid4,
1001 .probe_timing = TIMING_ZERO,
1002 .block_erasers =
1003 {
1004 {
1005 .eraseblocks = {
1006 {4 * 1024, 2},
1007 {8 * 1024, 1},
1008 {16 * 1024, 1},
1009 {32 * 1024, 1},
1010 {64 * 1024, 3},
1011 },
1012 .block_erase = spi_block_erase_d8,
1013 }, {
1014 .eraseblocks = { {256 * 1024, 1} },
1015 .block_erase = spi_block_erase_c7,
1016 }
1017 },
Alan Green1ca1c862019-07-26 08:35:15 +10001018 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +00001019 .unlock = spi_disable_blockprotect,
1020 .write = spi_chip_write_256,
1021 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001022 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001023 },
1024
1025 /* The A25L40P{T,U} chips are distinguished by their
1026 * erase block layouts, but without any distinction in RDID.
1027 * This inexplicable quirk was verified by Rudolf Marek
1028 * and discussed on the flashrom mailing list on 2010-07-12.
1029 */
1030 {
1031 .vendor = "AMIC",
1032 .name = "A25L40PT",
hailfingere1e41ea2011-07-27 07:13:06 +00001033 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001034 .manufacture_id = AMIC_ID,
1035 .model_id = AMIC_A25L40PT,
1036 .total_size = 512,
1037 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001038 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001039 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001040 .probe = probe_spi_rdid4,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = {
1046 {64 * 1024, 7},
1047 {32 * 1024, 1},
1048 {16 * 1024, 1},
1049 {8 * 1024, 1},
1050 {4 * 1024, 2},
1051 },
1052 .block_erase = spi_block_erase_d8,
1053 }, {
1054 .eraseblocks = { {512 * 1024, 1} },
1055 .block_erase = spi_block_erase_c7,
1056 }
1057 },
Alan Green0c65ed02019-07-26 08:07:01 +10001058 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001059 .unlock = spi_disable_blockprotect,
1060 .write = spi_chip_write_256,
1061 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001062 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001063 },
1064
1065 {
1066 .vendor = "AMIC",
1067 .name = "A25L40PU",
hailfingere1e41ea2011-07-27 07:13:06 +00001068 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001069 .manufacture_id = AMIC_ID,
1070 .model_id = AMIC_A25L40PU,
1071 .total_size = 512,
1072 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001073 .feature_bits = FEATURE_WRSR_WREN,
Alan Greene3e4fb82019-09-09 16:28:33 +10001074 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001075 .probe = probe_spi_rdid4,
1076 .probe_timing = TIMING_ZERO,
1077 .block_erasers =
1078 {
1079 {
1080 .eraseblocks = {
1081 {4 * 1024, 2},
1082 {8 * 1024, 1},
1083 {16 * 1024, 1},
1084 {32 * 1024, 1},
1085 {64 * 1024, 7},
1086 },
1087 .block_erase = spi_block_erase_d8,
1088 }, {
1089 .eraseblocks = { {512 * 1024, 1} },
1090 .block_erase = spi_block_erase_c7,
1091 }
1092 },
Alan Green0c65ed02019-07-26 08:07:01 +10001093 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001094 .unlock = spi_disable_blockprotect,
1095 .write = spi_chip_write_256,
1096 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001097 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001098 },
1099
1100 {
1101 .vendor = "AMIC",
hailfinger6eb433a2010-07-29 15:00:40 +00001102 .name = "A25L512",
hailfingere1e41ea2011-07-27 07:13:06 +00001103 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001104 .manufacture_id = AMIC_ID_NOPREFIX,
1105 .model_id = AMIC_A25L512,
1106 .total_size = 64,
1107 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001108 .feature_bits = FEATURE_WRSR_WREN,
hailfinger6eb433a2010-07-29 15:00:40 +00001109 .tested = TEST_UNTESTED,
1110 .probe = probe_spi_rdid,
1111 .probe_timing = TIMING_ZERO,
1112 .block_erasers =
1113 {
1114 {
1115 .eraseblocks = { { 4 * 1024, 16 } },
1116 .block_erase = spi_block_erase_20,
1117 }, {
1118 .eraseblocks = { { 64 * 1024, 1 } },
1119 .block_erase = spi_block_erase_d8,
1120 }, {
1121 .eraseblocks = { { 64 * 1024, 1 } },
1122 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001123 }
hailfinger6eb433a2010-07-29 15:00:40 +00001124 },
Alan Green0c65ed02019-07-26 08:07:01 +10001125 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001126 .unlock = spi_disable_blockprotect,
1127 .write = spi_chip_write_256,
1128 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001129 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001130 },
1131
1132 {
1133 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +10001134 .name = "A25L80P",
hailfingere1e41ea2011-07-27 07:13:06 +00001135 .bustype = BUS_SPI,
Alan Greend76dc1f2019-06-26 15:38:19 +10001136 .manufacture_id = AMIC_ID,
1137 .model_id = AMIC_A25L80P,
hailfinger6eb433a2010-07-29 15:00:40 +00001138 .total_size = 1024,
1139 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001140 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001141 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +10001142 .probe = probe_spi_rdid4,
hailfinger6eb433a2010-07-29 15:00:40 +00001143 .probe_timing = TIMING_ZERO,
1144 .block_erasers =
1145 {
1146 {
Alan Greend76dc1f2019-06-26 15:38:19 +10001147 .eraseblocks = {
1148 {4 * 1024, 2},
1149 {8 * 1024, 1},
1150 {16 * 1024, 1},
1151 {32 * 1024, 1},
1152 {64 * 1024, 15},
1153 },
hailfinger6eb433a2010-07-29 15:00:40 +00001154 .block_erase = spi_block_erase_d8,
1155 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10001156 .eraseblocks = { {1024 * 1024, 1} },
hailfinger6eb433a2010-07-29 15:00:40 +00001157 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001158 }
hailfinger6eb433a2010-07-29 15:00:40 +00001159 },
Alan Green0c65ed02019-07-26 08:07:01 +10001160 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001161 .unlock = spi_disable_blockprotect,
1162 .write = spi_chip_write_256,
1163 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001164 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001165 },
1166
1167 {
1168 .vendor = "AMIC",
Alan Greenbacd3232019-07-26 09:32:45 +10001169 .name = "A25LQ032/A25LQ32A",
hailfingere1e41ea2011-07-27 07:13:06 +00001170 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001171 .manufacture_id = AMIC_ID_NOPREFIX,
1172 .model_id = AMIC_A25LQ032,
1173 .total_size = 4096,
1174 .page_size = 256,
Alan Greenbacd3232019-07-26 09:32:45 +10001175 /* A25LQ32A supports SFDP */
Stefan Tauner9816fc82016-08-12 15:47:49 -07001176 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001177 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001178 .tested = TEST_UNTESTED,
1179 .probe = probe_spi_rdid,
1180 .probe_timing = TIMING_ZERO,
1181 .block_erasers =
1182 {
1183 {
1184 .eraseblocks = { { 4 * 1024, 1024 } },
1185 .block_erase = spi_block_erase_20,
1186 }, {
1187 .eraseblocks = { { 64 * 1024, 64 } },
1188 .block_erase = spi_block_erase_52,
1189 }, {
1190 .eraseblocks = { { 64 * 1024, 64 } },
1191 .block_erase = spi_block_erase_d8,
1192 }, {
1193 .eraseblocks = { { 4096 * 1024, 1 } },
1194 .block_erase = spi_block_erase_60,
1195 }, {
1196 .eraseblocks = { { 4096 * 1024, 1 } },
1197 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001198 }
hailfinger6eb433a2010-07-29 15:00:40 +00001199 },
Alan Greene2e73402019-09-02 15:47:59 +10001200 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1201 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
hailfinger6eb433a2010-07-29 15:00:40 +00001202 .write = spi_chip_write_256,
1203 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001204 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001205 },
1206
1207 {
1208 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001209 .name = "A29002B",
hailfingere1e41ea2011-07-27 07:13:06 +00001210 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001211 .manufacture_id = AMIC_ID_NOPREFIX,
1212 .model_id = AMIC_A29002B,
1213 .total_size = 256,
1214 .page_size = 64 * 1024,
1215 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1216 .tested = TEST_UNTESTED,
1217 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001218 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001219 .block_erasers =
1220 {
1221 {
Simon Glass8dc82732013-07-16 10:13:51 -06001222 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001223 {16 * 1024, 1},
1224 {8 * 1024, 2},
1225 {32 * 1024, 1},
1226 {64 * 1024, 3},
1227 },
1228 .block_erase = erase_sector_jedec,
1229 }, {
1230 .eraseblocks = { {256 * 1024, 1} },
1231 .block_erase = erase_chip_block_jedec,
1232 },
1233 },
1234 .write = write_jedec_1,
1235 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001236 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001237 },
1238
1239 {
1240 .vendor = "AMIC",
1241 .name = "A29002T",
hailfingere1e41ea2011-07-27 07:13:06 +00001242 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001243 .manufacture_id = AMIC_ID_NOPREFIX,
1244 .model_id = AMIC_A29002T,
1245 .total_size = 256,
1246 .page_size = 64 * 1024,
1247 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00001248 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001249 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001250 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001251 .block_erasers =
1252 {
1253 {
Simon Glass8dc82732013-07-16 10:13:51 -06001254 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001255 {64 * 1024, 3},
1256 {32 * 1024, 1},
1257 {8 * 1024, 2},
1258 {16 * 1024, 1},
1259 },
1260 .block_erase = erase_sector_jedec,
1261 }, {
1262 .eraseblocks = { {256 * 1024, 1} },
1263 .block_erase = erase_chip_block_jedec,
1264 },
1265 },
1266 .write = write_jedec_1,
1267 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001268 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001269 },
1270
1271 {
1272 .vendor = "AMIC",
1273 .name = "A29040B",
hailfingere1e41ea2011-07-27 07:13:06 +00001274 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001275 .manufacture_id = AMIC_ID_NOPREFIX,
1276 .model_id = AMIC_A29040B,
1277 .total_size = 512,
1278 .page_size = 64 * 1024,
1279 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Alan Greena9956bd2019-07-26 09:10:41 +10001280 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001281 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001282 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001283 .block_erasers =
1284 {
1285 {
1286 .eraseblocks = { {64 * 1024, 8} },
1287 .block_erase = erase_sector_jedec,
1288 }, {
1289 .eraseblocks = { {512 * 1024, 1} },
1290 .block_erase = erase_chip_block_jedec,
1291 },
1292 },
1293 .write = write_jedec_1,
1294 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001295 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001296 },
1297
1298 {
1299 .vendor = "AMIC",
1300 .name = "A49LF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00001301 .bustype = BUS_LPC,
hailfinger61958912010-07-28 22:20:20 +00001302 .manufacture_id = AMIC_ID_NOPREFIX,
1303 .model_id = AMIC_A49LF040A,
1304 .total_size = 512,
1305 .page_size = 64 * 1024,
1306 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +10001307 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001308 .probe = probe_jedec,
1309 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1310 .block_erasers =
1311 {
1312 {
1313 .eraseblocks = { {64 * 1024, 8} },
1314 .block_erase = erase_block_jedec,
1315 }, {
1316 .eraseblocks = { {512 * 1024, 1} },
1317 .block_erase = erase_chip_block_jedec,
1318 }
1319 },
Alan Green90539742019-09-02 17:06:30 +10001320 .unlock = unlock_regspace2_uniform_64k,
hailfinger61958912010-07-28 22:20:20 +00001321 .write = write_jedec_1,
1322 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001323 .voltage = {3000, 3600},
hailfinger61958912010-07-28 22:20:20 +00001324 },
1325
1326 {
hailfinger286829b2009-01-08 03:40:17 +00001327 .vendor = "Atmel",
1328 .name = "AT25DF021",
hailfingere1e41ea2011-07-27 07:13:06 +00001329 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001330 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001331 .model_id = ATMEL_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001332 .total_size = 256,
1333 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001334 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001335 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001336 .tested = TEST_UNTESTED,
1337 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001338 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001339 .block_erasers =
1340 {
1341 {
1342 .eraseblocks = { {4 * 1024, 64} },
1343 .block_erase = spi_block_erase_20,
1344 }, {
1345 .eraseblocks = { {32 * 1024, 8} },
1346 .block_erase = spi_block_erase_52,
1347 }, {
1348 .eraseblocks = { {64 * 1024, 4} },
1349 .block_erase = spi_block_erase_d8,
1350 }, {
1351 .eraseblocks = { {256 * 1024, 1} },
1352 .block_erase = spi_block_erase_60,
1353 }, {
1354 .eraseblocks = { {256 * 1024, 1} },
1355 .block_erase = spi_block_erase_c7,
1356 }
1357 },
hailfingerc33d4732010-07-29 13:09:18 +00001358 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001359 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001360 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001361 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001362 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001363 },
1364
hailfinger286829b2009-01-08 03:40:17 +00001365 {
1366 .vendor = "Atmel",
1367 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001368 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001369 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001370 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001371 .total_size = 512,
1372 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001373 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001374 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001375 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001376 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001377 .block_erasers =
1378 {
1379 {
1380 .eraseblocks = { {4 * 1024, 128} },
1381 .block_erase = spi_block_erase_20,
1382 }, {
1383 .eraseblocks = { {32 * 1024, 16} },
1384 .block_erase = spi_block_erase_52,
1385 }, {
1386 .eraseblocks = { {64 * 1024, 8} },
1387 .block_erase = spi_block_erase_d8,
1388 }, {
1389 .eraseblocks = { {512 * 1024, 1} },
1390 .block_erase = spi_block_erase_60,
1391 }, {
1392 .eraseblocks = { {512 * 1024, 1} },
1393 .block_erase = spi_block_erase_c7,
1394 }
1395 },
hailfingerc33d4732010-07-29 13:09:18 +00001396 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001397 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001398 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001399 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001400 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001401 },
1402
hailfinger286829b2009-01-08 03:40:17 +00001403 {
1404 .vendor = "Atmel",
1405 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001406 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001407 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001408 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001409 .total_size = 1024,
1410 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001411 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00001412 .tested = TEST_UNTESTED,
1413 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001414 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001415 .block_erasers =
1416 {
1417 {
1418 .eraseblocks = { {4 * 1024, 256} },
1419 .block_erase = spi_block_erase_20,
1420 }, {
1421 .eraseblocks = { {32 * 1024, 32} },
1422 .block_erase = spi_block_erase_52,
1423 }, {
1424 .eraseblocks = { {64 * 1024, 16} },
1425 .block_erase = spi_block_erase_d8,
1426 }, {
1427 .eraseblocks = { {1024 * 1024, 1} },
1428 .block_erase = spi_block_erase_60,
1429 }, {
1430 .eraseblocks = { {1024 * 1024, 1} },
1431 .block_erase = spi_block_erase_c7,
1432 }
1433 },
hailfingerc33d4732010-07-29 13:09:18 +00001434 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001435 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfingerc33d4732010-07-29 13:09:18 +00001436 .write = spi_chip_write_256,
1437 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001438 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001439 },
1440
1441 {
1442 .vendor = "Atmel",
1443 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001444 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001445 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001446 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001447 .total_size = 1024,
1448 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001449 .feature_bits = FEATURE_WRSR_WREN,
hailfingerc33d4732010-07-29 13:09:18 +00001450 .tested = TEST_UNTESTED,
1451 .probe = probe_spi_rdid,
1452 .probe_timing = TIMING_ZERO,
1453 .block_erasers =
1454 {
1455 {
1456 .eraseblocks = { {4 * 1024, 256} },
1457 .block_erase = spi_block_erase_20,
1458 }, {
1459 .eraseblocks = { {32 * 1024, 32} },
1460 .block_erase = spi_block_erase_52,
1461 }, {
1462 .eraseblocks = { {64 * 1024, 16} },
1463 .block_erase = spi_block_erase_d8,
1464 }, {
1465 .eraseblocks = { {1024 * 1024, 1} },
1466 .block_erase = spi_block_erase_60,
1467 }, {
1468 .eraseblocks = { {1024 * 1024, 1} },
1469 .block_erase = spi_block_erase_c7,
1470 }
1471 },
1472 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001473 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001474 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001475 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001476 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001477 },
1478
hailfinger286829b2009-01-08 03:40:17 +00001479 {
1480 .vendor = "Atmel",
1481 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001482 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001483 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001484 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001485 .total_size = 2048,
1486 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001487 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001488 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001489 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001490 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001491 .block_erasers =
1492 {
1493 {
1494 .eraseblocks = { {4 * 1024, 512} },
1495 .block_erase = spi_block_erase_20,
1496 }, {
1497 .eraseblocks = { {32 * 1024, 64} },
1498 .block_erase = spi_block_erase_52,
1499 }, {
1500 .eraseblocks = { {64 * 1024, 32} },
1501 .block_erase = spi_block_erase_d8,
1502 }, {
1503 .eraseblocks = { {2 * 1024 * 1024, 1} },
1504 .block_erase = spi_block_erase_60,
1505 }, {
1506 .eraseblocks = { {2 * 1024 * 1024, 1} },
1507 .block_erase = spi_block_erase_c7,
1508 }
1509 },
hailfingerc33d4732010-07-29 13:09:18 +00001510 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001511 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001512 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001513 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001514 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001515 },
1516
hailfinger286829b2009-01-08 03:40:17 +00001517 {
1518 .vendor = "Atmel",
1519 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001520 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001521 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001522 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001523 .total_size = 4096,
1524 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001525 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001526 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001527 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001528 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001529 .block_erasers =
1530 {
1531 {
1532 .eraseblocks = { {4 * 1024, 1024} },
1533 .block_erase = spi_block_erase_20,
1534 }, {
1535 .eraseblocks = { {32 * 1024, 128} },
1536 .block_erase = spi_block_erase_52,
1537 }, {
1538 .eraseblocks = { {64 * 1024, 64} },
1539 .block_erase = spi_block_erase_d8,
1540 }, {
1541 .eraseblocks = { {4 * 1024 * 1024, 1} },
1542 .block_erase = spi_block_erase_60,
1543 }, {
1544 .eraseblocks = { {4 * 1024 * 1024, 1} },
1545 .block_erase = spi_block_erase_c7,
1546 }
1547 },
hailfingerc33d4732010-07-29 13:09:18 +00001548 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001549 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001550 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001551 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001552 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001553 },
1554
hailfinger286829b2009-01-08 03:40:17 +00001555 {
1556 .vendor = "Atmel",
1557 .name = "AT25DF321A",
hailfingere1e41ea2011-07-27 07:13:06 +00001558 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001559 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001560 .model_id = ATMEL_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001561 .total_size = 4096,
1562 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001563 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001564 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenb2d50132019-09-16 12:26:24 +10001565 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001566 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001567 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001568 .block_erasers =
1569 {
1570 {
1571 .eraseblocks = { {4 * 1024, 1024} },
1572 .block_erase = spi_block_erase_20,
1573 }, {
1574 .eraseblocks = { {32 * 1024, 128} },
1575 .block_erase = spi_block_erase_52,
1576 }, {
1577 .eraseblocks = { {64 * 1024, 64} },
1578 .block_erase = spi_block_erase_d8,
1579 }, {
1580 .eraseblocks = { {4 * 1024 * 1024, 1} },
1581 .block_erase = spi_block_erase_60,
1582 }, {
1583 .eraseblocks = { {4 * 1024 * 1024, 1} },
1584 .block_erase = spi_block_erase_c7,
1585 }
1586 },
hailfingerc33d4732010-07-29 13:09:18 +00001587 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001588 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001589 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001590 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001591 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001592 },
1593
hailfinger286829b2009-01-08 03:40:17 +00001594 {
1595 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001596 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001597 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001598 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001599 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001600 .total_size = 8192,
1601 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001602 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001603 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001604 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001605 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001606 .block_erasers =
1607 {
1608 {
1609 .eraseblocks = { {4 * 1024, 2048} },
1610 .block_erase = spi_block_erase_20,
1611 }, {
1612 .eraseblocks = { {32 * 1024, 256} },
1613 .block_erase = spi_block_erase_52,
1614 }, {
1615 .eraseblocks = { {64 * 1024, 128} },
1616 .block_erase = spi_block_erase_d8,
1617 }, {
1618 .eraseblocks = { {8 * 1024 * 1024, 1} },
1619 .block_erase = spi_block_erase_60,
1620 }, {
1621 .eraseblocks = { {8 * 1024 * 1024, 1} },
1622 .block_erase = spi_block_erase_c7,
1623 }
1624 },
hailfingerc33d4732010-07-29 13:09:18 +00001625 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001626 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfingerc33d4732010-07-29 13:09:18 +00001627 .write = spi_chip_write_256,
1628 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001629 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001630 },
1631
1632 {
1633 .vendor = "Atmel",
1634 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001635 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001636 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001637 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001638 .total_size = 2048,
1639 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001640 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001641 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerc33d4732010-07-29 13:09:18 +00001642 .tested = TEST_UNTESTED,
1643 .probe = probe_spi_rdid,
1644 .probe_timing = TIMING_ZERO,
1645 .block_erasers =
1646 {
1647 {
1648 .eraseblocks = { {4 * 1024, 512} },
1649 .block_erase = spi_block_erase_20,
1650 }, {
1651 .eraseblocks = { {32 * 1024, 64} },
1652 .block_erase = spi_block_erase_52,
1653 }, {
1654 .eraseblocks = { {64 * 1024, 32} },
1655 .block_erase = spi_block_erase_d8,
1656 }, {
1657 .eraseblocks = { {2 * 1024 * 1024, 1} },
1658 .block_erase = spi_block_erase_60,
1659 }, {
1660 .eraseblocks = { {2 * 1024 * 1024, 1} },
1661 .block_erase = spi_block_erase_c7,
1662 }
1663 },
1664 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001665 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001666 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001667 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001668 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001669 },
1670
hailfinger286829b2009-01-08 03:40:17 +00001671 {
1672 .vendor = "Atmel",
1673 .name = "AT25F512B",
hailfingere1e41ea2011-07-27 07:13:06 +00001674 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001675 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001676 .model_id = ATMEL_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00001677 .total_size = 64,
1678 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001679 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001680 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001681 .tested = TEST_UNTESTED,
1682 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001683 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001684 .block_erasers =
1685 {
1686 {
1687 .eraseblocks = { {4 * 1024, 16} },
1688 .block_erase = spi_block_erase_20,
1689 }, {
1690 .eraseblocks = { {32 * 1024, 2} },
1691 .block_erase = spi_block_erase_52,
1692 }, {
1693 .eraseblocks = { {32 * 1024, 2} },
1694 .block_erase = spi_block_erase_d8,
1695 }, {
1696 .eraseblocks = { {64 * 1024, 1} },
1697 .block_erase = spi_block_erase_60,
1698 }, {
1699 .eraseblocks = { {64 * 1024, 1} },
1700 .block_erase = spi_block_erase_c7,
Alan Green5d709732019-09-16 12:32:25 +10001701 }, {
1702 .eraseblocks = { {64 * 1024, 1} },
1703 .block_erase = spi_block_erase_62,
hailfinger22155a82009-12-23 12:02:55 +00001704 }
1705 },
Alan Green5d709732019-09-16 12:32:25 +10001706 .printlock = spi_prettyprint_status_register_at25f512b,
1707 .unlock = spi_disable_blockprotect_at25f512b,
hailfinger87c05482009-05-09 02:34:18 +00001708 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001709 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001710 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001711 },
1712
hailfinger286829b2009-01-08 03:40:17 +00001713 {
1714 .vendor = "Atmel",
1715 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00001716 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001717 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001718 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00001719 .total_size = 128,
1720 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001721 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10001722 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001723 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001724 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001725 .block_erasers =
1726 {
1727 {
1728 .eraseblocks = { {4 * 1024, 32} },
1729 .block_erase = spi_block_erase_20,
1730 }, {
hailfingerc33d4732010-07-29 13:09:18 +00001731 .eraseblocks = { {4 * 1024, 32} },
1732 .block_erase = spi_block_erase_d7,
1733 }, {
hailfinger22155a82009-12-23 12:02:55 +00001734 .eraseblocks = { {32 * 1024, 4} },
1735 .block_erase = spi_block_erase_52,
1736 }, {
1737 .eraseblocks = { {32 * 1024, 4} },
1738 .block_erase = spi_block_erase_d8,
1739 }, {
1740 .eraseblocks = { {128 * 1024, 1} },
1741 .block_erase = spi_block_erase_60,
1742 }, {
1743 .eraseblocks = { {128 * 1024, 1} },
1744 .block_erase = spi_block_erase_c7,
1745 }
1746 },
hailfingerc33d4732010-07-29 13:09:18 +00001747 .printlock = spi_prettyprint_status_register_at25fs010,
1748 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00001749 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001750 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001751 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001752 },
1753
hailfinger286829b2009-01-08 03:40:17 +00001754 {
1755 .vendor = "Atmel",
1756 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00001757 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001758 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001759 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00001760 .total_size = 512,
1761 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001762 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00001763 .tested = TEST_UNTESTED,
1764 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001765 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001766 .block_erasers =
1767 {
1768 {
1769 .eraseblocks = { {4 * 1024, 128} },
1770 .block_erase = spi_block_erase_20,
1771 }, {
1772 .eraseblocks = { {64 * 1024, 8} },
1773 .block_erase = spi_block_erase_52,
1774 }, {
1775 .eraseblocks = { {64 * 1024, 8} },
1776 .block_erase = spi_block_erase_d8,
1777 }, {
1778 .eraseblocks = { {512 * 1024, 1} },
1779 .block_erase = spi_block_erase_60,
1780 }, {
1781 .eraseblocks = { {512 * 1024, 1} },
1782 .block_erase = spi_block_erase_c7,
1783 }
1784 },
hailfingerc33d4732010-07-29 13:09:18 +00001785 .printlock = spi_prettyprint_status_register_at25fs040,
1786 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00001787 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001788 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001789 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001790 },
1791
hailfinger286829b2009-01-08 03:40:17 +00001792 {
1793 .vendor = "Atmel",
Alan Greenab43dc02019-08-06 15:56:21 +10001794 .name = "AT25SF128A",
1795 .bustype = BUS_SPI,
1796 .manufacture_id = ATMEL_ID,
1797 .model_id = ATMEL_AT25SF128A,
1798 .total_size = 16384,
1799 .page_size = 256,
1800 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green597a4122019-09-02 10:57:28 +10001801 .tested = TEST_OK_PR,
Alan Greenab43dc02019-08-06 15:56:21 +10001802 .probe = probe_spi_rdid,
1803 .probe_timing = TIMING_ZERO,
1804 .block_erasers =
1805 {
1806 {
1807 .eraseblocks = { {4 * 1024, 4096} },
1808 .block_erase = spi_block_erase_20,
1809 }, {
1810 .eraseblocks = { {32 * 1024, 512} },
1811 .block_erase = spi_block_erase_52,
1812 }, {
1813 .eraseblocks = { {64 * 1024, 256} },
1814 .block_erase = spi_block_erase_d8,
1815 }, {
1816 .eraseblocks = { {16 * 1024 * 1024, 1} },
1817 .block_erase = spi_block_erase_60,
1818 }, {
1819 .eraseblocks = { {16 * 1024 * 1024, 1} },
1820 .block_erase = spi_block_erase_c7,
1821 }
1822 },
Alan Green597a4122019-09-02 10:57:28 +10001823 .printlock = spi_prettyprint_status_register_bp4_srwd,
1824 .unlock = spi_disable_blockprotect_bp4_srwd,
Alan Greenab43dc02019-08-06 15:56:21 +10001825 .write = spi_chip_write_256,
1826 .read = spi_chip_read,
1827 .voltage = {1700, 2000},
1828 .wp = &wp_w25q,
1829 },
1830
1831 {
1832 .vendor = "Atmel",
1833 .name = "AT25SL128A",
1834 .bustype = BUS_SPI,
1835 .manufacture_id = ATMEL_ID,
1836 .model_id = ATMEL_AT25SL128A,
1837 .total_size = 16384,
1838 .page_size = 256,
1839 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1840 .tested = TEST_OK_PREW,
1841 .probe = probe_spi_rdid,
1842 .probe_timing = TIMING_ZERO,
1843 .block_erasers =
1844 {
1845 {
1846 .eraseblocks = { {4 * 1024, 4096} },
1847 .block_erase = spi_block_erase_20,
1848 }, {
1849 .eraseblocks = { {32 * 1024, 512} },
1850 .block_erase = spi_block_erase_52,
1851 }, {
1852 .eraseblocks = { {64 * 1024, 256} },
1853 .block_erase = spi_block_erase_d8,
1854 }, {
1855 .eraseblocks = { {16 * 1024 * 1024, 1} },
1856 .block_erase = spi_block_erase_60,
1857 }, {
1858 .eraseblocks = { {16 * 1024 * 1024, 1} },
1859 .block_erase = spi_block_erase_c7,
1860 }
1861 },
1862 .printlock = spi_prettyprint_status_register_at25df,
1863 .unlock = spi_disable_blockprotect_at25df,
1864 .write = spi_chip_write_256,
1865 .read = spi_chip_read,
1866 .voltage = {1700, 2000},
1867 .wp = &wp_w25q,
1868 },
1869
1870 {
1871 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001872 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00001873 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001874 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001875 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00001876 .total_size = 512,
1877 .page_size = 256,
Alan Green1fdf13b2019-09-16 12:54:45 +10001878 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
1879 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001880 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001881 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001882 .block_erasers =
1883 {
1884 {
Alan Green1fdf13b2019-09-16 12:54:45 +10001885 .eraseblocks = { {256, 2048} },
1886 .block_erase = spi_block_erase_81,
1887 }, {
1888 .eraseblocks = { {2 * 1024, 256} },
1889 .block_erase = spi_block_erase_50,
1890 }, {
hailfinger22155a82009-12-23 12:02:55 +00001891 .eraseblocks = { {4 * 1024, 128} },
1892 .block_erase = spi_block_erase_20,
1893 }
1894 },
Alan Green6cfd0182019-07-26 13:50:04 +10001895 .printlock = spi_prettyprint_status_register_plain,
Alan Green1fdf13b2019-09-16 12:54:45 +10001896 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
1897 .write = spi_chip_write_1,
1898 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00001899 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00001900 },
1901
hailfinger286829b2009-01-08 03:40:17 +00001902 {
1903 .vendor = "Atmel",
1904 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001905 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001906 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001907 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00001908 .total_size = 1024,
1909 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00001910 .feature_bits = FEATURE_WRSR_WREN,
1911 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001912 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001913 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001914 .block_erasers =
1915 {
1916 {
1917 .eraseblocks = { {4 * 1024, 256} },
1918 .block_erase = spi_block_erase_20,
1919 }, {
1920 .eraseblocks = { {32 * 1024, 32} },
1921 .block_erase = spi_block_erase_52,
1922 }, {
1923 .eraseblocks = { {64 * 1024, 16} },
1924 .block_erase = spi_block_erase_d8,
1925 }, {
1926 .eraseblocks = { {1024 * 1024, 1} },
1927 .block_erase = spi_block_erase_60,
1928 }, {
1929 .eraseblocks = { {1024 * 1024, 1} },
1930 .block_erase = spi_block_erase_c7,
1931 }
1932 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001933 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Green64b91de2019-09-09 16:34:07 +10001934 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001935 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001936 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001937 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001938 },
1939
hailfinger286829b2009-01-08 03:40:17 +00001940 {
1941 .vendor = "Atmel",
1942 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001943 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001944 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001945 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00001946 .total_size = 2048,
1947 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001948 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001949 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001950 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001951 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001952 .block_erasers =
1953 {
1954 {
1955 .eraseblocks = { {4 * 1024, 512} },
1956 .block_erase = spi_block_erase_20,
1957 }, {
1958 .eraseblocks = { {32 * 1024, 64} },
1959 .block_erase = spi_block_erase_52,
1960 }, {
1961 .eraseblocks = { {64 * 1024, 32} },
1962 .block_erase = spi_block_erase_d8,
1963 }, {
1964 .eraseblocks = { {2 * 1024 * 1024, 1} },
1965 .block_erase = spi_block_erase_60,
1966 }, {
1967 .eraseblocks = { {2 * 1024 * 1024, 1} },
1968 .block_erase = spi_block_erase_c7,
1969 }
1970 },
hailfinger7533bc82011-05-19 00:06:06 +00001971 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001972 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001973 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001974 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001975 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001976 },
1977
hailfinger286829b2009-01-08 03:40:17 +00001978 {
1979 .vendor = "Atmel",
1980 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00001981 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001982 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001983 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00001984 .total_size = 2048,
1985 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001986 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001987 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001988 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001989 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001990 .block_erasers =
1991 {
1992 {
1993 .eraseblocks = { {4 * 1024, 512} },
1994 .block_erase = spi_block_erase_20,
1995 }, {
1996 .eraseblocks = { {32 * 1024, 64} },
1997 .block_erase = spi_block_erase_52,
1998 }, {
1999 .eraseblocks = { {64 * 1024, 32} },
2000 .block_erase = spi_block_erase_d8,
2001 }, {
2002 .eraseblocks = { {2 * 1024 * 1024, 1} },
2003 .block_erase = spi_block_erase_60,
2004 }, {
2005 .eraseblocks = { {2 * 1024 * 1024, 1} },
2006 .block_erase = spi_block_erase_c7,
2007 }
2008 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002009 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Greenb2d50132019-09-16 12:26:24 +10002010 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002011 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002012 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002013 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002014 },
2015
hailfinger286829b2009-01-08 03:40:17 +00002016 {
2017 .vendor = "Atmel",
2018 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00002019 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002020 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002021 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00002022 .total_size = 512,
2023 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002024 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002025 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
hailfinger286829b2009-01-08 03:40:17 +00002026 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002027 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002028 .block_erasers =
2029 {
2030 {
2031 .eraseblocks = { {4 * 1024, 128} },
2032 .block_erase = spi_block_erase_20,
2033 }, {
2034 .eraseblocks = { {32 * 1024, 16} },
2035 .block_erase = spi_block_erase_52,
2036 }, {
2037 .eraseblocks = { {64 * 1024, 8} },
2038 .block_erase = spi_block_erase_d8,
2039 }, {
2040 .eraseblocks = { {512 * 1024, 1} },
2041 .block_erase = spi_block_erase_60,
2042 }, {
2043 .eraseblocks = { {512 * 1024, 1} },
2044 .block_erase = spi_block_erase_c7,
2045 }
2046 },
Alan Green6cfd0182019-07-26 13:50:04 +10002047 .printlock = spi_prettyprint_status_register_plain,
Alan Greenab57f8f2019-07-09 12:42:39 +10002048 .write = NULL, /* Incompatible Page write */
hailfinger286829b2009-01-08 03:40:17 +00002049 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002050 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002051 },
2052
hailfinger286829b2009-01-08 03:40:17 +00002053 {
2054 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00002055 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00002056 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00002057 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002058 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00002059 .total_size = 128,
2060 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002061 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002062 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00002063 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002064 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002065 .block_erasers =
2066 {
2067 {
2068 .eraseblocks = { {128 * 1024, 1} },
2069 .block_erase = erase_chip_block_jedec,
2070 }
2071 },
uweb3a82ef2009-05-16 21:39:19 +00002072 .write = write_jedec, /* FIXME */
2073 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002074 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00002075 },
2076
2077 {
2078 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002079 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00002080 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002081 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002082 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00002083 .total_size = 256,
2084 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002085 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10002086 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002087 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00002088 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00002089 .block_erasers =
2090 {
2091 {
2092 .eraseblocks = { {256 * 1024, 1} },
2093 .block_erase = erase_chip_block_jedec,
2094 }
2095 },
hailfinger286829b2009-01-08 03:40:17 +00002096 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002097 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002098 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002099 },
2100
hailfinger286829b2009-01-08 03:40:17 +00002101 {
2102 .vendor = "Atmel",
2103 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002104 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002105 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002106 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002107 .total_size = 512,
2108 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002109 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002110 .tested = TEST_UNTESTED,
2111 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002112 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002113 .block_erasers =
2114 {
2115 {
2116 .eraseblocks = { {512 * 1024, 1} },
2117 .block_erase = erase_chip_block_jedec,
2118 }
2119 },
hailfinger286829b2009-01-08 03:40:17 +00002120 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002121 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002122 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002123 },
2124
hailfinger286829b2009-01-08 03:40:17 +00002125 {
2126 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002127 .name = "AT29C512",
2128 .bustype = BUS_PARALLEL,
2129 .manufacture_id = ATMEL_ID,
2130 .model_id = ATMEL_AT29C512,
2131 .total_size = 64,
2132 .page_size = 128,
2133 .feature_bits = FEATURE_LONG_RESET,
2134 .tested = TEST_OK_PREW,
2135 .probe = probe_jedec,
2136 .probe_timing = 10000, /* 10mS, Enter=Exec */
2137 .block_erasers =
2138 {
2139 {
2140 .eraseblocks = { {64 * 1024, 1} },
2141 .block_erase = erase_chip_block_jedec,
2142 }
2143 },
2144 .write = write_jedec,
2145 .read = read_memmapped,
2146 .voltage = {4500, 5500},
2147 },
2148
2149 {
2150 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002151 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002152 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002153 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002154 .model_id = ATMEL_AT45CS1282,
Alan Greenab57f8f2019-07-09 12:42:39 +10002155 .total_size = 16896, /* No power of two sizes */
2156 .page_size = 1056, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002157 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2158 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2159 .feature_bits = FEATURE_OTP,
2160 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002161 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002162 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002163 .block_erasers =
2164 {
2165 {
2166 .eraseblocks = {
2167 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2168 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2169 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2170 },
2171 .block_erase = spi_erase_at45cs_sector,
2172 }
2173 },
Alan Green6cfd0182019-07-26 13:50:04 +10002174 .printlock = spi_prettyprint_status_register_plain,
Alan Greendad2dae2019-09-16 15:55:08 +10002175 .write = spi_write_at45db,
2176 .read = spi_read_at45db,
stefanct7e00e222011-06-03 07:26:31 +00002177 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10002178 .gran = write_gran_1056bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00002179 },
stepanaa1b6a22008-12-08 18:15:10 +00002180
hailfinger286829b2009-01-08 03:40:17 +00002181 {
2182 .vendor = "Atmel",
2183 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002184 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002185 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002186 .model_id = ATMEL_AT45DB011D,
Alan Greendad2dae2019-09-16 15:55:08 +10002187 .total_size = 128, /* or 132, determined from status register */
2188 .page_size = 256, /* or 264, determined from status register */
2189 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2190 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2191 .feature_bits = FEATURE_OTP,
2192 .tested = TEST_OK_PREW,
2193 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002194 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002195 .block_erasers =
2196 {
2197 {
2198 .eraseblocks = { {256, 512} },
2199 .block_erase = spi_erase_at45db_page,
2200 }, {
2201 .eraseblocks = { {8 * 256, 512/8} },
2202 .block_erase = spi_erase_at45db_block,
2203 }, {
2204 .eraseblocks = {
2205 {8 * 256, 1},
2206 {120 * 256, 1},
2207 {128 * 256, 3},
2208 },
2209 .block_erase = spi_erase_at45db_sector
2210 }, {
2211 .eraseblocks = { {128 * 1024, 1} },
2212 .block_erase = spi_erase_at45db_chip,
2213 }
2214 },
2215 .printlock = spi_prettyprint_status_register_at45db,
2216 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2217 /* granularity will be set by the probing function. */
2218 .write = spi_write_at45db,
2219 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002220 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002221 },
stepanaa1b6a22008-12-08 18:15:10 +00002222
hailfinger286829b2009-01-08 03:40:17 +00002223 {
2224 .vendor = "Atmel",
2225 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002226 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002227 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002228 .model_id = ATMEL_AT45DB021D,
Alan Greendad2dae2019-09-16 15:55:08 +10002229 .total_size = 256, /* or 264, determined from status register */
2230 .page_size = 256, /* or 264, determined from status register */
2231 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2232 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2233 .feature_bits = FEATURE_OTP,
2234 .tested = TEST_OK_PREW,
2235 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002236 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002237 .block_erasers =
2238 {
2239 {
2240 .eraseblocks = { {256, 1024} },
2241 .block_erase = spi_erase_at45db_page,
2242 }, {
2243 .eraseblocks = { {8 * 256, 1024/8} },
2244 .block_erase = spi_erase_at45db_block,
2245 }, {
2246 .eraseblocks = {
2247 {8 * 256, 1},
2248 {120 * 256, 1},
2249 {128 * 256, 7},
2250 },
2251 .block_erase = spi_erase_at45db_sector
2252 }, {
2253 .eraseblocks = { {256 * 1024, 1} },
2254 .block_erase = spi_erase_at45db_chip,
2255 }
2256 },
2257 .printlock = spi_prettyprint_status_register_at45db,
2258 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2259 /* granularity will be set by the probing function. */
2260 .write = spi_write_at45db,
2261 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002262 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002263 },
stepanaa1b6a22008-12-08 18:15:10 +00002264
hailfinger286829b2009-01-08 03:40:17 +00002265 {
2266 .vendor = "Atmel",
2267 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002268 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002269 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002270 .model_id = ATMEL_AT45DB041D,
Alan Greendad2dae2019-09-16 15:55:08 +10002271 .total_size = 512, /* or 528, determined from status register */
2272 .page_size = 256, /* or 264, determined from status register */
2273 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2274 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2275 .feature_bits = FEATURE_OTP,
2276 .tested = TEST_OK_PREW,
2277 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002278 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002279 .block_erasers =
2280 {
2281 {
2282 .eraseblocks = { {256, 2048} },
2283 .block_erase = spi_erase_at45db_page,
2284 }, {
2285 .eraseblocks = { {8 * 256, 2048/8} },
2286 .block_erase = spi_erase_at45db_block,
2287 }, {
2288 .eraseblocks = {
2289 {8 * 256, 1},
2290 {248 * 256, 1},
2291 {256 * 256, 7},
2292 },
2293 .block_erase = spi_erase_at45db_sector
2294 }, {
2295 .eraseblocks = { {512 * 1024, 1} },
2296 .block_erase = spi_erase_at45db_chip,
2297 }
2298 },
2299 .printlock = spi_prettyprint_status_register_at45db,
2300 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2301 /* granularity will be set by the probing function. */
2302 .write = spi_write_at45db,
2303 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Alan Green5dc48da2019-08-26 15:35:10 +10002304 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002305 },
stepanaa1b6a22008-12-08 18:15:10 +00002306
hailfinger286829b2009-01-08 03:40:17 +00002307 {
2308 .vendor = "Atmel",
2309 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002310 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002311 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002312 .model_id = ATMEL_AT45DB081D,
Alan Greendad2dae2019-09-16 15:55:08 +10002313 .total_size = 1024, /* or 1056, determined from status register */
2314 .page_size = 256, /* or 264, determined from status register */
2315 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2316 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2317 .feature_bits = FEATURE_OTP,
2318 .tested = TEST_OK_PREW,
2319 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002320 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002321 .block_erasers =
2322 {
2323 {
2324 .eraseblocks = { {256, 4096} },
2325 .block_erase = spi_erase_at45db_page,
2326 }, {
2327 .eraseblocks = { {8 * 256, 4096/8} },
2328 .block_erase = spi_erase_at45db_block,
2329 }, {
2330 .eraseblocks = {
2331 {8 * 256, 1},
2332 {248 * 256, 1},
2333 {256 * 256, 15},
2334 },
2335 .block_erase = spi_erase_at45db_sector
2336 }, {
2337 .eraseblocks = { {1024 * 1024, 1} },
2338 .block_erase = spi_erase_at45db_chip,
2339 }
2340 },
2341 .printlock = spi_prettyprint_status_register_at45db,
2342 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2343 /* granularity will be set by the probing function. */
2344 .write = spi_write_at45db,
2345 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002346 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002347 },
stepanaa1b6a22008-12-08 18:15:10 +00002348
hailfinger286829b2009-01-08 03:40:17 +00002349 {
2350 .vendor = "Atmel",
2351 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002352 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002353 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002354 .model_id = ATMEL_AT45DB161D,
Alan Greendad2dae2019-09-16 15:55:08 +10002355 .total_size = 2048, /* or 2112, determined from status register */
2356 .page_size = 512, /* or 528, determined from status register */
2357 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2358 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2359 .feature_bits = FEATURE_OTP,
2360 .tested = TEST_OK_PREW,
2361 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002362 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002363 .block_erasers =
2364 {
2365 {
2366 .eraseblocks = { {512, 4096} },
2367 .block_erase = spi_erase_at45db_page,
2368 }, {
2369 .eraseblocks = { {8 * 512, 4096/8} },
2370 .block_erase = spi_erase_at45db_block,
2371 }, {
2372 .eraseblocks = {
2373 {8 * 512, 1},
2374 {248 * 512, 1},
2375 {256 * 512, 15},
2376 },
2377 .block_erase = spi_erase_at45db_sector
2378 }, {
2379 .eraseblocks = { {2048 * 1024, 1} },
2380 .block_erase = spi_erase_at45db_chip,
2381 }
2382 },
2383 .printlock = spi_prettyprint_status_register_at45db,
2384 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2385 /* granularity will be set by the probing function. */
2386 .write = spi_write_at45db,
2387 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002388 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002389 },
stepanaa1b6a22008-12-08 18:15:10 +00002390
hailfinger286829b2009-01-08 03:40:17 +00002391 {
2392 .vendor = "Atmel",
2393 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002394 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002395 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002396 .model_id = ATMEL_AT45DB321C,
Alan Greenab57f8f2019-07-09 12:42:39 +10002397 .total_size = 4224, /* No power of two sizes */
2398 .page_size = 528, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002399 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2400 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2401 .feature_bits = FEATURE_OTP,
2402 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002403 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002404 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002405 .block_erasers =
2406 {
2407 {
2408 .eraseblocks = { {528, 8192} },
2409 .block_erase = spi_erase_at45db_page,
2410 }, {
2411 .eraseblocks = { {8 * 528, 8192/8} },
2412 .block_erase = spi_erase_at45db_block,
2413 }, /* Although the datasheets describes sectors (which can be write protected)
2414 * there seems to be no erase functions for them.
2415 {
2416 .eraseblocks = {
2417 {8 * 528, 1},
2418 {120 * 528, 1},
2419 {128 * 528, 63},
2420 },
2421 .block_erase = spi_erase_at45db_sector
2422 }, */ {
2423 .eraseblocks = { {4224 * 1024, 1} },
2424 .block_erase = spi_erase_at45db_chip,
2425 }
2426 },
2427 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
2428 .write = spi_write_at45db,
2429 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
stefanct7e00e222011-06-03 07:26:31 +00002430 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10002431 .gran = write_gran_528bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00002432 },
stepanaa1b6a22008-12-08 18:15:10 +00002433
hailfinger286829b2009-01-08 03:40:17 +00002434 {
2435 .vendor = "Atmel",
2436 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00002437 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002438 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002439 .model_id = ATMEL_AT45DB321D,
Alan Greendad2dae2019-09-16 15:55:08 +10002440 .total_size = 4096, /* or 4224, determined from status register */
2441 .page_size = 512, /* or 528, determined from status register */
2442 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner9816fc82016-08-12 15:47:49 -07002443 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2444 .feature_bits = FEATURE_OTP,
Alan Greendad2dae2019-09-16 15:55:08 +10002445 .tested = TEST_OK_PREW,
2446 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002447 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002448 .block_erasers =
2449 {
2450 {
2451 .eraseblocks = { {512, 8192} },
2452 .block_erase = spi_erase_at45db_page,
2453 }, {
2454 .eraseblocks = { {8 * 512, 8192/8} },
2455 .block_erase = spi_erase_at45db_block,
2456 }, {
2457 .eraseblocks = {
2458 {8 * 512, 1},
2459 {120 * 512, 1},
2460 {128 * 512, 63},
2461 },
2462 .block_erase = spi_erase_at45db_sector
2463 }, {
2464 .eraseblocks = { {4096 * 1024, 1} },
2465 .block_erase = spi_erase_at45db_chip,
2466 }
2467 },
2468 .printlock = spi_prettyprint_status_register_at45db,
2469 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2470 /* granularity will be set by the probing function. */
2471 .write = spi_write_at45db,
2472 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2473 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002474 },
stepanaa1b6a22008-12-08 18:15:10 +00002475
hailfinger286829b2009-01-08 03:40:17 +00002476 {
2477 .vendor = "Atmel",
2478 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00002479 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002480 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002481 .model_id = ATMEL_AT45DB642D,
Alan Greendad2dae2019-09-16 15:55:08 +10002482 .total_size = 8192, /* or 8448, determined from status register */
2483 .page_size = 1024, /* or 1056, determined from status register */
2484 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2485 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2486 .feature_bits = FEATURE_OTP,
2487 .tested = TEST_OK_PREW,
2488 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002489 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002490 .block_erasers =
2491 {
2492 {
2493 .eraseblocks = { {1024, 8192} },
2494 .block_erase = spi_erase_at45db_page,
2495 }, {
2496 .eraseblocks = { {8 * 1024, 8192/8} },
2497 .block_erase = spi_erase_at45db_block,
2498 }, {
2499 .eraseblocks = {
2500 {8 * 1024, 1},
2501 {248 * 1024, 1},
2502 {256 * 1024, 31},
2503 },
2504 .block_erase = spi_erase_at45db_sector
2505 }, {
2506 .eraseblocks = { {8192 * 1024, 1} },
2507 .block_erase = spi_erase_at45db_chip,
2508 }
2509 },
2510 .printlock = spi_prettyprint_status_register_at45db,
2511 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2512 /* granularity will be set by the probing function. */
2513 .write = spi_write_at45db,
2514 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002515 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002516 },
stepanaa1b6a22008-12-08 18:15:10 +00002517
hailfinger286829b2009-01-08 03:40:17 +00002518 {
2519 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00002520 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00002521 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00002522 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002523 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00002524 .total_size = 64,
2525 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00002526 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00002527 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00002528 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002529 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002530 .block_erasers =
2531 {
2532 {
2533 .eraseblocks = { {64 * 1024, 1} },
2534 .block_erase = erase_chip_block_jedec,
2535 }
2536 },
snelsonc6855342010-01-28 23:55:12 +00002537 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00002538 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002539 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00002540 },
2541
2542 {
2543 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002544 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00002545 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002546 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002547 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00002548 .total_size = 256,
2549 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002550 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002551 .tested = TEST_UNTESTED,
2552 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002553 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002554 .block_erasers =
2555 {
2556 {
2557 .eraseblocks = {
2558 {16 * 1024, 1},
2559 {8 * 1024, 2},
2560 {96 * 1024, 1},
2561 {128 * 1024, 1},
2562 },
2563 .block_erase = erase_sector_jedec,
2564 }, {
2565 .eraseblocks = { {256 * 1024, 1} },
2566 .block_erase = erase_chip_block_jedec,
2567 }
2568 },
snelsonc6855342010-01-28 23:55:12 +00002569 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002570 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002571 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002572 },
2573
hailfinger286829b2009-01-08 03:40:17 +00002574 {
2575 .vendor = "Atmel",
2576 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00002577 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002578 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002579 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00002580 .total_size = 256,
2581 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002582 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002583 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00002584 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002585 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002586 .block_erasers =
2587 {
2588 {
2589 .eraseblocks = {
2590 {128 * 1024, 1},
2591 {96 * 1024, 1},
2592 {8 * 1024, 2},
2593 {16 * 1024, 1},
2594 },
2595 .block_erase = erase_sector_jedec,
2596 }, {
2597 .eraseblocks = { {256 * 1024, 1} },
2598 .block_erase = erase_chip_block_jedec,
2599 }
2600 },
snelsonc6855342010-01-28 23:55:12 +00002601 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002602 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002603 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002604 },
2605
hailfinger867df6b2010-07-22 11:44:38 +00002606 {
uwe598c14d2011-09-08 19:55:18 +00002607 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002608 .name = "AT49F020",
2609 .bustype = BUS_PARALLEL,
2610 .manufacture_id = ATMEL_ID,
2611 .model_id = ATMEL_AT49F020,
2612 .total_size = 256,
Alan Greenebbee922019-09-02 11:36:59 +10002613 .page_size = 0, /* unused */
Alan Greend76dc1f2019-06-26 15:38:19 +10002614 .feature_bits = FEATURE_EITHER_RESET,
2615 .tested = TEST_OK_PRE,
2616 .probe = probe_jedec,
2617 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2618 .block_erasers =
2619 {
2620 {
2621 .eraseblocks = { {256 * 1024, 1} },
2622 .block_erase = erase_chip_block_jedec,
2623 }
Alan Greenebbee922019-09-02 11:36:59 +10002624 /* Chip features an optional permanent write protection
2625 * of the first 8 kB. The erase function is the same as
2626 * above, but 00000H to 01FFFH will not be erased.
2627 * FIXME: add another eraser when partial erasers are
2628 * supported.
2629 */
Alan Greend76dc1f2019-06-26 15:38:19 +10002630 },
Alan Greenebbee922019-09-02 11:36:59 +10002631 .printlock = printlock_at49f,
Alan Greend76dc1f2019-06-26 15:38:19 +10002632 .write = write_jedec_1,
2633 .read = read_memmapped,
2634 .voltage = {4500, 5500},
2635 },
2636
2637 {
2638 .vendor = "Atmel",
uwe598c14d2011-09-08 19:55:18 +00002639 .name = "AT49LH002",
2640 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2641 .manufacture_id = ATMEL_ID,
2642 .model_id = ATMEL_AT49LH002,
2643 .total_size = 256,
2644 .page_size = 0, /* unused */
2645 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2646 .tested = TEST_UNTESTED,
2647 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
Alan Green52ad0822019-09-16 16:01:09 +10002648 .probe_timing = TIMING_ZERO,
uwe598c14d2011-09-08 19:55:18 +00002649 .block_erasers =
2650 {
2651 {
2652 .eraseblocks = {
2653 {64 * 1024, 3},
2654 {32 * 1024, 1},
2655 {8 * 1024, 2},
2656 {16 * 1024, 1},
2657 },
Alan Green52ad0822019-09-16 16:01:09 +10002658 .block_erase = NULL, /* TODO: Implement. */
uwe598c14d2011-09-08 19:55:18 +00002659 }, {
2660 .eraseblocks = {
2661 {64 * 1024, 4},
2662 },
Alan Green52ad0822019-09-16 16:01:09 +10002663 .block_erase = erase_block_82802ab,
uwe598c14d2011-09-08 19:55:18 +00002664 },
2665 },
Alan Green52ad0822019-09-16 16:01:09 +10002666 .printlock = printlock_regspace2_block_eraser_0,
2667 .unlock = unlock_regspace2_block_eraser_0,
uwe598c14d2011-09-08 19:55:18 +00002668 .write = write_82802ab,
2669 .read = read_memmapped,
2670 .voltage = {3000, 3600},
2671 },
2672
2673 {
Alan Greend76dc1f2019-06-26 15:38:19 +10002674 .vendor = "Bright",
2675 .name = "BM29F040",
2676 .bustype = BUS_PARALLEL,
2677 .manufacture_id = BRIGHT_ID,
2678 .model_id = BRIGHT_BM29F040,
2679 .total_size = 512,
2680 .page_size = 64 * 1024,
2681 .feature_bits = FEATURE_EITHER_RESET,
2682 .tested = TEST_OK_PR,
2683 .probe = probe_jedec,
2684 .probe_timing = TIMING_ZERO,
2685 .block_erasers =
2686 {
2687 {
2688 .eraseblocks = { {64 * 1024, 8} },
2689 .block_erase = erase_sector_jedec,
2690 }, {
2691 .eraseblocks = { {512 * 1024, 1} },
2692 .block_erase = erase_chip_block_jedec,
2693 },
2694 },
2695 .write = write_jedec_1,
2696 .read = read_memmapped,
2697 .voltage = {4500, 5500},
2698 },
2699
2700 {
uwe97b20792011-09-13 22:05:44 +00002701 .vendor = "Catalyst",
2702 .name = "CAT28F512",
2703 .bustype = BUS_PARALLEL,
2704 .manufacture_id = CATALYST_ID,
2705 .model_id = CATALYST_CAT28F512,
2706 .total_size = 64,
2707 .page_size = 0, /* unused */
2708 .feature_bits = 0,
Alan Greenf5424a22019-07-26 14:32:32 +10002709 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
uwe97b20792011-09-13 22:05:44 +00002710 .probe = probe_jedec, /* FIXME! */
2711 .probe_timing = TIMING_ZERO,
2712 .block_erasers =
2713 {
2714 {
2715 .eraseblocks = { {64 * 1024, 1} },
2716 .block_erase = NULL, /* TODO */
2717 },
2718 },
2719 .write = NULL, /* TODO */
2720 .read = read_memmapped,
2721 .voltage = {4500, 5500},
2722 },
2723
2724 {
Alan Green58393332019-07-31 16:35:44 +10002725 .vendor = "ENE",
2726 .name = "KB9012 (EDI)",
2727 .bustype = BUS_SPI,
2728 .total_size = 128,
2729 .page_size = 128,
Alan Greendbeec2b2019-09-16 14:36:52 +10002730 .feature_bits = FEATURE_ERASED_ZERO,
Alan Green58393332019-07-31 16:35:44 +10002731 .tested = TEST_OK_PREW,
2732 .spi_cmd_set = SPI_EDI,
2733 .probe = edi_probe_kb9012,
2734 .probe_timing = TIMING_ZERO,
2735 .block_erasers =
2736 {
2737 {
2738 .eraseblocks = { {128, 1024} },
2739 .block_erase = edi_chip_block_erase,
2740 },
2741 },
2742 .write = edi_chip_write,
2743 .read = edi_chip_read,
2744 .voltage = {2700, 3600},
Alan Green956eb9c2019-09-16 14:29:45 +10002745 .gran = write_gran_128bytes,
Alan Green58393332019-07-31 16:35:44 +10002746 },
2747
2748 {
2749 .vendor = "ESMT",
mkarcherf6986732010-06-19 22:06:35 +00002750 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00002751 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002752 .manufacture_id = ESMT_ID,
2753 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00002754 .total_size = 1024,
2755 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002756 .feature_bits = FEATURE_WRSR_EITHER,
Alan Greena3c9bbe2019-09-16 14:51:07 +10002757 .tested = TEST_OK_PREW,
mkarcherf6986732010-06-19 22:06:35 +00002758 .probe = probe_spi_rdid,
2759 .probe_timing = TIMING_ZERO,
2760 .block_erasers =
2761 {
2762 {
2763 .eraseblocks = { {4 * 1024, 256} },
2764 .block_erase = spi_block_erase_20,
2765 }, {
2766 .eraseblocks = { {64 * 1024, 16} },
2767 .block_erase = spi_block_erase_d8,
2768 }, {
2769 .eraseblocks = { {1024 * 1024, 1} },
2770 .block_erase = spi_block_erase_60,
2771 }, {
2772 .eraseblocks = { {1024 * 1024, 1} },
2773 .block_erase = spi_block_erase_c7,
2774 }
2775 },
Alan Greena3c9bbe2019-09-16 14:51:07 +10002776 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00002777 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00002778 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00002779 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002780 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00002781 },
2782
2783 {
Edward O'Callaghana9c81002019-02-24 15:54:40 +11002784 .vendor = "ESMT",
Alan Greend76dc1f2019-06-26 15:38:19 +10002785 .name = "F49B002UA",
2786 .bustype = BUS_PARALLEL,
2787 .manufacture_id = ESMT_ID,
2788 .model_id = ESMT_F49B002UA,
2789 .total_size = 256,
2790 .page_size = 4096,
2791 .feature_bits = FEATURE_EITHER_RESET,
2792 .tested = TEST_UNTESTED,
2793 .probe = probe_jedec,
2794 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2795 .block_erasers =
2796 {
2797 {
2798 .eraseblocks = {
2799 {128 * 1024, 1},
2800 {96 * 1024, 1},
2801 {8 * 1024, 2},
2802 {16 * 1024, 1},
2803 },
2804 .block_erase = erase_sector_jedec,
2805 }, {
2806 .eraseblocks = { {256 * 1024, 1} },
2807 .block_erase = erase_chip_block_jedec,
2808 }
2809 },
2810 .write = write_jedec_1,
2811 .read = read_memmapped,
2812 .voltage = {4500, 5500},
2813 },
2814
2815 {
hailfingerab07cbd2009-06-05 20:53:07 +00002816 .vendor = "Eon",
2817 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00002818 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002819 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002820 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00002821 .total_size = 64,
2822 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002823 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00002824 .tested = TEST_UNTESTED,
2825 .probe = probe_spi_rdid,
2826 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002827 .block_erasers =
2828 {
2829 {
2830 .eraseblocks = {
2831 {4 * 1024, 2},
2832 {8 * 1024, 1},
2833 {16 * 1024, 1},
2834 {32 * 1024, 1},
2835 },
2836 .block_erase = spi_block_erase_d8,
2837 }, {
2838 .eraseblocks = { {64 * 1024, 1} },
2839 .block_erase = spi_block_erase_c7,
2840 }
2841 },
Alan Green6cfd0182019-07-26 13:50:04 +10002842 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00002843 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002844 .write = spi_chip_write_256,
2845 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002846 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002847 },
2848
2849 {
2850 .vendor = "Eon",
2851 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00002852 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002853 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002854 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00002855 .total_size = 64,
2856 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002857 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00002858 .tested = TEST_UNTESTED,
2859 .probe = probe_spi_rdid,
2860 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002861 .block_erasers =
2862 {
2863 {
2864 .eraseblocks = {
2865 {32 * 1024, 1},
2866 {16 * 1024, 1},
2867 {8 * 1024, 1},
2868 {4 * 1024, 2},
2869 },
2870 .block_erase = spi_block_erase_d8,
2871 }, {
2872 .eraseblocks = { {64 * 1024, 1} },
2873 .block_erase = spi_block_erase_c7,
2874 }
2875 },
Alan Green6cfd0182019-07-26 13:50:04 +10002876 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00002877 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002878 .write = spi_chip_write_256,
2879 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002880 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002881 },
2882
2883 {
2884 .vendor = "Eon",
2885 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00002886 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002887 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002888 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00002889 .total_size = 128,
2890 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002891 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00002892 .tested = TEST_UNTESTED,
2893 .probe = probe_spi_rdid,
2894 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002895 .block_erasers =
2896 {
2897 {
2898 .eraseblocks = {
2899 {4 * 1024, 2},
2900 {8 * 1024, 1},
2901 {16 * 1024, 1},
2902 {32 * 1024, 3},
2903 },
2904 .block_erase = spi_block_erase_d8,
2905 }, {
2906 .eraseblocks = { {128 * 1024, 1} },
2907 .block_erase = spi_block_erase_c7,
2908 }
2909 },
Alan Green6cfd0182019-07-26 13:50:04 +10002910 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00002911 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002912 .write = spi_chip_write_256,
2913 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002914 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002915 },
2916
2917 {
2918 .vendor = "Eon",
2919 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00002920 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002921 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002922 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00002923 .total_size = 128,
2924 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002925 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002926 .tested = TEST_OK_PREW,
snelson2d471072010-01-09 05:30:14 +00002927 .probe = probe_spi_rdid,
2928 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002929 .block_erasers =
2930 {
2931 {
2932 .eraseblocks = {
2933 {32 * 1024, 3},
2934 {16 * 1024, 1},
2935 {8 * 1024, 1},
2936 {4 * 1024, 2},
2937 },
2938 .block_erase = spi_block_erase_d8,
2939 }, {
2940 .eraseblocks = { {128 * 1024, 1} },
2941 .block_erase = spi_block_erase_c7,
2942 }
2943 },
Alan Green6cfd0182019-07-26 13:50:04 +10002944 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00002945 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002946 .write = spi_chip_write_256,
2947 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002948 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002949 },
2950
2951 {
2952 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00002953 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00002954 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002955 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002956 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00002957 .total_size = 2048,
2958 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002959 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00002960 .tested = TEST_UNTESTED,
2961 .probe = probe_spi_rdid,
2962 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002963 .block_erasers =
2964 {
2965 {
2966 .eraseblocks = {
2967 {4 * 1024, 2},
2968 {8 * 1024, 1},
2969 {16 * 1024, 1},
2970 {32 * 1024, 1},
2971 {64 * 1024, 31},
2972 },
2973 .block_erase = spi_block_erase_d8,
2974 }, {
2975 .eraseblocks = { {2 * 1024 * 1024, 1} },
2976 .block_erase = spi_block_erase_c7,
2977 }
2978 },
Alan Green6cfd0182019-07-26 13:50:04 +10002979 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00002980 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002981 .write = spi_chip_write_256,
2982 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002983 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002984 },
2985
2986 {
2987 .vendor = "Eon",
2988 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00002989 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002990 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002991 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00002992 .total_size = 2048,
2993 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002994 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00002995 .tested = TEST_UNTESTED,
2996 .probe = probe_spi_rdid,
2997 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002998 .block_erasers =
2999 {
3000 {
3001 .eraseblocks = {
3002 {64 * 1024, 31},
3003 {32 * 1024, 1},
3004 {16 * 1024, 1},
3005 {8 * 1024, 1},
3006 {4 * 1024, 2},
3007 },
3008 .block_erase = spi_block_erase_d8,
3009 }, {
3010 .eraseblocks = { {2 * 1024 * 1024, 1} },
3011 .block_erase = spi_block_erase_c7,
3012 }
3013 },
Alan Green6cfd0182019-07-26 13:50:04 +10003014 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003015 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003016 .write = spi_chip_write_256,
3017 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003018 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003019 },
3020
3021 {
3022 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003023 .name = "EN25B20",
3024 .bustype = BUS_SPI,
3025 .manufacture_id = EON_ID_NOPREFIX,
3026 .model_id = EON_EN25B20,
3027 .total_size = 256,
3028 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003029 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003030 .tested = TEST_UNTESTED,
3031 .probe = probe_spi_rdid,
3032 .probe_timing = TIMING_ZERO,
3033 .block_erasers =
3034 {
3035 {
3036 .eraseblocks = {
3037 {4 * 1024, 2},
3038 {8 * 1024, 1},
3039 {16 * 1024, 1},
3040 {32 * 1024, 1},
3041 {64 * 1024, 3}
3042 },
3043 .block_erase = spi_block_erase_d8,
3044 }, {
3045 .eraseblocks = { {256 * 1024, 1} },
3046 .block_erase = spi_block_erase_c7,
3047 }
3048 },
Alan Green6cfd0182019-07-26 13:50:04 +10003049 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003050 .unlock = spi_disable_blockprotect,
3051 .write = spi_chip_write_256,
3052 .read = spi_chip_read,
3053 .voltage = {2700, 3600},
3054 },
3055
3056 {
3057 .vendor = "Eon",
3058 .name = "EN25B20T",
3059 .bustype = BUS_SPI,
3060 .manufacture_id = EON_ID_NOPREFIX,
3061 .model_id = EON_EN25B20,
3062 .total_size = 256,
3063 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003064 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003065 .tested = TEST_UNTESTED,
3066 .probe = probe_spi_rdid,
3067 .probe_timing = TIMING_ZERO,
3068 .block_erasers =
3069 {
3070 {
3071 .eraseblocks = {
3072 {64 * 1024, 3},
3073 {32 * 1024, 1},
3074 {16 * 1024, 1},
3075 {8 * 1024, 1},
3076 {4 * 1024, 2},
3077 },
3078 .block_erase = spi_block_erase_d8,
3079 }, {
3080 .eraseblocks = { {256 * 1024, 1} },
3081 .block_erase = spi_block_erase_c7,
3082 }
3083 },
Alan Green6cfd0182019-07-26 13:50:04 +10003084 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003085 .unlock = spi_disable_blockprotect,
3086 .write = spi_chip_write_256,
3087 .read = spi_chip_read,
3088 .voltage = {2700, 3600},
3089 },
3090
3091 {
3092 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003093 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00003094 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003095 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003096 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00003097 .total_size = 4096,
3098 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10003099 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00003100 .tested = TEST_UNTESTED,
3101 .probe = probe_spi_rdid,
3102 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003103 .block_erasers =
3104 {
3105 {
3106 .eraseblocks = {
3107 {4 * 1024, 2},
3108 {8 * 1024, 1},
3109 {16 * 1024, 1},
3110 {32 * 1024, 1},
3111 {64 * 1024, 63},
3112 },
3113 .block_erase = spi_block_erase_d8,
3114 }, {
3115 .eraseblocks = { {4 * 1024 * 1024, 1} },
3116 .block_erase = spi_block_erase_c7,
3117 }
3118 },
Alan Green6cfd0182019-07-26 13:50:04 +10003119 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003120 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003121 .write = spi_chip_write_256,
3122 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003123 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003124 },
3125
3126 {
3127 .vendor = "Eon",
3128 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00003129 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003130 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003131 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00003132 .total_size = 4096,
3133 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10003134 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00003135 .tested = TEST_UNTESTED,
3136 .probe = probe_spi_rdid,
3137 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003138 .block_erasers =
3139 {
3140 {
3141 .eraseblocks = {
3142 {64 * 1024, 63},
3143 {32 * 1024, 1},
3144 {16 * 1024, 1},
3145 {8 * 1024, 1},
3146 {4 * 1024, 2},
3147 },
3148 .block_erase = spi_block_erase_d8,
3149 }, {
3150 .eraseblocks = { {4 * 1024 * 1024, 1} },
3151 .block_erase = spi_block_erase_c7,
3152 }
3153 },
Alan Green6cfd0182019-07-26 13:50:04 +10003154 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003155 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003156 .write = spi_chip_write_256,
3157 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003158 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003159 },
3160
3161 {
3162 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003163 .name = "EN25B40",
3164 .bustype = BUS_SPI,
3165 .manufacture_id = EON_ID_NOPREFIX,
3166 .model_id = EON_EN25B40,
3167 .total_size = 512,
3168 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003169 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003170 .tested = TEST_UNTESTED,
3171 .probe = probe_spi_rdid,
3172 .probe_timing = TIMING_ZERO,
3173 .block_erasers =
3174 {
3175 {
3176 .eraseblocks = {
3177 {4 * 1024, 2},
3178 {8 * 1024, 1},
3179 {16 * 1024, 1},
3180 {32 * 1024, 1},
3181 {64 * 1024, 7}
3182 },
3183 .block_erase = spi_block_erase_d8,
3184 }, {
3185 .eraseblocks = { {512 * 1024, 1} },
3186 .block_erase = spi_block_erase_c7,
3187 }
3188 },
Alan Green6cfd0182019-07-26 13:50:04 +10003189 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003190 .unlock = spi_disable_blockprotect,
3191 .write = spi_chip_write_256,
3192 .read = spi_chip_read,
3193 .voltage = {2700, 3600},
3194 },
3195
3196 {
3197 .vendor = "Eon",
3198 .name = "EN25B40T",
3199 .bustype = BUS_SPI,
3200 .manufacture_id = EON_ID_NOPREFIX,
3201 .model_id = EON_EN25B40,
3202 .total_size = 512,
3203 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003204 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003205 .tested = TEST_UNTESTED,
3206 .probe = probe_spi_rdid,
3207 .probe_timing = TIMING_ZERO,
3208 .block_erasers =
3209 {
3210 {
3211 .eraseblocks = {
3212 {64 * 1024, 7},
3213 {32 * 1024, 1},
3214 {16 * 1024, 1},
3215 {8 * 1024, 1},
3216 {4 * 1024, 2},
3217 },
3218 .block_erase = spi_block_erase_d8,
3219 }, {
3220 .eraseblocks = { {512 * 1024, 1} },
3221 .block_erase = spi_block_erase_c7,
3222 }
3223 },
Alan Green6cfd0182019-07-26 13:50:04 +10003224 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003225 .unlock = spi_disable_blockprotect,
3226 .write = spi_chip_write_256,
3227 .read = spi_chip_read,
3228 .voltage = {2700, 3600},
3229 },
3230
3231 {
3232 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003233 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00003234 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003235 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003236 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00003237 .total_size = 8192,
3238 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10003239 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00003240 .tested = TEST_UNTESTED,
3241 .probe = probe_spi_rdid,
3242 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003243 .block_erasers =
3244 {
3245 {
3246 .eraseblocks = {
3247 {4 * 1024, 2},
3248 {8 * 1024, 1},
3249 {16 * 1024, 1},
3250 {32 * 1024, 1},
3251 {64 * 1024, 127},
3252 },
3253 .block_erase = spi_block_erase_d8,
3254 }, {
3255 .eraseblocks = { {8 * 1024 * 1024, 1} },
3256 .block_erase = spi_block_erase_c7,
3257 }
3258 },
Alan Green6cfd0182019-07-26 13:50:04 +10003259 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003260 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003261 .write = spi_chip_write_256,
3262 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003263 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003264 },
3265
3266 {
3267 .vendor = "Eon",
3268 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00003269 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003270 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003271 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00003272 .total_size = 8192,
3273 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10003274 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00003275 .tested = TEST_UNTESTED,
3276 .probe = probe_spi_rdid,
3277 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003278 .block_erasers =
3279 {
3280 {
3281 .eraseblocks = {
3282 {64 * 1024, 127},
3283 {32 * 1024, 1},
3284 {16 * 1024, 1},
3285 {8 * 1024, 1},
3286 {4 * 1024, 2},
3287 },
3288 .block_erase = spi_block_erase_d8,
3289 }, {
3290 .eraseblocks = { {8 * 1024 * 1024, 1} },
3291 .block_erase = spi_block_erase_c7,
3292 }
3293 },
Alan Green6cfd0182019-07-26 13:50:04 +10003294 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003295 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003296 .write = spi_chip_write_256,
3297 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003298 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003299 },
3300
3301 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003302 .vendor = "Eon",
3303 .name = "EN25B80",
3304 .bustype = BUS_SPI,
3305 .manufacture_id = EON_ID_NOPREFIX,
3306 .model_id = EON_EN25B80,
3307 .total_size = 1024,
3308 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003309 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003310 .tested = TEST_UNTESTED,
3311 .probe = probe_spi_rdid,
3312 .probe_timing = TIMING_ZERO,
3313 .block_erasers =
3314 {
3315 {
3316 .eraseblocks = {
3317 {4 * 1024, 2},
3318 {8 * 1024, 1},
3319 {16 * 1024, 1},
3320 {32 * 1024, 1},
3321 {64 * 1024, 15}
3322 },
3323 .block_erase = spi_block_erase_d8,
3324 }, {
3325 .eraseblocks = { {1024 * 1024, 1} },
3326 .block_erase = spi_block_erase_c7,
3327 }
3328 },
Alan Green6cfd0182019-07-26 13:50:04 +10003329 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003330 .unlock = spi_disable_blockprotect,
3331 .write = spi_chip_write_256,
3332 .read = spi_chip_read,
3333 .voltage = {2700, 3600},
3334 },
3335
3336 {
3337 .vendor = "Eon",
3338 .name = "EN25B80T",
3339 .bustype = BUS_SPI,
3340 .manufacture_id = EON_ID_NOPREFIX,
3341 .model_id = EON_EN25B80,
3342 .total_size = 1024,
3343 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003344 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003345 .tested = TEST_UNTESTED,
3346 .probe = probe_spi_rdid,
3347 .probe_timing = TIMING_ZERO,
3348 .block_erasers =
3349 {
3350 {
3351 .eraseblocks = {
3352 {64 * 1024, 15},
3353 {32 * 1024, 1},
3354 {16 * 1024, 1},
3355 {8 * 1024, 1},
3356 {4 * 1024, 2},
3357 },
3358 .block_erase = spi_block_erase_d8,
3359 }, {
3360 .eraseblocks = { {1024 * 1024, 1} },
3361 .block_erase = spi_block_erase_c7,
3362 }
3363 },
Alan Green6cfd0182019-07-26 13:50:04 +10003364 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003365 .unlock = spi_disable_blockprotect,
3366 .write = spi_chip_write_256,
3367 .read = spi_chip_read,
3368 .voltage = {2700, 3600},
3369 },
3370
3371 {
David Hendrickse185bf22011-05-24 15:34:18 -07003372 /* Note: EN25Q16 is an evil twin which shares the model ID
3373 but has different write protection capabilities */
hailfingerab07cbd2009-06-05 20:53:07 +00003374 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00003375 .name = "EN25D16",
hailfingere1e41ea2011-07-27 07:13:06 +00003376 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003377 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003378 .model_id = EON_EN25D16,
hailfinger77c5d932009-06-15 12:10:57 +00003379 .total_size = 2048,
3380 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003381 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger77c5d932009-06-15 12:10:57 +00003383 .tested = TEST_UNTESTED,
3384 .probe = probe_spi_rdid,
3385 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003386 .block_erasers =
3387 {
3388 {
3389 .eraseblocks = { {4 * 1024, 512} },
3390 .block_erase = spi_block_erase_20,
3391 }, {
3392 .eraseblocks = { {64 * 1024, 32} },
3393 .block_erase = spi_block_erase_d8,
3394 }, {
3395 .eraseblocks = { {64 * 1024, 32} },
3396 .block_erase = spi_block_erase_52,
3397 }, {
3398 .eraseblocks = { {2 * 1024 * 1024, 1} },
3399 .block_erase = spi_block_erase_60,
3400 }, {
3401 .eraseblocks = { {2 * 1024 * 1024, 1} },
3402 .block_erase = spi_block_erase_c7,
3403 }
3404 },
hailfingerb9560ee2010-07-14 20:21:22 +00003405 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003406 .write = spi_chip_write_256,
3407 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003408 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003409 },
3410
3411 {
3412 .vendor = "Eon",
3413 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00003414 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003415 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003416 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00003417 .total_size = 64,
3418 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003419 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10003420 .tested = TEST_OK_PREW,
hailfinger77c5d932009-06-15 12:10:57 +00003421 .probe = probe_spi_rdid,
3422 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003423 .block_erasers =
3424 {
3425 {
3426 .eraseblocks = { {4 * 1024, 16} },
3427 .block_erase = spi_block_erase_20,
3428 }, {
3429 .eraseblocks = { {32 * 1024, 2} },
3430 .block_erase = spi_block_erase_d8,
3431 }, {
3432 .eraseblocks = { {32 * 1024, 2} },
3433 .block_erase = spi_block_erase_52,
3434 }, {
3435 .eraseblocks = { {64 * 1024, 1} },
3436 .block_erase = spi_block_erase_60,
3437 }, {
3438 .eraseblocks = { {64 * 1024, 1} },
3439 .block_erase = spi_block_erase_c7,
3440 }
3441 },
Alan Green6cfd0182019-07-26 13:50:04 +10003442 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003443 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003444 .write = spi_chip_write_256,
3445 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003446 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003447 },
3448
3449 {
3450 .vendor = "Eon",
3451 .name = "EN25F10",
hailfingere1e41ea2011-07-27 07:13:06 +00003452 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003453 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003454 .model_id = EON_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00003455 .total_size = 128,
3456 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003457 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00003458 .tested = TEST_UNTESTED,
3459 .probe = probe_spi_rdid,
3460 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003461 .block_erasers =
3462 {
3463 {
3464 .eraseblocks = { {4 * 1024, 32} },
3465 .block_erase = spi_block_erase_20,
3466 }, {
3467 .eraseblocks = { {32 * 1024, 4} },
3468 .block_erase = spi_block_erase_d8,
3469 }, {
3470 .eraseblocks = { {32 * 1024, 4} },
3471 .block_erase = spi_block_erase_52,
3472 }, {
3473 .eraseblocks = { {128 * 1024, 1} },
3474 .block_erase = spi_block_erase_60,
3475 }, {
3476 .eraseblocks = { {128 * 1024, 1} },
3477 .block_erase = spi_block_erase_c7,
3478 }
3479 },
Alan Green6cfd0182019-07-26 13:50:04 +10003480 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003481 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003482 .write = spi_chip_write_256,
3483 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003484 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003485 },
3486
3487 {
3488 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003489 .name = "EN25F16",
3490 .bustype = BUS_SPI,
3491 .manufacture_id = EON_ID_NOPREFIX,
3492 .model_id = EON_EN25F16,
3493 .total_size = 2048,
3494 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003495 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10003496 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10003497 .probe = probe_spi_rdid,
3498 .probe_timing = TIMING_ZERO,
3499 .block_erasers =
3500 {
3501 {
3502 .eraseblocks = { {4 * 1024, 512} },
3503 .block_erase = spi_block_erase_20,
3504 }, {
3505 .eraseblocks = { {64 * 1024, 32} },
3506 .block_erase = spi_block_erase_d8,
3507 }, {
3508 .eraseblocks = { {2 * 1024 * 1024, 1} },
3509 .block_erase = spi_block_erase_60,
3510 }, {
3511 .eraseblocks = { {2 * 1024 * 1024, 1} },
3512 .block_erase = spi_block_erase_c7,
3513 }
3514 },
Alan Green6cfd0182019-07-26 13:50:04 +10003515 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003516 .unlock = spi_disable_blockprotect,
3517 .write = spi_chip_write_256,
3518 .read = spi_chip_read,
3519 .voltage = {2700, 3600},
3520 },
3521
3522 {
3523 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00003524 .name = "EN25F20",
hailfingere1e41ea2011-07-27 07:13:06 +00003525 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003526 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003527 .model_id = EON_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00003528 .total_size = 256,
3529 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003530 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00003531 .tested = TEST_UNTESTED,
3532 .probe = probe_spi_rdid,
3533 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003534 .block_erasers =
3535 {
3536 {
3537 .eraseblocks = { {4 * 1024, 64} },
3538 .block_erase = spi_block_erase_20,
3539 }, {
3540 .eraseblocks = { {64 * 1024, 4} },
3541 .block_erase = spi_block_erase_d8,
3542 }, {
3543 .eraseblocks = { {64 * 1024, 4} },
3544 .block_erase = spi_block_erase_52,
3545 }, {
3546 .eraseblocks = { {256 * 1024, 1} },
3547 .block_erase = spi_block_erase_60,
3548 }, {
3549 .eraseblocks = { {256 * 1024, 1} },
3550 .block_erase = spi_block_erase_c7,
3551 }
3552 },
Alan Green6cfd0182019-07-26 13:50:04 +10003553 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003554 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003555 .write = spi_chip_write_256,
3556 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003557 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003558 },
3559
3560 {
3561 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003562 .name = "EN25F32",
3563 .bustype = BUS_SPI,
3564 .manufacture_id = EON_ID_NOPREFIX,
3565 .model_id = EON_EN25F32,
3566 .total_size = 4096,
3567 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003568 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10003569 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10003570 .probe = probe_spi_rdid,
3571 .probe_timing = TIMING_ZERO,
3572 .block_erasers =
3573 {
3574 {
3575 .eraseblocks = { {4 * 1024, 1024} },
3576 .block_erase = spi_block_erase_20,
3577 }, {
3578 .eraseblocks = { {64 * 1024, 64} },
3579 .block_erase = spi_block_erase_d8,
3580 }, {
3581 .eraseblocks = { {4 * 1024 * 1024, 1} },
3582 .block_erase = spi_block_erase_60,
3583 }, {
3584 .eraseblocks = { {4 * 1024 * 1024, 1} },
3585 .block_erase = spi_block_erase_c7,
3586 }
3587 },
Alan Green6cfd0182019-07-26 13:50:04 +10003588 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003589 .unlock = spi_disable_blockprotect,
3590 .write = spi_chip_write_256,
3591 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10003592 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10003593 },
3594
3595 {
3596 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003597 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00003598 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003599 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003600 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00003601 .total_size = 512,
3602 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003603 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10003604 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00003605 .probe = probe_spi_rdid,
3606 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00003607 .block_erasers =
3608 {
3609 {
snelson2d471072010-01-09 05:30:14 +00003610 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00003611 .block_erase = spi_block_erase_20,
3612 }, {
snelson2d471072010-01-09 05:30:14 +00003613 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00003614 .block_erase = spi_block_erase_d8,
3615 }, {
snelson2d471072010-01-09 05:30:14 +00003616 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003617 .block_erase = spi_block_erase_60,
3618 }, {
snelson2d471072010-01-09 05:30:14 +00003619 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003620 .block_erase = spi_block_erase_c7,
3621 },
3622 },
Alan Green6cfd0182019-07-26 13:50:04 +10003623 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003624 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003625 .write = spi_chip_write_256,
3626 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003627 .voltage = {2700, 3600},
Louis Yung-Chieh Lod6572b32011-05-24 16:28:27 +08003628 .wp = &wp_w25,
hailfingerab07cbd2009-06-05 20:53:07 +00003629 },
3630
3631 {
3632 .vendor = "Eon",
3633 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00003634 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003635 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003636 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00003637 .total_size = 1024,
3638 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10003639 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10003640 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00003641 .probe = probe_spi_rdid,
3642 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003643 .block_erasers =
3644 {
3645 {
3646 .eraseblocks = { {4 * 1024, 256} },
3647 .block_erase = spi_block_erase_20,
3648 }, {
3649 .eraseblocks = { {64 * 1024, 16} },
3650 .block_erase = spi_block_erase_d8,
3651 }, {
3652 .eraseblocks = { {1024 * 1024, 1} },
3653 .block_erase = spi_block_erase_60,
3654 }, {
3655 .eraseblocks = { {1024 * 1024, 1} },
3656 .block_erase = spi_block_erase_c7,
3657 }
3658 },
Alan Green6cfd0182019-07-26 13:50:04 +10003659 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003660 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003661 .write = spi_chip_write_256,
3662 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003663 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003664 },
3665
3666 {
3667 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003668 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003669 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003670 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10003671 .model_id = EON_EN25Q128,
3672 .total_size = 16384,
hailfinger77c5d932009-06-15 12:10:57 +00003673 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10003674 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003675 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greene3e4fb82019-09-09 16:28:33 +10003676 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07003677 .probe = probe_spi_rdid,
3678 .probe_timing = TIMING_ZERO,
3679 .block_erasers =
3680 {
3681 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003682 .eraseblocks = { {4 * 1024, 4096} },
David Hendrickse185bf22011-05-24 15:34:18 -07003683 .block_erase = spi_block_erase_20,
3684 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003685 .eraseblocks = { {64 * 1024, 256} },
David Hendrickse185bf22011-05-24 15:34:18 -07003686 .block_erase = spi_block_erase_d8,
3687 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003688 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003689 .block_erase = spi_block_erase_60,
3690 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003691 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003692 .block_erase = spi_block_erase_c7,
3693 }
3694 },
Alan Green6cfd0182019-07-26 13:50:04 +10003695 .printlock = spi_prettyprint_status_register_plain,
David Hendrickse185bf22011-05-24 15:34:18 -07003696 .unlock = spi_disable_blockprotect,
3697 .write = spi_chip_write_256,
3698 .read = spi_chip_read,
David Hendrickse185bf22011-05-24 15:34:18 -07003699 .wp = &wp_w25,
3700 },
3701
3702 {
3703 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003704 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003705 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003706 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10003707 .model_id = EON_EN25Q32,
3708 .total_size = 4096,
David Hendrickse185bf22011-05-24 15:34:18 -07003709 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10003710 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003711 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10003712 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07003713 .probe = probe_spi_rdid,
3714 .probe_timing = TIMING_ZERO,
3715 .block_erasers =
3716 {
3717 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003718 .eraseblocks = { {4 * 1024, 1024} },
David Hendrickse185bf22011-05-24 15:34:18 -07003719 .block_erase = spi_block_erase_20,
3720 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003721 .eraseblocks = { {64 * 1024, 64} },
David Hendrickse185bf22011-05-24 15:34:18 -07003722 .block_erase = spi_block_erase_d8,
3723 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003724 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003725 .block_erase = spi_block_erase_60,
3726 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003727 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003728 .block_erase = spi_block_erase_c7,
3729 }
3730 },
Alan Green6cfd0182019-07-26 13:50:04 +10003731 .printlock = spi_prettyprint_status_register_plain,
David Hendrickse185bf22011-05-24 15:34:18 -07003732 .unlock = spi_disable_blockprotect,
3733 .write = spi_chip_write_256,
3734 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10003735 .voltage = {2700, 3600},
David Hendrickse185bf22011-05-24 15:34:18 -07003736 .wp = &wp_w25,
hailfinger77c5d932009-06-15 12:10:57 +00003737 },
3738
3739 {
snelson2b18d0f2010-03-05 08:44:11 +00003740 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00003741 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003742 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003743 .manufacture_id = EON_ID_NOPREFIX,
3744 .model_id = EON_EN25Q40,
3745 .total_size = 512,
3746 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003747 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003749 .tested = TEST_UNTESTED,
3750 .probe = probe_spi_rdid,
3751 .probe_timing = TIMING_ZERO,
3752 .block_erasers =
3753 {
3754 {
3755 .eraseblocks = { {4 * 1024, 128} },
3756 .block_erase = spi_block_erase_20,
3757 }, {
3758 .eraseblocks = { {64 * 1024, 8} },
3759 .block_erase = spi_block_erase_d8,
3760 }, {
3761 .eraseblocks = { {512 * 1024, 1} },
3762 .block_erase = spi_block_erase_60,
3763 }, {
3764 .eraseblocks = { {512 * 1024, 1} },
3765 .block_erase = spi_block_erase_c7,
3766 }
3767 },
Alan Green6cfd0182019-07-26 13:50:04 +10003768 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00003769 .unlock = spi_disable_blockprotect,
3770 .write = spi_chip_write_256,
3771 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003772 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10003773 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00003774 },
3775
3776 {
3777 .vendor = "Eon",
3778 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003779 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003780 .manufacture_id = EON_ID_NOPREFIX,
3781 .model_id = EON_EN25Q64,
3782 .total_size = 8192,
3783 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003784 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003785 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10003786 .tested = TEST_OK_PREW,
stefanct5d10cff2011-07-24 22:21:57 +00003787 .probe = probe_spi_rdid,
3788 .probe_timing = TIMING_ZERO,
3789 .block_erasers =
3790 {
3791 {
3792 .eraseblocks = { {4 * 1024, 2048} },
3793 .block_erase = spi_block_erase_20,
3794 }, {
3795 .eraseblocks = { {64 * 1024, 128} },
3796 .block_erase = spi_block_erase_d8,
3797 }, {
3798 .eraseblocks = { {8 * 1024 * 1024, 1} },
3799 .block_erase = spi_block_erase_60,
3800 }, {
3801 .eraseblocks = { {8 * 1024 * 1024, 1} },
3802 .block_erase = spi_block_erase_c7,
3803 }
3804 },
Alan Green6cfd0182019-07-26 13:50:04 +10003805 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00003806 .unlock = spi_disable_blockprotect,
3807 .write = spi_chip_write_256,
3808 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003809 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10003810 .wp = &wp_w25,
3811 },
3812
3813 {
3814 .vendor = "Eon",
3815 .name = "EN25Q80(A)",
3816 .bustype = BUS_SPI,
3817 .manufacture_id = EON_ID_NOPREFIX,
3818 .model_id = EON_EN25Q80,
3819 .total_size = 1024,
3820 .page_size = 256,
3821 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003822 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003823 .tested = TEST_UNTESTED,
3824 .probe = probe_spi_rdid,
3825 .probe_timing = TIMING_ZERO,
3826 .block_erasers =
3827 {
3828 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003829 .eraseblocks = { {4 * 1024, 256} },
stefanct5d10cff2011-07-24 22:21:57 +00003830 .block_erase = spi_block_erase_20,
3831 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003832 .eraseblocks = { {64 * 1024, 16} },
stefanct5d10cff2011-07-24 22:21:57 +00003833 .block_erase = spi_block_erase_d8,
3834 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003835 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00003836 .block_erase = spi_block_erase_60,
3837 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003838 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00003839 .block_erase = spi_block_erase_c7,
3840 }
3841 },
Alan Green6cfd0182019-07-26 13:50:04 +10003842 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00003843 .unlock = spi_disable_blockprotect,
3844 .write = spi_chip_write_256,
3845 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10003846 .voltage = {2700, 3600},
Alan Green35299002019-06-25 16:14:02 +10003847 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00003848 },
3849
3850 {
3851 .vendor = "Eon",
3852 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00003853 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003854 .manufacture_id = EON_ID_NOPREFIX,
3855 .model_id = EON_EN25QH16,
3856 .total_size = 2048,
3857 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003858 /* supports SFDP */
3859 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003861 .tested = TEST_UNTESTED,
3862 .probe = probe_spi_rdid,
3863 .probe_timing = TIMING_ZERO,
3864 .block_erasers =
3865 {
3866 {
3867 .eraseblocks = { {4 * 1024, 512} },
3868 .block_erase = spi_block_erase_20,
3869 }, {
3870 .eraseblocks = { {64 * 1024, 32} },
3871 .block_erase = spi_block_erase_d8,
3872 }, {
3873 .eraseblocks = { {1024 * 2048, 1} },
3874 .block_erase = spi_block_erase_60,
3875 }, {
3876 .eraseblocks = { {1024 * 2048, 1} },
3877 .block_erase = spi_block_erase_c7,
3878 }
3879 },
Alan Green6cfd0182019-07-26 13:50:04 +10003880 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00003881 .unlock = spi_disable_blockprotect,
3882 .write = spi_chip_write_256,
3883 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003884 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00003885 },
Alan Greena7cfa332019-06-24 15:48:14 +10003886
Marc Jonesb2f90022014-04-29 17:37:23 -06003887 {
3888 .vendor = "Eon",
3889 .name = "EN25S64",
3890 .bustype = BUS_SPI,
3891 .manufacture_id = EON_ID_NOPREFIX,
3892 .model_id = EON_EN25S64,
3893 .total_size = 8192,
3894 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003895 /* FIXME: add FEATURE_QPI removed */
Marc Jonesb2f90022014-04-29 17:37:23 -06003896 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10003897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10003898 .tested = TEST_OK_PREW,
Marc Jonesb2f90022014-04-29 17:37:23 -06003899 .probe = probe_spi_rdid,
3900 .probe_timing = TIMING_ZERO,
Alan Greena7cfa332019-06-24 15:48:14 +10003901 .block_erasers =
3902 {
Marc Jonesb2f90022014-04-29 17:37:23 -06003903 {
3904 .eraseblocks = { {4 * 1024, 2048} },
3905 .block_erase = spi_block_erase_20,
3906 }, {
3907 .eraseblocks = { {64 * 1024, 128} },
3908 .block_erase = spi_block_erase_d8,
3909 }, {
3910 .eraseblocks = { {8192 * 1024, 1} },
3911 .block_erase = spi_block_erase_60,
3912 }, {
3913 .eraseblocks = { {8192 * 1024, 1} },
3914 .block_erase = spi_block_erase_c7,
3915 }
3916 },
3917 .unlock = spi_disable_blockprotect,
3918 .write = spi_chip_write_256,
3919 .read = spi_chip_read,
3920 .voltage = {1650, 1950},
Marc Jones51c8a162014-05-06 15:02:14 -06003921 .wp = &wp_w25,
Marc Jonesb2f90022014-04-29 17:37:23 -06003922 },
stefanct5d10cff2011-07-24 22:21:57 +00003923
3924 {
3925 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00003926 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00003927 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003928 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003929 .model_id = EON_EN29F002B,
hailfinger286829b2009-01-08 03:40:17 +00003930 .total_size = 256,
3931 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003932 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00003933 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00003934 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003935 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003936 .block_erasers =
3937 {
3938 {
Simon Glass8dc82732013-07-16 10:13:51 -06003939 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003940 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00003941 {8 * 1024, 2},
3942 {32 * 1024, 1},
3943 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00003944 },
3945 .block_erase = erase_sector_jedec,
3946 }, {
3947 .eraseblocks = { {256 * 1024, 1} },
3948 .block_erase = erase_chip_block_jedec,
3949 },
3950 },
hailfingerfff99532009-11-27 17:49:42 +00003951 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003952 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003953 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003954 },
3955
hailfinger286829b2009-01-08 03:40:17 +00003956 {
hailfinger61958912010-07-28 22:20:20 +00003957 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00003958 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003959 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003960 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003961 .model_id = EON_EN29F002T,
hailfinger286829b2009-01-08 03:40:17 +00003962 .total_size = 256,
3963 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003964 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10003965 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00003966 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003967 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003968 .block_erasers =
3969 {
3970 {
Simon Glass8dc82732013-07-16 10:13:51 -06003971 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003972 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00003973 {32 * 1024, 1},
3974 {8 * 1024, 2},
3975 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00003976 },
3977 .block_erase = erase_sector_jedec,
3978 }, {
3979 .eraseblocks = { {256 * 1024, 1} },
3980 .block_erase = erase_chip_block_jedec,
3981 },
3982 },
hailfingerfff99532009-11-27 17:49:42 +00003983 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003984 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003985 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003986 },
3987
hailfinger286829b2009-01-08 03:40:17 +00003988 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003989 .vendor = "Eon",
3990 .name = "EN29F010",
3991 .bustype = BUS_PARALLEL,
3992 .manufacture_id = EON_ID,
3993 .model_id = EON_EN29F010,
3994 .total_size = 128,
3995 .page_size = 128,
3996 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3997 .tested = TEST_OK_PRE,
3998 .probe = probe_jedec,
3999 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4000 .block_erasers =
4001 {
4002 {
4003 .eraseblocks = { {16 * 1024, 8} },
4004 .block_erase = erase_sector_jedec,
4005 },
4006 {
4007 .eraseblocks = { {128 * 1024, 1} },
4008 .block_erase = erase_chip_block_jedec,
4009 },
4010 },
4011 .write = write_jedec_1,
4012 .read = read_memmapped,
4013 .voltage = {4500, 5500},
4014 },
4015
4016 {
hailfinger286829b2009-01-08 03:40:17 +00004017 .vendor = "Fujitsu",
4018 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00004019 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00004020 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004021 .model_id = FUJITSU_MBM29F004BC,
hailfinger286829b2009-01-08 03:40:17 +00004022 .total_size = 512,
4023 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00004024 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00004025 .tested = TEST_UNTESTED,
4026 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004027 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00004028 .block_erasers =
4029 {
4030 {
Simon Glass8dc82732013-07-16 10:13:51 -06004031 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004032 {16 * 1024, 1},
4033 {8 * 1024, 2},
4034 {32 * 1024, 1},
4035 {64 * 1024, 7},
4036 },
snelsonc6855342010-01-28 23:55:12 +00004037 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004038 }, {
4039 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00004040 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004041 },
4042 },
hailfinger286829b2009-01-08 03:40:17 +00004043 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00004044 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004045 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00004046 },
4047
hailfinger286829b2009-01-08 03:40:17 +00004048 {
4049 .vendor = "Fujitsu",
4050 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00004051 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00004052 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004053 .model_id = FUJITSU_MBM29F004TC,
hailfinger286829b2009-01-08 03:40:17 +00004054 .total_size = 512,
4055 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00004056 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00004057 .tested = TEST_UNTESTED,
4058 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004059 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00004060 .block_erasers =
4061 {
4062 {
Simon Glass8dc82732013-07-16 10:13:51 -06004063 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004064 {64 * 1024, 7},
4065 {32 * 1024, 1},
4066 {8 * 1024, 2},
4067 {16 * 1024, 1},
4068 },
snelsonc6855342010-01-28 23:55:12 +00004069 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004070 }, {
4071 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00004072 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004073 },
4074 },
hailfinger286829b2009-01-08 03:40:17 +00004075 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00004076 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004077 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00004078 },
4079
hailfinger286829b2009-01-08 03:40:17 +00004080 {
snelsonc6855342010-01-28 23:55:12 +00004081 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00004082 .vendor = "Fujitsu",
4083 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00004084 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00004085 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004086 .model_id = FUJITSU_MBM29F400BC,
hailfinger286829b2009-01-08 03:40:17 +00004087 .total_size = 512,
4088 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10004089 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00004090 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10004091 .probe = probe_jedec,
4092 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
snelson1c03aa12009-12-23 17:05:59 +00004093 .block_erasers =
4094 {
4095 {
Simon Glass8dc82732013-07-16 10:13:51 -06004096 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00004097 {16 * 1024, 1},
4098 {8 * 1024, 2},
4099 {32 * 1024, 1},
4100 {64 * 1024, 7},
4101 },
Alan Green607cc632019-09-16 16:09:32 +10004102 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004103 }, {
4104 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10004105 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00004106 },
4107 },
Alan Green607cc632019-09-16 16:09:32 +10004108 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00004109 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004110 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00004111 },
4112
hailfinger286829b2009-01-08 03:40:17 +00004113 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004114 .vendor = "Fujitsu",
4115 .name = "MBM29F400TC",
4116 .bustype = BUS_PARALLEL,
4117 .manufacture_id = FUJITSU_ID,
4118 .model_id = FUJITSU_MBM29F400TC,
4119 .total_size = 512,
4120 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10004121 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004122 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10004123 .probe = probe_jedec,
4124 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004125 .block_erasers =
4126 {
4127 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004128 .eraseblocks = {
4129 {64 * 1024, 7},
4130 {32 * 1024, 1},
4131 {8 * 1024, 2},
4132 {16 * 1024, 1},
4133 },
Alan Green607cc632019-09-16 16:09:32 +10004134 .block_erase = erase_sector_jedec,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004135 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004136 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10004137 .block_erase = erase_chip_block_jedec,
Alan Greend76dc1f2019-06-26 15:38:19 +10004138 },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004139 },
Alan Green607cc632019-09-16 16:09:32 +10004140 .write = write_jedec_1,
Alan Greend76dc1f2019-06-26 15:38:19 +10004141 .read = read_memmapped,
4142 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004143 },
4144
4145 {
4146 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10004147 .name = "GD25LQ128C/GD25LQ128D",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004148 .bustype = BUS_SPI,
4149 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004150 .model_id = GIGADEVICE_GD25LQ128CD,
4151 .total_size = 16384,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004152 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004153 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004154 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004155 .probe = probe_spi_rdid,
4156 .probe_timing = TIMING_ZERO,
4157 .block_erasers =
4158 {
4159 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004160 .eraseblocks = { {4 * 1024, 4096} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004161 .block_erase = spi_block_erase_20,
4162 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004163 .eraseblocks = { {32 * 1024, 512} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004164 .block_erase = spi_block_erase_52,
4165 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004166 .eraseblocks = { {64 * 1024, 256} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004167 .block_erase = spi_block_erase_d8,
4168 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004169 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004170 .block_erase = spi_block_erase_60,
4171 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004172 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004173 .block_erase = spi_block_erase_c7,
4174 }
4175 },
4176 .unlock = spi_disable_blockprotect,
4177 .write = spi_chip_write_256,
4178 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004179 .voltage = {1695, 1950},
Alan Greend76dc1f2019-06-26 15:38:19 +10004180 .wp = &wp_generic,
4181 },
4182
4183 {
4184 .vendor = "GigaDevice",
4185 .name = "GD25LQ32",
4186 .bustype = BUS_SPI,
4187 .manufacture_id = GIGADEVICE_ID,
4188 .model_id = GIGADEVICE_GD25LQ32,
4189 .total_size = 4096,
4190 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004191 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004192 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10004193 .probe = probe_spi_rdid,
4194 .probe_timing = TIMING_ZERO,
4195 .block_erasers =
4196 {
4197 {
4198 .eraseblocks = { {4 * 1024, 1024} },
4199 .block_erase = spi_block_erase_20,
4200 }, {
4201 .eraseblocks = { {32 * 1024, 128} },
4202 .block_erase = spi_block_erase_52,
4203 }, {
4204 .eraseblocks = { {64 * 1024, 64} },
4205 .block_erase = spi_block_erase_d8,
4206 }, {
4207 .eraseblocks = { {4 * 1024 * 1024, 1} },
4208 .block_erase = spi_block_erase_60,
4209 }, {
4210 .eraseblocks = { {4 * 1024 * 1024, 1} },
4211 .block_erase = spi_block_erase_c7,
4212 }
4213 },
4214 .unlock = spi_disable_blockprotect,
4215 .write = spi_chip_write_256,
4216 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004217 .voltage = {1695, 1950},
Alan Greend76dc1f2019-06-26 15:38:19 +10004218 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004219 },
4220
4221 {
4222 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07004223 .name = "GD25LQ40",
4224 .bustype = BUS_SPI,
4225 .manufacture_id = GIGADEVICE_ID,
4226 .model_id = GIGADEVICE_GD25LQ40,
4227 .total_size = 512,
4228 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004229 .feature_bits = FEATURE_WRSR_WREN,
David Schneider59543cd2016-04-27 02:11:00 -07004230 .tested = TEST_UNTESTED,
4231 .probe = probe_spi_rdid,
4232 .probe_timing = TIMING_ZERO,
4233 .block_erasers =
4234 {
4235 {
4236 .eraseblocks = { {4 * 1024, 128} },
4237 .block_erase = spi_block_erase_20,
4238 }, {
4239 .eraseblocks = { {32 * 1024, 16} },
4240 .block_erase = spi_block_erase_52,
4241 }, {
4242 .eraseblocks = { {64 * 1024, 8} },
4243 .block_erase = spi_block_erase_d8,
4244 }, {
4245 .eraseblocks = { {512 * 1024, 1} },
4246 .block_erase = spi_block_erase_60,
4247 }, {
4248 .eraseblocks = { {512 * 1024, 1} },
4249 .block_erase = spi_block_erase_c7,
4250 }
4251 },
4252 .unlock = spi_disable_blockprotect,
4253 .write = spi_chip_write_256,
4254 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004255 .voltage = {1695, 1950},
David Schneider59543cd2016-04-27 02:11:00 -07004256 },
4257
4258 {
4259 .vendor = "GigaDevice",
Alan Green78d8f702019-08-06 16:46:42 +10004260 .name = "GD25LQ64(B)",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004261 .bustype = BUS_SPI,
4262 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004263 .model_id = GIGADEVICE_GD25LQ64,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004264 .total_size = 8192,
4265 .page_size = 256,
Alan Green78d8f702019-08-06 16:46:42 +10004266 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004267 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10004268 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004269 .probe = probe_spi_rdid,
4270 .probe_timing = TIMING_ZERO,
4271 .block_erasers =
4272 {
4273 {
4274 .eraseblocks = { {4 * 1024, 2048} },
4275 .block_erase = spi_block_erase_20,
4276 }, {
4277 .eraseblocks = { {32 * 1024, 256} },
4278 .block_erase = spi_block_erase_52,
4279 }, {
4280 .eraseblocks = { {64 * 1024, 128} },
4281 .block_erase = spi_block_erase_d8,
4282 }, {
4283 .eraseblocks = { {8 * 1024 * 1024, 1} },
4284 .block_erase = spi_block_erase_60,
4285 }, {
4286 .eraseblocks = { {8 * 1024 * 1024, 1} },
4287 .block_erase = spi_block_erase_c7,
4288 }
4289 },
Alan Green78d8f702019-08-06 16:46:42 +10004290 .printlock = spi_prettyprint_status_register_bp4_srwd,
4291 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004292 .write = spi_chip_write_256,
Alan Green78d8f702019-08-06 16:46:42 +10004293 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
4294 .voltage = {1695, 1950},
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004295 .wp = &wp_w25,
4296 },
4297
4298 {
David Hendricksf5c122d2016-03-14 15:46:04 -07004299 /*
Stefan Tauner9816fc82016-08-12 15:47:49 -07004300 * TODO: There is a GD25Q128B without QPI support which can
4301 * be differentiated using SFDP, but for now we only care
4302 * about the GD25Q128C.
David Hendricksf5c122d2016-03-14 15:46:04 -07004303 */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004304 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06004305 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004306 .bustype = BUS_SPI,
4307 .manufacture_id = GIGADEVICE_ID,
4308 .model_id = GIGADEVICE_GD25Q128,
4309 .total_size = 16384,
4310 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004311 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004312 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10004313 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004314 .probe = probe_spi_rdid,
4315 .probe_timing = TIMING_ZERO,
4316 .block_erasers =
4317 {
4318 {
4319 .eraseblocks = { {4 * 1024, 4096} },
4320 .block_erase = spi_block_erase_20,
4321 }, {
4322 .eraseblocks = { {32 * 1024, 512} },
4323 .block_erase = spi_block_erase_52,
4324 }, {
4325 .eraseblocks = { {64 * 1024, 256} },
4326 .block_erase = spi_block_erase_d8,
4327 }, {
4328 .eraseblocks = { {16 * 1024 * 1024, 1} },
4329 .block_erase = spi_block_erase_60,
4330 }, {
4331 .eraseblocks = { {16 * 1024 * 1024, 1} },
4332 .block_erase = spi_block_erase_c7,
4333 }
4334 },
4335 .unlock = spi_disable_blockprotect,
4336 .write = spi_chip_write_256,
4337 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004338 .voltage = {2700, 3600},
Martin Roth95785bd2017-05-09 23:47:20 -06004339 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004340 },
4341
4342 {
Duncan Laurie0c383552019-03-16 12:35:16 -07004343 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004344 .name = "GD25Q16(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10004345 .bustype = BUS_SPI,
4346 .manufacture_id = GIGADEVICE_ID,
4347 .model_id = GIGADEVICE_GD25Q16,
4348 .total_size = 2048,
4349 .page_size = 256,
4350 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004351 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greend76dc1f2019-06-26 15:38:19 +10004352 .tested = TEST_UNTESTED,
4353 .probe = probe_spi_rdid,
4354 .probe_timing = TIMING_ZERO,
4355 .block_erasers =
4356 {
4357 {
4358 .eraseblocks = { {4 * 1024, 512} },
4359 .block_erase = spi_block_erase_20,
4360 }, {
4361 .eraseblocks = { {32 * 1024, 64} },
4362 .block_erase = spi_block_erase_52,
4363 }, {
4364 .eraseblocks = { {64 * 1024, 32} },
4365 .block_erase = spi_block_erase_d8,
4366 }, {
4367 .eraseblocks = { {2 * 1024 * 1024, 1} },
4368 .block_erase = spi_block_erase_60,
4369 }, {
4370 .eraseblocks = { {2 * 1024 * 1024, 1} },
4371 .block_erase = spi_block_erase_c7,
4372 }
4373 },
4374 .unlock = spi_disable_blockprotect,
4375 .write = spi_chip_write_256,
4376 .read = spi_chip_read,
4377 .voltage = {2700, 3600},
4378 },
4379
4380 {
4381 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004382 .name = "GD25Q20(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10004383 .bustype = BUS_SPI,
4384 .manufacture_id = GIGADEVICE_ID,
4385 .model_id = GIGADEVICE_GD25Q20,
4386 .total_size = 256,
4387 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004388 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004389 .tested = TEST_UNTESTED,
4390 .probe = probe_spi_rdid,
4391 .probe_timing = TIMING_ZERO,
4392 .block_erasers =
4393 {
4394 {
4395 .eraseblocks = { {4 * 1024, 64} },
4396 .block_erase = spi_block_erase_20,
4397 }, {
4398 .eraseblocks = { {32 * 1024, 8} },
4399 .block_erase = spi_block_erase_52,
4400 }, {
4401 .eraseblocks = { {64 * 1024, 4} },
4402 .block_erase = spi_block_erase_d8,
4403 }, {
4404 .eraseblocks = { {256 * 1024, 1} },
4405 .block_erase = spi_block_erase_60,
4406 }, {
4407 .eraseblocks = { {256 * 1024, 1} },
4408 .block_erase = spi_block_erase_c7,
4409 }
4410 },
4411 .unlock = spi_disable_blockprotect,
4412 .write = spi_chip_write_256,
4413 .read = spi_chip_read,
4414 .voltage = {2700, 3600},
4415 },
4416
4417 {
4418 .vendor = "GigaDevice",
Duncan Laurie0c383552019-03-16 12:35:16 -07004419 .name = "GD25Q256D",
4420 .bustype = BUS_SPI,
4421 .manufacture_id = GIGADEVICE_ID,
4422 .model_id = GIGADEVICE_GD25Q256D,
4423 .total_size = 32768,
4424 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004425 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004426 .tested = TEST_OK_PREW,
Duncan Laurie0c383552019-03-16 12:35:16 -07004427 .probe = probe_spi_rdid,
4428 .probe_timing = TIMING_ZERO,
4429 .block_erasers =
4430 {
4431 {
4432 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004433 .block_erase = spi_block_erase_20,
Duncan Laurie0c383552019-03-16 12:35:16 -07004434 }, {
4435 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004436 .block_erase = spi_block_erase_52,
Duncan Laurie0c383552019-03-16 12:35:16 -07004437 }, {
4438 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004439 .block_erase = spi_block_erase_d8,
Duncan Laurie0c383552019-03-16 12:35:16 -07004440 }, {
4441 .eraseblocks = { {32 * 1024 * 1024, 1} },
4442 .block_erase = spi_block_erase_60,
4443 }, {
4444 .eraseblocks = { {32 * 1024 * 1024, 1} },
4445 .block_erase = spi_block_erase_c7,
4446 }
4447 },
4448 .unlock = spi_disable_blockprotect,
4449 .write = spi_chip_write_256,
4450 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004451 .set_4ba = spi_enter_4ba_b7_we,
Duncan Laurie0c383552019-03-16 12:35:16 -07004452 .voltage = {2700, 3600},
4453 .wp = &wp_w25q_large,
4454 },
4455
4456 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07004457 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004458 .name = "GD25Q32(B)",
Bryan Freed9a0051f2012-05-22 16:06:09 -07004459 .bustype = BUS_SPI,
4460 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004461 .model_id = GIGADEVICE_GD25Q32,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004462 .total_size = 4096,
4463 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004464 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004465 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10004466 .tested = TEST_OK_PREW,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004467 .probe = probe_spi_rdid,
4468 .probe_timing = TIMING_ZERO,
4469 .block_erasers =
4470 {
4471 {
4472 .eraseblocks = { {4 * 1024, 1024} },
4473 .block_erase = spi_block_erase_20,
4474 }, {
4475 .eraseblocks = { {32 * 1024, 128} },
4476 .block_erase = spi_block_erase_52,
4477 }, {
4478 .eraseblocks = { {64 * 1024, 64} },
4479 .block_erase = spi_block_erase_d8,
4480 }, {
4481 .eraseblocks = { {4 * 1024 * 1024, 1} },
4482 .block_erase = spi_block_erase_60,
4483 }, {
4484 .eraseblocks = { {4 * 1024 * 1024, 1} },
4485 .block_erase = spi_block_erase_c7,
4486 }
4487 },
4488 .unlock = spi_disable_blockprotect,
4489 .write = spi_chip_write_256,
4490 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10004491 .voltage = {2700, 3600},
4492 .wp = &wp_generic,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004493 },
4494
4495 {
Alan Green753a38e2019-06-07 14:44:32 +10004496 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004497 .name = "GD25Q40(B)",
Alan Green753a38e2019-06-07 14:44:32 +10004498 .bustype = BUS_SPI,
4499 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004500 .model_id = GIGADEVICE_GD25Q40,
4501 .total_size = 512,
4502 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004503 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004504 .tested = TEST_UNTESTED,
4505 .probe = probe_spi_rdid,
4506 .probe_timing = TIMING_ZERO,
4507 .block_erasers =
4508 {
4509 {
4510 .eraseblocks = { {4 * 1024, 128} },
4511 .block_erase = spi_block_erase_20,
4512 }, {
4513 .eraseblocks = { {32 * 1024, 16} },
4514 .block_erase = spi_block_erase_52,
4515 }, {
4516 .eraseblocks = { {64 * 1024, 8} },
4517 .block_erase = spi_block_erase_d8,
4518 }, {
4519 .eraseblocks = { {512 * 1024, 1} },
4520 .block_erase = spi_block_erase_60,
4521 }, {
4522 .eraseblocks = { {512 * 1024, 1} },
4523 .block_erase = spi_block_erase_c7,
4524 }
4525 },
4526 .unlock = spi_disable_blockprotect,
4527 .write = spi_chip_write_256,
4528 .read = spi_chip_read,
4529 .voltage = {2700, 3600},
4530 },
4531
4532 {
4533 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004534 .name = "GD25Q64(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10004535 .bustype = BUS_SPI,
4536 .manufacture_id = GIGADEVICE_ID,
4537 .model_id = GIGADEVICE_GD25Q64,
Alan Green753a38e2019-06-07 14:44:32 +10004538 .total_size = 8192,
4539 .page_size = 256,
4540 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004541 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10004542 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10004543 .probe = probe_spi_rdid,
4544 .probe_timing = TIMING_ZERO,
4545 .block_erasers =
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004546 {
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004547 {
Alan Green753a38e2019-06-07 14:44:32 +10004548 .eraseblocks = { {4 * 1024, 2048} },
4549 .block_erase = spi_block_erase_20,
4550 }, {
4551 .eraseblocks = { {32 * 1024, 256} },
4552 .block_erase = spi_block_erase_52,
4553 }, {
4554 .eraseblocks = { {64 * 1024, 128} },
4555 .block_erase = spi_block_erase_d8,
4556 }, {
4557 .eraseblocks = { {8 * 1024 * 1024, 1} },
4558 .block_erase = spi_block_erase_60,
4559 }, {
4560 .eraseblocks = { {8 * 1024 * 1024, 1} },
4561 .block_erase = spi_block_erase_c7,
4562 }
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004563 },
Alan Green753a38e2019-06-07 14:44:32 +10004564 .unlock = spi_disable_blockprotect,
4565 .write = spi_chip_write_256,
4566 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004567 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +10004568 .wp = &wp_w25,
4569 },
4570
4571 {
4572 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10004573 .name = "GD25Q80(B)",
Alan Green753a38e2019-06-07 14:44:32 +10004574 .bustype = BUS_SPI,
4575 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004576 .model_id = GIGADEVICE_GD25Q80,
4577 .total_size = 1024,
Alan Green753a38e2019-06-07 14:44:32 +10004578 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004579 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004580 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10004581 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10004582 .probe = probe_spi_rdid,
4583 .probe_timing = TIMING_ZERO,
4584 .block_erasers =
4585 {
4586 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004587 .eraseblocks = { {4 * 1024, 256} },
Alan Green753a38e2019-06-07 14:44:32 +10004588 .block_erase = spi_block_erase_20,
4589 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004590 .eraseblocks = { {32 * 1024, 32} },
Alan Green753a38e2019-06-07 14:44:32 +10004591 .block_erase = spi_block_erase_52,
4592 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004593 .eraseblocks = { {64 * 1024, 16} },
Alan Green753a38e2019-06-07 14:44:32 +10004594 .block_erase = spi_block_erase_d8,
4595 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004596 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10004597 .block_erase = spi_block_erase_60,
4598 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004599 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10004600 .block_erase = spi_block_erase_c7,
4601 }
4602 },
4603 .unlock = spi_disable_blockprotect,
4604 .write = spi_chip_write_256,
4605 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10004606 .voltage = {2700, 3600},
hailfingerc6950ad2010-06-21 16:12:22 +00004607 },
4608
4609 {
4610 .vendor = "Hyundai",
4611 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00004612 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004613 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004614 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00004615 .total_size = 256,
4616 .page_size = 256 * 1024,
4617 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4618 .tested = TEST_UNTESTED,
4619 .probe = probe_jedec,
4620 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4621 .block_erasers =
4622 {
4623 {
4624 .eraseblocks = {
4625 {16 * 1024, 1},
4626 {8 * 1024, 2},
4627 {32 * 1024, 1},
4628 {64 * 1024, 3},
4629 },
4630 .block_erase = erase_sector_jedec,
4631 }, {
4632 .eraseblocks = { {256 * 1024, 1} },
4633 .block_erase = erase_chip_block_jedec,
4634 },
4635 },
4636 .write = write_jedec_1,
4637 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004638 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004639 },
4640
4641 {
mhme8e87912010-09-16 00:51:51 +00004642 .vendor = "Hyundai",
Alan Greend76dc1f2019-06-26 15:38:19 +10004643 .name = "HY29F002T",
4644 .bustype = BUS_PARALLEL,
4645 .manufacture_id = HYUNDAI_ID,
4646 .model_id = HYUNDAI_HY29F002T,
4647 .total_size = 256,
4648 .page_size = 256 * 1024,
4649 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4650 .tested = TEST_OK_PRE,
4651 .probe = probe_jedec,
4652 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4653 .block_erasers =
4654 {
4655 {
4656 .eraseblocks = {
4657 {64 * 1024, 3},
4658 {32 * 1024, 1},
4659 {8 * 1024, 2},
4660 {16 * 1024, 1},
4661 },
4662 .block_erase = erase_sector_jedec,
4663 }, {
4664 .eraseblocks = { {256 * 1024, 1} },
4665 .block_erase = erase_chip_block_jedec,
4666 },
4667 },
4668 .write = write_jedec_1,
4669 .read = read_memmapped,
4670 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
4671 },
4672
4673 {
4674 .vendor = "Hyundai",
mhme8e87912010-09-16 00:51:51 +00004675 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00004676 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00004677 .manufacture_id = HYUNDAI_ID,
4678 .model_id = HYUNDAI_HY29F040A,
4679 .total_size = 512,
4680 .page_size = 64 * 1024,
4681 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4682 .tested = TEST_UNTESTED,
4683 .probe = probe_jedec,
4684 .probe_timing = TIMING_ZERO,
4685 .block_erasers =
4686 {
4687 {
4688 .eraseblocks = { {64 * 1024, 8} },
4689 .block_erase = erase_sector_jedec,
4690 }, {
4691 .eraseblocks = { {512 * 1024, 1} },
4692 .block_erase = erase_chip_block_jedec,
4693 },
4694 },
4695 .write = write_jedec_1,
4696 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004697 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00004698 },
4699
4700 {
hailfinger286829b2009-01-08 03:40:17 +00004701 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004702 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004703 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004704 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004705 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00004706 .total_size = 128,
4707 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00004708 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00004709 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004710 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004711 .block_erasers =
4712 {
4713 {
Simon Glass8dc82732013-07-16 10:13:51 -06004714 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004715 {8 * 1024, 1},
4716 {4 * 1024, 2},
4717 {112 * 1024, 1},
4718 },
snelsonc0acbeb2010-03-19 18:47:06 +00004719 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004720 },
4721 },
snelsona013bf62010-03-22 04:39:31 +00004722 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004723 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004724 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004725 },
4726
4727 {
4728 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004729 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004730 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004731 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004732 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00004733 .total_size = 128,
4734 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Alan Greenf5424a22019-07-26 14:32:32 +10004735 .tested = TEST_OK_PREW,
hailfingerd4d97b92009-05-29 12:55:31 +00004736 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004737 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004738 .block_erasers =
4739 {
4740 {
stefanctd6efe1a2011-09-03 11:22:27 +00004741 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004742 {112 * 1024, 1},
4743 {4 * 1024, 2},
4744 {8 * 1024, 1},
4745 },
snelsonc0acbeb2010-03-19 18:47:06 +00004746 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004747 },
4748 },
snelsona013bf62010-03-22 04:39:31 +00004749 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004750 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004751 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004752 },
4753
4754 {
4755 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004756 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004757 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00004758 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004759 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00004760 .total_size = 256,
4761 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00004762 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00004763 .probe = probe_82802ab,
4764 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4765 .block_erasers =
4766 {
4767 {
4768 .eraseblocks = {
4769 {128 * 1024, 1},
4770 {96 * 1024, 1},
4771 {8 * 1024, 2},
4772 {16 * 1024, 1},
4773 },
4774 .block_erase = erase_block_82802ab,
4775 },
4776 },
4777 .write = write_82802ab,
4778 .read = read_memmapped,
4779 },
4780
4781 {
4782 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004783 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004784 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004785 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004786 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004787 .total_size = 512,
4788 .page_size = 128 * 1024, /* maximal block size */
4789 .tested = TEST_UNTESTED,
4790 .probe = probe_82802ab,
4791 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4792 .block_erasers =
4793 {
4794 {
Simon Glass8dc82732013-07-16 10:13:51 -06004795 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004796 {16 * 1024, 1},
4797 {8 * 1024, 2},
4798 {96 * 1024, 1},
4799 {128 * 1024, 3},
4800 },
4801 .block_erase = erase_block_82802ab,
4802 },
4803 },
4804 .write = write_82802ab,
4805 .read = read_memmapped,
4806 },
4807
4808 {
4809 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004810 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004811 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004812 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004813 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004814 .total_size = 512,
4815 .page_size = 128 * 1024, /* maximal block size */
4816 .tested = TEST_UNTESTED,
4817 .probe = probe_82802ab,
4818 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4819 .block_erasers =
4820 {
4821 {
Simon Glass8dc82732013-07-16 10:13:51 -06004822 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004823 {128 * 1024, 3},
4824 {96 * 1024, 1},
4825 {8 * 1024, 2},
4826 {16 * 1024, 1},
4827 },
4828 .block_erase = erase_block_82802ab,
4829 },
4830 },
4831 .write = write_82802ab,
4832 .read = read_memmapped,
4833 },
4834
4835 {
4836 .vendor = "Intel",
Alan Greend76dc1f2019-06-26 15:38:19 +10004837 .name = "28F008S3/S5/SC",
4838 .bustype = BUS_PARALLEL,
4839 .manufacture_id = INTEL_ID,
4840 .model_id = INTEL_28F004S3,
4841 .total_size = 512,
4842 .page_size = 256,
4843 .tested = TEST_UNTESTED,
4844 .probe = probe_82802ab,
4845 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4846 .block_erasers =
4847 {
4848 {
4849 .eraseblocks = { {64 * 1024, 8} },
4850 .block_erase = erase_block_82802ab,
4851 },
4852 },
4853 .unlock = unlock_28f004s5,
4854 .write = write_82802ab,
4855 .read = read_memmapped,
4856 },
4857
4858 {
4859 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004860 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004861 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004862 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004863 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004864 .total_size = 512,
4865 .page_size = 128 * 1024, /* maximal block size */
4866 .feature_bits = FEATURE_ADDR_SHIFTED,
4867 .tested = TEST_UNTESTED,
4868 .probe = probe_82802ab,
4869 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4870 .block_erasers =
4871 {
4872 {
Simon Glass8dc82732013-07-16 10:13:51 -06004873 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004874 {16 * 1024, 1},
4875 {8 * 1024, 2},
4876 {96 * 1024, 1},
4877 {128 * 1024, 3},
4878 },
4879 .block_erase = erase_block_82802ab,
4880 },
4881 },
4882 .write = write_82802ab,
4883 .read = read_memmapped,
4884 },
4885
4886 {
4887 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004888 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004889 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004890 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004891 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004892 .total_size = 512,
4893 .page_size = 128 * 1024, /* maximal block size */
4894 .feature_bits = FEATURE_ADDR_SHIFTED,
4895 .tested = TEST_UNTESTED,
4896 .probe = probe_82802ab,
4897 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4898 .block_erasers =
4899 {
4900 {
Simon Glass8dc82732013-07-16 10:13:51 -06004901 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004902 {128 * 1024, 3},
4903 {96 * 1024, 1},
4904 {8 * 1024, 2},
4905 {16 * 1024, 1},
4906 },
4907 .block_erase = erase_block_82802ab,
4908 },
4909 },
4910 .write = write_82802ab,
4911 .read = read_memmapped,
4912 },
4913
4914 {
4915 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00004916 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00004917 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004918 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004919 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00004920 .total_size = 512,
4921 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004922 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00004923 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00004924 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004925 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004926 .block_erasers =
4927 {
4928 {
4929 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004930 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004931 },
4932 },
Alan Greena59b2ae2019-09-02 17:26:10 +10004933 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00004934 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004935 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004936 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004937 },
4938
hailfinger286829b2009-01-08 03:40:17 +00004939 {
4940 .vendor = "Intel",
4941 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00004942 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004943 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004944 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00004945 .total_size = 1024,
4946 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004947 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00004948 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00004949 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004950 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004951 .block_erasers =
4952 {
4953 {
4954 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00004955 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004956 },
4957 },
Alan Greena59b2ae2019-09-02 17:26:10 +10004958 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00004959 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004960 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004961 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004962 },
4963
hailfinger286829b2009-01-08 03:40:17 +00004964 {
4965 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004966 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00004967 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004968 .manufacture_id = MACRONIX_ID,
4969 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00004970 .total_size = 128,
4971 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004972 /* MX25L1006E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004973 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004974 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00004975 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004976 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004977 .block_erasers =
4978 {
4979 {
4980 .eraseblocks = { {4 * 1024, 32} },
4981 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004982 }, {
hailfinger7df21362009-09-05 02:30:58 +00004983 .eraseblocks = { {64 * 1024, 2} },
4984 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004985 }, {
hailfinger7df21362009-09-05 02:30:58 +00004986 .eraseblocks = { {128 * 1024, 1} },
4987 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004988 }, {
hailfinger7df21362009-09-05 02:30:58 +00004989 .eraseblocks = { {128 * 1024, 1} },
4990 .block_erase = spi_block_erase_c7,
4991 },
4992 },
Alan Greena514de82019-09-09 16:40:10 +10004993 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00004994 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004995 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004996 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00004997 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004998 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004999 },
5000
hailfinger286829b2009-01-08 03:40:17 +00005001 {
5002 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005003 .name = "MX25L12805D",
hailfingere1e41ea2011-07-27 07:13:06 +00005004 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005005 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005006 .model_id = MACRONIX_MX25L12805,
5007 .total_size = 16384,
hailfinger286829b2009-01-08 03:40:17 +00005008 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005009 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00005010 .tested = TEST_UNTESTED,
5011 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005012 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005013 .block_erasers =
5014 {
5015 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005016 .eraseblocks = { {4 * 1024, 4096} },
hailfinger91cf1032009-10-01 13:15:01 +00005017 .block_erase = spi_block_erase_20,
5018 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005019 .eraseblocks = { {64 * 1024, 256} },
hailfinger91cf1032009-10-01 13:15:01 +00005020 .block_erase = spi_block_erase_d8,
5021 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005022 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00005023 .block_erase = spi_block_erase_60,
5024 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005025 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00005026 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10005027 }
hailfinger91cf1032009-10-01 13:15:01 +00005028 },
hailfingerb9560ee2010-07-14 20:21:22 +00005029 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005030 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005031 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005032 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005033 },
5034
hailfinger286829b2009-01-08 03:40:17 +00005035 {
5036 .vendor = "Macronix",
5037 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00005038 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005039 .manufacture_id = MACRONIX_ID,
5040 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00005041 .total_size = 2048,
5042 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005043 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005044 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005045 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005046 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00005047 .block_erasers =
5048 {
5049 {
5050 .eraseblocks = { {4 * 1024, 512} },
5051 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
5052 }, {
5053 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
5054 .block_erase = spi_block_erase_52,
5055 }, {
5056 .eraseblocks = { {64 * 1024, 32} },
5057 .block_erase = spi_block_erase_d8,
5058 }, {
5059 .eraseblocks = { {2 * 1024 * 1024, 1} },
5060 .block_erase = spi_block_erase_60,
5061 }, {
5062 .eraseblocks = { {2 * 1024 * 1024, 1} },
5063 .block_erase = spi_block_erase_c7,
5064 },
5065 },
hailfingerb9560ee2010-07-14 20:21:22 +00005066 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005067 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005068 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005069 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005070 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005071 },
5072
hailfinger286829b2009-01-08 03:40:17 +00005073 {
5074 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00005075 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00005076 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005077 .manufacture_id = MACRONIX_ID,
5078 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00005079 .total_size = 2048,
5080 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005081 .feature_bits = FEATURE_WRSR_WREN,
hailfinger0a2fef02009-04-19 23:04:00 +00005082 .tested = TEST_UNTESTED,
5083 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005084 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005085 .block_erasers =
5086 {
5087 {
5088 .eraseblocks = { {4 * 1024, 512} },
5089 .block_erase = spi_block_erase_20,
5090 }, {
5091 .eraseblocks = { {64 * 1024, 32} },
5092 .block_erase = spi_block_erase_d8,
5093 }, {
5094 .eraseblocks = { {2 * 1024 * 1024, 1} },
5095 .block_erase = spi_block_erase_60,
5096 }, {
5097 .eraseblocks = { {2 * 1024 * 1024, 1} },
5098 .block_erase = spi_block_erase_c7,
5099 }
5100 },
hailfingerb9560ee2010-07-14 20:21:22 +00005101 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005102 .write = spi_chip_write_256,
hailfinger0a2fef02009-04-19 23:04:00 +00005103 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005104 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00005105 },
hailfingerf1255892009-04-20 22:54:13 +00005106
hailfinger0a2fef02009-04-19 23:04:00 +00005107 {
5108 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00005109 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00005110 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005111 .manufacture_id = MACRONIX_ID,
5112 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00005113 .total_size = 2048,
5114 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005115 .feature_bits = FEATURE_WRSR_WREN,
uwef926ca22010-09-13 19:59:28 +00005116 .tested = TEST_UNTESTED,
5117 .probe = probe_spi_rdid,
5118 .probe_timing = TIMING_ZERO,
5119 .block_erasers =
5120 {
5121 {
5122 .eraseblocks = { {4 * 1024, 512} },
5123 .block_erase = spi_block_erase_20,
5124 }, {
5125 .eraseblocks = { {64 * 1024, 32} },
5126 .block_erase = spi_block_erase_d8,
5127 }, {
5128 .eraseblocks = { {2 * 1024 * 1024, 1} },
5129 .block_erase = spi_block_erase_60,
5130 }, {
5131 .eraseblocks = { {2 * 1024 * 1024, 1} },
5132 .block_erase = spi_block_erase_c7,
5133 }
5134 },
5135 .unlock = spi_disable_blockprotect,
5136 .write = spi_chip_write_256,
5137 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00005138 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00005139 },
5140
5141 {
5142 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005143 .name = "MX25L2005(C)/MX25L2006E",
Alan Greend76dc1f2019-06-26 15:38:19 +10005144 .bustype = BUS_SPI,
5145 .manufacture_id = MACRONIX_ID,
5146 .model_id = MACRONIX_MX25L2005,
5147 .total_size = 256,
5148 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005149 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10005150 .tested = TEST_UNTESTED,
5151 .probe = probe_spi_rdid,
5152 .probe_timing = TIMING_ZERO,
5153 .block_erasers =
5154 {
5155 {
5156 .eraseblocks = { {4 * 1024, 64} },
5157 .block_erase = spi_block_erase_20,
5158 }, {
5159 .eraseblocks = { {64 * 1024, 4} },
5160 .block_erase = spi_block_erase_52,
5161 }, {
5162 .eraseblocks = { {64 * 1024, 4} },
5163 .block_erase = spi_block_erase_d8,
5164 }, {
5165 .eraseblocks = { {256 * 1024, 1} },
5166 .block_erase = spi_block_erase_60,
5167 }, {
5168 .eraseblocks = { {256 * 1024, 1} },
5169 .block_erase = spi_block_erase_c7,
5170 },
5171 },
5172 .unlock = spi_disable_blockprotect,
5173 .write = spi_chip_write_256,
5174 .read = spi_chip_read, /* Fast read (0x0B) supported */
5175 .voltage = {2700, 3600},
5176 .wp = &wp_w25,
5177 },
5178
5179 {
5180 .vendor = "Macronix",
5181 .name = "MX25L25635F/MX25L25645G",
5182 .bustype = BUS_SPI,
5183 .manufacture_id = MACRONIX_ID,
5184 .model_id = MACRONIX_MX25L25635F,
5185 .total_size = 32768,
5186 .page_size = 256,
5187 .feature_bits =
Edward O'Callaghan27486212019-07-26 21:59:55 +10005188 FEATURE_WRSR_WREN | FEATURE_4BA_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10005189 .tested = TEST_UNTESTED,
5190 .probe = probe_spi_rdid,
5191 .probe_timing = TIMING_ZERO,
5192 .block_erasers =
5193 {
5194 {
5195 .eraseblocks = { {4 * 1024, 8192} },
5196 .block_erase = spi_block_erase_21,
5197 }, {
5198 .eraseblocks = { {32 * 1024, 1024} },
5199 .block_erase = spi_block_erase_5c,
5200 }, {
5201 .eraseblocks = { {64 * 1024, 512} },
5202 .block_erase = spi_block_erase_dc,
5203 }, {
5204 .eraseblocks = { {32768 * 1024, 1} },
5205 .block_erase = spi_block_erase_60,
5206 }, {
5207 .eraseblocks = { {32768 * 1024, 1} },
5208 .block_erase = spi_block_erase_c7,
5209 },
5210 },
5211 .unlock = spi_disable_blockprotect,
5212 .write = spi_chip_write_256,
5213 .read = spi_chip_read,
5214 .set_4ba = spi_enter_4ba_b7,
5215 .voltage = {2700, 3600},
5216 .wp = &wp_generic,
5217 },
5218
5219 {
5220 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005221 .name = "MX25L3205(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00005222 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005223 .manufacture_id = MACRONIX_ID,
5224 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00005225 .total_size = 4096,
5226 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005227 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005228 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005229 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005230 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005231 .block_erasers =
5232 {
5233 {
5234 .eraseblocks = { {4 * 1024, 1024} },
5235 .block_erase = spi_block_erase_20,
5236 }, {
5237 .eraseblocks = { {4 * 1024, 1024} },
5238 .block_erase = spi_block_erase_d8,
5239 }, {
5240 .eraseblocks = { {4 * 1024 * 1024, 1} },
5241 .block_erase = spi_block_erase_60,
5242 }, {
5243 .eraseblocks = { {4 * 1024 * 1024, 1} },
5244 .block_erase = spi_block_erase_c7,
5245 },
5246 },
hailfingerb9560ee2010-07-14 20:21:22 +00005247 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005248 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005249 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005250 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08005251 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00005252 },
5253
hailfinger286829b2009-01-08 03:40:17 +00005254 {
5255 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00005256 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00005257 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005258 .manufacture_id = MACRONIX_ID,
5259 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00005260 .total_size = 4096,
5261 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005262 .feature_bits = FEATURE_WRSR_WREN,
stuge38d77d22009-04-23 22:51:56 +00005263 .tested = TEST_UNTESTED,
5264 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005265 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005266 .block_erasers =
5267 {
5268 {
5269 .eraseblocks = { {4 * 1024, 1024} },
5270 .block_erase = spi_block_erase_20,
5271 }, {
5272 .eraseblocks = { {64 * 1024, 64} },
5273 .block_erase = spi_block_erase_d8,
5274 }, {
5275 .eraseblocks = { {4 * 1024 * 1024, 1} },
5276 .block_erase = spi_block_erase_60,
5277 }, {
5278 .eraseblocks = { {4 * 1024 * 1024, 1} },
5279 .block_erase = spi_block_erase_c7,
5280 }
5281 },
hailfingerb9560ee2010-07-14 20:21:22 +00005282 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005283 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00005284 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005285 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00005286 },
5287
Vincent Palatin87e092a2013-02-28 15:46:14 -08005288 {
5289 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005290 .name = "MX25L4005(A/C)/MX25L4006E",
Vincent Palatin87e092a2013-02-28 15:46:14 -08005291 .bustype = BUS_SPI,
5292 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005293 .model_id = MACRONIX_MX25L4005,
5294 .total_size = 512,
Vincent Palatin87e092a2013-02-28 15:46:14 -08005295 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005296 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005297 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10005298 .probe = probe_spi_rdid,
5299 .probe_timing = TIMING_ZERO,
5300 .block_erasers =
5301 {
5302 {
5303 .eraseblocks = { {4 * 1024, 128} },
5304 .block_erase = spi_block_erase_20,
5305 }, {
5306 .eraseblocks = { {64 * 1024, 8} },
5307 .block_erase = spi_block_erase_52,
5308 }, {
5309 .eraseblocks = { {64 * 1024, 8} },
5310 .block_erase = spi_block_erase_d8,
5311 }, {
5312 .eraseblocks = { {512 * 1024, 1} },
5313 .block_erase = spi_block_erase_60,
5314 }, {
5315 .eraseblocks = { {512 * 1024, 1} },
5316 .block_erase = spi_block_erase_c7,
5317 },
5318 },
Alan Greena514de82019-09-09 16:40:10 +10005319 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10005320 .unlock = spi_disable_blockprotect,
5321 .write = spi_chip_write_256,
5322 .read = spi_chip_read, /* Fast read (0x0B) supported */
5323 .voltage = {2700, 3600},
5324 .wp = &wp_w25,
5325 },
5326
5327 {
5328 .vendor = "Macronix",
5329 .name = "MX25L512(E)/MX25V512(C)",
5330 .bustype = BUS_SPI,
5331 .manufacture_id = MACRONIX_ID,
5332 .model_id = MACRONIX_MX25L512,
5333 .total_size = 64,
5334 .page_size = 256,
5335 /* MX25L512E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005336 .feature_bits = FEATURE_WRSR_WREN,
Vincent Palatin87e092a2013-02-28 15:46:14 -08005337 .tested = TEST_UNTESTED,
5338 .probe = probe_spi_rdid,
5339 .probe_timing = TIMING_ZERO,
5340 .block_erasers =
5341 {
5342 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005343 .eraseblocks = { {4 * 1024, 16} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005344 .block_erase = spi_block_erase_20,
5345 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005346 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005347 .block_erase = spi_block_erase_52,
5348 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005349 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005350 .block_erase = spi_block_erase_d8,
5351 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005352 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005353 .block_erase = spi_block_erase_60,
5354 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005355 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005356 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10005357 },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005358 },
5359 .unlock = spi_disable_blockprotect,
5360 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10005361 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
5362 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
Vincent Palatin87e092a2013-02-28 15:46:14 -08005363 },
5364
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005365 {
5366 /* FIXME: This is an evil twin of the MX25L6405, with the same
5367 * ID bytes but different block erase capabilities */
5368 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005369 .name = "MX25L6406E/MX25L6408E",
hailfingere1e41ea2011-07-27 07:13:06 +00005370 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005371 .manufacture_id = MACRONIX_ID,
5372 .model_id = MACRONIX_MX25L6405,
5373 .total_size = 8192,
5374 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005375 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005376 .tested = TEST_OK_PREW,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005377 .probe = probe_spi_rdid,
5378 .probe_timing = TIMING_ZERO,
5379 .block_erasers =
5380 {
5381 {
5382 .eraseblocks = { {4 * 1024, 2048} },
5383 .block_erase = spi_block_erase_20,
5384 }, {
5385 .eraseblocks = { {64 * 1024, 128} },
5386 .block_erase = spi_block_erase_d8,
5387 }, {
5388 .eraseblocks = { {64 * 1024, 128} },
5389 .block_erase = spi_block_erase_52,
5390 }, {
5391 .eraseblocks = { {8 * 1024 * 1024, 1} },
5392 .block_erase = spi_block_erase_60,
5393 }, {
5394 .eraseblocks = { {8 * 1024 * 1024, 1} },
5395 .block_erase = spi_block_erase_c7,
5396 }
5397 },
5398 .unlock = spi_disable_blockprotect,
5399 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005400 .read = spi_chip_read, /* Fast read (0x0B) supported */
5401 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
David Hendricks83541d32014-07-15 20:58:21 -07005402 .wp = &wp_generic,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005403 },
stepanaa1b6a22008-12-08 18:15:10 +00005404
hailfinger286829b2009-01-08 03:40:17 +00005405 {
5406 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08005407 .name = "MX25L6495F",
5408 .bustype = BUS_SPI,
5409 .manufacture_id = MACRONIX_ID,
5410 .model_id = MACRONIX_MX25L6495F,
5411 .total_size = 8192,
5412 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10005413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10005414 .tested = TEST_OK_PREW,
David Hendricksc3496092014-11-13 17:20:55 -08005415 .probe = probe_spi_rdid,
5416 .probe_timing = TIMING_ZERO,
5417 .block_erasers =
5418 {
5419 {
5420 .eraseblocks = { {4 * 1024, 2048} },
5421 .block_erase = spi_block_erase_20,
5422 }, {
5423 .eraseblocks = { {64 * 1024, 128} },
5424 .block_erase = spi_block_erase_d8,
5425 }, {
5426 .eraseblocks = { {32 * 1024, 256} },
5427 .block_erase = spi_block_erase_52,
5428 }, {
5429 .eraseblocks = { {8 * 1024 * 1024, 1} },
5430 .block_erase = spi_block_erase_60,
5431 }, {
5432 .eraseblocks = { {8 * 1024 * 1024, 1} },
5433 .block_erase = spi_block_erase_c7,
5434 }
5435 },
5436 .unlock = spi_disable_blockprotect,
5437 .write = spi_chip_write_256,
5438 .read = spi_chip_read, /* Fast read (0x0B) supported */
5439 .voltage = {2700, 3600},
5440 .wp = &wp_generic,
5441 },
5442
5443 {
5444 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10005445 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Jongpil66a96492014-08-14 17:59:06 +09005446 .bustype = BUS_SPI,
5447 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005448 .model_id = MACRONIX_MX25L8005,
5449 .total_size = 1024,
Jongpil66a96492014-08-14 17:59:06 +09005450 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005451 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005452 .tested = TEST_OK_PREW,
Jongpil66a96492014-08-14 17:59:06 +09005453 .probe = probe_spi_rdid,
5454 .probe_timing = TIMING_ZERO,
5455 .block_erasers =
5456 {
5457 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005458 .eraseblocks = { {4 * 1024, 256} },
Jongpil66a96492014-08-14 17:59:06 +09005459 .block_erase = spi_block_erase_20,
5460 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005461 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09005462 .block_erase = spi_block_erase_52,
5463 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005464 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09005465 .block_erase = spi_block_erase_d8,
5466 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005467 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09005468 .block_erase = spi_block_erase_60,
5469 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005470 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09005471 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10005472 },
Jongpil66a96492014-08-14 17:59:06 +09005473 },
Alan Greena514de82019-09-09 16:40:10 +10005474 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jongpil66a96492014-08-14 17:59:06 +09005475 .unlock = spi_disable_blockprotect,
5476 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10005477 .read = spi_chip_read,
5478 .voltage = {2700, 3600},
Jongpil66a96492014-08-14 17:59:06 +09005479 .wp = &wp_w25,
5480 },
5481
Alex Lu831c6092017-11-02 23:19:34 -07005482 {
5483 .vendor = "Macronix",
5484 .name = "MX25U12835F",
5485 .bustype = BUS_SPI,
5486 .manufacture_id = MACRONIX_ID,
Alan Greendc0792e2019-07-01 15:01:34 +10005487 .model_id = MACRONIX_MX25U12835E,
Alex Lu831c6092017-11-02 23:19:34 -07005488 .total_size = 16384,
5489 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005490 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005491 .tested = TEST_OK_PREW,
Alex Lu831c6092017-11-02 23:19:34 -07005492 .probe = probe_spi_rdid,
5493 .probe_timing = TIMING_ZERO,
5494 .block_erasers =
5495 {
5496 {
5497 .eraseblocks = { {4 * 1024, 4096} },
5498 .block_erase = spi_block_erase_20,
5499 }, {
5500 .eraseblocks = { {32 * 1024, 512} },
5501 .block_erase = spi_block_erase_52,
5502 }, {
5503 .eraseblocks = { {64 * 1024, 256} },
5504 .block_erase = spi_block_erase_d8,
5505 }, {
5506 .eraseblocks = { {8 * 1024 * 2048, 1} },
5507 .block_erase = spi_block_erase_60,
5508 }, {
5509 .eraseblocks = { {8 * 1024 * 2048, 1} },
5510 .block_erase = spi_block_erase_c7,
5511 }
5512 },
5513 .unlock = spi_disable_blockprotect,
5514 .write = spi_chip_write_256,
5515 .read = spi_chip_read, /* Fast read (0x0B) supported */
5516 .voltage = {1650, 2000},
Paul Fagerburg50a120d2019-05-17 09:47:36 -06005517 .wp = &wp_w25q_large,
Alex Lu831c6092017-11-02 23:19:34 -07005518 },
5519
Jongpil66a96492014-08-14 17:59:06 +09005520 {
5521 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07005522 .name = "MX25U25635F",
5523 .bustype = BUS_SPI,
5524 .manufacture_id = MACRONIX_ID,
5525 .model_id = MACRONIX_MX25U25635F,
5526 /* FIXME(dhendrix): support 32-bit addressing */
5527 .total_size = 32768/2,
5528 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005529 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005530 .tested = TEST_OK_PREW,
David Hendricks419e32a2015-04-07 17:25:14 -07005531 .probe = probe_spi_rdid,
5532 .probe_timing = TIMING_ZERO,
5533 .block_erasers =
5534 {
5535 /* FIXME(dhendrix): support 32-bit addressing */
5536 {
5537 .eraseblocks = { {4 * 1024, 8192/2} },
5538 .block_erase = spi_block_erase_20,
5539 }, {
5540 .eraseblocks = { {32 * 1024, 1024/2} },
5541 .block_erase = spi_block_erase_52,
5542 }, {
5543 .eraseblocks = { {64 * 1024, 512/2} },
5544 .block_erase = spi_block_erase_d8,
5545 }, {
5546 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5547 .block_erase = spi_block_erase_60,
5548 }, {
5549 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5550 .block_erase = spi_block_erase_c7,
5551 }
5552 },
5553 .unlock = spi_disable_blockprotect,
5554 .write = spi_chip_write_256,
5555 .read = spi_chip_read, /* Fast read (0x0B) supported */
5556 .voltage = {1650, 2000},
5557 /* FIXME(dhendrix): write-protect support */
Alan Greena7cfa332019-06-24 15:48:14 +10005558 /* .wp = &wp_generic, */
David Hendricks419e32a2015-04-07 17:25:14 -07005559 },
5560
5561 {
5562 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10005563 .name = "MX25U3235E/F",
hailfingere1e41ea2011-07-27 07:13:06 +00005564 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005565 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005566 .model_id = MACRONIX_MX25U3235E,
5567 .total_size = 4096,
stuged8f34912009-04-21 01:47:16 +00005568 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005569 .feature_bits = FEATURE_WRSR_WREN,
stuged8f34912009-04-21 01:47:16 +00005570 .tested = TEST_UNTESTED,
5571 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005572 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005573 .block_erasers =
5574 {
5575 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005576 .eraseblocks = { {4 * 1024, 1024} },
snelson2d471072010-01-09 05:30:14 +00005577 .block_erase = spi_block_erase_20,
5578 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005579 .eraseblocks = { {32 * 1024, 128} },
5580 .block_erase = spi_block_erase_52,
5581 }, {
5582 .eraseblocks = { {64 * 1024, 64} },
snelson2d471072010-01-09 05:30:14 +00005583 .block_erase = spi_block_erase_d8,
5584 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005585 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00005586 .block_erase = spi_block_erase_60,
5587 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005588 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00005589 .block_erase = spi_block_erase_c7,
5590 }
5591 },
hailfingerb9560ee2010-07-14 20:21:22 +00005592 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005593 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10005594 .read = spi_chip_read, /* Fast read (0x0B) supported */
5595 .voltage = {1650, 2000},
5596 .wp = &wp_w25,
5597 },
5598
5599 {
5600 .vendor = "Macronix",
5601 .name = "MX25U6435E/F",
5602 .bustype = BUS_SPI,
5603 .manufacture_id = MACRONIX_ID,
5604 .model_id = MACRONIX_MX25U6435E,
5605 .total_size = 8192,
5606 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10005607 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10005608 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10005609 .probe = probe_spi_rdid,
5610 .probe_timing = TIMING_ZERO,
5611 .block_erasers =
5612 {
5613 {
5614 .eraseblocks = { {4 * 1024, 2048} },
5615 .block_erase = spi_block_erase_20,
5616 }, {
5617 .eraseblocks = { {32 * 1024, 256} },
5618 .block_erase = spi_block_erase_52,
5619 }, {
5620 .eraseblocks = { {64 * 1024, 128} },
5621 .block_erase = spi_block_erase_d8,
5622 }, {
5623 .eraseblocks = { {8 * 1024 * 1024, 1} },
5624 .block_erase = spi_block_erase_60,
5625 }, {
5626 .eraseblocks = { {8 * 1024 * 1024, 1} },
5627 .block_erase = spi_block_erase_c7,
5628 }
5629 },
5630 .unlock = spi_disable_blockprotect,
5631 .write = spi_chip_write_256,
5632 .read = spi_chip_read, /* Fast read (0x0B) supported */
5633 .voltage = {1650, 2000},
5634 .wp = &wp_w25,
stuged8f34912009-04-21 01:47:16 +00005635 },
5636
5637 {
5638 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00005639 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00005640 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005641 .manufacture_id = MACRONIX_ID,
5642 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00005643 .total_size = 128,
5644 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005645 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5646 .tested = TEST_UNTESTED,
5647 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005648 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005649 .block_erasers =
5650 {
5651 {
Simon Glass8dc82732013-07-16 10:13:51 -06005652 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005653 {8 * 1024, 1},
5654 {4 * 1024, 2},
5655 {8 * 1024, 2},
5656 {32 * 1024, 1},
5657 {64 * 1024, 1},
5658 },
snelsonc6855342010-01-28 23:55:12 +00005659 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005660 }, {
5661 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005662 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005663 }
5664 },
hailfingerfff99532009-11-27 17:49:42 +00005665 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005666 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005667 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005668 },
5669
5670 {
5671 .vendor = "Macronix",
5672 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00005673 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005674 .manufacture_id = MACRONIX_ID,
5675 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00005676 .total_size = 128,
5677 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005678 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00005679 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005680 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005681 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005682 .block_erasers =
5683 {
5684 {
Simon Glass8dc82732013-07-16 10:13:51 -06005685 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005686 {64 * 1024, 1},
5687 {32 * 1024, 1},
5688 {8 * 1024, 2},
5689 {4 * 1024, 2},
5690 {8 * 1024, 1},
5691 },
snelsonc6855342010-01-28 23:55:12 +00005692 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005693 }, {
5694 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005695 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005696 }
5697 },
hailfingerfff99532009-11-27 17:49:42 +00005698 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005699 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005700 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005701 },
5702
5703 {
5704 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005705 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005706 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005707 .manufacture_id = MACRONIX_ID,
5708 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005709 .total_size = 256,
5710 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005711 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005712 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00005713 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005714 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005715 .block_erasers =
5716 {
5717 {
5718 .eraseblocks = {
5719 {16 * 1024, 1},
5720 {8 * 1024, 2},
5721 {32 * 1024, 1},
5722 {64 * 1024, 3},
5723 },
snelsonc6855342010-01-28 23:55:12 +00005724 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005725 }, {
5726 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005727 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005728 },
5729 },
hailfingerfff99532009-11-27 17:49:42 +00005730 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005731 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005732 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005733 },
5734
hailfinger286829b2009-01-08 03:40:17 +00005735 {
5736 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005737 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005738 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005739 .manufacture_id = MACRONIX_ID,
5740 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005741 .total_size = 256,
5742 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005743 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005744 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005745 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005746 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005747 .block_erasers =
5748 {
5749 {
5750 .eraseblocks = {
5751 {64 * 1024, 3},
5752 {32 * 1024, 1},
5753 {8 * 1024, 2},
5754 {16 * 1024, 1},
5755 },
snelsonc6855342010-01-28 23:55:12 +00005756 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005757 }, {
5758 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005759 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005760 },
5761 },
hailfingerfff99532009-11-27 17:49:42 +00005762 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005763 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005764 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005765 },
5766
hailfinger286829b2009-01-08 03:40:17 +00005767 {
5768 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00005769 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005770 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00005771 .manufacture_id = MACRONIX_ID,
5772 .model_id = MACRONIX_MX29F040,
5773 .total_size = 512,
5774 .page_size = 64 * 1024,
5775 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5776 .tested = TEST_UNTESTED,
5777 .probe = probe_jedec,
5778 .probe_timing = TIMING_ZERO,
5779 .block_erasers =
5780 {
5781 {
5782 .eraseblocks = { {64 * 1024, 8} },
5783 .block_erase = erase_sector_jedec,
5784 }, {
5785 .eraseblocks = { {512 * 1024, 1} },
5786 .block_erase = erase_chip_block_jedec,
5787 },
5788 },
5789 .write = write_jedec_1,
5790 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00005791 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00005792 },
5793
5794 {
5795 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00005796 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00005797 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005798 .manufacture_id = MACRONIX_ID,
5799 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00005800 .total_size = 512,
5801 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005802 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5803 .tested = TEST_UNTESTED,
5804 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005805 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005806 .block_erasers =
5807 {
5808 {
Alan Green0d97b472019-07-26 10:33:25 +10005809 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +00005810 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005811 }, {
5812 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005813 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005814 },
5815 },
hailfingerfff99532009-11-27 17:49:42 +00005816 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005817 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005818 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00005819 },
5820
Alan Green82e27422019-08-26 12:18:10 +10005821 /* The ST M25P05 is a bit of a problem. It has the same ID as the
5822 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
5823 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
5824 * only is successful if RDID does not work.
5825 */
hailfinger286829b2009-01-08 03:40:17 +00005826 {
Alan Green82e27422019-08-26 12:18:10 +10005827 .vendor = "Micron/Numonyx/ST",
5828 .name = "M25P05",
5829 .bustype = BUS_SPI,
5830 .manufacture_id = 0, /* Not used. */
5831 .model_id = ST_M25P05_RES,
5832 .total_size = 64,
5833 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005834 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10005835 .tested = TEST_UNTESTED,
5836 .probe = probe_spi_res1,
5837 .probe_timing = TIMING_ZERO,
5838 .block_erasers =
5839 {
5840 {
5841 .eraseblocks = { {32 * 1024, 2} },
5842 .block_erase = spi_block_erase_d8,
5843 }, {
5844 .eraseblocks = { {64 * 1024, 1} },
5845 .block_erase = spi_block_erase_c7,
5846 }
5847 },
Alan Green197c7432019-09-09 17:24:41 +10005848 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5849 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005850 .write = spi_chip_write_1, /* 128 */
5851 .read = spi_chip_read,
5852 .voltage = {2700, 3600},
5853 },
5854
5855 {
5856 .vendor = "Micron/Numonyx/ST",
5857 .name = "M25P05-A",
5858 .bustype = BUS_SPI,
5859 .manufacture_id = ST_ID,
5860 .model_id = ST_M25P05A,
5861 .total_size = 64,
5862 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005863 .feature_bits = FEATURE_WRSR_WREN,
5864 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10005865 .probe = probe_spi_rdid,
5866 .probe_timing = TIMING_ZERO,
5867 .block_erasers =
5868 {
5869 {
5870 .eraseblocks = { {32 * 1024, 2} },
5871 .block_erase = spi_block_erase_d8,
5872 }, {
5873 .eraseblocks = { {64 * 1024, 1} },
5874 .block_erase = spi_block_erase_c7,
5875 }
5876 },
Alan Green197c7432019-09-09 17:24:41 +10005877 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5878 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005879 .write = spi_chip_write_256,
5880 .read = spi_chip_read,
5881 .voltage = {2700, 3600},
5882 },
5883
5884 /* The ST M25P10 has the same problem as the M25P05. */
5885 {
5886 .vendor = "Micron/Numonyx/ST",
5887 .name = "M25P10",
5888 .bustype = BUS_SPI,
5889 .manufacture_id = 0, /* Not used. */
5890 .model_id = ST_M25P10_RES,
5891 .total_size = 128,
5892 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005893 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10005894 .tested = TEST_UNTESTED,
5895 .probe = probe_spi_res1,
5896 .probe_timing = TIMING_ZERO,
5897 .block_erasers =
5898 {
5899 {
5900 .eraseblocks = { {32 * 1024, 4} },
5901 .block_erase = spi_block_erase_d8,
5902 }, {
5903 .eraseblocks = { {128 * 1024, 1} },
5904 .block_erase = spi_block_erase_c7,
5905 }
5906 },
Alan Green197c7432019-09-09 17:24:41 +10005907 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5908 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005909 .write = spi_chip_write_1, /* 128 */
5910 .read = spi_chip_read,
5911 .voltage = {2700, 3600},
5912 },
5913
5914 {
5915 .vendor = "Micron/Numonyx/ST",
5916 .name = "M25P10-A",
5917 .bustype = BUS_SPI,
5918 .manufacture_id = ST_ID,
5919 .model_id = ST_M25P10A,
5920 .total_size = 128,
5921 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005922 .feature_bits = FEATURE_WRSR_WREN,
5923 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10005924 .probe = probe_spi_rdid,
5925 .probe_timing = TIMING_ZERO,
5926 .block_erasers =
5927 {
5928 {
5929 .eraseblocks = { {32 * 1024, 4} },
5930 .block_erase = spi_block_erase_d8,
5931 }, {
5932 .eraseblocks = { {128 * 1024, 1} },
5933 .block_erase = spi_block_erase_c7,
5934 }
5935 },
Alan Green197c7432019-09-09 17:24:41 +10005936 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5937 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005938 .write = spi_chip_write_256,
5939 .read = spi_chip_read,
5940 .voltage = {2700, 3600},
5941 },
5942
5943 {
5944 .vendor = "Micron/Numonyx/ST",
5945 .name = "M25P128",
5946 .bustype = BUS_SPI,
5947 .manufacture_id = ST_ID,
5948 .model_id = ST_M25P128,
5949 .total_size = 16384,
5950 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005951 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10005952 .tested = TEST_OK_PREW,
5953 .probe = probe_spi_rdid,
5954 .probe_timing = TIMING_ZERO,
5955 .block_erasers =
5956 {
5957 {
5958 .eraseblocks = { {256 * 1024, 64} },
5959 .block_erase = spi_block_erase_d8,
5960 }, {
5961 .eraseblocks = { {16 * 1024 * 1024, 1} },
5962 .block_erase = spi_block_erase_c7,
5963 }
5964 },
Alan Green197c7432019-09-09 17:24:41 +10005965 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5966 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005967 .write = spi_chip_write_256,
5968 .read = spi_chip_read,
5969 .voltage = {2700, 3600},
5970 },
5971
5972 {
5973 .vendor = "Micron/Numonyx/ST",
5974 .name = "M25P16",
5975 .bustype = BUS_SPI,
5976 .manufacture_id = ST_ID,
5977 .model_id = ST_M25P16,
5978 .total_size = 2048,
5979 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10005980 .feature_bits = FEATURE_WRSR_WREN,
5981 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10005982 .probe = probe_spi_rdid,
5983 .probe_timing = TIMING_ZERO,
5984 .block_erasers =
5985 {
5986 {
5987 .eraseblocks = { {64 * 1024, 32} },
5988 .block_erase = spi_block_erase_d8,
5989 }, {
5990 .eraseblocks = { {2 * 1024 * 1024, 1} },
5991 .block_erase = spi_block_erase_c7,
5992 }
5993 },
Alan Green197c7432019-09-09 17:24:41 +10005994 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
5995 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10005996 .write = spi_chip_write_256,
5997 .read = spi_chip_read,
5998 .voltage = {2700, 3600},
5999 },
6000
6001 {
6002 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6003 .name = "M25P20",
6004 .bustype = BUS_SPI,
6005 .manufacture_id = ST_ID,
6006 .model_id = ST_M25P20,
6007 .total_size = 256,
6008 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006009 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006010 .tested = TEST_UNTESTED,
6011 .probe = probe_spi_rdid,
6012 .probe_timing = TIMING_ZERO,
6013 .block_erasers =
6014 {
6015 {
6016 .eraseblocks = { {64 * 1024, 4} },
6017 .block_erase = spi_block_erase_d8,
6018 }, {
6019 .eraseblocks = { {256 * 1024, 1} },
6020 .block_erase = spi_block_erase_c7,
6021 }
6022 },
Alan Green197c7432019-09-09 17:24:41 +10006023 .printlock = spi_prettyprint_status_register_bp1_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006024 .unlock = spi_disable_blockprotect,
6025 .write = spi_chip_write_256,
6026 .read = spi_chip_read, /* Fast read (0x0B) supported */
6027 .voltage = {2700, 3600},
6028 },
6029
6030 {
6031 .vendor = "Micron/Numonyx/ST",
6032 .name = "M25P32",
6033 .bustype = BUS_SPI,
6034 .manufacture_id = ST_ID,
6035 .model_id = ST_M25P32,
6036 .total_size = 4096,
6037 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006038 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006039 .tested = TEST_OK_PREW,
6040 .probe = probe_spi_rdid,
6041 .probe_timing = TIMING_ZERO,
6042 .block_erasers =
6043 {
6044 {
6045 .eraseblocks = { {64 * 1024, 64} },
6046 .block_erase = spi_block_erase_d8,
6047 }, {
6048 .eraseblocks = { {4 * 1024 * 1024, 1} },
6049 .block_erase = spi_block_erase_c7,
6050 }
6051 },
Alan Green197c7432019-09-09 17:24:41 +10006052 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
6053 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006054 .write = spi_chip_write_256,
6055 .read = spi_chip_read,
6056 .voltage = {2700, 3600},
6057 },
6058
6059 {
6060 .vendor = "Micron/Numonyx/ST", /* Numonyx */
6061 .name = "M25P40",
6062 .bustype = BUS_SPI,
6063 .manufacture_id = ST_ID,
6064 .model_id = ST_M25P40,
6065 .total_size = 512,
6066 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006067 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006068 .tested = TEST_OK_PREW,
6069 .probe = probe_spi_rdid,
6070 .probe_timing = TIMING_ZERO,
6071 .block_erasers =
6072 {
6073 {
6074 .eraseblocks = { {64 * 1024, 8} },
6075 .block_erase = spi_block_erase_d8,
6076 }, {
6077 .eraseblocks = { {512 * 1024, 1} },
6078 .block_erase = spi_block_erase_c7,
6079 }
6080 },
Alan Green197c7432019-09-09 17:24:41 +10006081 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
6082 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006083 .write = spi_chip_write_256,
6084 .read = spi_chip_read,
6085 .voltage = {2700, 3600},
6086 },
6087
6088 {
6089 .vendor = "Micron/Numonyx/ST",
6090 .name = "M25P40-old",
6091 .bustype = BUS_SPI,
6092 .manufacture_id = 0, /* Not used. */
6093 .model_id = ST_M25P40_RES,
6094 .total_size = 512,
6095 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006096 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006097 .tested = TEST_UNTESTED,
6098 .probe = probe_spi_res1,
6099 .probe_timing = TIMING_ZERO,
6100 .block_erasers =
6101 {
6102 {
6103 .eraseblocks = { {64 * 1024, 8} },
6104 .block_erase = spi_block_erase_d8,
6105 }, {
6106 .eraseblocks = { {512 * 1024, 1} },
6107 .block_erase = spi_block_erase_c7,
6108 }
6109 },
Alan Green197c7432019-09-09 17:24:41 +10006110 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
6111 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006112 .write = spi_chip_write_256,
6113 .read = spi_chip_read,
6114 },
6115
6116 {
6117 .vendor = "Micron/Numonyx/ST",
6118 .name = "M25P64",
6119 .bustype = BUS_SPI,
6120 .manufacture_id = ST_ID,
6121 .model_id = ST_M25P64,
6122 .total_size = 8192,
6123 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006124 .feature_bits = FEATURE_WRSR_WREN,
6125 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10006126 .probe = probe_spi_rdid,
6127 .probe_timing = TIMING_ZERO,
6128 .block_erasers =
6129 {
6130 {
6131 .eraseblocks = { {64 * 1024, 128} },
6132 .block_erase = spi_block_erase_d8,
6133 }, {
6134 .eraseblocks = { {8 * 1024 * 1024, 1} },
6135 .block_erase = spi_block_erase_c7,
6136 }
6137 },
Alan Green197c7432019-09-09 17:24:41 +10006138 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
6139 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006140 .write = spi_chip_write_256,
6141 .read = spi_chip_read,
6142 .voltage = {2700, 3600},
6143 },
6144
6145 {
6146 .vendor = "Micron/Numonyx/ST",
6147 .name = "M25P80",
6148 .bustype = BUS_SPI,
6149 .manufacture_id = ST_ID,
6150 .model_id = ST_M25P80,
6151 .total_size = 1024,
6152 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006153 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006154 .tested = TEST_OK_PREW,
6155 .probe = probe_spi_rdid,
6156 .probe_timing = TIMING_ZERO,
6157 .block_erasers =
6158 {
6159 {
6160 .eraseblocks = { {64 * 1024, 16} },
6161 .block_erase = spi_block_erase_d8,
6162 }, {
6163 .eraseblocks = { {1024 * 1024, 1} },
6164 .block_erase = spi_block_erase_c7,
6165 }
6166 },
Alan Green197c7432019-09-09 17:24:41 +10006167 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
6168 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10006169 .write = spi_chip_write_256,
6170 .read = spi_chip_read,
6171 .voltage = {2700, 3600},
6172 },
6173
6174 {
6175 .vendor = "Micron/Numonyx/ST",
6176 .name = "M25PE10",
6177 .bustype = BUS_SPI,
6178 .manufacture_id = ST_ID,
6179 .model_id = ST_M25PE10,
6180 .total_size = 128,
6181 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006182 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006183 .tested = TEST_UNTESTED,
6184 .probe = probe_spi_rdid,
6185 .probe_timing = TIMING_ZERO,
6186 .block_erasers =
6187 {
6188 {
6189 .eraseblocks = { {4 * 1024, 32} },
6190 .block_erase = spi_block_erase_20,
6191 }, {
6192 .eraseblocks = { {64 * 1024, 2} },
6193 .block_erase = spi_block_erase_d8,
6194 }, {
6195 .eraseblocks = { {128 * 1024, 1} },
6196 .block_erase = spi_block_erase_c7,
6197 }
6198 },
Alan Green197c7432019-09-09 17:24:41 +10006199 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +10006200 .unlock = spi_disable_blockprotect,
6201 .write = spi_chip_write_256,
6202 .read = spi_chip_read,
6203 .voltage = {2700, 3600},
6204 },
6205
6206 {
6207 .vendor = "Micron/Numonyx/ST",
6208 .name = "M25PE16",
6209 .bustype = BUS_SPI,
6210 .manufacture_id = ST_ID,
6211 .model_id = ST_M25PE16,
6212 .total_size = 2048,
6213 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006214 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006215 .tested = TEST_UNTESTED,
6216 .probe = probe_spi_rdid,
6217 .probe_timing = TIMING_ZERO,
6218 .block_erasers =
6219 {
6220 {
6221 .eraseblocks = { {4 * 1024, 512} },
6222 .block_erase = spi_block_erase_20,
6223 }, {
6224 .eraseblocks = { {64 * 1024, 32} },
6225 .block_erase = spi_block_erase_d8,
6226 }, {
6227 .eraseblocks = { {2 * 1024 * 1024, 1} },
6228 .block_erase = spi_block_erase_c7,
6229 }
6230 },
Alan Green197c7432019-09-09 17:24:41 +10006231 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +10006232 .unlock = spi_disable_blockprotect,
6233 .write = spi_chip_write_256,
6234 .read = spi_chip_read,
6235 .voltage = {2700, 3600},
6236 },
6237
6238 {
6239 .vendor = "Micron/Numonyx/ST",
6240 .name = "M25PE20",
6241 .bustype = BUS_SPI,
6242 .manufacture_id = ST_ID,
6243 .model_id = ST_M25PE20,
6244 .total_size = 256,
6245 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006246 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006247 .tested = TEST_UNTESTED,
6248 .probe = probe_spi_rdid,
6249 .probe_timing = TIMING_ZERO,
6250 .block_erasers =
6251 {
6252 {
6253 .eraseblocks = { {4 * 1024, 64} },
6254 .block_erase = spi_block_erase_20,
6255 }, {
6256 .eraseblocks = { {64 * 1024, 4} },
6257 .block_erase = spi_block_erase_d8,
6258 }, {
6259 .eraseblocks = { {256 * 1024, 1} },
6260 .block_erase = spi_block_erase_c7,
6261 }
6262 },
Alan Green197c7432019-09-09 17:24:41 +10006263 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +10006264 .unlock = spi_disable_blockprotect,
6265 .write = spi_chip_write_256,
6266 .read = spi_chip_read,
6267 .voltage = {2700, 3600},
6268 },
6269
6270 {
6271 .vendor = "Micron/Numonyx/ST",
6272 .name = "M25PE40",
6273 .bustype = BUS_SPI,
6274 .manufacture_id = ST_ID,
6275 .model_id = ST_M25PE40,
6276 .total_size = 512,
6277 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006278 .feature_bits = FEATURE_WRSR_WREN,
6279 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10006280 .probe = probe_spi_rdid,
6281 .probe_timing = TIMING_ZERO,
6282 .block_erasers =
6283 {
6284 {
6285 .eraseblocks = { {4 * 1024, 128} },
6286 .block_erase = spi_block_erase_20,
6287 }, {
6288 .eraseblocks = { {64 * 1024, 8} },
6289 .block_erase = spi_block_erase_d8,
6290 }, {
6291 .eraseblocks = { {512 * 1024, 1} },
6292 .block_erase = spi_block_erase_c7,
6293 }
6294 },
Alan Green197c7432019-09-09 17:24:41 +10006295 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +10006296 .unlock = spi_disable_blockprotect,
6297 .write = spi_chip_write_256,
6298 .read = spi_chip_read,
6299 .voltage = {2700, 3600},
6300 },
6301
6302 {
6303 .vendor = "Micron/Numonyx/ST",
6304 .name = "M25PE80",
6305 .bustype = BUS_SPI,
6306 .manufacture_id = ST_ID,
6307 .model_id = ST_M25PE80,
6308 .total_size = 1024,
6309 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006310 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10006311 .tested = TEST_OK_PREW,
6312 .probe = probe_spi_rdid,
6313 .probe_timing = TIMING_ZERO,
6314 .block_erasers =
6315 {
6316 {
6317 .eraseblocks = { {4 * 1024, 256} },
6318 .block_erase = spi_block_erase_20,
6319 }, {
6320 .eraseblocks = { {64 * 1024, 16} },
6321 .block_erase = spi_block_erase_d8,
6322 }, {
6323 .eraseblocks = { {1024 * 1024, 1} },
6324 .block_erase = spi_block_erase_c7,
6325 }
6326 },
Alan Green197c7432019-09-09 17:24:41 +10006327 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +10006328 .unlock = spi_disable_blockprotect,
6329 .write = spi_chip_write_256,
6330 .read = spi_chip_read,
6331 .voltage = {2700, 3600},
6332 },
6333
6334 {
6335 .vendor = "Micron/Numonyx/ST",
6336 .name = "M25PX16",
6337 .bustype = BUS_SPI,
6338 .manufacture_id = ST_ID,
6339 .model_id = ST_M25PX16,
6340 .total_size = 2048,
6341 .page_size = 256,
6342 /* OTP: 64B total; read 0x4B; write 0x42 */
Alan Green197c7432019-09-09 17:24:41 +10006343 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +10006344 .tested = TEST_OK_PREW,
6345 .probe = probe_spi_rdid,
6346 .probe_timing = TIMING_ZERO,
6347 .block_erasers =
6348 {
6349 {
6350 .eraseblocks = { { 4 * 1024, 512 } },
6351 .block_erase = spi_block_erase_20,
6352 }, {
6353 .eraseblocks = { {64 * 1024, 32} },
6354 .block_erase = spi_block_erase_d8,
6355 }, {
6356 .eraseblocks = { {2 * 1024 * 1024, 1} },
6357 .block_erase = spi_block_erase_c7,
6358 }
6359 },
Alan Green197c7432019-09-09 17:24:41 +10006360 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
6361 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +10006362 .write = spi_chip_write_256,
6363 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006364 .voltage = {2300, 3600},
Alan Green82e27422019-08-26 12:18:10 +10006365 },
6366
6367 {
6368 .vendor = "Micron/Numonyx/ST",
6369 .name = "M25PX32",
6370 .bustype = BUS_SPI,
6371 .manufacture_id = ST_ID,
6372 .model_id = ST_M25PX32,
6373 .total_size = 4096,
6374 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006375 /* OTP: 64B total; read 0x4B; write 0x42 */
6376 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +10006377 .tested = TEST_OK_PRE,
6378 .probe = probe_spi_rdid,
6379 .probe_timing = TIMING_ZERO,
6380 .block_erasers =
6381 {
6382 {
6383 .eraseblocks = { { 4 * 1024, 1024 } },
6384 .block_erase = spi_block_erase_20,
6385 }, {
6386 .eraseblocks = { {64 * 1024, 64} },
6387 .block_erase = spi_block_erase_d8,
6388 }, {
6389 .eraseblocks = { {4 * 1024 * 1024, 1} },
6390 .block_erase = spi_block_erase_c7,
6391 }
6392 },
Alan Green197c7432019-09-09 17:24:41 +10006393 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
6394 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +10006395 .write = spi_chip_write_256,
6396 .read = spi_chip_read,
6397 .voltage = {2700, 3600},
6398 },
6399
6400 {
6401 .vendor = "Micron/Numonyx/ST",
6402 .name = "M25PX64",
6403 .bustype = BUS_SPI,
6404 .manufacture_id = ST_ID,
6405 .model_id = ST_M25PX64,
6406 .total_size = 8192,
6407 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10006408 /* OTP: 64B total; read 0x4B; write 0x42 */
6409 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6410 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10006411 .probe = probe_spi_rdid,
6412 .probe_timing = TIMING_ZERO,
6413 .block_erasers =
6414 {
6415 {
6416 .eraseblocks = { { 4 * 1024, 2048 } },
6417 .block_erase = spi_block_erase_20,
6418 }, {
6419 .eraseblocks = { {64 * 1024, 128} },
6420 .block_erase = spi_block_erase_d8,
6421 }, {
6422 .eraseblocks = { {8 * 1024 * 1024, 1} },
6423 .block_erase = spi_block_erase_c7,
6424 }
6425 },
Alan Green197c7432019-09-09 17:24:41 +10006426 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
6427 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +10006428 .write = spi_chip_write_256,
6429 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006430 .voltage = {2700, 3600},
Alan Green82e27422019-08-26 12:18:10 +10006431 },
6432
6433 {
6434 .vendor = "Micron/Numonyx/ST",
6435 .name = "MT25QL256", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
6436 .bustype = BUS_SPI,
6437 .manufacture_id = ST_ID,
6438 .model_id = ST_N25Q256__3E,
6439 .total_size = 32768,
6440 .page_size = 256,
6441 /* supports SFDP */
6442 /* OTP: 64B total; read 0x4B, write 0x42 */
6443 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
6444 .tested = TEST_OK_PREW,
6445 .probe = probe_spi_rdid,
6446 .probe_timing = TIMING_ZERO,
6447 .block_erasers =
6448 {
6449 {
6450 .eraseblocks = { {4 * 1024, 8192} },
6451 .block_erase = spi_block_erase_21,
6452 }, {
6453 .eraseblocks = { {64 * 1024, 512} },
6454 .block_erase = spi_block_erase_dc,
6455 }, {
6456 .eraseblocks = { {32768 * 1024, 1} },
6457 .block_erase = spi_block_erase_c7,
6458 }
6459 },
6460 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
6461 .write = spi_chip_write_256, /* Multi I/O supported */
6462 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6463 .voltage = {2700, 3600},
6464 },
6465
6466 {
6467 .vendor = "Micron/Numonyx/ST",
6468 .name = "MT25QL512", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
Alan Greend76dc1f2019-06-26 15:38:19 +10006469 .bustype = BUS_SPI,
6470 .manufacture_id = ST_ID,
6471 .model_id = ST_N25Q512__3E,
6472 .total_size = 65536,
6473 .page_size = 256,
6474 /* supports SFDP */
6475 /* OTP: 64B total; read 0x4B, write 0x42 */
6476 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
6477 .tested = TEST_OK_PREW,
6478 .probe = probe_spi_rdid,
6479 .probe_timing = TIMING_ZERO,
6480 .block_erasers =
6481 {
6482 {
6483 .eraseblocks = { {4 * 1024, 16384} },
6484 .block_erase = spi_block_erase_21,
6485 }, {
Alan Green184a7ba2019-07-31 16:02:42 +10006486 .eraseblocks = { {4 * 1024, 16384} },
6487 .block_erase = spi_block_erase_20,
6488 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006489 .eraseblocks = { {64 * 1024, 1024} },
6490 .block_erase = spi_block_erase_dc,
6491 }, {
Alan Green184a7ba2019-07-31 16:02:42 +10006492 .eraseblocks = { {64 * 1024, 1024} },
6493 .block_erase = spi_block_erase_d8,
6494 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006495 .eraseblocks = { {65536 * 1024, 1} },
6496 .block_erase = spi_block_erase_c7,
6497 }
6498 },
Alan Green184a7ba2019-07-31 16:02:42 +10006499 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
6500 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
Alan Greend76dc1f2019-06-26 15:38:19 +10006501 .write = spi_chip_write_256, /* Multi I/O supported */
6502 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6503 .voltage = {2700, 3600},
6504 },
6505
6506 {
Alan Green82e27422019-08-26 12:18:10 +10006507 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +10006508 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +10006509 .bustype = BUS_SPI,
6510 .manufacture_id = ST_ID,
6511 .model_id = ST_N25Q064__1E,
6512 .total_size = 8192,
6513 .page_size = 256,
6514 /* supports SFDP */
6515 /* OTP: 64B total; read 0x4B, write 0x42 */
6516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6517 .tested = TEST_OK_PREW,
6518 .probe = probe_spi_rdid,
6519 .probe_timing = TIMING_ZERO,
6520 .block_erasers =
6521 {
6522 {
6523 .eraseblocks = { {4 * 1024, 2048 } },
6524 .block_erase = spi_block_erase_20,
6525 }, {
6526 .eraseblocks = { {64 * 1024, 128} },
6527 .block_erase = spi_block_erase_d8,
6528 }, {
6529 .eraseblocks = { {8 * 1024 * 1024, 1} },
6530 .block_erase = spi_block_erase_c7,
6531 }
6532 },
Alan Green197c7432019-09-09 17:24:41 +10006533 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
6534 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
6535 .write = spi_chip_write_256, /* Multi I/O supported */
6536 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green82e27422019-08-26 12:18:10 +10006537 .voltage = {1700, 2000},
6538 .wp = &wp_w25,
6539 },
6540
6541 {
6542 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +10006543 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +10006544 .bustype = BUS_SPI,
6545 .manufacture_id = ST_ID,
6546 .model_id = ST_N25Q064__3E,
6547 .total_size = 8192,
6548 .page_size = 256,
6549 /* supports SFDP */
6550 /* OTP: 64B total; read 0x4B, write 0x42 */
6551 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6552 .tested = TEST_OK_PREW,
6553 .probe = probe_spi_rdid,
6554 .probe_timing = TIMING_ZERO,
6555 .block_erasers =
6556 {
6557 {
6558 .eraseblocks = { {4 * 1024, 2048 } },
6559 .block_erase = spi_block_erase_20,
6560 }, {
6561 .eraseblocks = { {64 * 1024, 128} },
6562 .block_erase = spi_block_erase_d8,
6563 }, {
6564 .eraseblocks = { {8 * 1024 * 1024, 1} },
6565 .block_erase = spi_block_erase_c7,
6566 }
6567 },
Alan Green197c7432019-09-09 17:24:41 +10006568 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
6569 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
6570 .write = spi_chip_write_256, /* Multi I/O supported */
6571 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green82e27422019-08-26 12:18:10 +10006572 .voltage = {2700, 3600},
6573 .wp = &wp_w25,
6574 },
6575
6576 {
hailfinger0ae231d2010-07-29 20:01:13 +00006577 .vendor = "MoselVitelic",
6578 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +00006579 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006580 .manufacture_id = SYNCMOS_MVC_ID,
6581 .model_id = MVC_V29C51000B,
6582 .total_size = 64,
6583 .page_size = 512,
6584 .feature_bits = FEATURE_EITHER_RESET,
6585 .tested = TEST_UNTESTED,
6586 .probe = probe_jedec,
6587 .probe_timing = TIMING_ZERO,
6588 .block_erasers =
6589 {
6590 {
6591 .eraseblocks = { {512, 128} },
6592 .block_erase = erase_sector_jedec,
6593 }, {
6594 .eraseblocks = { {64 * 1024, 1} },
6595 .block_erase = erase_chip_block_jedec,
6596 },
6597 },
6598 .write = write_jedec_1,
6599 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006600 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006601 },
6602
6603 {
6604 .vendor = "MoselVitelic",
6605 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +00006606 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006607 .manufacture_id = SYNCMOS_MVC_ID,
6608 .model_id = MVC_V29C51000T,
6609 .total_size = 64,
6610 .page_size = 512,
6611 .feature_bits = FEATURE_EITHER_RESET,
6612 .tested = TEST_UNTESTED,
6613 .probe = probe_jedec,
6614 .probe_timing = TIMING_ZERO,
6615 .block_erasers =
6616 {
6617 {
6618 .eraseblocks = { {512, 128} },
6619 .block_erase = erase_sector_jedec,
6620 }, {
6621 .eraseblocks = { {64 * 1024, 1} },
6622 .block_erase = erase_chip_block_jedec,
6623 },
6624 },
6625 .write = write_jedec_1,
6626 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006627 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006628 },
6629
6630 {
6631 .vendor = "MoselVitelic",
6632 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +00006633 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006634 .manufacture_id = SYNCMOS_MVC_ID,
6635 .model_id = MVC_V29C51400B,
6636 .total_size = 512,
6637 .page_size = 1024,
6638 .feature_bits = FEATURE_EITHER_RESET,
6639 .tested = TEST_UNTESTED,
6640 .probe = probe_jedec,
6641 .probe_timing = TIMING_ZERO,
6642 .block_erasers =
6643 {
6644 {
6645 .eraseblocks = { {1024, 512} },
6646 .block_erase = erase_sector_jedec,
6647 }, {
6648 .eraseblocks = { {512 * 1024, 1} },
6649 .block_erase = erase_chip_block_jedec,
6650 },
6651 },
6652 .write = write_jedec_1,
6653 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006654 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006655 },
6656
6657 {
6658 .vendor = "MoselVitelic",
6659 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +00006660 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006661 .manufacture_id = SYNCMOS_MVC_ID,
6662 .model_id = MVC_V29C51400T,
6663 .total_size = 512,
6664 .page_size = 1024,
6665 .feature_bits = FEATURE_EITHER_RESET,
6666 .tested = TEST_UNTESTED,
6667 .probe = probe_jedec,
6668 .probe_timing = TIMING_ZERO,
6669 .block_erasers =
6670 {
6671 {
6672 .eraseblocks = { {1024, 512} },
6673 .block_erase = erase_sector_jedec,
6674 }, {
6675 .eraseblocks = { {512 * 1024, 1} },
6676 .block_erase = erase_chip_block_jedec,
6677 },
6678 },
6679 .write = write_jedec_1,
6680 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006681 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006682 },
6683
6684 {
6685 .vendor = "MoselVitelic",
6686 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +00006687 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006688 .manufacture_id = SYNCMOS_MVC_ID,
6689 .model_id = MVC_V29LC51000,
6690 .total_size = 64,
6691 .page_size = 512,
6692 .feature_bits = FEATURE_EITHER_RESET,
6693 .tested = TEST_UNTESTED,
6694 .probe = probe_jedec,
6695 .probe_timing = TIMING_ZERO,
6696 .block_erasers =
6697 {
6698 {
6699 .eraseblocks = { {512, 128} },
6700 .block_erase = erase_sector_jedec,
6701 }, {
6702 .eraseblocks = { {64 * 1024, 1} },
6703 .block_erase = erase_chip_block_jedec,
6704 },
6705 },
6706 .write = write_jedec_1,
6707 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006708 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006709 },
6710
6711 {
6712 .vendor = "MoselVitelic",
6713 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +00006714 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006715 .manufacture_id = SYNCMOS_MVC_ID,
6716 .model_id = MVC_V29LC51001,
6717 .total_size = 128,
6718 .page_size = 512,
6719 .feature_bits = FEATURE_EITHER_RESET,
6720 .tested = TEST_UNTESTED,
6721 .probe = probe_jedec,
6722 .probe_timing = TIMING_ZERO,
6723 .block_erasers =
6724 {
6725 {
6726 .eraseblocks = { {512, 256} },
6727 .block_erase = erase_sector_jedec,
6728 }, {
6729 .eraseblocks = { {128 * 1024, 1} },
6730 .block_erase = erase_chip_block_jedec,
6731 },
6732 },
6733 .write = write_jedec_1,
6734 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006735 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006736 },
6737
6738 {
6739 .vendor = "MoselVitelic",
6740 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +00006741 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00006742 .manufacture_id = SYNCMOS_MVC_ID,
6743 .model_id = MVC_V29LC51002,
6744 .total_size = 256,
6745 .page_size = 512,
6746 .feature_bits = FEATURE_EITHER_RESET,
6747 .tested = TEST_UNTESTED,
6748 .probe = probe_jedec,
6749 .probe_timing = TIMING_ZERO,
6750 .block_erasers =
6751 {
6752 {
6753 .eraseblocks = { {512, 512} },
6754 .block_erase = erase_sector_jedec,
6755 }, {
6756 .eraseblocks = { {256 * 1024, 1} },
6757 .block_erase = erase_chip_block_jedec,
6758 },
6759 },
6760 .write = write_jedec_1,
6761 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006762 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00006763 },
6764
6765 {
hailfinger286829b2009-01-08 03:40:17 +00006766 .vendor = "PMC",
6767 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006768 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006769 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006770 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +00006771 .total_size = 128,
6772 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10006773 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00006774 .tested = TEST_UNTESTED,
6775 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006776 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006777 .block_erasers =
6778 {
6779 {
6780 .eraseblocks = { {4 * 1024, 32} },
6781 .block_erase = spi_block_erase_d7,
6782 }, {
6783 .eraseblocks = { {32 * 1024, 4} },
6784 .block_erase = spi_block_erase_d8,
6785 }, {
6786 .eraseblocks = { {128 * 1024, 1} },
6787 .block_erase = spi_block_erase_c7,
6788 }
6789 },
hailfingerb9560ee2010-07-14 20:21:22 +00006790 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006791 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006792 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006793 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006794 },
6795
hailfinger286829b2009-01-08 03:40:17 +00006796 {
6797 .vendor = "PMC",
6798 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +00006799 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006800 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006801 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +00006802 .total_size = 2048,
6803 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10006804 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00006805 .tested = TEST_UNTESTED,
6806 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006807 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006808 .block_erasers =
6809 {
6810 {
6811 .eraseblocks = { {4 * 1024, 512} },
6812 .block_erase = spi_block_erase_d7,
6813 }, {
6814 .eraseblocks = { {4 * 1024, 512} },
6815 .block_erase = spi_block_erase_20,
6816 }, {
6817 .eraseblocks = { {64 * 1024, 32} },
6818 .block_erase = spi_block_erase_d8,
6819 }, {
6820 .eraseblocks = { {2 * 1024 * 1024, 1} },
6821 .block_erase = spi_block_erase_60,
6822 }, {
6823 .eraseblocks = { {2 * 1024 * 1024, 1} },
6824 .block_erase = spi_block_erase_c7,
6825 }
6826 },
Alan Greena514de82019-09-09 16:40:10 +10006827 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00006828 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006829 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006830 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006831 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006832 },
6833
hailfinger286829b2009-01-08 03:40:17 +00006834 {
6835 .vendor = "PMC",
6836 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006837 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006838 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006839 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +00006840 .total_size = 256,
6841 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10006842 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00006843 .tested = TEST_UNTESTED,
6844 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006845 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006846 .block_erasers =
6847 {
6848 {
6849 .eraseblocks = { {4 * 1024, 64} },
6850 .block_erase = spi_block_erase_d7,
6851 }, {
6852 .eraseblocks = { {64 * 1024, 4} },
6853 .block_erase = spi_block_erase_d8,
6854 }, {
6855 .eraseblocks = { {256 * 1024, 1} },
6856 .block_erase = spi_block_erase_c7,
6857 }
6858 },
Alan Greena514de82019-09-09 16:40:10 +10006859 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00006860 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006861 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006862 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006863 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006864 },
6865
hailfinger286829b2009-01-08 03:40:17 +00006866 {
6867 .vendor = "PMC",
6868 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006869 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006870 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006871 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +00006872 .total_size = 512,
6873 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10006874 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10006875 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00006876 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006877 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006878 .block_erasers =
6879 {
6880 {
6881 .eraseblocks = { {4 * 1024, 128} },
6882 .block_erase = spi_block_erase_d7,
6883 }, {
6884 .eraseblocks = { {64 * 1024, 8} },
6885 .block_erase = spi_block_erase_d8,
6886 }, {
6887 .eraseblocks = { {512 * 1024, 1} },
6888 .block_erase = spi_block_erase_c7,
6889 }
6890 },
Alan Greena514de82019-09-09 16:40:10 +10006891 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00006892 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006893 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006894 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006895 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006896 },
6897
hailfinger286829b2009-01-08 03:40:17 +00006898 {
6899 .vendor = "PMC",
6900 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +00006901 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006902 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006903 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +00006904 .total_size = 1024,
6905 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10006906 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00006907 .tested = TEST_UNTESTED,
6908 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006909 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006910 .block_erasers =
6911 {
6912 {
6913 .eraseblocks = { {4 * 1024, 256} },
6914 .block_erase = spi_block_erase_d7,
6915 }, {
6916 .eraseblocks = { {4 * 1024, 256} },
6917 .block_erase = spi_block_erase_20,
6918 }, {
6919 .eraseblocks = { {64 * 1024, 16} },
6920 .block_erase = spi_block_erase_d8,
6921 }, {
6922 .eraseblocks = { {1024 * 1024, 1} },
6923 .block_erase = spi_block_erase_60,
6924 }, {
6925 .eraseblocks = { {1024 * 1024, 1} },
6926 .block_erase = spi_block_erase_c7,
6927 }
6928 },
Alan Greena514de82019-09-09 16:40:10 +10006929 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00006930 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006931 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006932 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006933 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006934 },
6935
hailfinger286829b2009-01-08 03:40:17 +00006936 {
6937 .vendor = "PMC",
Alan Greenb40ec892019-08-26 11:43:40 +10006938 .name = "Pm25LV512(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00006939 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006940 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006941 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +00006942 .total_size = 64,
6943 .page_size = 256,
6944 .tested = TEST_UNTESTED,
6945 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006946 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006947 .block_erasers =
6948 {
6949 {
6950 .eraseblocks = { {4 * 1024, 16} },
6951 .block_erase = spi_block_erase_d7,
6952 }, {
6953 .eraseblocks = { {32 * 1024, 2} },
6954 .block_erase = spi_block_erase_d8,
6955 }, {
6956 .eraseblocks = { {64 * 1024, 1} },
6957 .block_erase = spi_block_erase_c7,
6958 }
6959 },
hailfingerb9560ee2010-07-14 20:21:22 +00006960 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006961 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006962 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006963 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006964 },
6965
hailfinger286829b2009-01-08 03:40:17 +00006966 {
6967 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006968 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00006969 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006970 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006971 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +00006972 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006973 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006974 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +00006975 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00006976 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006977 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006978 .block_erasers =
6979 {
6980 {
6981 .eraseblocks = {
6982 {16 * 1024, 1},
6983 {8 * 1024, 2},
6984 {96 * 1024, 1},
6985 {128 * 1024, 1},
6986 },
snelsonc6855342010-01-28 23:55:12 +00006987 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006988 }, {
6989 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006990 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006991 },
6992 },
snelsonc6855342010-01-28 23:55:12 +00006993 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006994 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006995 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006996 },
6997
6998 {
6999 .vendor = "PMC",
Alan Greend76dc1f2019-06-26 15:38:19 +10007000 .name = "Pm29F002T",
7001 .bustype = BUS_PARALLEL,
7002 .manufacture_id = PMC_ID_NOPREFIX,
7003 .model_id = PMC_PM29F002T,
7004 .total_size = 256,
7005 .page_size = 8 * 1024,
7006 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7007 .tested = TEST_OK_PREW,
7008 .probe = probe_jedec,
7009 .probe_timing = TIMING_FIXME,
7010 .block_erasers =
7011 {
7012 {
7013 .eraseblocks = {
7014 {128 * 1024, 1},
7015 {96 * 1024, 1},
7016 {8 * 1024, 2},
7017 {16 * 1024, 1},
7018 },
7019 .block_erase = erase_sector_jedec,
7020 }, {
7021 .eraseblocks = { {256 * 1024, 1} },
7022 .block_erase = erase_chip_block_jedec,
7023 },
7024 },
7025 .write = write_jedec_1,
7026 .read = read_memmapped,
7027 .voltage = {4500, 5500},
7028 },
7029
7030 {
7031 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +00007032 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00007033 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +00007034 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00007035 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +00007036 .total_size = 128,
7037 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007038 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00007039 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +00007040 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007041 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +00007042 .block_erasers =
7043 {
7044 {
7045 .eraseblocks = { {4 * 1024, 32} },
7046 .block_erase = erase_sector_jedec,
7047 }, {
7048 .eraseblocks = { {64 * 1024, 2} },
7049 .block_erase = erase_block_jedec,
7050 }, {
7051 .eraseblocks = { {128 * 1024, 1} },
7052 .block_erase = erase_chip_block_jedec,
7053 }
7054 },
snelsonc6855342010-01-28 23:55:12 +00007055 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +00007056 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007057 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +00007058 },
7059
7060 {
7061 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +00007062 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00007063 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00007064 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00007065 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +00007066 .total_size = 256,
7067 .page_size = 4096,
7068 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7069 .tested = TEST_UNTESTED,
7070 .probe = probe_jedec,
7071 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +10007072 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +00007073 {
7074 {
7075 .eraseblocks = { {4 * 1024, 64} },
7076 .block_erase = erase_sector_jedec,
7077 }, {
7078 .eraseblocks = { {64 * 1024, 4} },
7079 .block_erase = erase_block_jedec,
7080 }, {
7081 .eraseblocks = { {256 * 1024, 1} },
7082 .block_erase = erase_chip_block_jedec,
7083 }
7084 },
7085 .write = write_jedec_1,
7086 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007087 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00007088 },
7089
7090 {
7091 .vendor = "PMC",
7092 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00007093 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00007094 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00007095 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +00007096 .total_size = 512,
7097 .page_size = 4096,
7098 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00007099 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +00007100 .probe = probe_jedec,
7101 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +10007102 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +00007103 {
7104 {
7105 .eraseblocks = { {4 * 1024, 128} },
7106 .block_erase = erase_sector_jedec,
7107 }, {
7108 .eraseblocks = { {64 * 1024, 8} },
7109 .block_erase = erase_block_jedec,
7110 }, {
7111 .eraseblocks = { {512 * 1024, 1} },
7112 .block_erase = erase_chip_block_jedec,
7113 }
7114 },
7115 .write = write_jedec_1,
7116 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007117 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00007118 },
Simon Glass8dc82732013-07-16 10:13:51 -06007119
hailfingerd444cc72010-03-27 23:25:14 +00007120 {
7121 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +00007122 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +00007123 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007124 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00007125 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +00007126 .total_size = 256,
7127 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007128 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +10007129 .tested = TEST_OK_PR,
hailfingerafac00e2010-01-09 02:24:17 +00007130 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007131 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00007132 .block_erasers =
7133 {
7134 {
7135 .eraseblocks = { {4 * 1024, 64} },
7136 .block_erase = erase_sector_jedec,
7137 }, {
7138 .eraseblocks = { {16 * 1024, 16} },
7139 .block_erase = erase_block_jedec,
7140 }, {
7141 .eraseblocks = { {256 * 1024, 1} },
7142 .block_erase = erase_chip_block_jedec,
7143 }
7144 },
Alan Green90539742019-09-02 17:06:30 +10007145 .unlock = unlock_regspace2_uniform_32k,
snelson59c83d22010-02-27 18:01:15 +00007146 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007147 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007148 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007149 },
7150
hailfinger286829b2009-01-08 03:40:17 +00007151 {
7152 .vendor = "PMC",
7153 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +00007154 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007155 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00007156 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +00007157 .total_size = 512,
7158 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007159 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +10007160 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +00007161 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007162 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00007163 .block_erasers =
7164 {
7165 {
7166 .eraseblocks = { {4 * 1024, 128} },
7167 .block_erase = erase_sector_jedec,
7168 }, {
7169 .eraseblocks = { {64 * 1024, 8} },
7170 .block_erase = erase_block_jedec,
7171 }, {
7172 .eraseblocks = { {512 * 1024, 1} },
7173 .block_erase = erase_chip_block_jedec,
7174 }
7175 },
Alan Green90539742019-09-02 17:06:30 +10007176 .unlock = unlock_regspace2_uniform_64k,
snelson59c83d22010-02-27 18:01:15 +00007177 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007178 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007179 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007180 },
7181
hailfinger286829b2009-01-08 03:40:17 +00007182 {
hailfinger286829b2009-01-08 03:40:17 +00007183 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +00007184 .name = "SST25LF040A",
7185 .bustype = BUS_SPI,
7186 .manufacture_id = SST_ID,
7187 .model_id = SST_SST25VF040_REMS,
7188 .total_size = 512,
7189 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007190 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007191 .tested = TEST_OK_PREW,
stefanct753c1a52011-08-17 09:50:11 +00007192 .probe = probe_spi_res2,
7193 .probe_timing = TIMING_ZERO,
7194 .block_erasers =
7195 {
7196 {
7197 .eraseblocks = { {4 * 1024, 128} },
7198 .block_erase = spi_block_erase_20,
7199 }, {
7200 .eraseblocks = { {32 * 1024, 16} },
7201 .block_erase = spi_block_erase_52,
7202 }, {
7203 .eraseblocks = { {512 * 1024, 1} },
7204 .block_erase = spi_block_erase_60,
7205 },
7206 },
Alan Greena514de82019-09-09 16:40:10 +10007207 .printlock = spi_prettyprint_status_register_sst25,
stefanct753c1a52011-08-17 09:50:11 +00007208 .unlock = spi_disable_blockprotect,
7209 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7210 .read = spi_chip_read,
7211 .voltage = {3000, 3600},
7212 },
7213
7214 {
7215 .vendor = "SST",
7216 .name = "SST25LF080A",
7217 .bustype = BUS_SPI,
7218 .manufacture_id = SST_ID,
7219 .model_id = SST_SST25VF080_REMS,
7220 .total_size = 1024,
7221 .page_size = 256,
7222 .tested = TEST_UNTESTED,
7223 .probe = probe_spi_res2,
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 = { {1024 * 1024, 1} },
7235 .block_erase = spi_block_erase_60,
7236 },
7237 },
7238 .unlock = spi_disable_blockprotect,
7239 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
7240 .read = spi_chip_read,
7241 .voltage = {3000, 3600},
7242 },
7243
7244 {
7245 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007246 .name = "SST25VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007247 .bustype = BUS_SPI,
hailfingerfb1f31f2010-12-03 14:48:11 +00007248 .manufacture_id = SST_ID,
7249 .model_id = SST_SST25VF010_REMS,
7250 .total_size = 128,
7251 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +10007252 .tested = TEST_OK_PREW,
hailfingerfb1f31f2010-12-03 14:48:11 +00007253 .probe = probe_spi_rems,
7254 .probe_timing = TIMING_ZERO,
7255 .block_erasers =
7256 {
7257 {
7258 .eraseblocks = { {4 * 1024, 32} },
7259 .block_erase = spi_block_erase_20,
7260 }, {
7261 .eraseblocks = { {32 * 1024, 4} },
7262 .block_erase = spi_block_erase_52,
7263 }, {
7264 .eraseblocks = { {128 * 1024, 1} },
7265 .block_erase = spi_block_erase_60,
7266 },
7267 },
7268 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007269 .write = spi_aai_write,
hailfingerfb1f31f2010-12-03 14:48:11 +00007270 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007271 .voltage = {2700, 3600},
hailfingerfb1f31f2010-12-03 14:48:11 +00007272 },
7273
7274 {
David Hendricks668f29d2011-01-27 18:51:45 -08007275 .vendor = "SST",
Alan Greenb40ec892019-08-26 11:43:40 +10007276 .name = "SST25VF010(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00007277 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08007278 .manufacture_id = SST_ID,
7279 .model_id = SST_SST25VF010_REMS,
7280 .total_size = 128,
7281 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +10007282 .tested = TEST_OK_PREW,
David Hendricks668f29d2011-01-27 18:51:45 -08007283 .probe = probe_spi_rems,
7284 .probe_timing = TIMING_ZERO,
7285 .block_erasers =
7286 {
7287 {
7288 .eraseblocks = { {4 * 1024, 32} },
7289 .block_erase = spi_block_erase_20,
7290 }, {
7291 .eraseblocks = { {32 * 1024, 4} },
7292 .block_erase = spi_block_erase_52,
7293 }, {
7294 .eraseblocks = { {128 * 1024, 1} },
7295 .block_erase = spi_block_erase_60,
7296 },
7297 },
7298 .unlock = spi_disable_blockprotect,
7299 .write = spi_chip_write_1,
7300 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10007301 .voltage = {2700, 3600},
David Hendricks668f29d2011-01-27 18:51:45 -08007302 },
7303
7304 {
hailfingerfb1f31f2010-12-03 14:48:11 +00007305 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007306 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +00007307 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007308 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007309 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +00007310 .total_size = 2048,
7311 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007312 .feature_bits = FEATURE_WRSR_EITHER,
Alan Green1295b292019-07-30 13:38:04 +10007313 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007314 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007315 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007316 .block_erasers =
7317 {
7318 {
7319 .eraseblocks = { {4 * 1024, 512} },
7320 .block_erase = spi_block_erase_20,
7321 }, {
7322 .eraseblocks = { {32 * 1024, 64} },
7323 .block_erase = spi_block_erase_52,
7324 }, {
7325 .eraseblocks = { {64 * 1024, 32} },
7326 .block_erase = spi_block_erase_d8,
7327 }, {
7328 .eraseblocks = { {2 * 1024 * 1024, 1} },
7329 .block_erase = spi_block_erase_60,
7330 }, {
7331 .eraseblocks = { {2 * 1024 * 1024, 1} },
7332 .block_erase = spi_block_erase_c7,
7333 },
7334 },
hailfingerb9560ee2010-07-14 20:21:22 +00007335 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007336 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +00007337 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007338 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007339 },
7340
hailfinger286829b2009-01-08 03:40:17 +00007341 {
7342 .vendor = "SST",
7343 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +00007344 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007345 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007346 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +00007347 .total_size = 4096,
7348 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007349 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007350 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007351 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007352 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007353 .block_erasers =
7354 {
7355 {
7356 .eraseblocks = { {4 * 1024, 1024} },
7357 .block_erase = spi_block_erase_20,
7358 }, {
7359 .eraseblocks = { {32 * 1024, 128} },
7360 .block_erase = spi_block_erase_52,
7361 }, {
7362 .eraseblocks = { {64 * 1024, 64} },
7363 .block_erase = spi_block_erase_d8,
7364 }, {
7365 .eraseblocks = { {4 * 1024 * 1024, 1} },
7366 .block_erase = spi_block_erase_60,
7367 }, {
7368 .eraseblocks = { {4 * 1024 * 1024, 1} },
7369 .block_erase = spi_block_erase_c7,
7370 },
7371 },
Alan Greena514de82019-09-09 16:40:10 +10007372 .printlock = spi_prettyprint_status_register_sst25,
hailfingerb9560ee2010-07-14 20:21:22 +00007373 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00007374 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +00007375 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007376 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +00007377 },
7378
7379 {
7380 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00007381 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007382 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +00007383 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007384 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +00007385 .total_size = 512,
7386 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007387 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007388 .tested = TEST_OK_PR,
hailfinger3aa0df12009-12-23 12:16:47 +00007389 .probe = probe_spi_rems,
7390 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007391 .block_erasers =
7392 {
7393 {
7394 .eraseblocks = { {4 * 1024, 128} },
7395 .block_erase = spi_block_erase_20,
7396 }, {
7397 .eraseblocks = { {32 * 1024, 16} },
7398 .block_erase = spi_block_erase_52,
7399 }, {
7400 .eraseblocks = { {512 * 1024, 1} },
7401 .block_erase = spi_block_erase_60,
7402 },
7403 },
hailfingerb9560ee2010-07-14 20:21:22 +00007404 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007405 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +00007406 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007407 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007408 },
7409
hailfinger286829b2009-01-08 03:40:17 +00007410 {
7411 .vendor = "SST",
7412 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00007413 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007414 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007415 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +00007416 .total_size = 512,
7417 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007418 .feature_bits = FEATURE_WRSR_EWSR,
hailfinger286829b2009-01-08 03:40:17 +00007419 .tested = TEST_UNTESTED,
7420 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007421 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007422 .block_erasers =
7423 {
7424 {
7425 .eraseblocks = { {4 * 1024, 128} },
7426 .block_erase = spi_block_erase_20,
7427 }, {
7428 .eraseblocks = { {32 * 1024, 16} },
7429 .block_erase = spi_block_erase_52,
7430 }, {
7431 .eraseblocks = { {64 * 1024, 8} },
7432 .block_erase = spi_block_erase_d8,
7433 }, {
7434 .eraseblocks = { {512 * 1024, 1} },
7435 .block_erase = spi_block_erase_60,
7436 }, {
7437 .eraseblocks = { {512 * 1024, 1} },
7438 .block_erase = spi_block_erase_c7,
7439 },
7440 },
hailfingerb9560ee2010-07-14 20:21:22 +00007441 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007442 .write = spi_aai_write,
stuge48dda5c2009-02-25 08:07:33 +00007443 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007444 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +00007445 },
7446
7447 {
7448 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +00007449 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00007450 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +00007451 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007452 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +00007453 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +00007454 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007455 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007456 .tested = TEST_OK_PR,
stuge712ce862009-01-26 03:37:40 +00007457 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +00007458 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007459 .block_erasers =
7460 {
7461 {
7462 .eraseblocks = { {4 * 1024, 128} },
7463 .block_erase = spi_block_erase_20,
7464 }, {
7465 .eraseblocks = { {32 * 1024, 16} },
7466 .block_erase = spi_block_erase_52,
7467 }, {
7468 .eraseblocks = { {64 * 1024, 8} },
7469 .block_erase = spi_block_erase_d8,
7470 }, {
7471 .eraseblocks = { {512 * 1024, 1} },
7472 .block_erase = spi_block_erase_60,
7473 }, {
7474 .eraseblocks = { {512 * 1024, 1} },
7475 .block_erase = spi_block_erase_c7,
7476 },
7477 },
hailfingerb9560ee2010-07-14 20:21:22 +00007478 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00007479 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +00007480 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007481 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +00007482 },
7483
7484 {
7485 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007486 .name = "SST25VF064C",
7487 .bustype = BUS_SPI,
7488 .manufacture_id = SST_ID,
7489 .model_id = SST_SST25VF064C,
7490 .total_size = 8192,
7491 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007492 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007493 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +10007494 .probe = probe_spi_rdid,
7495 .probe_timing = TIMING_ZERO,
7496 .block_erasers =
7497 {
7498 {
7499 .eraseblocks = { {4 * 1024, 2048} },
7500 .block_erase = spi_block_erase_20,
7501 }, {
7502 .eraseblocks = { {32 * 1024, 256} },
7503 .block_erase = spi_block_erase_52,
7504 }, {
7505 .eraseblocks = { {64 * 1024, 128} },
7506 .block_erase = spi_block_erase_d8,
7507 }, {
7508 .eraseblocks = { {8 * 1024 * 1024, 1} },
7509 .block_erase = spi_block_erase_60,
7510 }, {
7511 .eraseblocks = { {8 * 1024 * 1024, 1} },
7512 .block_erase = spi_block_erase_c7,
7513 },
7514 },
7515 .unlock = spi_disable_blockprotect,
7516 .write = spi_chip_write_256,
7517 .read = spi_chip_read,
7518 .voltage = {2700, 3600},
7519 },
7520
7521 {
7522 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007523 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +00007524 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007525 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007526 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +00007527 .total_size = 1024,
7528 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10007529 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +10007530 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007531 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007532 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00007533 .block_erasers =
7534 {
7535 {
7536 .eraseblocks = { {4 * 1024, 256} },
7537 .block_erase = spi_block_erase_20,
7538 }, {
7539 .eraseblocks = { {32 * 1024, 32} },
7540 .block_erase = spi_block_erase_52,
7541 }, {
7542 .eraseblocks = { {64 * 1024, 16} },
7543 .block_erase = spi_block_erase_d8,
7544 }, {
7545 .eraseblocks = { {1024 * 1024, 1} },
7546 .block_erase = spi_block_erase_60,
7547 }, {
7548 .eraseblocks = { {1024 * 1024, 1} },
7549 .block_erase = spi_block_erase_c7,
7550 },
7551 },
hailfingerb9560ee2010-07-14 20:21:22 +00007552 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007553 .write = spi_chip_write_1,
hailfinger286829b2009-01-08 03:40:17 +00007554 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007555 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007556 },
7557
hailfinger286829b2009-01-08 03:40:17 +00007558 {
7559 .vendor = "SST",
7560 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00007561 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007562 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007563 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +00007564 .total_size = 512,
7565 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00007566 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +00007567 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007568 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007569 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +00007570 .block_erasers =
7571 {
7572 {
7573 .eraseblocks = { {128, 4096} },
7574 .block_erase = erase_sector_28sf040,
7575 }, {
7576 .eraseblocks = { {512 * 1024, 1} },
7577 .block_erase = erase_chip_28sf040,
7578 }
7579 },
hailfinger86bf3b52010-10-13 21:49:30 +00007580 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +00007581 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +00007582 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007583 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007584 },
7585
hailfinger286829b2009-01-08 03:40:17 +00007586 {
7587 .vendor = "SST",
7588 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +00007589 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007590 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007591 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +00007592 .total_size = 128,
7593 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007594 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007595 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00007596 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007597 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007598 .block_erasers =
7599 {
7600 {
7601 .eraseblocks = { {128 * 1024, 1} },
7602 .block_erase = erase_chip_block_jedec,
7603 }
7604 },
hailfinger286829b2009-01-08 03:40:17 +00007605 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007606 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007607 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007608 },
7609
hailfinger286829b2009-01-08 03:40:17 +00007610 {
7611 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007612 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007613 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007614 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007615 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +00007616 .total_size = 256,
7617 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007618 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007619 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007620 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007621 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007622 .block_erasers =
7623 {
7624 {
7625 .eraseblocks = { {256 * 1024, 1} },
7626 .block_erase = erase_chip_block_jedec,
7627 }
7628 },
hailfinger286829b2009-01-08 03:40:17 +00007629 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007630 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007631 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007632 },
7633
hailfinger286829b2009-01-08 03:40:17 +00007634 {
7635 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007636 .name = "SST29LE010",
7637 .bustype = BUS_PARALLEL,
7638 .manufacture_id = SST_ID,
7639 .model_id = SST_SST29LE010,
7640 .total_size = 128,
7641 .page_size = 128,
7642 .feature_bits = FEATURE_LONG_RESET,
7643 .tested = TEST_UNTESTED,
7644 .probe = probe_jedec,
7645 .probe_timing = 10,
7646 .block_erasers =
7647 {
7648 {
7649 .eraseblocks = { {128 * 1024, 1} },
7650 .block_erase = erase_chip_block_jedec,
7651 }
7652 },
7653 .write = write_jedec,
7654 .read = read_memmapped,
7655 .voltage = {3000, 3600},
7656 },
7657
7658 {
7659 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007660 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +00007661 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007662 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007663 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +00007664 .total_size = 256,
7665 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00007666 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007667 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007668 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007669 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00007670 .block_erasers =
7671 {
7672 {
7673 .eraseblocks = { {256 * 1024, 1} },
7674 .block_erase = erase_chip_block_jedec,
7675 }
7676 },
hailfinger286829b2009-01-08 03:40:17 +00007677 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00007678 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007679 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007680 },
7681
hailfinger286829b2009-01-08 03:40:17 +00007682 {
7683 .vendor = "SST",
7684 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +00007685 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007686 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007687 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +00007688 .total_size = 128,
7689 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007690 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +00007691 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007692 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +00007693 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007694 .block_erasers =
7695 {
7696 {
7697 .eraseblocks = { {4 * 1024, 32} },
7698 .block_erase = erase_sector_jedec,
7699 }, {
7700 .eraseblocks = { {128 * 1024, 1} },
7701 .block_erase = erase_chip_block_jedec,
7702 }
7703 },
snelsonc6855342010-01-28 23:55:12 +00007704 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007705 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007706 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007707 },
7708
hailfinger286829b2009-01-08 03:40:17 +00007709 {
7710 .vendor = "SST",
7711 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007712 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007713 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007714 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +00007715 .total_size = 256,
7716 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007717 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007718 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007719 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007720 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007721 .block_erasers =
7722 {
7723 {
7724 .eraseblocks = { {4 * 1024, 64} },
7725 .block_erase = erase_sector_jedec,
7726 }, {
7727 .eraseblocks = { {256 * 1024, 1} },
7728 .block_erase = erase_chip_block_jedec,
7729 }
7730 },
snelsonc6855342010-01-28 23:55:12 +00007731 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007732 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007733 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007734 },
7735
hailfinger286829b2009-01-08 03:40:17 +00007736 {
7737 .vendor = "SST",
7738 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007739 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007740 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007741 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +00007742 .total_size = 512,
7743 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007744 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +00007745 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007746 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007747 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007748 .block_erasers =
7749 {
7750 {
7751 .eraseblocks = { {4 * 1024, 128} },
7752 .block_erase = erase_sector_jedec,
7753 }, {
7754 .eraseblocks = { {512 * 1024, 1} },
7755 .block_erase = erase_chip_block_jedec,
7756 }
7757 },
snelsonc6855342010-01-28 23:55:12 +00007758 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007759 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007760 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007761 },
7762
hailfinger286829b2009-01-08 03:40:17 +00007763 {
7764 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007765 .name = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +00007766 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007767 .manufacture_id = SST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10007768 .model_id = SST_SST39SF512,
hailfinger286829b2009-01-08 03:40:17 +00007769 .total_size = 64,
7770 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007771 .feature_bits = FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +10007772 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007773 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007774 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007775 .block_erasers =
7776 {
7777 {
7778 .eraseblocks = { {4 * 1024, 16} },
7779 .block_erase = erase_sector_jedec,
7780 }, {
7781 .eraseblocks = { {64 * 1024, 1} },
7782 .block_erase = erase_chip_block_jedec,
7783 }
7784 },
snelsonc6855342010-01-28 23:55:12 +00007785 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007786 .read = read_memmapped,
Alan Greend76dc1f2019-06-26 15:38:19 +10007787 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007788 },
7789
hailfinger286829b2009-01-08 03:40:17 +00007790 {
7791 .vendor = "SST",
7792 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007793 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007794 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007795 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +00007796 .total_size = 128,
7797 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007798 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007799 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007800 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007801 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007802 .block_erasers =
7803 {
7804 {
7805 .eraseblocks = { {4 * 1024, 32} },
7806 .block_erase = erase_sector_jedec,
7807 }, {
7808 .eraseblocks = { {128 * 1024, 1} },
7809 .block_erase = erase_chip_block_jedec,
7810 }
7811 },
snelsonc6855342010-01-28 23:55:12 +00007812 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007813 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007814 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007815 },
7816
hailfinger286829b2009-01-08 03:40:17 +00007817 {
7818 .vendor = "SST",
7819 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +00007820 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007821 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007822 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +00007823 .total_size = 256,
7824 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007825 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007826 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007827 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007828 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007829 .block_erasers =
7830 {
7831 {
7832 .eraseblocks = { {4 * 1024, 64} },
7833 .block_erase = erase_sector_jedec,
7834 }, {
7835 .eraseblocks = { {256 * 1024, 1} },
7836 .block_erase = erase_chip_block_jedec,
7837 }
7838 },
snelsonc6855342010-01-28 23:55:12 +00007839 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007840 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007841 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007842 },
7843
hailfinger286829b2009-01-08 03:40:17 +00007844 {
7845 .vendor = "SST",
7846 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007847 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007848 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007849 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +00007850 .total_size = 512,
7851 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007852 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007853 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007854 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007855 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007856 .block_erasers =
7857 {
7858 {
7859 .eraseblocks = { {4 * 1024, 128} },
7860 .block_erase = erase_sector_jedec,
7861 }, {
7862 .eraseblocks = { {512 * 1024, 1} },
7863 .block_erase = erase_chip_block_jedec,
7864 }
7865 },
snelsonc6855342010-01-28 23:55:12 +00007866 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007867 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007868 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +00007869 },
stepanaa1b6a22008-12-08 18:15:10 +00007870
hailfinger286829b2009-01-08 03:40:17 +00007871 {
7872 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +00007873 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +00007874 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +00007875 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007876 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +00007877 .total_size = 1024,
7878 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007879 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +00007880 .tested = TEST_UNTESTED,
7881 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007882 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007883 .block_erasers =
7884 {
7885 {
7886 .eraseblocks = { {4 * 1024, 256} },
7887 .block_erase = erase_sector_jedec,
7888 }, {
7889 .eraseblocks = { {64 * 1024, 16} },
7890 .block_erase = erase_block_jedec,
7891 }, {
7892 .eraseblocks = { {1024 * 1024, 1} },
7893 .block_erase = erase_chip_block_jedec,
7894 }
7895 },
snelsonc6855342010-01-28 23:55:12 +00007896 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007897 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007898 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +00007899 },
7900
7901 {
7902 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007903 .name = "SST39VF512",
7904 .bustype = BUS_PARALLEL,
7905 .manufacture_id = SST_ID,
7906 .model_id = SST_SST39VF512,
7907 .total_size = 64,
7908 .page_size = 4096,
7909 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007910 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10007911 .probe = probe_jedec,
7912 .probe_timing = 1, /* 150 ns */
7913 .block_erasers =
7914 {
7915 {
7916 .eraseblocks = { {4 * 1024, 16} },
7917 .block_erase = erase_sector_jedec,
7918 }, {
7919 .eraseblocks = { {64 * 1024, 1} },
7920 .block_erase = erase_chip_block_jedec,
7921 }
7922 },
7923 .write = write_jedec_1,
7924 .read = read_memmapped,
7925 .voltage = {2700, 3600},
7926 },
7927
7928 {
7929 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007930 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007931 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007932 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007933 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +00007934 .total_size = 256,
7935 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007936 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007937 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00007938 .probe = probe_jedec,
7939 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007940 .block_erasers =
7941 {
7942 {
7943 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +00007944 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007945 }, {
7946 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00007947 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007948 }, {
7949 .eraseblocks = { {256 * 1024, 1} },
7950 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7951 }
7952 },
hailfingerb8e4e212010-03-15 03:48:42 +00007953 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007954 .unlock = unlock_sst_fwhub,
7955 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007956 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007957 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007958 },
7959
hailfinger286829b2009-01-08 03:40:17 +00007960 {
7961 .vendor = "SST",
7962 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007963 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007964 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007965 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +00007966 .total_size = 384,
7967 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007968 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10007969 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00007970 .probe = probe_jedec,
7971 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007972 .block_erasers =
7973 {
7974 {
7975 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +00007976 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007977 }, {
7978 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +00007979 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007980 }, {
7981 .eraseblocks = { {384 * 1024, 1} },
7982 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7983 }
7984 },
hailfingerb8e4e212010-03-15 03:48:42 +00007985 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007986 .unlock = unlock_sst_fwhub,
7987 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007988 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007989 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007990 },
7991
hailfinger286829b2009-01-08 03:40:17 +00007992 {
hailfinger80f48682009-09-23 22:01:33 +00007993 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
7994 * and is only honored for 64k block erase, but not 4k sector erase.
7995 */
hailfinger286829b2009-01-08 03:40:17 +00007996 .vendor = "SST",
7997 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007998 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007999 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008000 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +00008001 .total_size = 512,
8002 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008003 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008004 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00008005 .probe = probe_jedec,
8006 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +00008007 .block_erasers =
8008 {
8009 {
8010 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +00008011 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +00008012 }, {
8013 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +00008014 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +00008015 }, {
8016 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +00008017 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +00008018 },
8019 },
hailfingerb8e4e212010-03-15 03:48:42 +00008020 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008021 .unlock = unlock_sst_fwhub,
8022 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008023 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008024 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008025 },
8026
hailfinger286829b2009-01-08 03:40:17 +00008027 {
8028 .vendor = "SST",
8029 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +00008030 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008031 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008032 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +00008033 .total_size = 512,
8034 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008035 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008036 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00008037 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008038 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008039 .block_erasers =
8040 {
8041 {
8042 .eraseblocks = { {4 * 1024, 128} },
8043 .block_erase = erase_sector_49lfxxxc,
8044 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008045 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008046 {64 * 1024, 7},
8047 {32 * 1024, 1},
8048 {8 * 1024, 2},
8049 {16 * 1024, 1},
8050 },
snelson3a69e422010-03-23 17:10:28 +00008051 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008052 }
8053 },
snelson3a69e422010-03-23 17:10:28 +00008054 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008055 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008056 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008057 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008058 },
8059
hailfinger286829b2009-01-08 03:40:17 +00008060 {
8061 .vendor = "SST",
8062 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +00008063 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008064 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008065 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +00008066 .total_size = 1024,
8067 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008068 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00008069 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00008070 .probe = probe_jedec,
8071 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008072 .block_erasers =
8073 {
8074 {
8075 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +00008076 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00008077 }, {
8078 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00008079 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00008080 }, {
8081 .eraseblocks = { {1024 * 1024, 1} },
8082 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
8083 }
8084 },
hailfingerb8e4e212010-03-15 03:48:42 +00008085 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00008086 .unlock = unlock_sst_fwhub,
8087 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008088 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008089 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008090 },
8091
hailfinger286829b2009-01-08 03:40:17 +00008092 {
8093 .vendor = "SST",
8094 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +00008095 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008096 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008097 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +00008098 .total_size = 1024,
8099 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008100 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008101 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00008102 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008103 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008104 .block_erasers =
8105 {
8106 {
8107 .eraseblocks = { {4 * 1024, 256} },
8108 .block_erase = erase_sector_49lfxxxc,
8109 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008110 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008111 {64 * 1024, 15},
8112 {32 * 1024, 1},
8113 {8 * 1024, 2},
8114 {16 * 1024, 1},
8115 },
snelson3a69e422010-03-23 17:10:28 +00008116 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008117 }
8118 },
snelson3a69e422010-03-23 17:10:28 +00008119 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008120 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008121 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008122 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008123 },
8124
hailfinger286829b2009-01-08 03:40:17 +00008125 {
8126 .vendor = "SST",
8127 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +00008128 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008129 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008130 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +00008131 .total_size = 2048,
8132 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008133 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008134 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00008135 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008136 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008137 .block_erasers =
8138 {
8139 {
8140 .eraseblocks = { {4 * 1024, 512} },
8141 .block_erase = erase_sector_49lfxxxc,
8142 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008143 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008144 {64 * 1024, 31},
8145 {32 * 1024, 1},
8146 {8 * 1024, 2},
8147 {16 * 1024, 1},
8148 },
snelson3a69e422010-03-23 17:10:28 +00008149 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008150 }
8151 },
snelson3a69e422010-03-23 17:10:28 +00008152 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008153 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008154 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008155 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008156 },
8157
hailfinger286829b2009-01-08 03:40:17 +00008158 {
8159 .vendor = "SST",
8160 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +00008161 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008162 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008163 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +00008164 .total_size = 256,
8165 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008166 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008167 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008168 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008169 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008170 .block_erasers =
8171 {
8172 {
8173 .eraseblocks = { {4 * 1024, 64} },
8174 .block_erase = erase_sector_jedec,
8175 }, {
8176 .eraseblocks = { {16 * 1024, 16} },
8177 .block_erase = erase_block_jedec,
8178 }, {
8179 .eraseblocks = { {256 * 1024, 1} },
8180 .block_erase = NULL,
8181 }
8182 },
snelsonc6855342010-01-28 23:55:12 +00008183 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008184 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008185 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +00008186 },
8187
hailfinger286829b2009-01-08 03:40:17 +00008188 {
8189 .vendor = "SST",
8190 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00008191 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008192 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008193 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +00008194 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +00008195 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008196 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008197 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00008198 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008199 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008200 .block_erasers =
8201 {
8202 {
8203 .eraseblocks = { {4 * 1024, 64} },
8204 .block_erase = erase_sector_jedec,
8205 }, {
8206 .eraseblocks = { {16 * 1024, 16} },
8207 .block_erase = erase_block_jedec,
8208 }, {
8209 .eraseblocks = { {256 * 1024, 1} },
8210 .block_erase = NULL,
8211 }
8212 },
snelsonc6855342010-01-28 23:55:12 +00008213 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008214 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008215 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008216 },
8217
hailfinger286829b2009-01-08 03:40:17 +00008218 {
8219 .vendor = "SST",
8220 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +00008221 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008222 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008223 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +00008224 .total_size = 512,
8225 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008226 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008227 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008228 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00008229 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00008230 .block_erasers =
8231 {
8232 {
8233 .eraseblocks = { {4 * 1024, 128} },
8234 .block_erase = erase_sector_jedec,
8235 }, {
8236 .eraseblocks = { {64 * 1024, 8} },
8237 .block_erase = erase_block_jedec,
8238 }, {
8239 .eraseblocks = { {512 * 1024, 1} },
8240 .block_erase = NULL,
8241 }
8242 },
snelsonc6855342010-01-28 23:55:12 +00008243 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008244 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008245 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008246 },
8247
hailfinger286829b2009-01-08 03:40:17 +00008248 {
8249 .vendor = "SST",
8250 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008251 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008252 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008253 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +00008254 .total_size = 512,
8255 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +00008256 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +00008257 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +00008258 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +00008259 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +00008260 .block_erasers =
8261 {
8262 {
8263 .eraseblocks = { {4 * 1024, 128} },
8264 .block_erase = erase_sector_jedec,
8265 }, {
8266 .eraseblocks = { {64 * 1024, 8} },
8267 .block_erase = erase_block_jedec,
8268 }, {
8269 .eraseblocks = { {512 * 1024, 1} },
8270 .block_erase = NULL,
8271 }
8272 },
Alan Greena59b2ae2019-09-02 17:26:10 +10008273 .unlock = unlock_regspace2_uniform_64k,
snelsonc6855342010-01-28 23:55:12 +00008274 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008275 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008276 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008277 },
8278
hailfinger286829b2009-01-08 03:40:17 +00008279 {
8280 .vendor = "SST",
8281 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +00008282 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008283 .manufacture_id = SST_ID,
Alan Greena7cfa332019-06-24 15:48:14 +10008284 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +00008285 .total_size = 1024,
8286 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00008287 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008288 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008289 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06008290 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +00008291 .block_erasers =
8292 {
8293 {
8294 .eraseblocks = { {4 * 1024, 256} },
8295 .block_erase = erase_sector_jedec,
8296 }, {
8297 .eraseblocks = { {64 * 1024, 16} },
8298 .block_erase = erase_block_jedec,
8299 }, {
8300 .eraseblocks = { {1024 * 1024, 1} },
8301 .block_erase = NULL,
8302 }
8303 },
snelsonc6855342010-01-28 23:55:12 +00008304 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008305 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008306 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008307 },
8308
hailfinger286829b2009-01-08 03:40:17 +00008309 {
8310 .vendor = "SST",
8311 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +00008312 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00008313 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00008314 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +00008315 .total_size = 2048,
8316 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008317 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008318 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00008319 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008320 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00008321 .block_erasers =
8322 {
8323 {
8324 .eraseblocks = { {4 * 1024, 512} },
8325 .block_erase = erase_sector_49lfxxxc,
8326 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06008327 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00008328 {64 * 1024, 31},
8329 {32 * 1024, 1},
8330 {8 * 1024, 2},
8331 {16 * 1024, 1},
8332 },
snelson3a69e422010-03-23 17:10:28 +00008333 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00008334 }
8335 },
snelson1ee293c2010-02-19 00:52:10 +00008336 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00008337 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008338 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008339 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008340 },
8341
Alan Greend76dc1f2019-06-26 15:38:19 +10008342 {
8343 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008344 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00008345 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008346 .manufacture_id = ST_ID,
8347 .model_id = ST_M29F002B,
8348 .total_size = 256,
8349 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008350 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008351 .tested = TEST_UNTESTED,
8352 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008353 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008354 .block_erasers =
8355 {
8356 {
8357 .eraseblocks = {
8358 {16 * 1024, 1},
8359 {8 * 1024, 2},
8360 {32 * 1024, 1},
8361 {64 * 1024, 3},
8362 },
8363 .block_erase = erase_sector_jedec,
8364 }, {
8365 .eraseblocks = { {256 * 1024, 1} },
8366 .block_erase = erase_chip_block_jedec,
8367 }
8368 },
snelsonc6855342010-01-28 23:55:12 +00008369 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008370 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008371 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008372 },
8373
hailfinger286829b2009-01-08 03:40:17 +00008374 {
8375 .vendor = "ST",
8376 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +00008377 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008378 .manufacture_id = ST_ID,
8379 .model_id = ST_M29F002T,
8380 .total_size = 256,
8381 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008382 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008383 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008384 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008385 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008386 .block_erasers =
8387 {
8388 {
8389 .eraseblocks = {
8390 {64 * 1024, 3},
8391 {32 * 1024, 1},
8392 {8 * 1024, 2},
8393 {16 * 1024, 1},
8394 },
8395 .block_erase = erase_sector_jedec,
8396 }, {
8397 .eraseblocks = { {256 * 1024, 1} },
8398 .block_erase = erase_chip_block_jedec,
8399 }
8400 },
snelsonc6855342010-01-28 23:55:12 +00008401 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008402 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008403 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008404 },
8405
hailfinger286829b2009-01-08 03:40:17 +00008406 {
8407 .vendor = "ST",
8408 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008409 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008410 .manufacture_id = ST_ID,
8411 .model_id = ST_M29F040B,
8412 .total_size = 512,
8413 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008414 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8415 .tested = TEST_UNTESTED,
8416 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00008417 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +00008418 .block_erasers =
8419 {
8420 {
Alan Green0d97b472019-07-26 10:33:25 +10008421 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +00008422 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +00008423 }, {
8424 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00008425 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +00008426 }
8427 },
snelsonc6855342010-01-28 23:55:12 +00008428 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008429 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008430 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008431 },
8432
hailfinger286829b2009-01-08 03:40:17 +00008433 {
snelsonc6855342010-01-28 23:55:12 +00008434 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00008435 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +00008436 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +00008437 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +00008438 .manufacture_id = ST_ID,
8439 .model_id = ST_M29F400BB,
8440 .total_size = 512,
8441 .page_size = 64 * 1024,
8442 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00008443 .tested = TEST_UNTESTED,
hailfingerfa513302010-07-16 22:07:20 +00008444 .probe = probe_m29f400bt,
8445 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
8446 .block_erasers =
8447 {
8448 {
8449 .eraseblocks = {
8450 {16 * 1024, 1},
8451 {8 * 1024, 2},
8452 {32 * 1024, 1},
8453 {64 * 1024, 7},
8454 },
8455 .block_erase = block_erase_m29f400bt,
8456 }, {
8457 .eraseblocks = { {512 * 1024, 1} },
8458 .block_erase = block_erase_chip_m29f400bt,
8459 }
8460 },
hailfinger86bf3b52010-10-13 21:49:30 +00008461 .write = write_m29f400bt,
hailfingerfa513302010-07-16 22:07:20 +00008462 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008463 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +00008464 },
Alan Green753a38e2019-06-07 14:44:32 +10008465
hailfingerfa513302010-07-16 22:07:20 +00008466 {
8467 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
8468 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008469 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +00008470 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008471 .manufacture_id = ST_ID,
8472 .model_id = ST_M29F400BT,
8473 .total_size = 512,
8474 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008475 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008476 .tested = TEST_UNTESTED,
8477 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00008478 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelsone0c56352010-01-19 16:08:51 +00008479 .block_erasers =
8480 {
8481 {
8482 .eraseblocks = {
8483 {64 * 1024, 7},
8484 {32 * 1024, 1},
8485 {8 * 1024, 2},
8486 {16 * 1024, 1},
8487 },
8488 .block_erase = block_erase_m29f400bt,
8489 }, {
8490 .eraseblocks = { {512 * 1024, 1} },
8491 .block_erase = block_erase_chip_m29f400bt,
8492 }
8493 },
hailfingerfa513302010-07-16 22:07:20 +00008494 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00008495 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008496 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008497 },
8498
hailfinger286829b2009-01-08 03:40:17 +00008499 {
8500 .vendor = "ST",
8501 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +00008502 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008503 .manufacture_id = ST_ID,
8504 .model_id = ST_M29W010B,
8505 .total_size = 128,
8506 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008508 .tested = TEST_UNTESTED,
8509 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008510 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008511 .block_erasers =
8512 {
8513 {
Alan Green0d97b472019-07-26 10:33:25 +10008514 .eraseblocks = { {16 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +00008515 .block_erase = erase_sector_jedec,
8516 }, {
8517 .eraseblocks = { {128 * 1024, 1} },
8518 .block_erase = erase_chip_block_jedec,
8519 }
8520 },
snelsonc6855342010-01-28 23:55:12 +00008521 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008522 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008523 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008524 },
8525
hailfinger286829b2009-01-08 03:40:17 +00008526 {
8527 .vendor = "ST",
8528 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008529 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008530 .manufacture_id = ST_ID,
8531 .model_id = ST_M29W040B,
8532 .total_size = 512,
8533 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008534 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008535 .tested = TEST_UNTESTED,
8536 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008537 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008538 .block_erasers =
8539 {
8540 {
Alan Green0d97b472019-07-26 10:33:25 +10008541 .eraseblocks = { {64 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +00008542 .block_erase = erase_sector_jedec,
8543 }, {
8544 .eraseblocks = { {512 * 1024, 1} },
8545 .block_erase = erase_chip_block_jedec,
8546 }
8547 },
snelsonc6855342010-01-28 23:55:12 +00008548 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008549 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008550 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008551 },
8552
Alan Green753a38e2019-06-07 14:44:32 +10008553 {
8554 .vendor = "ST",
8555 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +00008556 .bustype = BUS_PARALLEL,
Alan Green753a38e2019-06-07 14:44:32 +10008557 .manufacture_id = ST_ID,
8558 .model_id = ST_M29W512B,
Alan Greena7cfa332019-06-24 15:48:14 +10008559 .total_size = 64,
8560 .page_size = 64 * 1024,
8561 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10008562 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10008563 .probe = probe_jedec,
8564 .probe_timing = TIMING_ZERO,
8565 .block_erasers =
8566 {
8567 {
8568 .eraseblocks = { {64 * 1024, 1} },
8569 .block_erase = erase_chip_block_jedec,
8570 }
8571 },
8572 .write = write_jedec_1,
8573 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008574 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +10008575 },
snelson91cd0662010-02-01 05:49:46 +00008576
hailfinger286829b2009-01-08 03:40:17 +00008577 {
8578 .vendor = "ST",
8579 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +00008580 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008581 .manufacture_id = ST_ID,
8582 .model_id = ST_M50FLW040A,
8583 .total_size = 512,
8584 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008585 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008586 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008587 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008588 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008589 .block_erasers =
8590 {
8591 {
snelsonf88616b2010-01-19 16:39:19 +00008592 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008593 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008594 {64 * 1024, 5}, /* block */
8595 {4 * 1024, 16}, /* sector */
8596 {4 * 1024, 16}, /* sector */
8597 },
8598 .block_erase = NULL,
8599 }, {
Alan Green0d97b472019-07-26 10:33:25 +10008600 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00008601 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008602 }
8603 },
snelsonc0acbeb2010-03-19 18:47:06 +00008604 .unlock = unlock_stm50flw0x0x,
8605 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008606 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008607 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008608 },
8609
hailfinger286829b2009-01-08 03:40:17 +00008610 {
8611 .vendor = "ST",
8612 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008613 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008614 .manufacture_id = ST_ID,
8615 .model_id = ST_M50FLW040B,
8616 .total_size = 512,
8617 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008618 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008619 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008620 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008621 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008622 .block_erasers =
8623 {
8624 {
snelsonf88616b2010-01-19 16:39:19 +00008625 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008626 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008627 {4 * 1024, 16}, /* sector */
8628 {64 * 1024, 5}, /* block */
8629 {4 * 1024, 16}, /* sector */
8630 },
8631 .block_erase = NULL,
8632 }, {
Alan Green0d97b472019-07-26 10:33:25 +10008633 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00008634 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008635 }
8636 },
snelsonc0acbeb2010-03-19 18:47:06 +00008637 .unlock = unlock_stm50flw0x0x,
8638 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008639 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008640 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008641 },
8642
hailfinger286829b2009-01-08 03:40:17 +00008643 {
8644 .vendor = "ST",
8645 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +00008646 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008647 .manufacture_id = ST_ID,
8648 .model_id = ST_M50FLW080A,
8649 .total_size = 1024,
8650 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008651 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008652 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +00008653 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008654 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008655 .block_erasers =
8656 {
8657 {
snelsonf88616b2010-01-19 16:39:19 +00008658 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008659 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008660 {64 * 1024, 13}, /* block */
8661 {4 * 1024, 16}, /* sector */
8662 {4 * 1024, 16}, /* sector */
8663 },
8664 .block_erase = NULL,
8665 }, {
Alan Green0d97b472019-07-26 10:33:25 +10008666 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00008667 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008668 }
8669 },
snelsonc0acbeb2010-03-19 18:47:06 +00008670 .unlock = unlock_stm50flw0x0x,
8671 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008672 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008673 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008674 },
8675
hailfinger286829b2009-01-08 03:40:17 +00008676 {
8677 .vendor = "ST",
8678 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +00008679 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008680 .manufacture_id = ST_ID,
8681 .model_id = ST_M50FLW080B,
8682 .total_size = 1024,
8683 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008684 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008685 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008686 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008687 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008688 .block_erasers =
8689 {
8690 {
snelsonf88616b2010-01-19 16:39:19 +00008691 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008692 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008693 {4 * 1024, 16}, /* sector */
8694 {64 * 1024, 13}, /* block */
8695 {4 * 1024, 16}, /* sector */
8696 },
8697 .block_erase = NULL,
8698 }, {
Alan Green0d97b472019-07-26 10:33:25 +10008699 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00008700 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008701 }
8702 },
snelsonc0acbeb2010-03-19 18:47:06 +00008703 .unlock = unlock_stm50flw0x0x,
8704 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008705 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008706 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008707 },
8708
hailfinger286829b2009-01-08 03:40:17 +00008709 {
8710 .vendor = "ST",
8711 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +00008712 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008713 .manufacture_id = ST_ID,
8714 .model_id = ST_M50FW002,
8715 .total_size = 256,
8716 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008717 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008718 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008719 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008720 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelsone0c56352010-01-19 16:08:51 +00008721 .block_erasers =
8722 {
8723 {
8724 .eraseblocks = {
8725 {64 * 1024, 3},
8726 {32 * 1024, 1},
8727 {8 * 1024, 2},
8728 {16 * 1024, 1},
8729 },
snelsonc0acbeb2010-03-19 18:47:06 +00008730 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008731 }
8732 },
snelsonc0acbeb2010-03-19 18:47:06 +00008733 .unlock = unlock_stm50flw0x0x,
8734 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008735 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008736 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008737 },
8738
hailfinger286829b2009-01-08 03:40:17 +00008739 {
8740 .vendor = "ST",
8741 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +00008742 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008743 .manufacture_id = ST_ID,
8744 .model_id = ST_M50FW016,
8745 .total_size = 2048,
8746 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008747 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008748 .tested = TEST_UNTESTED,
8749 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008750 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008751 .block_erasers =
8752 {
8753 {
Alan Green0d97b472019-07-26 10:33:25 +10008754 .eraseblocks = { {64 * 1024, 32} },
snelsonc0acbeb2010-03-19 18:47:06 +00008755 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008756 }
8757 },
snelsonc0acbeb2010-03-19 18:47:06 +00008758 .unlock = unlock_stm50flw0x0x,
8759 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008760 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008761 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008762 },
8763
hailfinger286829b2009-01-08 03:40:17 +00008764 {
8765 .vendor = "ST",
8766 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +00008767 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008768 .manufacture_id = ST_ID,
8769 .model_id = ST_M50FW040,
8770 .total_size = 512,
8771 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008772 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00008773 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00008774 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008775 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008776 .block_erasers =
8777 {
8778 {
Alan Green0d97b472019-07-26 10:33:25 +10008779 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00008780 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008781 }
8782 },
snelsonc0acbeb2010-03-19 18:47:06 +00008783 .unlock = unlock_stm50flw0x0x,
8784 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008785 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008786 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008787 },
8788
hailfinger286829b2009-01-08 03:40:17 +00008789 {
8790 .vendor = "ST",
8791 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +00008792 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008793 .manufacture_id = ST_ID,
8794 .model_id = ST_M50FW080,
8795 .total_size = 1024,
8796 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008797 .feature_bits = FEATURE_REGISTERMAP,
stefancte0e52902011-05-26 14:28:51 +00008798 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008799 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008800 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008801 .block_erasers =
8802 {
8803 {
Alan Green0d97b472019-07-26 10:33:25 +10008804 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00008805 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008806 }
8807 },
snelsonc0acbeb2010-03-19 18:47:06 +00008808 .unlock = unlock_stm50flw0x0x,
8809 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008810 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008811 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008812 },
8813
hailfinger286829b2009-01-08 03:40:17 +00008814 {
8815 .vendor = "ST",
8816 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +00008817 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008818 .manufacture_id = ST_ID,
8819 .model_id = ST_M50LPW116,
8820 .total_size = 2048,
8821 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008822 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008823 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008824 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +00008825 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008826 .block_erasers =
8827 {
8828 {
8829 .eraseblocks = {
8830 {4 * 1024, 16},
8831 {64 * 1024, 30},
8832 {32 * 1024, 1},
8833 {8 * 1024, 2},
8834 {16 * 1024, 1},
8835 },
snelsonc0acbeb2010-03-19 18:47:06 +00008836 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008837 }
8838 },
snelsonc0acbeb2010-03-19 18:47:06 +00008839 .unlock = unlock_stm50flw0x0x,
8840 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008841 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008842 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008843 },
8844
hailfinger286829b2009-01-08 03:40:17 +00008845 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008846 .vendor = "Sanyo",
8847 .name = "LF25FW203A",
8848 .bustype = BUS_SPI,
8849 .manufacture_id = SANYO_ID,
8850 .model_id = SANYO_LE25FW203A,
8851 .total_size = 2048,
8852 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10008853 .tested = TEST_UNTESTED,
8854 .probe = probe_spi_rdid,
8855 .probe_timing = TIMING_ZERO,
8856 .block_erasers =
8857 {
8858 {
8859 .eraseblocks = { {64 * 1024, 32} },
8860 .block_erase = spi_block_erase_d8,
8861 }, {
8862 .eraseblocks = { {2 * 1024 * 1024, 1} },
8863 .block_erase = spi_block_erase_c7,
8864 }
8865 },
8866 .unlock = spi_disable_blockprotect,
8867 .write = spi_chip_write_256,
8868 .read = spi_chip_read,
8869 },
8870
8871 {
8872 .vendor = "Sharp",
8873 .name = "LH28F008BJT-BTLZ1",
8874 .bustype = BUS_PARALLEL,
8875 .manufacture_id = SHARP_ID,
8876 .model_id = SHARP_LH28F008BJ__PB,
8877 .total_size = 1024,
8878 .page_size = 64 * 1024,
8879 .tested = TEST_OK_PREW,
8880 .probe = probe_82802ab,
8881 .probe_timing = TIMING_ZERO,
8882 .block_erasers =
8883 {
8884 {
8885 .eraseblocks = {
8886 {8 * 1024, 8},
8887 {64 * 1024, 15}
8888 },
8889 .block_erase = erase_block_82802ab,
8890 }, {
8891 .eraseblocks = { {1024 * 1024, 1} },
8892 .block_erase = erase_sector_49lfxxxc,
8893 }
8894 },
8895 .unlock = unlock_lh28f008bjt,
8896 .write = write_82802ab,
8897 .read = read_memmapped,
8898 .voltage = {2700, 3600},
8899 },
8900
8901 {
8902 .vendor = "Sharp",
8903 .name = "LHF00L04",
8904 .bustype = BUS_FWH, /* A/A Mux */
8905 .manufacture_id = SHARP_ID,
8906 .model_id = SHARP_LHF00L04,
8907 .total_size = 1024,
8908 .page_size = 64 * 1024,
8909 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
8910 .tested = TEST_UNTESTED,
8911 .probe = probe_82802ab,
8912 .probe_timing = TIMING_ZERO,
8913 .block_erasers =
8914 {
8915 {
8916 .eraseblocks = {
8917 {64 * 1024, 15},
8918 {8 * 1024, 8}
8919 },
8920 .block_erase = erase_block_82802ab,
8921 }, {
8922 .eraseblocks = {
8923 {1024 * 1024, 1}
8924 },
8925 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
8926 },
8927 },
Alan Greena59b2ae2019-09-02 17:26:10 +10008928 .unlock = unlock_regspace2_uniform_64k,
Alan Greend76dc1f2019-06-26 15:38:19 +10008929 .write = write_82802ab,
8930 .read = read_memmapped,
8931 .voltage = {3000, 3600},
8932 },
8933
8934 {
8935 .vendor = "Spansion",
8936 .name = "S25FL004A",
8937 .bustype = BUS_SPI,
8938 .manufacture_id = SPANSION_ID,
8939 .model_id = SPANSION_S25FL004A,
8940 .total_size = 512,
8941 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10008942 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10008943 .tested = TEST_UNTESTED,
8944 .probe = probe_spi_rdid,
8945 .probe_timing = TIMING_ZERO,
8946 .block_erasers =
8947 {
8948 {
8949 .eraseblocks = { {64 * 1024, 8} },
8950 .block_erase = spi_block_erase_d8,
8951 }, {
8952 .eraseblocks = { {512 * 1024, 1} },
8953 .block_erase = spi_block_erase_c7,
8954 }
8955 },
Alan Green6cfd0182019-07-26 13:50:04 +10008956 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10008957 .unlock = spi_disable_blockprotect,
8958 .write = spi_chip_write_256,
8959 .read = spi_chip_read,
8960 .voltage = {2700, 3600},
8961 },
8962
8963 {
8964 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +10008965 .name = "S25FL008A",
8966 .bustype = BUS_SPI,
8967 .manufacture_id = SPANSION_ID,
8968 .model_id = SPANSION_S25FL008A,
8969 .total_size = 1024,
8970 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10008971 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008972 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +10008973 .probe = probe_spi_rdid,
8974 .probe_timing = TIMING_ZERO,
8975 .block_erasers =
8976 {
8977 {
8978 .eraseblocks = { {64 * 1024, 16} },
8979 .block_erase = spi_block_erase_d8,
8980 }, {
8981 .eraseblocks = { {1024 * 1024, 1} },
8982 .block_erase = spi_block_erase_c7,
8983 }
8984 },
Alan Green6cfd0182019-07-26 13:50:04 +10008985 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10008986 .unlock = spi_disable_blockprotect,
8987 .write = spi_chip_write_256,
8988 .read = spi_chip_read,
8989 .voltage = {2700, 3600},
8990 },
8991
8992 {
8993 .vendor = "Spansion",
8994 .name = "S25FL016A",
8995 .bustype = BUS_SPI,
8996 .manufacture_id = SPANSION_ID,
8997 .model_id = SPANSION_S25FL016A,
8998 .total_size = 2048,
8999 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10009000 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10009001 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009002 .probe = probe_spi_rdid,
9003 .probe_timing = TIMING_ZERO,
9004 .block_erasers =
9005 {
9006 {
9007 .eraseblocks = { {64 * 1024, 32} },
9008 .block_erase = spi_block_erase_d8,
9009 }, {
9010 .eraseblocks = { {2 * 1024 * 1024, 1} },
9011 .block_erase = spi_block_erase_c7,
9012 }
9013 },
Alan Green6cfd0182019-07-26 13:50:04 +10009014 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10009015 .unlock = spi_disable_blockprotect,
9016 .write = spi_chip_write_256,
9017 .read = spi_chip_read,
9018 .voltage = {2700, 3600},
9019 },
9020
9021 {
9022 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +10009023 .name = "S25FL032A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +10009024 .bustype = BUS_SPI,
9025 .manufacture_id = SPANSION_ID,
9026 .model_id = SPANSION_S25FL032A,
9027 .total_size = 4096,
9028 .page_size = 256,
Alan Greenc63f8d62019-08-26 15:10:04 +10009029 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009030 .probe = probe_spi_rdid,
9031 .probe_timing = TIMING_ZERO,
9032 .block_erasers =
9033 {
9034 {
9035 .eraseblocks = { {64 * 1024, 64} },
9036 .block_erase = spi_block_erase_d8,
9037 }, {
9038 .eraseblocks = { {4 * 1024 * 1024, 1} },
9039 .block_erase = spi_block_erase_c7,
9040 }
9041 },
9042 .unlock = spi_disable_blockprotect,
9043 .write = spi_chip_write_256,
9044 .read = spi_chip_read,
9045 .voltage = {2700, 3600},
9046 },
9047
9048 {
9049 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +10009050 .name = "S25FL064A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +10009051 .bustype = BUS_SPI,
9052 .manufacture_id = SPANSION_ID,
9053 .model_id = SPANSION_S25FL064A,
9054 .total_size = 8192,
9055 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +10009056 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009057 .probe = probe_spi_rdid,
9058 .probe_timing = TIMING_ZERO,
9059 .block_erasers =
9060 {
9061 {
9062 .eraseblocks = { {64 * 1024, 128} },
9063 .block_erase = spi_block_erase_d8,
9064 }, {
9065 .eraseblocks = { {8 * 1024 * 1024, 1} },
9066 .block_erase = spi_block_erase_c7,
9067 }
9068 },
9069 .unlock = spi_disable_blockprotect,
9070 .write = spi_chip_write_256,
9071 .read = spi_chip_read,
9072 .voltage = {2700, 3600},
9073 },
9074
9075 {
9076 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +10009077 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Alan Greend76dc1f2019-06-26 15:38:19 +10009078 .bustype = BUS_SPI,
9079 .manufacture_id = SPANSION_ID,
9080 .model_id = SPANSION_S25FL116K,
9081 .total_size = 2048,
9082 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +10009083 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009084 .probe = probe_spi_rdid,
9085 .probe_timing = TIMING_ZERO,
9086 .block_erasers =
9087 {
9088 {
9089 .eraseblocks = { {4 * 1024, 512} },
9090 .block_erase = spi_block_erase_20,
9091 }, {
9092 .eraseblocks = { {64 * 1024, 32} },
9093 .block_erase = spi_block_erase_d8,
9094 }, {
9095 .eraseblocks = { {2 * 1024 * 1024, 1} },
9096 .block_erase = spi_block_erase_c7,
9097 }
9098 },
9099 .unlock = spi_disable_blockprotect,
9100 .write = spi_chip_write_256,
9101 .read = spi_chip_read,
9102 .voltage = {2700, 3600},
9103 /* TODO: write-protection */
9104 },
9105
9106 {
9107 .vendor = "Spansion",
9108 .name = "S25FL128S_UL Uniform 128 kB Sectors",
9109 .bustype = BUS_SPI,
9110 .manufacture_id = SPANSION_ID,
9111 .model_id = SPANSION_S25FL128S_UL,
9112 .total_size = 16384,
9113 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009114 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10009115 .tested = TEST_UNTESTED,
9116 .probe = probe_spi_big_spansion,
9117 .probe_timing = TIMING_ZERO,
9118 .block_erasers =
9119 {
9120 {
9121 .eraseblocks = { {128 * 1024, 128} },
9122 .block_erase = spi_block_erase_d8,
9123 }, {
9124 .eraseblocks = { {16 * 1024 * 1024, 1} },
9125 .block_erase = spi_block_erase_60,
9126 }, {
9127 .eraseblocks = { {16 * 1024 * 1024, 1} },
9128 .block_erase = spi_block_erase_c7,
9129 },
9130 },
9131 .unlock = spi_disable_blockprotect,
9132 .write = spi_chip_write_256,
9133 .read = spi_chip_read,
9134 .voltage = {1700, 2000},
9135 .wp = &wp_generic,
9136 },
9137
9138 {
9139 .vendor = "Spansion",
9140 .name = "S25FL128S_US Uniform 64 kB Sectors",
9141 .bustype = BUS_SPI,
9142 .manufacture_id = SPANSION_ID,
9143 .model_id = SPANSION_S25FL128S_US,
9144 .total_size = 16384,
9145 .page_size = 256,
9146 .feature_bits = FEATURE_WRSR_WREN,
9147 .tested = TEST_UNTESTED,
9148 .probe = probe_spi_big_spansion,
9149 .probe_timing = TIMING_ZERO,
9150 .block_erasers =
9151 {
9152 {
9153 .eraseblocks = { {64 * 1024, 256} },
9154 .block_erase = spi_block_erase_d8,
9155 }, {
9156 .eraseblocks = { {16 * 1024 * 1024, 1} },
9157 .block_erase = spi_block_erase_60,
9158 }, {
9159 .eraseblocks = { {16 * 1024 * 1024, 1} },
9160 .block_erase = spi_block_erase_c7,
9161 },
9162 },
9163 .unlock = spi_disable_blockprotect,
9164 .write = spi_chip_write_256,
9165 .read = spi_chip_read,
9166 .voltage = {1700, 2000},
9167 .wp = &wp_generic,
9168 },
9169
9170 {
9171 .vendor = "Spansion",
9172 .name = "S25FL256S Large Sectors",
9173 .bustype = BUS_SPI,
9174 .manufacture_id = SPANSION_ID,
9175 .model_id = SPANSION_S25FL256S_UL,
9176 .total_size = 16384, /* This is just half the size.... */
9177 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009178 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10009179 .tested = TEST_UNTESTED,
9180 .probe = probe_spi_big_spansion,
9181 .probe_timing = TIMING_ZERO,
9182 .block_erasers =
9183 {
9184 {
9185 .eraseblocks = { {256 * 1024, 64} },
9186 .block_erase = s25fl_block_erase,
9187 }, {
9188 .eraseblocks = { {16 * 1024 * 1024, 1} },
9189 .block_erase = spi_block_erase_60,
9190 },
9191 },
9192 .unlock = spi_disable_blockprotect,
9193 .write = spi_chip_write_256,
9194 .read = spi_chip_read,
9195 .voltage = {1700, 2000},
9196 .wp = &wp_generic,
9197 },
9198
9199 {
9200 .vendor = "Spansion",
9201 .name = "S25FL256S Small Sectors",
9202 .bustype = BUS_SPI,
9203 .manufacture_id = SPANSION_ID,
9204 .model_id = SPANSION_S25FL256S_US,
9205 .total_size = 16384, /* This is just half the size.... */
9206 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009207 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009208 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009209 .probe = probe_spi_big_spansion,
9210 .probe_timing = TIMING_ZERO,
9211 .block_erasers =
9212 {
9213 {
9214 .eraseblocks = { {64 * 1024, 256} },
9215 .block_erase = s25fl_block_erase,
9216 }, {
9217 .eraseblocks = { {16 * 1024 * 1024, 1} },
9218 .block_erase = spi_block_erase_60,
9219 },
9220 },
9221 .unlock = spi_disable_blockprotect,
9222 .write = spi_chip_write_256,
9223 .read = spi_chip_read,
9224 .voltage = {1700, 2000},
9225 .wp = &wp_generic,
9226 },
9227
9228 {
9229 .vendor = "Spansion",
9230 .name = "S25FS128S Large Sectors",
9231 .bustype = BUS_SPI,
9232 .manufacture_id = SPANSION_ID,
9233 .model_id = SPANSION_S25FS128S_L,
9234 .total_size = 16384,
9235 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009236 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10009237 .tested = TEST_UNTESTED,
9238 .probe = probe_spi_big_spansion,
9239 .probe_timing = TIMING_ZERO,
9240 .block_erasers =
9241 {
9242 {
9243 .eraseblocks = { {64 * 1024, 256} },
9244 .block_erase = s25fs_block_erase_d8,
9245 }, {
9246 .eraseblocks = { {16 * 1024 * 1024, 1} },
9247 .block_erase = spi_block_erase_60,
9248 }, {
9249 .eraseblocks = { {16 * 1024 * 1024, 1} },
9250 .block_erase = spi_block_erase_c7,
9251 },
9252 },
9253 .unlock = spi_disable_blockprotect,
9254 .write = spi_chip_write_256,
9255 .read = spi_chip_read,
9256 .voltage = {1700, 2000},
9257 .wp = &wp_generic,
9258 },
9259
9260 {
9261 .vendor = "Spansion",
9262 .name = "S25FS128S Small Sectors",
9263 .bustype = BUS_SPI,
9264 .manufacture_id = SPANSION_ID,
9265 .model_id = SPANSION_S25FS128S_S,
9266 .total_size = 16384,
9267 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009268 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009269 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009270 .probe = probe_spi_big_spansion,
9271 .probe_timing = TIMING_ZERO,
9272 .block_erasers =
9273 {
9274 {
9275 .eraseblocks = { {64 * 1024, 256} },
9276 .block_erase = s25fs_block_erase_d8,
9277 }, {
9278 .eraseblocks = { {16 * 1024 * 1024, 1} },
9279 .block_erase = spi_block_erase_60,
9280 }, {
9281 .eraseblocks = { {16 * 1024 * 1024, 1} },
9282 .block_erase = spi_block_erase_c7,
9283 },
9284 },
9285 .unlock = spi_disable_blockprotect,
9286 .write = spi_chip_write_256,
9287 .read = spi_chip_read,
9288 .voltage = {1700, 2000},
9289 .wp = &wp_generic,
9290 },
9291
9292 {
hailfinger0ae231d2010-07-29 20:01:13 +00009293 .vendor = "SyncMOS/MoselVitelic",
9294 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +00009295 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009296 .manufacture_id = SYNCMOS_MVC_ID,
9297 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +00009298 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +00009299 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009300 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009301 .tested = TEST_UNTESTED,
9302 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009303 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009304 .block_erasers =
9305 {
9306 {
9307 .eraseblocks = { {512, 256} },
9308 .block_erase = erase_sector_jedec,
9309 }, {
9310 .eraseblocks = { {128 * 1024, 1} },
9311 .block_erase = erase_chip_block_jedec,
9312 },
9313 },
snelsonc6855342010-01-28 23:55:12 +00009314 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009315 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009316 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009317 },
9318
hailfinger286829b2009-01-08 03:40:17 +00009319 {
hailfinger0ae231d2010-07-29 20:01:13 +00009320 .vendor = "SyncMOS/MoselVitelic",
9321 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +00009322 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009323 .manufacture_id = SYNCMOS_MVC_ID,
9324 .model_id = SM_MVC_29C51001T,
9325 .total_size = 128,
9326 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00009327 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +00009328 .tested = TEST_UNTESTED,
9329 .probe = probe_jedec,
9330 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9331 .block_erasers =
9332 {
9333 {
9334 .eraseblocks = { {512, 256} },
9335 .block_erase = erase_sector_jedec,
9336 }, {
9337 .eraseblocks = { {128 * 1024, 1} },
9338 .block_erase = erase_chip_block_jedec,
9339 },
9340 },
9341 .write = write_jedec_1,
9342 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009343 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009344 },
9345
9346 {
9347 .vendor = "SyncMOS/MoselVitelic",
9348 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +00009349 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009350 .manufacture_id = SYNCMOS_MVC_ID,
9351 .model_id = SM_MVC_29C51002B,
9352 .total_size = 256,
9353 .page_size = 512,
9354 .feature_bits = FEATURE_EITHER_RESET,
9355 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00009356 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009357 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009358 .block_erasers =
9359 {
9360 {
9361 .eraseblocks = { {512, 512} },
9362 .block_erase = erase_sector_jedec,
9363 }, {
9364 .eraseblocks = { {256 * 1024, 1} },
9365 .block_erase = erase_chip_block_jedec,
9366 },
9367 },
snelsonc6855342010-01-28 23:55:12 +00009368 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009369 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +00009370 },
9371
hailfinger286829b2009-01-08 03:40:17 +00009372 {
hailfinger0ae231d2010-07-29 20:01:13 +00009373 .vendor = "SyncMOS/MoselVitelic",
9374 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +00009375 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009376 .manufacture_id = SYNCMOS_MVC_ID,
9377 .model_id = SM_MVC_29C51002T,
9378 .total_size = 256,
9379 .page_size = 512,
9380 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009381 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +00009382 .probe = probe_jedec,
9383 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9384 .block_erasers =
9385 {
9386 {
9387 .eraseblocks = { {512, 512} },
9388 .block_erase = erase_sector_jedec,
9389 }, {
9390 .eraseblocks = { {256 * 1024, 1} },
9391 .block_erase = erase_chip_block_jedec,
9392 },
9393 },
9394 .write = write_jedec_1,
9395 .read = read_memmapped,
9396 },
9397
9398 {
9399 .vendor = "SyncMOS/MoselVitelic",
9400 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009401 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009402 .manufacture_id = SYNCMOS_MVC_ID,
9403 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +00009404 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +00009405 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +00009406 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009407 .tested = TEST_UNTESTED,
9408 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009409 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00009410 .block_erasers =
9411 {
9412 {
hailfinger0ae231d2010-07-29 20:01:13 +00009413 .eraseblocks = { {1024, 512} },
9414 .block_erase = erase_sector_jedec,
9415 }, {
9416 .eraseblocks = { {512 * 1024, 1} },
9417 .block_erase = erase_chip_block_jedec,
9418 },
9419 },
9420 .write = write_jedec_1,
9421 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009422 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009423 },
9424
9425 {
9426 .vendor = "SyncMOS/MoselVitelic",
9427 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009428 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009429 .manufacture_id = SYNCMOS_MVC_ID,
9430 .model_id = SM_MVC_29C51004T,
9431 .total_size = 512,
9432 .page_size = 1024,
9433 .feature_bits = FEATURE_EITHER_RESET,
9434 .tested = TEST_UNTESTED,
9435 .probe = probe_jedec,
9436 .probe_timing = TIMING_ZERO,
9437 .block_erasers =
9438 {
9439 {
9440 .eraseblocks = { {1024, 512} },
9441 .block_erase = erase_sector_jedec,
9442 }, {
9443 .eraseblocks = { {512 * 1024, 1} },
9444 .block_erase = erase_chip_block_jedec,
9445 },
9446 },
9447 .write = write_jedec_1,
9448 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009449 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009450 },
9451
9452 {
9453 .vendor = "SyncMOS/MoselVitelic",
9454 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009455 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009456 .manufacture_id = SYNCMOS_MVC_ID,
9457 .model_id = SM_MVC_29C31004B,
9458 .total_size = 512,
9459 .page_size = 1024,
9460 .feature_bits = FEATURE_EITHER_RESET,
9461 .tested = TEST_UNTESTED,
9462 .probe = probe_jedec,
9463 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9464 .block_erasers =
9465 {
9466 {
9467 .eraseblocks = { {1024, 512} },
9468 .block_erase = erase_sector_jedec,
9469 }, {
9470 .eraseblocks = { {512 * 1024, 1} },
9471 .block_erase = erase_chip_block_jedec,
9472 },
9473 },
9474 .write = write_jedec_1,
9475 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009476 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +00009477 },
9478
9479 {
9480 .vendor = "SyncMOS/MoselVitelic",
9481 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009482 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009483 .manufacture_id = SYNCMOS_MVC_ID,
9484 .model_id = SM_MVC_29C31004T,
9485 .total_size = 512,
9486 .page_size = 1024,
9487 .feature_bits = FEATURE_EITHER_RESET,
9488 .tested = TEST_UNTESTED,
9489 .probe = probe_jedec,
9490 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9491 .block_erasers =
9492 {
9493 {
9494 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +00009495 .block_erase = erase_sector_jedec,
9496 }, {
9497 .eraseblocks = { {512 * 1024, 1} },
9498 .block_erase = erase_chip_block_jedec,
9499 },
9500 },
snelsonc6855342010-01-28 23:55:12 +00009501 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009502 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009503 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009504 },
9505
hailfinger286829b2009-01-08 03:40:17 +00009506 {
uwe77048c72009-05-27 23:17:40 +00009507 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009508 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +00009509 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009510 .manufacture_id = TI_OLD_ID,
9511 .model_id = TI_TMS29F002RB,
9512 .total_size = 256,
9513 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009514 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009515 .tested = TEST_UNTESTED,
9516 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009517 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009518 .block_erasers =
9519 {
9520 {
9521 .eraseblocks = {
9522 {16 * 1024, 1},
9523 {8 * 1024, 2},
9524 {32 * 1024, 1},
9525 {64 * 1024, 3},
9526 },
9527 .block_erase = erase_sector_jedec,
9528 }, {
9529 .eraseblocks = { {256 * 1024, 1} },
9530 .block_erase = erase_chip_block_jedec,
9531 },
9532 },
snelsonc6855342010-01-28 23:55:12 +00009533 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009534 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009535 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009536 },
9537
9538 {
uwe77048c72009-05-27 23:17:40 +00009539 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009540 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +00009541 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009542 .manufacture_id = TI_OLD_ID,
9543 .model_id = TI_TMS29F002RT,
9544 .total_size = 256,
9545 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009546 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009547 .tested = TEST_UNTESTED,
9548 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009549 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009550 .block_erasers =
9551 {
9552 {
9553 .eraseblocks = {
9554 {64 * 1024, 3},
9555 {32 * 1024, 1},
9556 {8 * 1024, 2},
9557 {16 * 1024, 1},
9558 },
9559 .block_erase = erase_sector_jedec,
9560 }, {
9561 .eraseblocks = { {256 * 1024, 1} },
9562 .block_erase = erase_chip_block_jedec,
9563 },
9564 },
snelsonc6855342010-01-28 23:55:12 +00009565 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009566 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009567 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009568 },
9569
9570 {
hailfinger286829b2009-01-08 03:40:17 +00009571 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -08009572 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +00009573 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +00009574 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009575 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -08009576 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +00009577 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009578 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10009579 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10009580 .tested = TEST_OK_PREW,
stefancte0e52902011-05-26 14:28:51 +00009581 .probe = probe_spi_rdid,
9582 .probe_timing = TIMING_ZERO,
9583 .block_erasers =
9584 {
9585 {
David Hendricks9356d162015-03-06 14:07:25 -08009586 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +00009587 .block_erase = spi_block_erase_20,
9588 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009589 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +00009590 .block_erase = spi_block_erase_52,
9591 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009592 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +00009593 .block_erase = spi_block_erase_d8,
9594 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009595 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009596 .block_erase = spi_block_erase_60,
9597 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009598 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009599 .block_erase = spi_block_erase_c7,
9600 }
9601 },
Alan Green6cfd0182019-07-26 13:50:04 +10009602 .printlock = spi_prettyprint_status_register_plain,
stefancte0e52902011-05-26 14:28:51 +00009603 .unlock = spi_disable_blockprotect,
9604 .write = spi_chip_write_256,
9605 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10009606 .voltage = {2700, 3600},
Duncan Laurieed32d7b2015-05-27 11:28:18 -07009607 .wp = &wp_w25q,
stefancte0e52902011-05-26 14:28:51 +00009608 },
9609
9610 {
9611 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +10009612 .name = "W25Q128.V..M",
Martin Rothee8dcf92017-05-10 19:16:19 -06009613 .bustype = BUS_SPI,
9614 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +10009615 .model_id = WINBOND_NEX_W25Q128_V_M,
Martin Rothee8dcf92017-05-10 19:16:19 -06009616 .total_size = 16384,
9617 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009618 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10009619 .tested = TEST_OK_PREW,
Martin Rothee8dcf92017-05-10 19:16:19 -06009620 .probe = probe_spi_rdid,
9621 .probe_timing = TIMING_ZERO,
9622 .block_erasers =
9623 {
9624 {
9625 .eraseblocks = { {4 * 1024, 4096} },
9626 .block_erase = spi_block_erase_20,
9627 }, {
9628 .eraseblocks = { {32 * 1024, 512} },
9629 .block_erase = spi_block_erase_52,
9630 }, {
9631 .eraseblocks = { {64 * 1024, 256} },
9632 .block_erase = spi_block_erase_d8,
9633 }, {
9634 .eraseblocks = { {16 * 1024 * 1024, 1} },
9635 .block_erase = spi_block_erase_60,
9636 }, {
9637 .eraseblocks = { {16 * 1024 * 1024, 1} },
9638 .block_erase = spi_block_erase_c7,
9639 }
9640 },
Alan Green6cfd0182019-07-26 13:50:04 +10009641 .printlock = spi_prettyprint_status_register_plain,
Alan Green96685f12019-08-26 15:48:25 +10009642 .unlock = spi_disable_blockprotect,
Martin Rothee8dcf92017-05-10 19:16:19 -06009643 .write = spi_chip_write_256,
9644 .read = spi_chip_read,
9645 .voltage = {2700, 3600},
9646 .wp = &wp_w25,
9647 },
Alan Greena7cfa332019-06-24 15:48:14 +10009648
Martin Rothee8dcf92017-05-10 19:16:19 -06009649 {
9650 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +10009651 .name = "W25Q128.W",
9652 .bustype = BUS_SPI,
9653 .manufacture_id = WINBOND_NEX_ID,
9654 .model_id = WINBOND_NEX_W25Q128_W,
9655 .total_size = 16384,
9656 .page_size = 256,
9657 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9658 .tested = TEST_OK_PREW,
9659 .probe = probe_spi_rdid,
9660 .probe_timing = TIMING_ZERO,
9661 .block_erasers =
9662 {
9663 {
9664 .eraseblocks = { {4 * 1024, 4096} },
9665 .block_erase = spi_block_erase_20,
9666 }, {
9667 .eraseblocks = { {32 * 1024, 512} },
9668 .block_erase = spi_block_erase_52,
9669 }, {
9670 .eraseblocks = { {64 * 1024, 256} },
9671 .block_erase = spi_block_erase_d8,
9672 }, {
9673 .eraseblocks = { {16 * 1024 * 1024, 1} },
9674 .block_erase = spi_block_erase_60,
9675 }, {
9676 .eraseblocks = { {16 * 1024 * 1024, 1} },
9677 .block_erase = spi_block_erase_c7,
9678 }
9679 },
9680 .unlock = spi_disable_blockprotect,
9681 .write = spi_chip_write_256,
9682 .read = spi_chip_read,
9683 /*
9684 * W25Q128FW is a 1.8V chip, however 3.3V variants with the same
9685 * model ID exist. We'll err on the side of caution here. A user
9686 * with a 3.3V chip sharing the model ID will need to either
9687 * specify voltage on the command line or duplicate this struct
9688 * with a different name/voltage and specify it with "-c".
9689 */
9690 .voltage = {1650, 1950},
9691 .wp = &wp_w25q,
9692 },
9693
9694 {
9695 .vendor = "Winbond",
Alan Green96685f12019-08-26 15:48:25 +10009696 .name = "W25Q16",
9697 .bustype = BUS_SPI,
9698 .manufacture_id = WINBOND_NEX_ID,
9699 .model_id = WINBOND_NEX_W25Q16_V,
9700 .total_size = 2048,
9701 .page_size = 256,
9702 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9703 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9704 .tested = TEST_OK_PREW,
9705 .probe = probe_spi_rdid,
9706 .probe_timing = TIMING_ZERO,
9707 .block_erasers =
9708 {
9709 {
9710 .eraseblocks = { {4 * 1024, 512} },
9711 .block_erase = spi_block_erase_20,
9712 }, {
9713 .eraseblocks = { {32 * 1024, 64} },
9714 .block_erase = spi_block_erase_52,
9715 }, {
9716 .eraseblocks = { {64 * 1024, 32} },
9717 .block_erase = spi_block_erase_d8,
9718 }, {
9719 .eraseblocks = { {2 * 1024 * 1024, 1} },
9720 .block_erase = spi_block_erase_60,
9721 }, {
9722 .eraseblocks = { {2 * 1024 * 1024, 1} },
9723 .block_erase = spi_block_erase_c7,
9724 }
9725 },
9726 .unlock = spi_disable_blockprotect,
9727 .write = spi_chip_write_256,
9728 .read = spi_chip_read,
9729 .voltage = {2700, 3600},
9730 .wp = &wp_w25q,
9731 },
9732
9733 {
9734 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009735 .name = "W25Q256.V",
9736 .bustype = BUS_SPI,
9737 .manufacture_id = WINBOND_NEX_ID,
9738 .model_id = WINBOND_NEX_W25Q256_V,
9739 .total_size = 32768,
9740 .page_size = 256,
9741 /* supports SFDP */
9742 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
9743 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Edward O'Callaghan27486212019-07-26 21:59:55 +10009744 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009745 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009746 .probe = probe_spi_rdid,
9747 .probe_timing = TIMING_ZERO,
9748 .block_erasers =
9749 {
9750 {
9751 .eraseblocks = { {4 * 1024, 8192} },
9752 .block_erase = spi_block_erase_20,
9753 }, {
9754 .eraseblocks = { {32 * 1024, 1024} },
9755 .block_erase = spi_block_erase_52,
9756 }, {
9757 .eraseblocks = { {64 * 1024, 512} },
9758 .block_erase = spi_block_erase_d8,
9759 }, {
9760 .eraseblocks = { {32 * 1024 * 1024, 1} },
9761 .block_erase = spi_block_erase_60,
9762 }, {
9763 .eraseblocks = { {32 * 1024 * 1024, 1} },
9764 .block_erase = spi_block_erase_c7,
9765 }
9766 },
Alan Green6cfd0182019-07-26 13:50:04 +10009767 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10009768 .unlock = spi_disable_blockprotect,
9769 .write = spi_chip_write_256,
9770 .read = spi_chip_read,
9771 .set_4ba = spi_enter_4ba_b7_we,
9772 .voltage = {2700, 3600},
9773 },
9774
9775 {
9776 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +10009777 .name = "W25Q256JV_M",
Shelley Chenfc338ee2018-07-20 16:27:15 -07009778 .bustype = BUS_SPI,
9779 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +10009780 .model_id = WINBOND_NEX_W25Q256JV_M,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009781 .total_size = 32768,
9782 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009783 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009784 .tested = TEST_OK_PREW,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009785 .probe = probe_spi_rdid,
9786 .probe_timing = TIMING_ZERO,
9787 .block_erasers =
9788 {
9789 {
9790 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009791 .block_erase = spi_block_erase_20,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009792 }, {
9793 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009794 .block_erase = spi_block_erase_52,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009795 }, {
9796 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009797 .block_erase = spi_block_erase_d8,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009798 }, {
9799 .eraseblocks = { {32 * 1024 * 1024, 1} },
9800 .block_erase = spi_block_erase_60,
9801 }, {
9802 .eraseblocks = { {32 * 1024 * 1024, 1} },
9803 .block_erase = spi_block_erase_c7,
9804 }
9805 },
9806 .unlock = spi_disable_blockprotect,
9807 .write = spi_chip_write_256,
9808 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009809 .set_4ba = spi_enter_4ba_b7_we,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009810 .voltage = {2700, 3600},
Duncan Laurie1801f7c2019-01-09 18:02:51 -08009811 .wp = &wp_w25q_large,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009812 },
Alan Greena7cfa332019-06-24 15:48:14 +10009813
Shelley Chenfc338ee2018-07-20 16:27:15 -07009814 {
9815 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +10009816 .name = "W25Q32.W",
Alan Greend76dc1f2019-06-26 15:38:19 +10009817 .bustype = BUS_SPI,
9818 .manufacture_id = WINBOND_NEX_ID,
9819 .model_id = WINBOND_NEX_W25Q32_W,
9820 .total_size = 4096,
9821 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009822 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009823 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009824 .probe = probe_spi_rdid,
9825 .probe_timing = TIMING_ZERO,
9826 .block_erasers =
9827 {
9828 {
9829 .eraseblocks = { {4 * 1024, 1024} },
9830 .block_erase = spi_block_erase_20,
9831 }, {
9832 .eraseblocks = { {32 * 1024, 128} },
9833 .block_erase = spi_block_erase_52,
9834 }, {
9835 .eraseblocks = { {64 * 1024, 64} },
9836 .block_erase = spi_block_erase_d8,
9837 }, {
9838 .eraseblocks = { {4 * 1024 * 1024, 1} },
9839 .block_erase = spi_block_erase_60,
9840 }, {
9841 .eraseblocks = { {4 * 1024 * 1024, 1} },
9842 .block_erase = spi_block_erase_c7,
9843 }
9844 },
9845 .unlock = spi_disable_blockprotect,
9846 .write = spi_chip_write_256,
9847 .read = spi_chip_read,
9848 .voltage = {1700, 1950},
9849 .wp = &wp_w25q,
9850 },
9851
9852 {
9853 .vendor = "Winbond",
Edward O'Callaghand80cf712019-05-24 22:06:36 +10009854 .name = "W25Q32JW",
9855 .bustype = BUS_SPI,
9856 .manufacture_id = WINBOND_NEX_ID,
9857 .model_id = WINBOND_NEX_W25Q32JW,
9858 .total_size = 4096,
9859 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009860 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009861 .tested = TEST_OK_PREW,
Edward O'Callaghand80cf712019-05-24 22:06:36 +10009862 .probe = probe_spi_rdid,
9863 .probe_timing = TIMING_ZERO,
9864 .block_erasers =
9865 {
9866 {
9867 .eraseblocks = { {4 * 1024, 1024} },
9868 .block_erase = spi_block_erase_20,
9869 }, {
9870 .eraseblocks = { {32 * 1024, 128} },
9871 .block_erase = spi_block_erase_52,
9872 }, {
9873 .eraseblocks = { {64 * 1024, 64} },
9874 .block_erase = spi_block_erase_d8,
9875 }, {
9876 .eraseblocks = { {4 * 1024 * 1024, 1} },
9877 .block_erase = spi_block_erase_60,
9878 }, {
9879 .eraseblocks = { {4 * 1024 * 1024, 1} },
9880 .block_erase = spi_block_erase_c7,
9881 }
9882 },
9883 .unlock = spi_disable_blockprotect,
9884 .write = spi_chip_write_256,
9885 .read = spi_chip_read,
9886 .voltage = {1700, 1950},
9887 .wp = &wp_w25q,
9888 },
Alan Greena7cfa332019-06-24 15:48:14 +10009889
Edward O'Callaghand80cf712019-05-24 22:06:36 +10009890 {
9891 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +10009892 .name = "W25Q32_V",
9893 .bustype = BUS_SPI,
9894 .manufacture_id = WINBOND_NEX_ID,
9895 .model_id = WINBOND_NEX_W25Q32_V,
9896 .total_size = 4096,
9897 .page_size = 256,
9898 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9900 .tested = TEST_OK_PREW,
9901 .probe = probe_spi_rdid,
9902 .probe_timing = TIMING_ZERO,
9903 .block_erasers =
9904 {
9905 {
9906 .eraseblocks = { {4 * 1024, 1024} },
9907 .block_erase = spi_block_erase_20,
9908 }, {
9909 .eraseblocks = { {32 * 1024, 128} },
9910 .block_erase = spi_block_erase_52,
9911 }, {
9912 .eraseblocks = { {64 * 1024, 64} },
9913 .block_erase = spi_block_erase_d8,
9914 }, {
9915 .eraseblocks = { {4 * 1024 * 1024, 1} },
9916 .block_erase = spi_block_erase_60,
9917 }, {
9918 .eraseblocks = { {4 * 1024 * 1024, 1} },
9919 .block_erase = spi_block_erase_c7,
9920 }
9921 },
9922 .unlock = spi_disable_blockprotect,
9923 .write = spi_chip_write_256,
9924 .read = spi_chip_read,
9925 .voltage = {2700, 3600},
9926 .wp = &wp_w25q,
9927 },
9928
9929 {
9930 .vendor = "Winbond",
Martin Rotha608fcc2019-09-26 02:27:11 -06009931 .name = "W25Q40.V",
9932 .bustype = BUS_SPI,
9933 .manufacture_id = WINBOND_NEX_ID,
9934 .model_id = WINBOND_NEX_W25Q40_V,
9935 .total_size = 512,
9936 .page_size = 256,
9937 /* supports SFDP */
9938 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
9939 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9940 .tested = TEST_OK_PREW,
9941 .probe = probe_spi_rdid,
9942 .probe_timing = TIMING_ZERO,
9943 .block_erasers =
9944 {
9945 {
9946 .eraseblocks = { {4 * 1024, 128} },
9947 .block_erase = spi_block_erase_20,
9948 }, {
9949 .eraseblocks = { {32 * 1024, 16} },
9950 .block_erase = spi_block_erase_52,
9951 }, {
9952 .eraseblocks = { {64 * 1024, 8} },
9953 .block_erase = spi_block_erase_d8,
9954 }, {
9955 .eraseblocks = { {512 * 1024, 1} },
9956 .block_erase = spi_block_erase_60,
9957 }, {
9958 .eraseblocks = { {512 * 1024, 1} },
9959 .block_erase = spi_block_erase_c7,
9960 }
9961 },
9962 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
9963 .unlock = spi_disable_blockprotect,
9964 .write = spi_chip_write_256, /* Multi I/O supported */
9965 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9966 .voltage = {2700, 3600},
9967 },
9968
9969 {
9970 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009971 .name = "W25Q40EW",
9972 .bustype = BUS_SPI,
9973 .manufacture_id = WINBOND_NEX_ID,
9974 .model_id = WINBOND_NEX_W25Q40EW,
9975 .total_size = 512,
9976 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009977 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009978 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009979 .probe = probe_spi_rdid,
9980 .probe_timing = TIMING_ZERO,
9981 .block_erasers =
9982 {
9983 {
9984 .eraseblocks = { {4 * 1024, 128} },
9985 .block_erase = spi_block_erase_20,
9986 }, {
9987 .eraseblocks = { {32 * 1024, 16} },
9988 .block_erase = spi_block_erase_52,
9989 }, {
9990 .eraseblocks = { {64 * 1024, 8} },
9991 .block_erase = spi_block_erase_d8,
9992 }, {
Alan Green1655a2e2019-07-26 10:55:55 +10009993 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +10009994 .block_erase = spi_block_erase_60,
9995 }, {
Alan Green1655a2e2019-07-26 10:55:55 +10009996 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +10009997 .block_erase = spi_block_erase_c7,
9998 }
9999 },
Alan Green6cfd0182019-07-26 13:50:04 +100010000 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100010001 .unlock = spi_disable_blockprotect,
10002 .write = spi_chip_write_256,
10003 .read = spi_chip_read,
10004 .voltage = {1650, 1950},
10005 /* FIXME(dhendrix): Add write-protection support */
10006 },
10007
10008 {
10009 .vendor = "Winbond",
10010 .name = "W25Q64",
10011 .bustype = BUS_SPI,
10012 .manufacture_id = WINBOND_NEX_ID,
10013 .model_id = WINBOND_NEX_W25Q64_V,
10014 .total_size = 8192,
10015 .page_size = 256,
10016 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +100010017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100010018 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010019 .probe = probe_spi_rdid,
10020 .probe_timing = TIMING_ZERO,
10021 .block_erasers =
10022 {
10023 {
10024 .eraseblocks = { {4 * 1024, 2048} },
10025 .block_erase = spi_block_erase_20,
10026 }, {
10027 .eraseblocks = { {32 * 1024, 256} },
10028 .block_erase = spi_block_erase_52,
10029 }, {
10030 .eraseblocks = { {64 * 1024, 128} },
10031 .block_erase = spi_block_erase_d8,
10032 }, {
10033 .eraseblocks = { {8 * 1024 * 1024, 1} },
10034 .block_erase = spi_block_erase_60,
10035 }, {
10036 .eraseblocks = { {8 * 1024 * 1024, 1} },
10037 .block_erase = spi_block_erase_c7,
10038 }
10039 },
10040 .unlock = spi_disable_blockprotect,
10041 .write = spi_chip_write_256,
10042 .read = spi_chip_read,
10043 .voltage = {2700, 3600},
10044 .wp = &wp_w25q,
10045 },
10046
10047 {
10048 .vendor = "Winbond",
10049 .name = "W25Q64DW",
10050 .bustype = BUS_SPI,
10051 .manufacture_id = WINBOND_NEX_ID,
10052 .model_id = WINBOND_NEX_W25Q64_W,
10053 .total_size = 8192,
10054 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010055 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100010056 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010057 .probe = probe_spi_rdid,
10058 .probe_timing = TIMING_ZERO,
10059 .block_erasers =
10060 {
10061 {
10062 .eraseblocks = { {4 * 1024, 2048} },
10063 .block_erase = spi_block_erase_20,
10064 }, {
10065 .eraseblocks = { {32 * 1024, 256} },
10066 .block_erase = spi_block_erase_52,
10067 }, {
10068 .eraseblocks = { {64 * 1024, 128} },
10069 .block_erase = spi_block_erase_d8,
10070 }, {
10071 .eraseblocks = { {8 * 1024 * 1024, 1} },
10072 .block_erase = spi_block_erase_60,
10073 }, {
10074 .eraseblocks = { {8 * 1024 * 1024, 1} },
10075 .block_erase = spi_block_erase_c7,
10076 }
10077 },
10078 .unlock = spi_disable_blockprotect,
10079 .write = spi_chip_write_256,
10080 .read = spi_chip_read,
10081 .voltage = {1700, 1950},
10082 .wp = &wp_w25q,
10083 },
10084
10085 {
10086 .vendor = "Winbond",
10087 .name = "W25Q80",
10088 .bustype = BUS_SPI,
10089 .manufacture_id = WINBOND_NEX_ID,
10090 .model_id = WINBOND_NEX_W25Q80_V,
10091 .total_size = 1024,
10092 .page_size = 256,
10093 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +100010094 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100010095 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010096 .probe = probe_spi_rdid,
10097 .probe_timing = TIMING_ZERO,
10098 .block_erasers =
10099 {
10100 {
10101 .eraseblocks = { {4 * 1024, 256} },
10102 .block_erase = spi_block_erase_20,
10103 }, {
10104 .eraseblocks = { {32 * 1024, 32} },
10105 .block_erase = spi_block_erase_52,
10106 }, {
10107 .eraseblocks = { {64 * 1024, 16} },
10108 .block_erase = spi_block_erase_d8,
10109 }, {
10110 .eraseblocks = { {1024 * 1024, 1} },
10111 .block_erase = spi_block_erase_60,
10112 }, {
10113 .eraseblocks = { {1024 * 1024, 1} },
10114 .block_erase = spi_block_erase_c7,
10115 }
10116 },
10117 .unlock = spi_disable_blockprotect,
10118 .write = spi_chip_write_256,
10119 .read = spi_chip_read,
10120 .voltage = {2700, 3600},
10121 .wp = &wp_w25q,
10122 },
10123
10124 {
10125 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010126 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +000010127 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010128 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010129 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +000010130 .total_size = 128,
10131 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010132 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100010133 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010134 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010135 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010136 .block_erasers =
10137 {
10138 {
10139 .eraseblocks = { {4 * 1024, 32} },
10140 .block_erase = spi_block_erase_20,
10141 }, {
snelson376060c2010-01-19 03:24:55 +000010142 .eraseblocks = { {64 * 1024, 2} },
10143 .block_erase = spi_block_erase_d8,
10144 }, {
10145 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000010146 .block_erase = spi_block_erase_c7,
10147 }
10148 },
Alan Green6cfd0182019-07-26 13:50:04 +100010149 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000010150 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000010151 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000010152 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010153 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080010154 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000010155 },
10156
hailfinger286829b2009-01-08 03:40:17 +000010157 {
10158 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010159 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +000010160 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +000010161 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010162 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +000010163 .total_size = 2048,
10164 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010165 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100010166 .tested = TEST_OK_PREW,
hailfingerea04a9e2009-07-11 19:39:11 +000010167 .probe = probe_spi_rdid,
10168 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010169 .block_erasers =
10170 {
10171 {
10172 .eraseblocks = { {4 * 1024, 512} },
10173 .block_erase = spi_block_erase_20,
10174 }, {
10175 .eraseblocks = { {32 * 1024, 64} },
10176 .block_erase = spi_block_erase_52,
10177 }, {
10178 .eraseblocks = { {64 * 1024, 32} },
10179 .block_erase = spi_block_erase_d8,
10180 }, {
10181 .eraseblocks = { {2 * 1024 * 1024, 1} },
10182 .block_erase = spi_block_erase_60,
10183 }, {
10184 .eraseblocks = { {2 * 1024 * 1024, 1} },
10185 .block_erase = spi_block_erase_c7,
10186 }
10187 },
Alan Green6cfd0182019-07-26 13:50:04 +100010188 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000010189 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +000010190 .write = spi_chip_write_256,
10191 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010192 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +000010193 },
10194
10195 {
10196 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010197 .name = "W25X20",
10198 .bustype = BUS_SPI,
10199 .manufacture_id = WINBOND_NEX_ID,
10200 .model_id = WINBOND_NEX_W25X20,
10201 .total_size = 256,
10202 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010203 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100010204 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010205 .probe = probe_spi_rdid,
10206 .probe_timing = TIMING_ZERO,
10207 .block_erasers =
10208 {
10209 {
10210 .eraseblocks = { {4 * 1024, 64} },
10211 .block_erase = spi_block_erase_20,
10212 }, {
10213 .eraseblocks = { {64 * 1024, 4} },
10214 .block_erase = spi_block_erase_d8,
10215 }, {
10216 .eraseblocks = { {256 * 1024, 1} },
10217 .block_erase = spi_block_erase_c7,
10218 }
10219 },
Alan Green6cfd0182019-07-26 13:50:04 +100010220 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100010221 .unlock = spi_disable_blockprotect,
10222 .write = spi_chip_write_256,
10223 .read = spi_chip_read,
10224 .voltage = {2700, 3600},
10225 .wp = &wp_w25,
10226 },
10227
10228 {
10229 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010230 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +000010231 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010232 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010233 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +000010234 .total_size = 4096,
10235 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010236 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100010237 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000010238 .probe = probe_spi_rdid,
10239 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010240 .block_erasers =
10241 {
10242 {
10243 .eraseblocks = { {4 * 1024, 1024} },
10244 .block_erase = spi_block_erase_20,
10245 }, {
10246 .eraseblocks = { {32 * 1024, 128} },
10247 .block_erase = spi_block_erase_52,
10248 }, {
10249 .eraseblocks = { {64 * 1024, 64} },
10250 .block_erase = spi_block_erase_d8,
10251 }, {
10252 .eraseblocks = { {4 * 1024 * 1024, 1} },
10253 .block_erase = spi_block_erase_60,
10254 }, {
10255 .eraseblocks = { {4 * 1024 * 1024, 1} },
10256 .block_erase = spi_block_erase_c7,
10257 }
10258 },
Alan Green6cfd0182019-07-26 13:50:04 +100010259 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000010260 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010261 .write = spi_chip_write_256,
10262 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010263 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010264 },
10265
10266 {
10267 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010268 .name = "W25X40",
10269 .bustype = BUS_SPI,
10270 .manufacture_id = WINBOND_NEX_ID,
10271 .model_id = WINBOND_NEX_W25X40,
10272 .total_size = 512,
10273 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010274 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100010275 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010276 .probe = probe_spi_rdid,
10277 .probe_timing = TIMING_ZERO,
10278 .block_erasers =
10279 {
10280 {
10281 .eraseblocks = { {4 * 1024, 128} },
10282 .block_erase = spi_block_erase_20,
10283 }, {
10284 .eraseblocks = { {64 * 1024, 8} },
10285 .block_erase = spi_block_erase_d8,
10286 }, {
10287 .eraseblocks = { {512 * 1024, 1} },
10288 .block_erase = spi_block_erase_c7,
10289 }
10290 },
Alan Green6cfd0182019-07-26 13:50:04 +100010291 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100010292 .unlock = spi_disable_blockprotect,
10293 .write = spi_chip_write_256,
10294 .read = spi_chip_read,
10295 .voltage = {2700, 3600},
10296 .wp = &wp_w25,
10297 },
10298
10299 {
10300 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000010301 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +000010302 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000010303 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000010304 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +000010305 .total_size = 8192,
10306 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010307 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100010308 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000010309 .probe = probe_spi_rdid,
10310 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000010311 .block_erasers =
10312 {
10313 {
10314 .eraseblocks = { {4 * 1024, 2048} },
10315 .block_erase = spi_block_erase_20,
10316 }, {
10317 .eraseblocks = { {32 * 1024, 256} },
10318 .block_erase = spi_block_erase_52,
10319 }, {
10320 .eraseblocks = { {64 * 1024, 128} },
10321 .block_erase = spi_block_erase_d8,
10322 }, {
10323 .eraseblocks = { {8 * 1024 * 1024, 1} },
10324 .block_erase = spi_block_erase_60,
10325 }, {
10326 .eraseblocks = { {8 * 1024 * 1024, 1} },
10327 .block_erase = spi_block_erase_c7,
10328 }
10329 },
Alan Green6cfd0182019-07-26 13:50:04 +100010330 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000010331 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000010332 .write = spi_chip_write_256,
10333 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000010334 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000010335 },
10336
10337 {
10338 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010339 .name = "W25X80",
10340 .bustype = BUS_SPI,
10341 .manufacture_id = WINBOND_NEX_ID,
10342 .model_id = WINBOND_NEX_W25X80,
10343 .total_size = 1024,
10344 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100010345 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100010346 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010347 .probe = probe_spi_rdid,
10348 .probe_timing = TIMING_ZERO,
hailfingere51a2012011-07-26 14:18:52 +000010349 .block_erasers =
10350 {
10351 {
Alan Greend76dc1f2019-06-26 15:38:19 +100010352 .eraseblocks = { {4 * 1024, 256} },
10353 .block_erase = spi_block_erase_20,
10354 }, {
10355 .eraseblocks = { {64 * 1024, 16} },
10356 .block_erase = spi_block_erase_d8,
10357 }, {
10358 .eraseblocks = { {1024 * 1024, 1} },
10359 .block_erase = spi_block_erase_c7,
hailfingere51a2012011-07-26 14:18:52 +000010360 }
10361 },
Alan Green6cfd0182019-07-26 13:50:04 +100010362 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100010363 .unlock = spi_disable_blockprotect,
10364 .write = spi_chip_write_256,
10365 .read = spi_chip_read,
10366 .voltage = {2700, 3600},
10367 .wp = &wp_w25,
hailfingere51a2012011-07-26 14:18:52 +000010368 },
10369
Alan Green753a38e2019-06-07 14:44:32 +100010370 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
10371 {
hailfingere51a2012011-07-26 14:18:52 +000010372 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010373 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +000010374 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010375 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010376 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +000010377 .total_size = 128,
10378 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010379 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +000010380 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010381 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010382 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +000010383 .block_erasers =
10384 {
10385 {
10386 .eraseblocks = { {128 * 1024, 1} },
10387 .block_erase = erase_chip_block_jedec,
10388 }
10389 },
hailfinger286829b2009-01-08 03:40:17 +000010390 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010391 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000010392 },
10393
hailfinger286829b2009-01-08 03:40:17 +000010394 {
10395 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010396 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
10397 .bustype = BUS_PARALLEL,
10398 .manufacture_id = WINBOND_ID,
10399 .model_id = WINBOND_W29C010,
10400 .total_size = 128,
10401 .page_size = 128,
10402 .feature_bits = FEATURE_LONG_RESET,
Alan Greenc63f8d62019-08-26 15:10:04 +100010403 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100010404 .probe = probe_w29ee011,
10405 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
10406 .block_erasers =
10407 {
10408 {
10409 .eraseblocks = { {128 * 1024, 1} },
10410 .block_erase = erase_chip_block_jedec,
10411 }
10412 },
10413 .write = write_jedec,
10414 .read = read_memmapped,
10415 },
10416
10417 {
10418 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010419 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000010420 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010421 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010422 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000010423 .total_size = 256,
10424 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010425 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100010426 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010427 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010428 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010429 .block_erasers =
10430 {
10431 {
10432 .eraseblocks = { {256 * 1024, 1} },
10433 .block_erase = erase_chip_block_jedec,
10434 }
10435 },
hailfinger286829b2009-01-08 03:40:17 +000010436 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010437 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010438 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010439 },
10440
hailfinger286829b2009-01-08 03:40:17 +000010441 {
10442 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010443 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000010444 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010445 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010446 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000010447 .total_size = 512,
10448 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000010449 .feature_bits = FEATURE_LONG_RESET,
10450 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000010451 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010452 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010453 .block_erasers =
10454 {
10455 {
10456 .eraseblocks = { {512 * 1024, 1} },
10457 .block_erase = erase_chip_block_jedec,
10458 }
10459 },
hailfinger286829b2009-01-08 03:40:17 +000010460 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010461 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010462 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010463 },
10464
hailfinger286829b2009-01-08 03:40:17 +000010465 {
10466 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000010467 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000010468 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000010469 .manufacture_id = WINBOND_ID,
10470 .model_id = WINBOND_W39L040,
10471 .total_size = 512,
10472 .page_size = 64 * 1024,
10473 .feature_bits = FEATURE_EITHER_RESET,
10474 .tested = TEST_OK_PR,
10475 .probe = probe_jedec,
10476 .probe_timing = 10,
10477 .block_erasers =
10478 {
10479 {
10480 .eraseblocks = { {4 * 1024, 128} },
10481 .block_erase = erase_block_jedec,
10482 }, {
10483 .eraseblocks = { {64 * 1024, 8} },
10484 .block_erase = erase_sector_jedec,
10485 }, {
10486 .eraseblocks = { {512 * 1024, 1} },
10487 .block_erase = erase_chip_block_jedec,
10488 }
10489 },
10490 .printlock = printlock_w39l040,
10491 .write = write_jedec_1,
10492 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010493 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000010494 },
10495
10496 {
10497 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010498 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000010499 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010500 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010501 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000010502 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010503 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010504 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010505 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010506 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000010507 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010508 .block_erasers =
10509 {
10510 {
10511 .eraseblocks = { {64 * 1024, 8} },
10512 .block_erase = erase_sector_jedec,
10513 }, {
10514 .eraseblocks = { {512 * 1024, 1} },
10515 .block_erase = erase_chip_block_jedec,
10516 }
10517 },
hailfingerf8993012010-12-05 16:33:59 +000010518 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000010519 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010520 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010521 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010522 },
10523
hailfinger286829b2009-01-08 03:40:17 +000010524 {
10525 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010526 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000010527 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010528 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010529 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000010530 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010531 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010532 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010533 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010534 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000010535 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010536 .block_erasers =
10537 {
10538 {
10539 .eraseblocks = { {64 * 1024, 8} },
10540 .block_erase = erase_sector_jedec,
10541 }, {
10542 .eraseblocks = { {512 * 1024, 1} },
10543 .block_erase = erase_chip_block_jedec,
10544 }
10545 },
hailfingerf8993012010-12-05 16:33:59 +000010546 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000010547 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010548 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010549 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010550 },
10551
hailfinger286829b2009-01-08 03:40:17 +000010552 {
10553 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010554 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000010555 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010556 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010557 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000010558 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010559 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010560 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010561 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000010562 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010563 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010564 .block_erasers =
10565 {
10566 {
10567 .eraseblocks = { {64 * 1024, 8} },
10568 .block_erase = erase_sector_jedec,
10569 }, {
10570 .eraseblocks = { {512 * 1024, 1} },
10571 .block_erase = erase_chip_block_jedec,
10572 }
10573 },
snelson1ee293c2010-02-19 00:52:10 +000010574 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000010575 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010576 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010577 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010578 },
10579
hailfinger286829b2009-01-08 03:40:17 +000010580 {
10581 .vendor = "Winbond",
10582 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010583 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010584 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010585 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000010586 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010587 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000010588 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010589 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010590 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000010591 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010592 .block_erasers =
10593 {
10594 {
10595 .eraseblocks = { {4 * 1024, 128} },
10596 .block_erase = erase_block_jedec,
10597 }, {
10598 .eraseblocks = { {64 * 1024, 8} },
10599 .block_erase = erase_sector_jedec,
10600 }, {
10601 .eraseblocks = { {512 * 1024, 1} },
10602 .block_erase = erase_chip_block_jedec,
10603 }
10604 },
hailfingerf8993012010-12-05 16:33:59 +000010605 .printlock = printlock_w39v040fa,
mkarcher74173032010-05-30 16:55:18 +000010606 .unlock = unlock_sst_fwhub,
snelsonc6855342010-01-28 23:55:12 +000010607 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010608 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010609 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010610 },
10611
hailfinger286829b2009-01-08 03:40:17 +000010612 {
10613 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010614 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010615 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010616 .manufacture_id = WINBOND_ID,
10617 .model_id = WINBOND_W39V040B,
10618 .total_size = 512,
10619 .page_size = 64 * 1024,
10620 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000010621 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010622 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010623 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000010624 .block_erasers =
10625 {
10626 {
10627 .eraseblocks = { {64 * 1024, 8} },
10628 .block_erase = erase_sector_jedec,
10629 }, {
10630 .eraseblocks = { {512 * 1024, 1} },
10631 .block_erase = erase_chip_block_jedec,
10632 }
10633 },
10634 .printlock = printlock_w39v040fb,
mkarcher64dbd922010-12-26 23:55:12 +000010635 .unlock = unlock_w39v040fb,
hailfingerf8993012010-12-05 16:33:59 +000010636 .write = write_jedec_1,
10637 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010638 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010639 },
10640
10641 {
10642 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080010643 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010644 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010645 .manufacture_id = WINBOND_ID,
10646 .model_id = WINBOND_W39V040C,
10647 .total_size = 512,
10648 .page_size = 64 * 1024,
10649 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100010650 .tested = TEST_OK_PREW,
10651 .probe = probe_jedec,
10652 .probe_timing = 10,
10653 .block_erasers =
10654 {
10655 {
10656 .eraseblocks = { {64 * 1024, 8} },
10657 .block_erase = erase_sector_jedec,
10658 }, {
10659 .eraseblocks = { {512 * 1024, 1} },
10660 .block_erase = erase_chip_block_jedec,
10661 }
10662 },
10663 .printlock = printlock_w39v040fc,
10664 .write = write_jedec_1,
10665 .read = read_memmapped,
10666 .voltage = {3000, 3600}, /* Also has 12V fast program */
10667 },
10668
10669 {
10670 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010671 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000010672 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010673 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010674 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000010675 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010676 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010677 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070010678 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010679 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010680 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010681 .block_erasers =
10682 {
10683 {
10684 .eraseblocks = { {64 * 1024, 16} },
10685 .block_erase = erase_sector_jedec,
10686 }, {
10687 .eraseblocks = { {1024 * 1024, 1} },
10688 .block_erase = erase_chip_block_jedec,
10689 }
10690 },
hailfingerf8993012010-12-05 16:33:59 +000010691 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000010692 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010693 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010694 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010695 },
10696
hailfinger286829b2009-01-08 03:40:17 +000010697 {
10698 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010699 .name = "W39V080FA",
10700 .bustype = BUS_FWH,
10701 .manufacture_id = WINBOND_ID,
10702 .model_id = WINBOND_W39V080FA,
10703 .total_size = 1024,
10704 .page_size = 64 * 1024,
10705 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10706 .tested = TEST_OK_PREW,
10707 .probe = probe_jedec,
10708 .probe_timing = 10,
10709 .block_erasers =
10710 {
10711 {
Alan Green0d97b472019-07-26 10:33:25 +100010712 .eraseblocks = { {64 * 1024, 16} },
Alan Greend76dc1f2019-06-26 15:38:19 +100010713 .block_erase = erase_sector_jedec,
10714 }, {
10715 .eraseblocks = { {1024 * 1024, 1} },
10716 .block_erase = erase_chip_block_jedec,
10717 }
10718 },
10719 .printlock = printlock_w39v080fa,
10720 .unlock = unlock_w39v080fa,
10721 .write = write_jedec_1,
10722 .read = read_memmapped,
10723 .voltage = {3000, 3600}, /* Also has 12V fast program */
10724 },
10725
10726 {
10727 .vendor = "Winbond",
10728 .name = "W39V080FA (dual mode)",
10729 .bustype = BUS_FWH,
10730 .manufacture_id = WINBOND_ID,
10731 .model_id = WINBOND_W39V080FA_DM,
10732 .total_size = 512,
10733 .page_size = 64 * 1024,
10734 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10735 .tested = TEST_UNTESTED,
10736 .probe = probe_jedec,
10737 .probe_timing = 10,
10738 .block_erasers =
10739 {
10740 {
Alan Green0d97b472019-07-26 10:33:25 +100010741 .eraseblocks = { {64 * 1024, 8} },
Alan Greend76dc1f2019-06-26 15:38:19 +100010742 .block_erase = erase_sector_jedec,
10743 }, {
10744 .eraseblocks = { {512 * 1024, 1} },
10745 .block_erase = erase_chip_block_jedec,
10746 }
10747 },
10748 .printlock = printlock_w39v080fa_dual,
10749 .write = write_jedec_1,
10750 .read = read_memmapped,
10751 .voltage = {3000, 3600}, /* Also has 12V fast program */
10752 },
10753
10754 {
10755 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010756 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000010757 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010758 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010759 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000010760 .total_size = 256,
10761 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010762 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010763 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010764 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010765 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010766 .block_erasers =
10767 {
10768 {
10769 .eraseblocks = {
10770 {128 * 1024, 1},
10771 {96 * 1024, 1},
10772 {8 * 1024, 2},
10773 {16 * 1024, 1},
10774 },
10775 .block_erase = erase_sector_jedec,
10776 }, {
10777 .eraseblocks = { {256 * 1024, 1} },
10778 .block_erase = erase_chip_block_jedec,
10779 }
10780 },
snelsonc6855342010-01-28 23:55:12 +000010781 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010782 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010783 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010784 },
10785
hailfinger286829b2009-01-08 03:40:17 +000010786 {
10787 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000010788 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000010789 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000010790 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010791 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000010792 .total_size = 256,
10793 .page_size = 128,
10794 .feature_bits = FEATURE_EITHER_RESET,
10795 .tested = TEST_OK_PROBE,
10796 .probe = probe_jedec,
10797 .probe_timing = 10,
10798 .block_erasers =
10799 {
10800 {
10801 .eraseblocks = { {256 * 1024, 1} },
10802 .block_erase = erase_chip_block_jedec,
10803 }
10804 },
10805 .write = write_jedec_1,
10806 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010807 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000010808 },
10809
10810 {
10811 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010812 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000010813 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010814 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010815 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000010816 .total_size = 256,
10817 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010818 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100010819 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010820 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010821 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010822 .block_erasers =
10823 {
10824 {
10825 .eraseblocks = {
10826 {64 * 1024, 3},
10827 {32 * 1024, 1},
10828 {8 * 1024, 2},
10829 {16 * 1024, 1},
10830 },
10831 .block_erase = erase_sector_jedec,
10832 }, {
10833 .eraseblocks = { {256 * 1024, 1} },
10834 .block_erase = erase_chip_block_jedec,
10835 }
10836 },
snelsonc6855342010-01-28 23:55:12 +000010837 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010838 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010839 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010840 },
10841
hailfinger286829b2009-01-08 03:40:17 +000010842 {
10843 .vendor = "Winbond",
10844 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010845 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010846 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010847 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000010848 .total_size = 256,
10849 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010850 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100010851 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010852 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010853 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010854 .block_erasers =
10855 {
10856 {
10857 .eraseblocks = {
10858 {64 * 1024, 3},
10859 {32 * 1024, 1},
10860 {8 * 1024, 2},
10861 {16 * 1024, 1},
10862 },
10863 .block_erase = erase_sector_jedec,
10864 }, {
10865 .eraseblocks = { {256 * 1024, 1} },
10866 .block_erase = erase_chip_block_jedec,
10867 }
10868 },
snelsonc6855342010-01-28 23:55:12 +000010869 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010870 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010871 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010872 },
10873
hailfinger286829b2009-01-08 03:40:17 +000010874 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000010875 .vendor = "Programmer",
10876 .name = "Opaque flash chip",
10877 .bustype = BUS_PROG,
10878 .manufacture_id = PROGMANUF_ID,
10879 .model_id = PROGDEV_ID,
10880 .total_size = 0,
10881 .page_size = 256,
10882 /* probe is assumed to work, rest will be filled in by probe */
10883 .tested = TEST_OK_PROBE,
10884 .probe = probe_opaque,
10885 /* eraseblock sizes will be set by the probing function */
10886 .block_erasers =
10887 {
10888 {
10889 .block_erase = erase_opaque,
10890 }
10891 },
10892 .write = write_opaque,
10893 .read = read_opaque,
10894 },
10895
10896 {
hailfinger867df6b2010-07-22 11:44:38 +000010897 .vendor = "AMIC",
10898 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010899 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000010900 .manufacture_id = AMIC_ID,
10901 .model_id = GENERIC_DEVICE_ID,
10902 .total_size = 0,
10903 .page_size = 256,
10904 .tested = TEST_BAD_PREW,
10905 .probe = probe_spi_rdid4,
10906 .probe_timing = TIMING_ZERO,
10907 .write = NULL,
10908 .read = NULL,
10909 },
10910
10911 {
hailfinger286829b2009-01-08 03:40:17 +000010912 .vendor = "Atmel",
10913 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010914 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010915 .manufacture_id = ATMEL_ID,
10916 .model_id = GENERIC_DEVICE_ID,
10917 .total_size = 0,
10918 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010919 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010920 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010921 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010922 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010923 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010924 },
10925
hailfinger286829b2009-01-08 03:40:17 +000010926 {
hailfinger61958912010-07-28 22:20:20 +000010927 .vendor = "Eon",
10928 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010929 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010930 .manufacture_id = EON_ID_NOPREFIX,
10931 .model_id = GENERIC_DEVICE_ID,
10932 .total_size = 0,
10933 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010934 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010935 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010936 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010937 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010938 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010939 },
10940
hailfinger286829b2009-01-08 03:40:17 +000010941 {
10942 .vendor = "Macronix",
10943 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010944 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000010945 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000010946 .model_id = GENERIC_DEVICE_ID,
10947 .total_size = 0,
10948 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010949 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010950 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010951 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010952 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010953 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010954 },
10955
hailfinger286829b2009-01-08 03:40:17 +000010956 {
10957 .vendor = "PMC",
10958 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010959 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010960 .manufacture_id = PMC_ID,
10961 .model_id = GENERIC_DEVICE_ID,
10962 .total_size = 0,
10963 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010964 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010965 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010966 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010967 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010968 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010969 },
10970
hailfinger286829b2009-01-08 03:40:17 +000010971 {
10972 .vendor = "SST",
10973 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010974 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010975 .manufacture_id = SST_ID,
10976 .model_id = GENERIC_DEVICE_ID,
10977 .total_size = 0,
10978 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010979 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010980 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010981 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010982 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010983 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010984 },
10985
hailfinger286829b2009-01-08 03:40:17 +000010986 {
10987 .vendor = "ST",
10988 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010989 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010990 .manufacture_id = ST_ID,
10991 .model_id = GENERIC_DEVICE_ID,
10992 .total_size = 0,
10993 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010994 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010995 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010996 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010997 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010998 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010999 },
uwec93fbdb2008-03-16 02:06:25 +000011000
hailfinger63165602009-11-20 01:12:45 +000011001 {
hailfinger201f62f2009-11-24 02:08:11 +000011002 .vendor = "Sanyo",
11003 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011004 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000011005 .manufacture_id = SANYO_ID,
11006 .model_id = GENERIC_DEVICE_ID,
11007 .total_size = 0,
11008 .page_size = 256,
11009 .tested = TEST_BAD_PREW,
11010 .probe = probe_spi_rdid,
11011 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000011012 .write = NULL,
11013 .read = NULL,
11014 },
11015
11016 {
hailfinger63165602009-11-20 01:12:45 +000011017 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080011018 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000011019 .bustype = BUS_SPI,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080011020 .manufacture_id = VARIABLE_SIZE_MANUF_ID,
11021 .model_id = VARIABLE_SIZE_DEVICE_ID,
11022 .total_size = 64, /* This size is set temporarily */
11023 .page_size = 256,
11024 .tested = TEST_OK_PREW,
11025 .probe = probe_variable_size,
11026 .block_erasers =
11027 {
11028 {
11029 .eraseblocks = { {4 * 1024, 16} },
11030 .block_erase = spi_block_erase_20,
11031 }, {
11032 .eraseblocks = { {64 * 1024, 1} },
11033 .block_erase = spi_block_erase_d8,
11034 }
11035 },
11036 .write = spi_chip_write_256,
11037 .read = spi_chip_read,
11038 },
11039
11040 {
11041 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000011042 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000011043 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011044 .manufacture_id = GENERIC_MANUF_ID,
11045 .model_id = GENERIC_DEVICE_ID,
11046 .total_size = 0,
11047 .page_size = 256,
11048 .tested = TEST_BAD_PREW,
11049 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000011050 .write = NULL,
11051 },
David Hendricks07af3a42011-07-11 22:13:02 -070011052
hailfinger63165602009-11-20 01:12:45 +000011053 {
11054 .vendor = "Generic",
11055 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000011056 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000011057 .manufacture_id = GENERIC_MANUF_ID,
11058 .model_id = GENERIC_DEVICE_ID,
11059 .total_size = 0,
11060 .page_size = 256,
11061 .tested = TEST_BAD_PREW,
11062 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000011063 .write = NULL,
11064 },
11065
Edward O'Callaghan6240c852019-07-02 15:49:58 +100011066 {0}
stuge7be5d032009-04-21 01:46:07 +000011067};
Simon Glass4c214132013-07-16 10:09:28 -060011068
Edward O'Callaghan6240c852019-07-02 15:49:58 +100011069const unsigned int flashchips_size = ARRAY_SIZE(flashchips);
11070
David Hendricks07153282016-12-22 16:07:00 -080011071/* Generic flashchip struct for platforms that use Intel hardware sequencing. */
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011072const struct flashchip flashchips_hwseq[] = {
11073 {
David Hendricks07153282016-12-22 16:07:00 -080011074 .vendor = "Generic",
11075 .name = "HWSEQ chip",
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011076 .bustype = BUS_PROG,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011077 /* probe is assumed to work, rest will be filled in by probe */
Alan Green1295b292019-07-30 13:38:04 +100011078 .tested = TEST_OK_PREW,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011079 .probe = probe_opaque,
11080 /* eraseblock sizes will be set by the probing function */
11081 .block_erasers =
11082 {
11083 {
11084 .block_erase = erase_opaque,
11085 }
11086 },
11087 .write = write_opaque,
11088 .read = read_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053011089 .read_status = read_status_opaque,
11090 .write_status = write_status_opaque,
Duncan Laurie25a4ca22019-04-25 12:08:52 -070011091 .check_access = check_access_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053011092 .wp = &wp_w25,
Furquan Shaikhc5bc5cd2019-01-07 04:25:59 -080011093 .unlock = &spi_disable_blockprotect,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053011094 },
11095
11096 {NULL}
11097};
11098
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011099int flash_erase_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011100{
Alan Greendbeec2b2019-09-16 14:36:52 +100011101 return flash->chip->feature_bits & FEATURE_ERASED_ZERO ? 0 : 0xff;
Simon Glass4c214132013-07-16 10:09:28 -060011102}
11103
Souvik Ghoshd75cd672016-06-17 14:21:39 -070011104int flash_unerased_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060011105{
Alan Greendbeec2b2019-09-16 14:36:52 +100011106 return flash->chip->feature_bits & FEATURE_ERASED_ZERO ? 0xff : 0;
Simon Glass4c214132013-07-16 10:09:28 -060011107}
David Hendricks8c084212015-11-17 22:29:36 -080011108
David Hendricks40df5b52016-12-22 15:36:28 -080011109const struct flashchip *flash_id_to_entry(uint32_t mfg_id, uint32_t model_id)
11110{
11111 const struct flashchip *chip;
11112
11113 for (chip = &flashchips[0]; chip->vendor; chip++) {
11114 if ((chip->manufacture_id == mfg_id) &&
11115 (chip->model_id == model_id))
11116 return chip;
11117 }
11118
11119 return NULL;
11120}
11121
David Hendricks8c084212015-11-17 22:29:36 -080011122struct voltage_range voltage_ranges[NUM_VOLTAGE_RANGES];
11123
11124static int compar(const void *_x, const void *_y)
11125{
11126 const struct voltage_range *x = _x;
11127 const struct voltage_range *y = _y;
11128
11129 /*
11130 * qsort() places entries in ascending order. We will sort by minimum
11131 * voltage primarily and max voltage secondarily, and move empty sets
11132 * to the end of array.
11133 */
11134 if (x->min == 0)
11135 return 1;
11136 if (y->min == 0)
11137 return -1;
11138
11139 if (x->min < y->min)
11140 return -1;
11141 if (x->min > y->min)
11142 return 1;
11143
11144 if (x->min == y->min) {
11145 if (x->max < y->max)
11146 return -1;
11147 if (x->max > y->max)
11148 return 1;
11149 }
11150
11151 return 0;
11152}
11153
11154int flash_supported_voltage_ranges(enum chipbustype bus)
11155{
11156 int i;
11157 int unique_ranges = 0;
11158
11159 /* clear array in case user calls this function multiple times */
11160 memset(voltage_ranges, 0, sizeof(voltage_ranges));
11161
11162 for (i = 0; i < ARRAY_SIZE(flashchips); i++) {
11163 int j;
11164 int match_found = 0;
11165
11166 if (unique_ranges >= NUM_VOLTAGE_RANGES) {
11167 msg_cerr("Increase NUM_VOLTAGE_RANGES.\n");
11168 return -1;
11169 }
11170
11171 if (!(flashchips[i].bustype & bus))
11172 continue;
11173
11174 for (j = 0; j < NUM_VOLTAGE_RANGES; j++) {
11175 if ((flashchips[i].voltage.min == voltage_ranges[j].min) &&
11176 (flashchips[i].voltage.max == voltage_ranges[j].max))
11177 match_found |= 1;
11178
11179 if (!voltage_ranges[j].min && !voltage_ranges[j].max)
11180 break;
11181 }
11182
11183 if (!match_found) {
11184 voltage_ranges[j] = flashchips[i].voltage;
11185 unique_ranges++;
11186 }
11187 }
11188
11189 qsort(&voltage_ranges[0], NUM_VOLTAGE_RANGES,
11190 sizeof(voltage_ranges[0]), compar);
11191
11192 for (i = 0; i < NUM_VOLTAGE_RANGES; i++) {
11193 msg_cspew("%s: voltage_range[%d]: { %u, %u }\n",
11194 __func__, i, voltage_ranges[i].min, voltage_ranges[i].max);
11195 }
11196
11197 return unique_ranges;
11198}