blob: 995f32cd1931e8696bdc99342de656071ad75141 [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,
549 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
550 .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 },
566 .printlock = spi_prettyprint_status_register_amic_a25l40p,
567 .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,
581 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
582 .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 },
598 .printlock = spi_prettyprint_status_register_amic_a25l40p,
599 .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,
613 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
614 .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 },
630 .printlock = spi_prettyprint_status_register_amic_a25l40p,
631 .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 */
646 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
647 .tested = TEST_UNTESTED,
648 .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 },
669 .printlock = spi_prettyprint_status_register_amic_a25l032,
670 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
671 .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,
684 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
685 .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 },
701 .printlock = spi_prettyprint_status_register_amic_a25l40p,
702 .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,
David Hendricks488cf072015-11-23 16:45:07 -0800717 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +0000736 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
David Hendricks488cf072015-11-23 16:45:07 -0800751 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +0000770 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
785 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
786 .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 },
802 .printlock = spi_prettyprint_status_register_amic_a25l40p,
803 .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,
David Hendricks488cf072015-11-23 16:45:07 -0800817 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +0000837 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
David Hendricks488cf072015-11-23 16:45:07 -0800852 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +0000872 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
887 .feature_bits = FEATURE_UNBOUND_READ,
888 .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 },
910 .printlock = spi_prettyprint_status_register_amic_a25l40p,
911 .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,
925 .feature_bits = FEATURE_UNBOUND_READ,
926 .tested = TEST_OK_PRU,
927 .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 },
948 .printlock = spi_prettyprint_status_register_amic_a25l40p,
949 .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,
David Hendricks488cf072015-11-23 16:45:07 -0800963 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +0000983 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
David Hendricks488cf072015-11-23 16:45:07 -0800998 .feature_bits = FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +00001018 .printlock = spi_prettyprint_status_register_amic_a25l05p,
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,
David Hendricks488cf072015-11-23 16:45:07 -08001038 .feature_bits = FEATURE_UNBOUND_READ,
1039 .tested = TEST_OK_PRU,
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 },
hailfinger7533bc82011-05-19 00:06:06 +00001058 .printlock = spi_prettyprint_status_register_amic_a25l40p,
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,
David Hendricks488cf072015-11-23 16:45:07 -08001073 .feature_bits = FEATURE_UNBOUND_READ,
1074 .tested = TEST_OK_PRU,
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 },
hailfinger7533bc82011-05-19 00:06:06 +00001093 .printlock = spi_prettyprint_status_register_amic_a25l40p,
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,
David Hendricks488cf072015-11-23 16:45:07 -08001108 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
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 },
hailfinger7533bc82011-05-19 00:06:06 +00001125 .printlock = spi_prettyprint_status_register_amic_a25l40p,
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 Greend76dc1f2019-06-26 15:38:19 +10001140 .feature_bits = FEATURE_UNBOUND_READ,
1141 .tested = TEST_OK_PREU,
1142 .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 },
hailfinger7533bc82011-05-19 00:06:06 +00001160 .printlock = spi_prettyprint_status_register_amic_a25l40p,
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",
hailfinger6eb433a2010-07-29 15:00:40 +00001169 .name = "A25LQ032",
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,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001175 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1176 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001177 .tested = TEST_UNTESTED,
1178 .probe = probe_spi_rdid,
1179 .probe_timing = TIMING_ZERO,
1180 .block_erasers =
1181 {
1182 {
1183 .eraseblocks = { { 4 * 1024, 1024 } },
1184 .block_erase = spi_block_erase_20,
1185 }, {
1186 .eraseblocks = { { 64 * 1024, 64 } },
1187 .block_erase = spi_block_erase_52,
1188 }, {
1189 .eraseblocks = { { 64 * 1024, 64 } },
1190 .block_erase = spi_block_erase_d8,
1191 }, {
1192 .eraseblocks = { { 4096 * 1024, 1 } },
1193 .block_erase = spi_block_erase_60,
1194 }, {
1195 .eraseblocks = { { 4096 * 1024, 1 } },
1196 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001197 }
hailfinger6eb433a2010-07-29 15:00:40 +00001198 },
hailfinger7533bc82011-05-19 00:06:06 +00001199 .printlock = spi_prettyprint_status_register_amic_a25lq032,
hailfinger6eb433a2010-07-29 15:00:40 +00001200 .unlock = NULL, /* Two status reg bytes (read with 0x35 and 0x05) */
1201 .write = spi_chip_write_256,
1202 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001203 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001204 },
1205
1206 {
1207 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001208 .name = "A29002B",
hailfingere1e41ea2011-07-27 07:13:06 +00001209 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001210 .manufacture_id = AMIC_ID_NOPREFIX,
1211 .model_id = AMIC_A29002B,
1212 .total_size = 256,
1213 .page_size = 64 * 1024,
1214 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1215 .tested = TEST_UNTESTED,
1216 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001217 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001218 .block_erasers =
1219 {
1220 {
Simon Glass8dc82732013-07-16 10:13:51 -06001221 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001222 {16 * 1024, 1},
1223 {8 * 1024, 2},
1224 {32 * 1024, 1},
1225 {64 * 1024, 3},
1226 },
1227 .block_erase = erase_sector_jedec,
1228 }, {
1229 .eraseblocks = { {256 * 1024, 1} },
1230 .block_erase = erase_chip_block_jedec,
1231 },
1232 },
1233 .write = write_jedec_1,
1234 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001235 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001236 },
1237
1238 {
1239 .vendor = "AMIC",
1240 .name = "A29002T",
hailfingere1e41ea2011-07-27 07:13:06 +00001241 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001242 .manufacture_id = AMIC_ID_NOPREFIX,
1243 .model_id = AMIC_A29002T,
1244 .total_size = 256,
1245 .page_size = 64 * 1024,
1246 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00001247 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001248 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001249 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001250 .block_erasers =
1251 {
1252 {
Simon Glass8dc82732013-07-16 10:13:51 -06001253 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001254 {64 * 1024, 3},
1255 {32 * 1024, 1},
1256 {8 * 1024, 2},
1257 {16 * 1024, 1},
1258 },
1259 .block_erase = erase_sector_jedec,
1260 }, {
1261 .eraseblocks = { {256 * 1024, 1} },
1262 .block_erase = erase_chip_block_jedec,
1263 },
1264 },
1265 .write = write_jedec_1,
1266 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001267 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001268 },
1269
1270 {
1271 .vendor = "AMIC",
1272 .name = "A29040B",
hailfingere1e41ea2011-07-27 07:13:06 +00001273 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001274 .manufacture_id = AMIC_ID_NOPREFIX,
1275 .model_id = AMIC_A29040B,
1276 .total_size = 512,
1277 .page_size = 64 * 1024,
1278 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1279 .tested = TEST_UNTESTED,
1280 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001281 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001282 .block_erasers =
1283 {
1284 {
1285 .eraseblocks = { {64 * 1024, 8} },
1286 .block_erase = erase_sector_jedec,
1287 }, {
1288 .eraseblocks = { {512 * 1024, 1} },
1289 .block_erase = erase_chip_block_jedec,
1290 },
1291 },
1292 .write = write_jedec_1,
1293 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001294 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001295 },
1296
1297 {
1298 .vendor = "AMIC",
1299 .name = "A49LF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00001300 .bustype = BUS_LPC,
hailfinger61958912010-07-28 22:20:20 +00001301 .manufacture_id = AMIC_ID_NOPREFIX,
1302 .model_id = AMIC_A49LF040A,
1303 .total_size = 512,
1304 .page_size = 64 * 1024,
1305 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Souvik Ghoshd64964a2016-06-13 17:51:25 -07001306 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001307 .probe = probe_jedec,
1308 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1309 .block_erasers =
1310 {
1311 {
1312 .eraseblocks = { {64 * 1024, 8} },
1313 .block_erase = erase_block_jedec,
1314 }, {
1315 .eraseblocks = { {512 * 1024, 1} },
1316 .block_erase = erase_chip_block_jedec,
1317 }
1318 },
1319 .unlock = unlock_49fl00x,
1320 .write = write_jedec_1,
1321 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001322 .voltage = {3000, 3600},
hailfinger61958912010-07-28 22:20:20 +00001323 },
1324
1325 {
hailfinger286829b2009-01-08 03:40:17 +00001326 .vendor = "Atmel",
1327 .name = "AT25DF021",
hailfingere1e41ea2011-07-27 07:13:06 +00001328 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001329 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001330 .model_id = ATMEL_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001331 .total_size = 256,
1332 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001333 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1334 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001335 .tested = TEST_UNTESTED,
1336 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001337 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001338 .block_erasers =
1339 {
1340 {
1341 .eraseblocks = { {4 * 1024, 64} },
1342 .block_erase = spi_block_erase_20,
1343 }, {
1344 .eraseblocks = { {32 * 1024, 8} },
1345 .block_erase = spi_block_erase_52,
1346 }, {
1347 .eraseblocks = { {64 * 1024, 4} },
1348 .block_erase = spi_block_erase_d8,
1349 }, {
1350 .eraseblocks = { {256 * 1024, 1} },
1351 .block_erase = spi_block_erase_60,
1352 }, {
1353 .eraseblocks = { {256 * 1024, 1} },
1354 .block_erase = spi_block_erase_c7,
1355 }
1356 },
hailfingerc33d4732010-07-29 13:09:18 +00001357 .printlock = spi_prettyprint_status_register_at25df,
1358 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001359 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001360 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001361 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001362 },
1363
hailfinger286829b2009-01-08 03:40:17 +00001364 {
1365 .vendor = "Atmel",
1366 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001367 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001368 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001369 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001370 .total_size = 512,
1371 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001373 .tested = TEST_UNTESTED,
1374 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001375 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001376 .block_erasers =
1377 {
1378 {
1379 .eraseblocks = { {4 * 1024, 128} },
1380 .block_erase = spi_block_erase_20,
1381 }, {
1382 .eraseblocks = { {32 * 1024, 16} },
1383 .block_erase = spi_block_erase_52,
1384 }, {
1385 .eraseblocks = { {64 * 1024, 8} },
1386 .block_erase = spi_block_erase_d8,
1387 }, {
1388 .eraseblocks = { {512 * 1024, 1} },
1389 .block_erase = spi_block_erase_60,
1390 }, {
1391 .eraseblocks = { {512 * 1024, 1} },
1392 .block_erase = spi_block_erase_c7,
1393 }
1394 },
hailfingerc33d4732010-07-29 13:09:18 +00001395 .printlock = spi_prettyprint_status_register_at25df,
1396 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001397 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001398 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001399 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001400 },
1401
hailfinger286829b2009-01-08 03:40:17 +00001402 {
1403 .vendor = "Atmel",
1404 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001405 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001406 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001407 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001408 .total_size = 1024,
1409 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001410 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001411 .tested = TEST_UNTESTED,
1412 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001413 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001414 .block_erasers =
1415 {
1416 {
1417 .eraseblocks = { {4 * 1024, 256} },
1418 .block_erase = spi_block_erase_20,
1419 }, {
1420 .eraseblocks = { {32 * 1024, 32} },
1421 .block_erase = spi_block_erase_52,
1422 }, {
1423 .eraseblocks = { {64 * 1024, 16} },
1424 .block_erase = spi_block_erase_d8,
1425 }, {
1426 .eraseblocks = { {1024 * 1024, 1} },
1427 .block_erase = spi_block_erase_60,
1428 }, {
1429 .eraseblocks = { {1024 * 1024, 1} },
1430 .block_erase = spi_block_erase_c7,
1431 }
1432 },
hailfingerc33d4732010-07-29 13:09:18 +00001433 .printlock = spi_prettyprint_status_register_at25df,
1434 .unlock = spi_disable_blockprotect_at25df,
1435 .write = spi_chip_write_256,
1436 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001437 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001438 },
1439
1440 {
1441 .vendor = "Atmel",
1442 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001443 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001444 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001445 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001446 .total_size = 1024,
1447 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001448 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerc33d4732010-07-29 13:09:18 +00001449 .tested = TEST_UNTESTED,
1450 .probe = probe_spi_rdid,
1451 .probe_timing = TIMING_ZERO,
1452 .block_erasers =
1453 {
1454 {
1455 .eraseblocks = { {4 * 1024, 256} },
1456 .block_erase = spi_block_erase_20,
1457 }, {
1458 .eraseblocks = { {32 * 1024, 32} },
1459 .block_erase = spi_block_erase_52,
1460 }, {
1461 .eraseblocks = { {64 * 1024, 16} },
1462 .block_erase = spi_block_erase_d8,
1463 }, {
1464 .eraseblocks = { {1024 * 1024, 1} },
1465 .block_erase = spi_block_erase_60,
1466 }, {
1467 .eraseblocks = { {1024 * 1024, 1} },
1468 .block_erase = spi_block_erase_c7,
1469 }
1470 },
1471 .printlock = spi_prettyprint_status_register_at25df_sec,
1472 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001473 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001474 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001475 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001476 },
1477
hailfinger286829b2009-01-08 03:40:17 +00001478 {
1479 .vendor = "Atmel",
1480 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001481 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001482 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001483 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001484 .total_size = 2048,
1485 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001487 .tested = TEST_UNTESTED,
1488 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001489 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001490 .block_erasers =
1491 {
1492 {
1493 .eraseblocks = { {4 * 1024, 512} },
1494 .block_erase = spi_block_erase_20,
1495 }, {
1496 .eraseblocks = { {32 * 1024, 64} },
1497 .block_erase = spi_block_erase_52,
1498 }, {
1499 .eraseblocks = { {64 * 1024, 32} },
1500 .block_erase = spi_block_erase_d8,
1501 }, {
1502 .eraseblocks = { {2 * 1024 * 1024, 1} },
1503 .block_erase = spi_block_erase_60,
1504 }, {
1505 .eraseblocks = { {2 * 1024 * 1024, 1} },
1506 .block_erase = spi_block_erase_c7,
1507 }
1508 },
hailfingerc33d4732010-07-29 13:09:18 +00001509 .printlock = spi_prettyprint_status_register_at25df_sec,
1510 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001511 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001512 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001513 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001514 },
1515
hailfinger286829b2009-01-08 03:40:17 +00001516 {
1517 .vendor = "Atmel",
1518 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001519 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001520 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001521 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001522 .total_size = 4096,
1523 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
1525 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00001526 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001527 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001528 .block_erasers =
1529 {
1530 {
1531 .eraseblocks = { {4 * 1024, 1024} },
1532 .block_erase = spi_block_erase_20,
1533 }, {
1534 .eraseblocks = { {32 * 1024, 128} },
1535 .block_erase = spi_block_erase_52,
1536 }, {
1537 .eraseblocks = { {64 * 1024, 64} },
1538 .block_erase = spi_block_erase_d8,
1539 }, {
1540 .eraseblocks = { {4 * 1024 * 1024, 1} },
1541 .block_erase = spi_block_erase_60,
1542 }, {
1543 .eraseblocks = { {4 * 1024 * 1024, 1} },
1544 .block_erase = spi_block_erase_c7,
1545 }
1546 },
hailfingerc33d4732010-07-29 13:09:18 +00001547 .printlock = spi_prettyprint_status_register_at25df,
1548 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001549 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001550 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001551 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001552 },
1553
hailfinger286829b2009-01-08 03:40:17 +00001554 {
1555 .vendor = "Atmel",
1556 .name = "AT25DF321A",
hailfingere1e41ea2011-07-27 07:13:06 +00001557 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001558 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001559 .model_id = ATMEL_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001560 .total_size = 4096,
1561 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001562 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1563 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanctd6efe1a2011-09-03 11:22:27 +00001564 .tested = TEST_OK_PROBE,
hailfinger286829b2009-01-08 03:40:17 +00001565 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001566 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001567 .block_erasers =
1568 {
1569 {
1570 .eraseblocks = { {4 * 1024, 1024} },
1571 .block_erase = spi_block_erase_20,
1572 }, {
1573 .eraseblocks = { {32 * 1024, 128} },
1574 .block_erase = spi_block_erase_52,
1575 }, {
1576 .eraseblocks = { {64 * 1024, 64} },
1577 .block_erase = spi_block_erase_d8,
1578 }, {
1579 .eraseblocks = { {4 * 1024 * 1024, 1} },
1580 .block_erase = spi_block_erase_60,
1581 }, {
1582 .eraseblocks = { {4 * 1024 * 1024, 1} },
1583 .block_erase = spi_block_erase_c7,
1584 }
1585 },
hailfingerc33d4732010-07-29 13:09:18 +00001586 .printlock = spi_prettyprint_status_register_at25df_sec,
1587 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001588 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001589 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001590 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001591 },
1592
hailfinger286829b2009-01-08 03:40:17 +00001593 {
1594 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001595 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001596 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001597 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001598 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001599 .total_size = 8192,
1600 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001601 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001602 .tested = TEST_UNTESTED,
1603 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001604 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001605 .block_erasers =
1606 {
1607 {
1608 .eraseblocks = { {4 * 1024, 2048} },
1609 .block_erase = spi_block_erase_20,
1610 }, {
1611 .eraseblocks = { {32 * 1024, 256} },
1612 .block_erase = spi_block_erase_52,
1613 }, {
1614 .eraseblocks = { {64 * 1024, 128} },
1615 .block_erase = spi_block_erase_d8,
1616 }, {
1617 .eraseblocks = { {8 * 1024 * 1024, 1} },
1618 .block_erase = spi_block_erase_60,
1619 }, {
1620 .eraseblocks = { {8 * 1024 * 1024, 1} },
1621 .block_erase = spi_block_erase_c7,
1622 }
1623 },
hailfingerc33d4732010-07-29 13:09:18 +00001624 .printlock = spi_prettyprint_status_register_at25df_sec,
1625 .unlock = spi_disable_blockprotect_at25df_sec,
1626 .write = spi_chip_write_256,
1627 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001628 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001629 },
1630
1631 {
1632 .vendor = "Atmel",
1633 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001634 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001635 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001636 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001637 .total_size = 2048,
1638 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001639 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1640 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfingerc33d4732010-07-29 13:09:18 +00001641 .tested = TEST_UNTESTED,
1642 .probe = probe_spi_rdid,
1643 .probe_timing = TIMING_ZERO,
1644 .block_erasers =
1645 {
1646 {
1647 .eraseblocks = { {4 * 1024, 512} },
1648 .block_erase = spi_block_erase_20,
1649 }, {
1650 .eraseblocks = { {32 * 1024, 64} },
1651 .block_erase = spi_block_erase_52,
1652 }, {
1653 .eraseblocks = { {64 * 1024, 32} },
1654 .block_erase = spi_block_erase_d8,
1655 }, {
1656 .eraseblocks = { {2 * 1024 * 1024, 1} },
1657 .block_erase = spi_block_erase_60,
1658 }, {
1659 .eraseblocks = { {2 * 1024 * 1024, 1} },
1660 .block_erase = spi_block_erase_c7,
1661 }
1662 },
1663 .printlock = spi_prettyprint_status_register_at25df_sec,
1664 .unlock = spi_disable_blockprotect_at25df_sec,
hailfinger87c05482009-05-09 02:34:18 +00001665 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001666 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001667 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001668 },
1669
hailfinger286829b2009-01-08 03:40:17 +00001670 {
1671 .vendor = "Atmel",
1672 .name = "AT25F512B",
hailfingere1e41ea2011-07-27 07:13:06 +00001673 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001674 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001675 .model_id = ATMEL_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00001676 .total_size = 64,
1677 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001678 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1679 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001680 .tested = TEST_UNTESTED,
1681 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001682 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001683 .block_erasers =
1684 {
1685 {
1686 .eraseblocks = { {4 * 1024, 16} },
1687 .block_erase = spi_block_erase_20,
1688 }, {
1689 .eraseblocks = { {32 * 1024, 2} },
1690 .block_erase = spi_block_erase_52,
1691 }, {
1692 .eraseblocks = { {32 * 1024, 2} },
1693 .block_erase = spi_block_erase_d8,
1694 }, {
1695 .eraseblocks = { {64 * 1024, 1} },
1696 .block_erase = spi_block_erase_60,
1697 }, {
1698 .eraseblocks = { {64 * 1024, 1} },
1699 .block_erase = spi_block_erase_c7,
1700 }
1701 },
hailfingerc33d4732010-07-29 13:09:18 +00001702 .printlock = spi_prettyprint_status_register_at25f,
1703 .unlock = spi_disable_blockprotect_at25f,
hailfinger87c05482009-05-09 02:34:18 +00001704 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001705 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001706 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001707 },
1708
hailfinger286829b2009-01-08 03:40:17 +00001709 {
1710 .vendor = "Atmel",
1711 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00001712 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001713 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001714 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00001715 .total_size = 128,
1716 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001717 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001718 .tested = TEST_UNTESTED,
1719 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001720 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001721 .block_erasers =
1722 {
1723 {
1724 .eraseblocks = { {4 * 1024, 32} },
1725 .block_erase = spi_block_erase_20,
1726 }, {
hailfingerc33d4732010-07-29 13:09:18 +00001727 .eraseblocks = { {4 * 1024, 32} },
1728 .block_erase = spi_block_erase_d7,
1729 }, {
hailfinger22155a82009-12-23 12:02:55 +00001730 .eraseblocks = { {32 * 1024, 4} },
1731 .block_erase = spi_block_erase_52,
1732 }, {
1733 .eraseblocks = { {32 * 1024, 4} },
1734 .block_erase = spi_block_erase_d8,
1735 }, {
1736 .eraseblocks = { {128 * 1024, 1} },
1737 .block_erase = spi_block_erase_60,
1738 }, {
1739 .eraseblocks = { {128 * 1024, 1} },
1740 .block_erase = spi_block_erase_c7,
1741 }
1742 },
hailfingerc33d4732010-07-29 13:09:18 +00001743 .printlock = spi_prettyprint_status_register_at25fs010,
1744 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00001745 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001746 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001747 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001748 },
1749
hailfinger286829b2009-01-08 03:40:17 +00001750 {
1751 .vendor = "Atmel",
1752 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00001753 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001754 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001755 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00001756 .total_size = 512,
1757 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08001758 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00001759 .tested = TEST_UNTESTED,
1760 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001761 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001762 .block_erasers =
1763 {
1764 {
1765 .eraseblocks = { {4 * 1024, 128} },
1766 .block_erase = spi_block_erase_20,
1767 }, {
1768 .eraseblocks = { {64 * 1024, 8} },
1769 .block_erase = spi_block_erase_52,
1770 }, {
1771 .eraseblocks = { {64 * 1024, 8} },
1772 .block_erase = spi_block_erase_d8,
1773 }, {
1774 .eraseblocks = { {512 * 1024, 1} },
1775 .block_erase = spi_block_erase_60,
1776 }, {
1777 .eraseblocks = { {512 * 1024, 1} },
1778 .block_erase = spi_block_erase_c7,
1779 }
1780 },
hailfingerc33d4732010-07-29 13:09:18 +00001781 .printlock = spi_prettyprint_status_register_at25fs040,
1782 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00001783 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001784 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001785 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001786 },
1787
hailfinger286829b2009-01-08 03:40:17 +00001788 {
1789 .vendor = "Atmel",
1790 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00001791 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001792 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001793 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00001794 .total_size = 512,
1795 .page_size = 256,
1796 .tested = TEST_UNTESTED,
1797 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001798 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001799 .block_erasers =
1800 {
1801 {
1802 .eraseblocks = { {4 * 1024, 128} },
1803 .block_erase = spi_block_erase_20,
1804 }
1805 },
hailfinger286829b2009-01-08 03:40:17 +00001806 .write = NULL /* Incompatible Page write */,
1807 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001808 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00001809 },
1810
hailfinger286829b2009-01-08 03:40:17 +00001811 {
1812 .vendor = "Atmel",
1813 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001814 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001815 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001816 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00001817 .total_size = 1024,
1818 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00001819 .feature_bits = FEATURE_WRSR_WREN,
1820 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001821 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001822 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001823 .block_erasers =
1824 {
1825 {
1826 .eraseblocks = { {4 * 1024, 256} },
1827 .block_erase = spi_block_erase_20,
1828 }, {
1829 .eraseblocks = { {32 * 1024, 32} },
1830 .block_erase = spi_block_erase_52,
1831 }, {
1832 .eraseblocks = { {64 * 1024, 16} },
1833 .block_erase = spi_block_erase_d8,
1834 }, {
1835 .eraseblocks = { {1024 * 1024, 1} },
1836 .block_erase = spi_block_erase_60,
1837 }, {
1838 .eraseblocks = { {1024 * 1024, 1} },
1839 .block_erase = spi_block_erase_c7,
1840 }
1841 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001842 .printlock = spi_prettyprint_status_register_at26df081a,
krause9d38a2f2011-01-17 07:45:54 +00001843 .unlock = spi_disable_blockprotect_at25df,
hailfinger87c05482009-05-09 02:34:18 +00001844 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001845 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001846 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001847 },
1848
hailfinger286829b2009-01-08 03:40:17 +00001849 {
1850 .vendor = "Atmel",
1851 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001852 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001853 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001854 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00001855 .total_size = 2048,
1856 .page_size = 256,
1857 .tested = TEST_UNTESTED,
1858 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001859 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001860 .block_erasers =
1861 {
1862 {
1863 .eraseblocks = { {4 * 1024, 512} },
1864 .block_erase = spi_block_erase_20,
1865 }, {
1866 .eraseblocks = { {32 * 1024, 64} },
1867 .block_erase = spi_block_erase_52,
1868 }, {
1869 .eraseblocks = { {64 * 1024, 32} },
1870 .block_erase = spi_block_erase_d8,
1871 }, {
1872 .eraseblocks = { {2 * 1024 * 1024, 1} },
1873 .block_erase = spi_block_erase_60,
1874 }, {
1875 .eraseblocks = { {2 * 1024 * 1024, 1} },
1876 .block_erase = spi_block_erase_c7,
1877 }
1878 },
hailfinger7533bc82011-05-19 00:06:06 +00001879 .printlock = spi_prettyprint_status_register_at25df,
hailfingerb9560ee2010-07-14 20:21:22 +00001880 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001881 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001882 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001883 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001884 },
1885
hailfinger286829b2009-01-08 03:40:17 +00001886 {
1887 .vendor = "Atmel",
1888 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00001889 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001890 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001891 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00001892 .total_size = 2048,
1893 .page_size = 256,
1894 .tested = TEST_UNTESTED,
1895 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001896 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001897 .block_erasers =
1898 {
1899 {
1900 .eraseblocks = { {4 * 1024, 512} },
1901 .block_erase = spi_block_erase_20,
1902 }, {
1903 .eraseblocks = { {32 * 1024, 64} },
1904 .block_erase = spi_block_erase_52,
1905 }, {
1906 .eraseblocks = { {64 * 1024, 32} },
1907 .block_erase = spi_block_erase_d8,
1908 }, {
1909 .eraseblocks = { {2 * 1024 * 1024, 1} },
1910 .block_erase = spi_block_erase_60,
1911 }, {
1912 .eraseblocks = { {2 * 1024 * 1024, 1} },
1913 .block_erase = spi_block_erase_c7,
1914 }
1915 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11001916 .printlock = spi_prettyprint_status_register_at26df081a,
hailfingerb9560ee2010-07-14 20:21:22 +00001917 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00001918 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001919 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001920 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001921 },
1922
hailfinger286829b2009-01-08 03:40:17 +00001923 {
1924 .vendor = "Atmel",
1925 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00001926 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001927 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001928 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00001929 .total_size = 512,
1930 .page_size = 256,
1931 .tested = TEST_UNTESTED,
1932 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001933 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001934 .block_erasers =
1935 {
1936 {
1937 .eraseblocks = { {4 * 1024, 128} },
1938 .block_erase = spi_block_erase_20,
1939 }, {
1940 .eraseblocks = { {32 * 1024, 16} },
1941 .block_erase = spi_block_erase_52,
1942 }, {
1943 .eraseblocks = { {64 * 1024, 8} },
1944 .block_erase = spi_block_erase_d8,
1945 }, {
1946 .eraseblocks = { {512 * 1024, 1} },
1947 .block_erase = spi_block_erase_60,
1948 }, {
1949 .eraseblocks = { {512 * 1024, 1} },
1950 .block_erase = spi_block_erase_c7,
1951 }
1952 },
hailfinger286829b2009-01-08 03:40:17 +00001953 .write = NULL /* Incompatible Page write */,
1954 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001955 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001956 },
1957
hailfinger286829b2009-01-08 03:40:17 +00001958 {
1959 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00001960 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00001961 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00001962 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001963 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00001964 .total_size = 128,
1965 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00001966 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00001967 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00001968 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00001969 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00001970 .block_erasers =
1971 {
1972 {
1973 .eraseblocks = { {128 * 1024, 1} },
1974 .block_erase = erase_chip_block_jedec,
1975 }
1976 },
uweb3a82ef2009-05-16 21:39:19 +00001977 .write = write_jedec, /* FIXME */
1978 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001979 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00001980 },
1981
1982 {
1983 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001984 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00001985 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00001986 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001987 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00001988 .total_size = 256,
1989 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00001990 .feature_bits = FEATURE_LONG_RESET,
1991 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00001992 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00001993 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00001994 .block_erasers =
1995 {
1996 {
1997 .eraseblocks = { {256 * 1024, 1} },
1998 .block_erase = erase_chip_block_jedec,
1999 }
2000 },
hailfinger286829b2009-01-08 03:40:17 +00002001 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002002 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002003 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002004 },
2005
hailfinger286829b2009-01-08 03:40:17 +00002006 {
2007 .vendor = "Atmel",
2008 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002009 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002010 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002011 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002012 .total_size = 512,
2013 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002014 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002015 .tested = TEST_UNTESTED,
2016 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002017 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002018 .block_erasers =
2019 {
2020 {
2021 .eraseblocks = { {512 * 1024, 1} },
2022 .block_erase = erase_chip_block_jedec,
2023 }
2024 },
hailfinger286829b2009-01-08 03:40:17 +00002025 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002026 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002027 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002028 },
2029
hailfinger286829b2009-01-08 03:40:17 +00002030 {
2031 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002032 .name = "AT29C512",
2033 .bustype = BUS_PARALLEL,
2034 .manufacture_id = ATMEL_ID,
2035 .model_id = ATMEL_AT29C512,
2036 .total_size = 64,
2037 .page_size = 128,
2038 .feature_bits = FEATURE_LONG_RESET,
2039 .tested = TEST_OK_PREW,
2040 .probe = probe_jedec,
2041 .probe_timing = 10000, /* 10mS, Enter=Exec */
2042 .block_erasers =
2043 {
2044 {
2045 .eraseblocks = { {64 * 1024, 1} },
2046 .block_erase = erase_chip_block_jedec,
2047 }
2048 },
2049 .write = write_jedec,
2050 .read = read_memmapped,
2051 .voltage = {4500, 5500},
2052 },
2053
2054 {
2055 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002056 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002057 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002058 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002059 .model_id = ATMEL_AT45CS1282,
hailfingerf60abdb2009-03-19 12:18:13 +00002060 .total_size = 16896 /* No power of two sizes */,
2061 .page_size = 1056 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002062 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002063 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002064 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002065 .write = NULL /* Incompatible Page write */,
2066 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002067 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002068 },
stepanaa1b6a22008-12-08 18:15:10 +00002069
hailfinger286829b2009-01-08 03:40:17 +00002070 {
2071 .vendor = "Atmel",
2072 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002073 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002074 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002075 .model_id = ATMEL_AT45DB011D,
hailfingerf60abdb2009-03-19 12:18:13 +00002076 .total_size = 128 /* Size can only be determined from status register */,
2077 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002078 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002079 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002080 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002081 .write = NULL,
2082 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002083 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002084 },
stepanaa1b6a22008-12-08 18:15:10 +00002085
hailfinger286829b2009-01-08 03:40:17 +00002086 {
2087 .vendor = "Atmel",
2088 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002089 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002090 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002091 .model_id = ATMEL_AT45DB021D,
hailfingerf60abdb2009-03-19 12:18:13 +00002092 .total_size = 256 /* Size can only be determined from status register */,
2093 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002094 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002095 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002096 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002097 .write = NULL,
2098 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002099 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002100 },
stepanaa1b6a22008-12-08 18:15:10 +00002101
hailfinger286829b2009-01-08 03:40:17 +00002102 {
2103 .vendor = "Atmel",
2104 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002105 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002106 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002107 .model_id = ATMEL_AT45DB041D,
hailfingerf60abdb2009-03-19 12:18:13 +00002108 .total_size = 512 /* Size can only be determined from status register */,
2109 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002110 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002111 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002112 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002113 .write = NULL,
2114 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002115 .voltage = {2500, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002116 },
stepanaa1b6a22008-12-08 18:15:10 +00002117
hailfinger286829b2009-01-08 03:40:17 +00002118 {
2119 .vendor = "Atmel",
2120 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002121 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002122 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002123 .model_id = ATMEL_AT45DB081D,
hailfingerf60abdb2009-03-19 12:18:13 +00002124 .total_size = 1024 /* Size can only be determined from status register */,
2125 .page_size = 256 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002126 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002127 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002128 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002129 .write = NULL,
2130 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002131 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002132 },
stepanaa1b6a22008-12-08 18:15:10 +00002133
hailfinger286829b2009-01-08 03:40:17 +00002134 {
2135 .vendor = "Atmel",
2136 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002137 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002138 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002139 .model_id = ATMEL_AT45DB161D,
hailfingerf60abdb2009-03-19 12:18:13 +00002140 .total_size = 2048 /* Size can only be determined from status register */,
2141 .page_size = 512 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002142 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002143 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002144 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002145 .write = NULL,
2146 .read = NULL,
stefanct66c8c1b2011-07-19 08:50:18 +00002147 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002148 },
stepanaa1b6a22008-12-08 18:15:10 +00002149
hailfinger286829b2009-01-08 03:40:17 +00002150 {
2151 .vendor = "Atmel",
2152 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002153 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002154 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002155 .model_id = ATMEL_AT45DB321C,
hailfingerf60abdb2009-03-19 12:18:13 +00002156 .total_size = 4224 /* No power of two sizes */,
2157 .page_size = 528 /* No power of two sizes */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002158 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002159 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002160 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002161 .write = NULL,
2162 .read = NULL /* Incompatible read */,
stefanct7e00e222011-06-03 07:26:31 +00002163 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002164 },
stepanaa1b6a22008-12-08 18:15:10 +00002165
hailfinger286829b2009-01-08 03:40:17 +00002166 {
2167 .vendor = "Atmel",
2168 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00002169 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002170 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002171 .model_id = ATMEL_AT45DB321D,
hailfingerf60abdb2009-03-19 12:18:13 +00002172 .total_size = 4096 /* Size can only be determined from status register */,
2173 .page_size = 512 /* Size can only be determined from status register */,
Stefan Tauner9816fc82016-08-12 15:47:49 -07002174 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2175 .feature_bits = FEATURE_OTP,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002176 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002177 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002178 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002179 .write = NULL,
2180 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002181 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002182 },
stepanaa1b6a22008-12-08 18:15:10 +00002183
hailfinger286829b2009-01-08 03:40:17 +00002184 {
2185 .vendor = "Atmel",
2186 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00002187 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002188 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002189 .model_id = ATMEL_AT45DB642D,
hailfingerf60abdb2009-03-19 12:18:13 +00002190 .total_size = 8192 /* Size can only be determined from status register */,
2191 .page_size = 1024 /* Size can only be determined from status register */,
Patrick Georgiac3423f2017-02-03 20:58:06 +01002192 .tested = { .probe = NT, .read = BAD, .erase = NT, .write = NT, .uread = NT },
hailfinger286829b2009-01-08 03:40:17 +00002193 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002194 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +00002195 .write = NULL,
2196 .read = NULL,
stefanct7e00e222011-06-03 07:26:31 +00002197 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002198 },
stepanaa1b6a22008-12-08 18:15:10 +00002199
hailfinger286829b2009-01-08 03:40:17 +00002200 {
2201 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00002202 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00002203 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00002204 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002205 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00002206 .total_size = 64,
2207 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00002208 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00002209 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00002210 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002211 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002212 .block_erasers =
2213 {
2214 {
2215 .eraseblocks = { {64 * 1024, 1} },
2216 .block_erase = erase_chip_block_jedec,
2217 }
2218 },
snelsonc6855342010-01-28 23:55:12 +00002219 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00002220 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002221 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00002222 },
2223
2224 {
2225 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002226 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00002227 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002228 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002229 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00002230 .total_size = 256,
2231 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002232 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002233 .tested = TEST_UNTESTED,
2234 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002235 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002236 .block_erasers =
2237 {
2238 {
2239 .eraseblocks = {
2240 {16 * 1024, 1},
2241 {8 * 1024, 2},
2242 {96 * 1024, 1},
2243 {128 * 1024, 1},
2244 },
2245 .block_erase = erase_sector_jedec,
2246 }, {
2247 .eraseblocks = { {256 * 1024, 1} },
2248 .block_erase = erase_chip_block_jedec,
2249 }
2250 },
snelsonc6855342010-01-28 23:55:12 +00002251 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002252 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002253 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002254 },
2255
hailfinger286829b2009-01-08 03:40:17 +00002256 {
2257 .vendor = "Atmel",
2258 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00002259 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002260 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002261 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00002262 .total_size = 256,
2263 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002264 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002265 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00002266 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00002267 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00002268 .block_erasers =
2269 {
2270 {
2271 .eraseblocks = {
2272 {128 * 1024, 1},
2273 {96 * 1024, 1},
2274 {8 * 1024, 2},
2275 {16 * 1024, 1},
2276 },
2277 .block_erase = erase_sector_jedec,
2278 }, {
2279 .eraseblocks = { {256 * 1024, 1} },
2280 .block_erase = erase_chip_block_jedec,
2281 }
2282 },
snelsonc6855342010-01-28 23:55:12 +00002283 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00002284 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002285 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002286 },
2287
hailfinger867df6b2010-07-22 11:44:38 +00002288 {
uwe598c14d2011-09-08 19:55:18 +00002289 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002290 .name = "AT49F020",
2291 .bustype = BUS_PARALLEL,
2292 .manufacture_id = ATMEL_ID,
2293 .model_id = ATMEL_AT49F020,
2294 .total_size = 256,
2295 .page_size = 256,
2296 .feature_bits = FEATURE_EITHER_RESET,
2297 .tested = TEST_OK_PRE,
2298 .probe = probe_jedec,
2299 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2300 .block_erasers =
2301 {
2302 {
2303 .eraseblocks = { {256 * 1024, 1} },
2304 .block_erase = erase_chip_block_jedec,
2305 }
2306 },
2307 .write = write_jedec_1,
2308 .read = read_memmapped,
2309 .voltage = {4500, 5500},
2310 },
2311
2312 {
2313 .vendor = "Atmel",
uwe598c14d2011-09-08 19:55:18 +00002314 .name = "AT49LH002",
2315 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
2316 .manufacture_id = ATMEL_ID,
2317 .model_id = ATMEL_AT49LH002,
2318 .total_size = 256,
2319 .page_size = 0, /* unused */
2320 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
2321 .tested = TEST_UNTESTED,
2322 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
2323 .probe_timing = TIMING_FIXME,
2324 .block_erasers =
2325 {
2326 {
2327 .eraseblocks = {
2328 {64 * 1024, 3},
2329 {32 * 1024, 1},
2330 {8 * 1024, 2},
2331 {16 * 1024, 1},
2332 },
2333 .block_erase = erase_block_82802ab,
2334 }, {
2335 .eraseblocks = {
2336 {64 * 1024, 4},
2337 },
2338 .block_erase = NULL, /* TODO: Implement. */
2339 },
2340 },
2341 .printlock = NULL, /* TODO */
2342 .unlock = NULL, /* unlock_82802ab() not correct(?) */
2343 .write = write_82802ab,
2344 .read = read_memmapped,
2345 .voltage = {3000, 3600},
2346 },
2347
2348 {
Alan Greend76dc1f2019-06-26 15:38:19 +10002349 .vendor = "Atmel",
2350 .name = "ATMEL_AT25SF128A",
2351 .bustype = BUS_SPI,
2352 .manufacture_id = ATMEL_ID,
2353 .model_id = ATMEL_AT25SF128A,
2354 .total_size = 16384,
2355 .page_size = 256,
2356 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
2357 .tested = TEST_OK_PREWU,
2358 .probe = probe_spi_rdid,
2359 .probe_timing = TIMING_ZERO,
2360 .block_erasers =
2361 {
2362 {
2363 .eraseblocks = { {4 * 1024, 4096} },
2364 .block_erase = spi_block_erase_20,
2365 }, {
2366 .eraseblocks = { {32 * 1024, 512} },
2367 .block_erase = spi_block_erase_52,
2368 }, {
2369 .eraseblocks = { {64 * 1024, 256} },
2370 .block_erase = spi_block_erase_d8,
2371 }, {
2372 .eraseblocks = { {16 * 1024 * 1024, 1} },
2373 .block_erase = spi_block_erase_60,
2374 }, {
2375 .eraseblocks = { {16 * 1024 * 1024, 1} },
2376 .block_erase = spi_block_erase_c7,
2377 }
2378 },
2379 .printlock = spi_prettyprint_status_register_at25df,
2380 .unlock = spi_disable_blockprotect_at25df,
2381 .write = spi_chip_write_256,
2382 .read = spi_chip_read,
2383 .voltage = {1700, 2000},
2384 .wp = &wp_w25q,
2385 },
2386
2387 {
2388 .vendor = "Atmel",
2389 .name = "ATMEL_AT25SL128A",
2390 .bustype = BUS_SPI,
2391 .manufacture_id = ATMEL_ID,
2392 .model_id = ATMEL_AT25SL128A,
2393 .total_size = 16384,
2394 .page_size = 256,
2395 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
2396 .tested = TEST_OK_PREWU,
2397 .probe = probe_spi_rdid,
2398 .probe_timing = TIMING_ZERO,
2399 .block_erasers =
2400 {
2401 {
2402 .eraseblocks = { {4 * 1024, 4096} },
2403 .block_erase = spi_block_erase_20,
2404 }, {
2405 .eraseblocks = { {32 * 1024, 512} },
2406 .block_erase = spi_block_erase_52,
2407 }, {
2408 .eraseblocks = { {64 * 1024, 256} },
2409 .block_erase = spi_block_erase_d8,
2410 }, {
2411 .eraseblocks = { {16 * 1024 * 1024, 1} },
2412 .block_erase = spi_block_erase_60,
2413 }, {
2414 .eraseblocks = { {16 * 1024 * 1024, 1} },
2415 .block_erase = spi_block_erase_c7,
2416 }
2417 },
2418 .printlock = spi_prettyprint_status_register_at25df,
2419 .unlock = spi_disable_blockprotect_at25df,
2420 .write = spi_chip_write_256,
2421 .read = spi_chip_read,
2422 .voltage = {1700, 2000},
2423 .wp = &wp_w25q,
2424 },
2425
2426 {
2427 .vendor = "Bright",
2428 .name = "BM29F040",
2429 .bustype = BUS_PARALLEL,
2430 .manufacture_id = BRIGHT_ID,
2431 .model_id = BRIGHT_BM29F040,
2432 .total_size = 512,
2433 .page_size = 64 * 1024,
2434 .feature_bits = FEATURE_EITHER_RESET,
2435 .tested = TEST_OK_PR,
2436 .probe = probe_jedec,
2437 .probe_timing = TIMING_ZERO,
2438 .block_erasers =
2439 {
2440 {
2441 .eraseblocks = { {64 * 1024, 8} },
2442 .block_erase = erase_sector_jedec,
2443 }, {
2444 .eraseblocks = { {512 * 1024, 1} },
2445 .block_erase = erase_chip_block_jedec,
2446 },
2447 },
2448 .write = write_jedec_1,
2449 .read = read_memmapped,
2450 .voltage = {4500, 5500},
2451 },
2452
2453 {
uwe97b20792011-09-13 22:05:44 +00002454 .vendor = "Catalyst",
2455 .name = "CAT28F512",
2456 .bustype = BUS_PARALLEL,
2457 .manufacture_id = CATALYST_ID,
2458 .model_id = CATALYST_CAT28F512,
2459 .total_size = 64,
2460 .page_size = 0, /* unused */
2461 .feature_bits = 0,
2462 .tested = TEST_OK_PR,
2463 .probe = probe_jedec, /* FIXME! */
2464 .probe_timing = TIMING_ZERO,
2465 .block_erasers =
2466 {
2467 {
2468 .eraseblocks = { {64 * 1024, 1} },
2469 .block_erase = NULL, /* TODO */
2470 },
2471 },
2472 .write = NULL, /* TODO */
2473 .read = read_memmapped,
2474 .voltage = {4500, 5500},
2475 },
2476
2477 {
mkarcherf6986732010-06-19 22:06:35 +00002478 .vendor = "EMST",
2479 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00002480 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01002481 .manufacture_id = ESMT_ID,
2482 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00002483 .total_size = 1024,
2484 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002485 .feature_bits = FEATURE_UNBOUND_READ,
mkarcherf6986732010-06-19 22:06:35 +00002486 .tested = TEST_UNTESTED,
2487 .probe = probe_spi_rdid,
2488 .probe_timing = TIMING_ZERO,
2489 .block_erasers =
2490 {
2491 {
2492 .eraseblocks = { {4 * 1024, 256} },
2493 .block_erase = spi_block_erase_20,
2494 }, {
2495 .eraseblocks = { {64 * 1024, 16} },
2496 .block_erase = spi_block_erase_d8,
2497 }, {
2498 .eraseblocks = { {1024 * 1024, 1} },
2499 .block_erase = spi_block_erase_60,
2500 }, {
2501 .eraseblocks = { {1024 * 1024, 1} },
2502 .block_erase = spi_block_erase_c7,
2503 }
2504 },
hailfingerb9560ee2010-07-14 20:21:22 +00002505 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00002506 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00002507 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002508 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00002509 },
2510
2511 {
Alan Greend76dc1f2019-06-26 15:38:19 +10002512 .vendor = "EMST",
2513 .name = "F49B002UA",
2514 .bustype = BUS_PARALLEL,
2515 .manufacture_id = ESMT_ID,
2516 .model_id = ESMT_F49B002UA,
2517 .total_size = 256,
2518 .page_size = 4096,
2519 .feature_bits = FEATURE_EITHER_RESET,
2520 .tested = TEST_UNTESTED,
2521 .probe = probe_jedec,
2522 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
2523 .block_erasers =
2524 {
2525 {
2526 .eraseblocks = {
2527 {128 * 1024, 1},
2528 {96 * 1024, 1},
2529 {8 * 1024, 2},
2530 {16 * 1024, 1},
2531 },
2532 .block_erase = erase_sector_jedec,
2533 }, {
2534 .eraseblocks = { {256 * 1024, 1} },
2535 .block_erase = erase_chip_block_jedec,
2536 }
2537 },
2538 .write = write_jedec_1,
2539 .read = read_memmapped,
2540 .voltage = {4500, 5500},
2541 },
2542
2543 {
hailfingerab07cbd2009-06-05 20:53:07 +00002544 .vendor = "Eon",
2545 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00002546 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002547 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002548 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00002549 .total_size = 64,
2550 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002551 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002552 .tested = TEST_UNTESTED,
2553 .probe = probe_spi_rdid,
2554 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002555 .block_erasers =
2556 {
2557 {
2558 .eraseblocks = {
2559 {4 * 1024, 2},
2560 {8 * 1024, 1},
2561 {16 * 1024, 1},
2562 {32 * 1024, 1},
2563 },
2564 .block_erase = spi_block_erase_d8,
2565 }, {
2566 .eraseblocks = { {64 * 1024, 1} },
2567 .block_erase = spi_block_erase_c7,
2568 }
2569 },
hailfingerb9560ee2010-07-14 20:21:22 +00002570 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002571 .write = spi_chip_write_256,
2572 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002573 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002574 },
2575
2576 {
2577 .vendor = "Eon",
2578 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00002579 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002580 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002581 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00002582 .total_size = 64,
2583 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002584 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002585 .tested = TEST_UNTESTED,
2586 .probe = probe_spi_rdid,
2587 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002588 .block_erasers =
2589 {
2590 {
2591 .eraseblocks = {
2592 {32 * 1024, 1},
2593 {16 * 1024, 1},
2594 {8 * 1024, 1},
2595 {4 * 1024, 2},
2596 },
2597 .block_erase = spi_block_erase_d8,
2598 }, {
2599 .eraseblocks = { {64 * 1024, 1} },
2600 .block_erase = spi_block_erase_c7,
2601 }
2602 },
hailfingerb9560ee2010-07-14 20:21:22 +00002603 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002604 .write = spi_chip_write_256,
2605 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002606 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002607 },
2608
2609 {
2610 .vendor = "Eon",
2611 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00002612 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002613 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002614 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00002615 .total_size = 128,
2616 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002617 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002618 .tested = TEST_UNTESTED,
2619 .probe = probe_spi_rdid,
2620 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002621 .block_erasers =
2622 {
2623 {
2624 .eraseblocks = {
2625 {4 * 1024, 2},
2626 {8 * 1024, 1},
2627 {16 * 1024, 1},
2628 {32 * 1024, 3},
2629 },
2630 .block_erase = spi_block_erase_d8,
2631 }, {
2632 .eraseblocks = { {128 * 1024, 1} },
2633 .block_erase = spi_block_erase_c7,
2634 }
2635 },
hailfingerb9560ee2010-07-14 20:21:22 +00002636 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002637 .write = spi_chip_write_256,
2638 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002639 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002640 },
2641
2642 {
2643 .vendor = "Eon",
2644 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00002645 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002646 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002647 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00002648 .total_size = 128,
2649 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002650 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002651 .tested = TEST_UNTESTED,
2652 .probe = probe_spi_rdid,
2653 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002654 .block_erasers =
2655 {
2656 {
2657 .eraseblocks = {
2658 {32 * 1024, 3},
2659 {16 * 1024, 1},
2660 {8 * 1024, 1},
2661 {4 * 1024, 2},
2662 },
2663 .block_erase = spi_block_erase_d8,
2664 }, {
2665 .eraseblocks = { {128 * 1024, 1} },
2666 .block_erase = spi_block_erase_c7,
2667 }
2668 },
hailfingerb9560ee2010-07-14 20:21:22 +00002669 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002670 .write = spi_chip_write_256,
2671 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002672 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002673 },
2674
2675 {
2676 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00002677 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00002678 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002679 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002680 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00002681 .total_size = 2048,
2682 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002683 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002684 .tested = TEST_UNTESTED,
2685 .probe = probe_spi_rdid,
2686 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002687 .block_erasers =
2688 {
2689 {
2690 .eraseblocks = {
2691 {4 * 1024, 2},
2692 {8 * 1024, 1},
2693 {16 * 1024, 1},
2694 {32 * 1024, 1},
2695 {64 * 1024, 31},
2696 },
2697 .block_erase = spi_block_erase_d8,
2698 }, {
2699 .eraseblocks = { {2 * 1024 * 1024, 1} },
2700 .block_erase = spi_block_erase_c7,
2701 }
2702 },
hailfingerb9560ee2010-07-14 20:21:22 +00002703 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002704 .write = spi_chip_write_256,
2705 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002706 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002707 },
2708
2709 {
2710 .vendor = "Eon",
2711 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00002712 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002713 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002714 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00002715 .total_size = 2048,
2716 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002717 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002718 .tested = TEST_UNTESTED,
2719 .probe = probe_spi_rdid,
2720 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002721 .block_erasers =
2722 {
2723 {
2724 .eraseblocks = {
2725 {64 * 1024, 31},
2726 {32 * 1024, 1},
2727 {16 * 1024, 1},
2728 {8 * 1024, 1},
2729 {4 * 1024, 2},
2730 },
2731 .block_erase = spi_block_erase_d8,
2732 }, {
2733 .eraseblocks = { {2 * 1024 * 1024, 1} },
2734 .block_erase = spi_block_erase_c7,
2735 }
2736 },
hailfingerb9560ee2010-07-14 20:21:22 +00002737 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002738 .write = spi_chip_write_256,
2739 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002740 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002741 },
2742
2743 {
2744 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10002745 .name = "EN25B20",
2746 .bustype = BUS_SPI,
2747 .manufacture_id = EON_ID_NOPREFIX,
2748 .model_id = EON_EN25B20,
2749 .total_size = 256,
2750 .page_size = 256,
2751 .feature_bits = FEATURE_UNBOUND_READ,
2752 .tested = TEST_UNTESTED,
2753 .probe = probe_spi_rdid,
2754 .probe_timing = TIMING_ZERO,
2755 .block_erasers =
2756 {
2757 {
2758 .eraseblocks = {
2759 {4 * 1024, 2},
2760 {8 * 1024, 1},
2761 {16 * 1024, 1},
2762 {32 * 1024, 1},
2763 {64 * 1024, 3}
2764 },
2765 .block_erase = spi_block_erase_d8,
2766 }, {
2767 .eraseblocks = { {256 * 1024, 1} },
2768 .block_erase = spi_block_erase_c7,
2769 }
2770 },
2771 .unlock = spi_disable_blockprotect,
2772 .write = spi_chip_write_256,
2773 .read = spi_chip_read,
2774 .voltage = {2700, 3600},
2775 },
2776
2777 {
2778 .vendor = "Eon",
2779 .name = "EN25B20T",
2780 .bustype = BUS_SPI,
2781 .manufacture_id = EON_ID_NOPREFIX,
2782 .model_id = EON_EN25B20,
2783 .total_size = 256,
2784 .page_size = 256,
2785 .feature_bits = FEATURE_UNBOUND_READ,
2786 .tested = TEST_UNTESTED,
2787 .probe = probe_spi_rdid,
2788 .probe_timing = TIMING_ZERO,
2789 .block_erasers =
2790 {
2791 {
2792 .eraseblocks = {
2793 {64 * 1024, 3},
2794 {32 * 1024, 1},
2795 {16 * 1024, 1},
2796 {8 * 1024, 1},
2797 {4 * 1024, 2},
2798 },
2799 .block_erase = spi_block_erase_d8,
2800 }, {
2801 .eraseblocks = { {256 * 1024, 1} },
2802 .block_erase = spi_block_erase_c7,
2803 }
2804 },
2805 .unlock = spi_disable_blockprotect,
2806 .write = spi_chip_write_256,
2807 .read = spi_chip_read,
2808 .voltage = {2700, 3600},
2809 },
2810
2811 {
2812 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00002813 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00002814 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002815 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002816 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00002817 .total_size = 4096,
2818 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002819 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002820 .tested = TEST_UNTESTED,
2821 .probe = probe_spi_rdid,
2822 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002823 .block_erasers =
2824 {
2825 {
2826 .eraseblocks = {
2827 {4 * 1024, 2},
2828 {8 * 1024, 1},
2829 {16 * 1024, 1},
2830 {32 * 1024, 1},
2831 {64 * 1024, 63},
2832 },
2833 .block_erase = spi_block_erase_d8,
2834 }, {
2835 .eraseblocks = { {4 * 1024 * 1024, 1} },
2836 .block_erase = spi_block_erase_c7,
2837 }
2838 },
hailfingerb9560ee2010-07-14 20:21:22 +00002839 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002840 .write = spi_chip_write_256,
2841 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002842 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002843 },
2844
2845 {
2846 .vendor = "Eon",
2847 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00002848 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002849 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002850 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00002851 .total_size = 4096,
2852 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002853 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002854 .tested = TEST_UNTESTED,
2855 .probe = probe_spi_rdid,
2856 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002857 .block_erasers =
2858 {
2859 {
2860 .eraseblocks = {
2861 {64 * 1024, 63},
2862 {32 * 1024, 1},
2863 {16 * 1024, 1},
2864 {8 * 1024, 1},
2865 {4 * 1024, 2},
2866 },
2867 .block_erase = spi_block_erase_d8,
2868 }, {
2869 .eraseblocks = { {4 * 1024 * 1024, 1} },
2870 .block_erase = spi_block_erase_c7,
2871 }
2872 },
hailfingerb9560ee2010-07-14 20:21:22 +00002873 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00002874 .write = spi_chip_write_256,
2875 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002876 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00002877 },
2878
2879 {
2880 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10002881 .name = "EN25B40",
2882 .bustype = BUS_SPI,
2883 .manufacture_id = EON_ID_NOPREFIX,
2884 .model_id = EON_EN25B40,
2885 .total_size = 512,
2886 .page_size = 256,
2887 .feature_bits = FEATURE_UNBOUND_READ,
2888 .tested = TEST_UNTESTED,
2889 .probe = probe_spi_rdid,
2890 .probe_timing = TIMING_ZERO,
2891 .block_erasers =
2892 {
2893 {
2894 .eraseblocks = {
2895 {4 * 1024, 2},
2896 {8 * 1024, 1},
2897 {16 * 1024, 1},
2898 {32 * 1024, 1},
2899 {64 * 1024, 7}
2900 },
2901 .block_erase = spi_block_erase_d8,
2902 }, {
2903 .eraseblocks = { {512 * 1024, 1} },
2904 .block_erase = spi_block_erase_c7,
2905 }
2906 },
2907 .unlock = spi_disable_blockprotect,
2908 .write = spi_chip_write_256,
2909 .read = spi_chip_read,
2910 .voltage = {2700, 3600},
2911 },
2912
2913 {
2914 .vendor = "Eon",
2915 .name = "EN25B40T",
2916 .bustype = BUS_SPI,
2917 .manufacture_id = EON_ID_NOPREFIX,
2918 .model_id = EON_EN25B40,
2919 .total_size = 512,
2920 .page_size = 256,
2921 .feature_bits = FEATURE_UNBOUND_READ,
2922 .tested = TEST_UNTESTED,
2923 .probe = probe_spi_rdid,
2924 .probe_timing = TIMING_ZERO,
2925 .block_erasers =
2926 {
2927 {
2928 .eraseblocks = {
2929 {64 * 1024, 7},
2930 {32 * 1024, 1},
2931 {16 * 1024, 1},
2932 {8 * 1024, 1},
2933 {4 * 1024, 2},
2934 },
2935 .block_erase = spi_block_erase_d8,
2936 }, {
2937 .eraseblocks = { {512 * 1024, 1} },
2938 .block_erase = spi_block_erase_c7,
2939 }
2940 },
2941 .unlock = spi_disable_blockprotect,
2942 .write = spi_chip_write_256,
2943 .read = spi_chip_read,
2944 .voltage = {2700, 3600},
2945 },
2946
2947 {
2948 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00002949 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00002950 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00002951 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002952 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00002953 .total_size = 8192,
2954 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002955 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerab07cbd2009-06-05 20:53:07 +00002956 .tested = TEST_UNTESTED,
2957 .probe = probe_spi_rdid,
2958 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002959 .block_erasers =
2960 {
2961 {
2962 .eraseblocks = {
2963 {4 * 1024, 2},
2964 {8 * 1024, 1},
2965 {16 * 1024, 1},
2966 {32 * 1024, 1},
2967 {64 * 1024, 127},
2968 },
2969 .block_erase = spi_block_erase_d8,
2970 }, {
2971 .eraseblocks = { {8 * 1024 * 1024, 1} },
2972 .block_erase = spi_block_erase_c7,
2973 }
2974 },
hailfingerb9560ee2010-07-14 20:21:22 +00002975 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00002976 .write = spi_chip_write_256,
2977 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002978 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00002979 },
2980
2981 {
2982 .vendor = "Eon",
2983 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00002984 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00002985 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00002986 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00002987 .total_size = 8192,
2988 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08002989 .feature_bits = FEATURE_UNBOUND_READ,
snelson2d471072010-01-09 05:30:14 +00002990 .tested = TEST_UNTESTED,
2991 .probe = probe_spi_rdid,
2992 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00002993 .block_erasers =
2994 {
2995 {
2996 .eraseblocks = {
2997 {64 * 1024, 127},
2998 {32 * 1024, 1},
2999 {16 * 1024, 1},
3000 {8 * 1024, 1},
3001 {4 * 1024, 2},
3002 },
3003 .block_erase = spi_block_erase_d8,
3004 }, {
3005 .eraseblocks = { {8 * 1024 * 1024, 1} },
3006 .block_erase = spi_block_erase_c7,
3007 }
3008 },
hailfingerb9560ee2010-07-14 20:21:22 +00003009 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003010 .write = spi_chip_write_256,
3011 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003012 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003013 },
3014
3015 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003016 .vendor = "Eon",
3017 .name = "EN25B80",
3018 .bustype = BUS_SPI,
3019 .manufacture_id = EON_ID_NOPREFIX,
3020 .model_id = EON_EN25B80,
3021 .total_size = 1024,
3022 .page_size = 256,
3023 .feature_bits = FEATURE_UNBOUND_READ,
3024 .tested = TEST_UNTESTED,
3025 .probe = probe_spi_rdid,
3026 .probe_timing = TIMING_ZERO,
3027 .block_erasers =
3028 {
3029 {
3030 .eraseblocks = {
3031 {4 * 1024, 2},
3032 {8 * 1024, 1},
3033 {16 * 1024, 1},
3034 {32 * 1024, 1},
3035 {64 * 1024, 15}
3036 },
3037 .block_erase = spi_block_erase_d8,
3038 }, {
3039 .eraseblocks = { {1024 * 1024, 1} },
3040 .block_erase = spi_block_erase_c7,
3041 }
3042 },
3043 .unlock = spi_disable_blockprotect,
3044 .write = spi_chip_write_256,
3045 .read = spi_chip_read,
3046 .voltage = {2700, 3600},
3047 },
3048
3049 {
3050 .vendor = "Eon",
3051 .name = "EN25B80T",
3052 .bustype = BUS_SPI,
3053 .manufacture_id = EON_ID_NOPREFIX,
3054 .model_id = EON_EN25B80,
3055 .total_size = 1024,
3056 .page_size = 256,
3057 .feature_bits = FEATURE_UNBOUND_READ,
3058 .tested = TEST_UNTESTED,
3059 .probe = probe_spi_rdid,
3060 .probe_timing = TIMING_ZERO,
3061 .block_erasers =
3062 {
3063 {
3064 .eraseblocks = {
3065 {64 * 1024, 15},
3066 {32 * 1024, 1},
3067 {16 * 1024, 1},
3068 {8 * 1024, 1},
3069 {4 * 1024, 2},
3070 },
3071 .block_erase = spi_block_erase_d8,
3072 }, {
3073 .eraseblocks = { {1024 * 1024, 1} },
3074 .block_erase = spi_block_erase_c7,
3075 }
3076 },
3077 .unlock = spi_disable_blockprotect,
3078 .write = spi_chip_write_256,
3079 .read = spi_chip_read,
3080 .voltage = {2700, 3600},
3081 },
3082
3083 {
David Hendrickse185bf22011-05-24 15:34:18 -07003084 /* Note: EN25Q16 is an evil twin which shares the model ID
3085 but has different write protection capabilities */
hailfingerab07cbd2009-06-05 20:53:07 +00003086 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00003087 .name = "EN25D16",
hailfingere1e41ea2011-07-27 07:13:06 +00003088 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003089 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003090 .model_id = EON_EN25D16,
hailfinger77c5d932009-06-15 12:10:57 +00003091 .total_size = 2048,
3092 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003093 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
3094 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
hailfinger77c5d932009-06-15 12:10:57 +00003095 .tested = TEST_UNTESTED,
3096 .probe = probe_spi_rdid,
3097 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003098 .block_erasers =
3099 {
3100 {
3101 .eraseblocks = { {4 * 1024, 512} },
3102 .block_erase = spi_block_erase_20,
3103 }, {
3104 .eraseblocks = { {64 * 1024, 32} },
3105 .block_erase = spi_block_erase_d8,
3106 }, {
3107 .eraseblocks = { {64 * 1024, 32} },
3108 .block_erase = spi_block_erase_52,
3109 }, {
3110 .eraseblocks = { {2 * 1024 * 1024, 1} },
3111 .block_erase = spi_block_erase_60,
3112 }, {
3113 .eraseblocks = { {2 * 1024 * 1024, 1} },
3114 .block_erase = spi_block_erase_c7,
3115 }
3116 },
hailfingerb9560ee2010-07-14 20:21:22 +00003117 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003118 .write = spi_chip_write_256,
3119 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003120 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003121 },
3122
3123 {
3124 .vendor = "Eon",
3125 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00003126 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003127 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003128 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00003129 .total_size = 64,
3130 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003131 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003132 .tested = TEST_UNTESTED,
3133 .probe = probe_spi_rdid,
3134 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003135 .block_erasers =
3136 {
3137 {
3138 .eraseblocks = { {4 * 1024, 16} },
3139 .block_erase = spi_block_erase_20,
3140 }, {
3141 .eraseblocks = { {32 * 1024, 2} },
3142 .block_erase = spi_block_erase_d8,
3143 }, {
3144 .eraseblocks = { {32 * 1024, 2} },
3145 .block_erase = spi_block_erase_52,
3146 }, {
3147 .eraseblocks = { {64 * 1024, 1} },
3148 .block_erase = spi_block_erase_60,
3149 }, {
3150 .eraseblocks = { {64 * 1024, 1} },
3151 .block_erase = spi_block_erase_c7,
3152 }
3153 },
hailfingerb9560ee2010-07-14 20:21:22 +00003154 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003155 .write = spi_chip_write_256,
3156 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003157 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003158 },
3159
3160 {
3161 .vendor = "Eon",
3162 .name = "EN25F10",
hailfingere1e41ea2011-07-27 07:13:06 +00003163 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003164 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003165 .model_id = EON_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00003166 .total_size = 128,
3167 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003168 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +00003169 .tested = TEST_UNTESTED,
3170 .probe = probe_spi_rdid,
3171 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003172 .block_erasers =
3173 {
3174 {
3175 .eraseblocks = { {4 * 1024, 32} },
3176 .block_erase = spi_block_erase_20,
3177 }, {
3178 .eraseblocks = { {32 * 1024, 4} },
3179 .block_erase = spi_block_erase_d8,
3180 }, {
3181 .eraseblocks = { {32 * 1024, 4} },
3182 .block_erase = spi_block_erase_52,
3183 }, {
3184 .eraseblocks = { {128 * 1024, 1} },
3185 .block_erase = spi_block_erase_60,
3186 }, {
3187 .eraseblocks = { {128 * 1024, 1} },
3188 .block_erase = spi_block_erase_c7,
3189 }
3190 },
hailfingerb9560ee2010-07-14 20:21:22 +00003191 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003192 .write = spi_chip_write_256,
3193 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003194 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003195 },
3196
3197 {
3198 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003199 .name = "EN25F16",
3200 .bustype = BUS_SPI,
3201 .manufacture_id = EON_ID_NOPREFIX,
3202 .model_id = EON_EN25F16,
3203 .total_size = 2048,
3204 .page_size = 256,
3205 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3206 .tested = TEST_OK_PREWU,
3207 .probe = probe_spi_rdid,
3208 .probe_timing = TIMING_ZERO,
3209 .block_erasers =
3210 {
3211 {
3212 .eraseblocks = { {4 * 1024, 512} },
3213 .block_erase = spi_block_erase_20,
3214 }, {
3215 .eraseblocks = { {64 * 1024, 32} },
3216 .block_erase = spi_block_erase_d8,
3217 }, {
3218 .eraseblocks = { {2 * 1024 * 1024, 1} },
3219 .block_erase = spi_block_erase_60,
3220 }, {
3221 .eraseblocks = { {2 * 1024 * 1024, 1} },
3222 .block_erase = spi_block_erase_c7,
3223 }
3224 },
3225 .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",
hailfinger77c5d932009-06-15 12:10:57 +00003233 .name = "EN25F20",
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_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00003237 .total_size = 256,
3238 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003239 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger77c5d932009-06-15 12:10:57 +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 = { {4 * 1024, 64} },
3247 .block_erase = spi_block_erase_20,
3248 }, {
3249 .eraseblocks = { {64 * 1024, 4} },
3250 .block_erase = spi_block_erase_d8,
3251 }, {
3252 .eraseblocks = { {64 * 1024, 4} },
3253 .block_erase = spi_block_erase_52,
3254 }, {
3255 .eraseblocks = { {256 * 1024, 1} },
3256 .block_erase = spi_block_erase_60,
3257 }, {
3258 .eraseblocks = { {256 * 1024, 1} },
3259 .block_erase = spi_block_erase_c7,
3260 }
3261 },
hailfingerb9560ee2010-07-14 20:21:22 +00003262 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00003263 .write = spi_chip_write_256,
3264 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003265 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00003266 },
3267
3268 {
3269 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003270 .name = "EN25F32",
3271 .bustype = BUS_SPI,
3272 .manufacture_id = EON_ID_NOPREFIX,
3273 .model_id = EON_EN25F32,
3274 .total_size = 4096,
3275 .page_size = 256,
3276 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3277 .tested = TEST_UNTESTED,
3278 .probe = probe_spi_rdid,
3279 .probe_timing = TIMING_ZERO,
3280 .block_erasers =
3281 {
3282 {
3283 .eraseblocks = { {4 * 1024, 1024} },
3284 .block_erase = spi_block_erase_20,
3285 }, {
3286 .eraseblocks = { {64 * 1024, 64} },
3287 .block_erase = spi_block_erase_d8,
3288 }, {
3289 .eraseblocks = { {4 * 1024 * 1024, 1} },
3290 .block_erase = spi_block_erase_60,
3291 }, {
3292 .eraseblocks = { {4 * 1024 * 1024, 1} },
3293 .block_erase = spi_block_erase_c7,
3294 }
3295 },
3296 .unlock = spi_disable_blockprotect,
3297 .write = spi_chip_write_256,
3298 .read = spi_chip_read,
3299 },
3300
3301 {
3302 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003303 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00003304 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003305 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003306 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00003307 .total_size = 512,
3308 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003309 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger27a59132009-06-22 10:06:28 +00003310 .tested = TEST_OK_PROBE,
hailfingerab07cbd2009-06-05 20:53:07 +00003311 .probe = probe_spi_rdid,
3312 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00003313 .block_erasers =
3314 {
3315 {
snelson2d471072010-01-09 05:30:14 +00003316 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00003317 .block_erase = spi_block_erase_20,
3318 }, {
snelson2d471072010-01-09 05:30:14 +00003319 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00003320 .block_erase = spi_block_erase_d8,
3321 }, {
snelson2d471072010-01-09 05:30:14 +00003322 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003323 .block_erase = spi_block_erase_60,
3324 }, {
snelson2d471072010-01-09 05:30:14 +00003325 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00003326 .block_erase = spi_block_erase_c7,
3327 },
3328 },
hailfingerb9560ee2010-07-14 20:21:22 +00003329 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003330 .write = spi_chip_write_256,
3331 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003332 .voltage = {2700, 3600},
Louis Yung-Chieh Lod6572b32011-05-24 16:28:27 +08003333 .wp = &wp_w25,
hailfingerab07cbd2009-06-05 20:53:07 +00003334 },
3335
3336 {
3337 .vendor = "Eon",
3338 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00003339 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003340 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003341 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00003342 .total_size = 1024,
3343 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003344 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3345 .tested = TEST_OK_PREWU,
hailfingerab07cbd2009-06-05 20:53:07 +00003346 .probe = probe_spi_rdid,
3347 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003348 .block_erasers =
3349 {
3350 {
3351 .eraseblocks = { {4 * 1024, 256} },
3352 .block_erase = spi_block_erase_20,
3353 }, {
3354 .eraseblocks = { {64 * 1024, 16} },
3355 .block_erase = spi_block_erase_d8,
3356 }, {
3357 .eraseblocks = { {1024 * 1024, 1} },
3358 .block_erase = spi_block_erase_60,
3359 }, {
3360 .eraseblocks = { {1024 * 1024, 1} },
3361 .block_erase = spi_block_erase_c7,
3362 }
3363 },
hailfingerb9560ee2010-07-14 20:21:22 +00003364 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003365 .write = spi_chip_write_256,
3366 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003367 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003368 },
3369
3370 {
3371 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003372 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00003373 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003374 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10003375 .model_id = EON_EN25Q128,
3376 .total_size = 16384,
hailfinger77c5d932009-06-15 12:10:57 +00003377 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10003378 /* OTP: 512B total; enter 0x3A */
3379 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendrickse185bf22011-05-24 15:34:18 -07003380 .tested = TEST_UNTESTED,
3381 .probe = probe_spi_rdid,
3382 .probe_timing = TIMING_ZERO,
3383 .block_erasers =
3384 {
3385 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003386 .eraseblocks = { {4 * 1024, 4096} },
David Hendrickse185bf22011-05-24 15:34:18 -07003387 .block_erase = spi_block_erase_20,
3388 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003389 .eraseblocks = { {64 * 1024, 256} },
David Hendrickse185bf22011-05-24 15:34:18 -07003390 .block_erase = spi_block_erase_d8,
3391 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003392 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003393 .block_erase = spi_block_erase_60,
3394 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003395 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003396 .block_erase = spi_block_erase_c7,
3397 }
3398 },
3399 .unlock = spi_disable_blockprotect,
3400 .write = spi_chip_write_256,
3401 .read = spi_chip_read,
David Hendrickse185bf22011-05-24 15:34:18 -07003402 .wp = &wp_w25,
3403 },
3404
3405 {
3406 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003407 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00003408 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07003409 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10003410 .model_id = EON_EN25Q32,
3411 .total_size = 4096,
David Hendrickse185bf22011-05-24 15:34:18 -07003412 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10003413 /* OTP: 512B total; enter 0x3A */
3414 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendrickse185bf22011-05-24 15:34:18 -07003415 .tested = TEST_UNTESTED,
3416 .probe = probe_spi_rdid,
3417 .probe_timing = TIMING_ZERO,
3418 .block_erasers =
3419 {
3420 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003421 .eraseblocks = { {4 * 1024, 1024} },
David Hendrickse185bf22011-05-24 15:34:18 -07003422 .block_erase = spi_block_erase_20,
3423 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003424 .eraseblocks = { {64 * 1024, 64} },
David Hendrickse185bf22011-05-24 15:34:18 -07003425 .block_erase = spi_block_erase_d8,
3426 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003427 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003428 .block_erase = spi_block_erase_60,
3429 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003430 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07003431 .block_erase = spi_block_erase_c7,
3432 }
3433 },
3434 .unlock = spi_disable_blockprotect,
3435 .write = spi_chip_write_256,
3436 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10003437 .voltage = {2700, 3600},
David Hendrickse185bf22011-05-24 15:34:18 -07003438 .wp = &wp_w25,
hailfinger77c5d932009-06-15 12:10:57 +00003439 },
3440
3441 {
snelson2b18d0f2010-03-05 08:44:11 +00003442 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00003443 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00003444 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003445 .manufacture_id = EON_ID_NOPREFIX,
3446 .model_id = EON_EN25Q40,
3447 .total_size = 512,
3448 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003449 /* OTP: 256B total; enter 0x3A */
3450 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003451 .tested = TEST_UNTESTED,
3452 .probe = probe_spi_rdid,
3453 .probe_timing = TIMING_ZERO,
3454 .block_erasers =
3455 {
3456 {
3457 .eraseblocks = { {4 * 1024, 128} },
3458 .block_erase = spi_block_erase_20,
3459 }, {
3460 .eraseblocks = { {64 * 1024, 8} },
3461 .block_erase = spi_block_erase_d8,
3462 }, {
3463 .eraseblocks = { {512 * 1024, 1} },
3464 .block_erase = spi_block_erase_60,
3465 }, {
3466 .eraseblocks = { {512 * 1024, 1} },
3467 .block_erase = spi_block_erase_c7,
3468 }
3469 },
3470 .unlock = spi_disable_blockprotect,
3471 .write = spi_chip_write_256,
3472 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003473 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10003474 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00003475 },
3476
3477 {
3478 .vendor = "Eon",
3479 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00003480 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003481 .manufacture_id = EON_ID_NOPREFIX,
3482 .model_id = EON_EN25Q64,
3483 .total_size = 8192,
3484 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003485 /* OTP: 512B total; enter 0x3A */
3486 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003487 .tested = TEST_UNTESTED,
3488 .probe = probe_spi_rdid,
3489 .probe_timing = TIMING_ZERO,
3490 .block_erasers =
3491 {
3492 {
3493 .eraseblocks = { {4 * 1024, 2048} },
3494 .block_erase = spi_block_erase_20,
3495 }, {
3496 .eraseblocks = { {64 * 1024, 128} },
3497 .block_erase = spi_block_erase_d8,
3498 }, {
3499 .eraseblocks = { {8 * 1024 * 1024, 1} },
3500 .block_erase = spi_block_erase_60,
3501 }, {
3502 .eraseblocks = { {8 * 1024 * 1024, 1} },
3503 .block_erase = spi_block_erase_c7,
3504 }
3505 },
3506 .unlock = spi_disable_blockprotect,
3507 .write = spi_chip_write_256,
3508 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003509 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10003510 .wp = &wp_w25,
3511 },
3512
3513 {
3514 .vendor = "Eon",
3515 .name = "EN25Q80(A)",
3516 .bustype = BUS_SPI,
3517 .manufacture_id = EON_ID_NOPREFIX,
3518 .model_id = EON_EN25Q80,
3519 .total_size = 1024,
3520 .page_size = 256,
3521 /* OTP: 256B total; enter 0x3A */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003522 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003523 .tested = TEST_UNTESTED,
3524 .probe = probe_spi_rdid,
3525 .probe_timing = TIMING_ZERO,
3526 .block_erasers =
3527 {
3528 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003529 .eraseblocks = { {4 * 1024, 256} },
stefanct5d10cff2011-07-24 22:21:57 +00003530 .block_erase = spi_block_erase_20,
3531 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003532 .eraseblocks = { {64 * 1024, 16} },
stefanct5d10cff2011-07-24 22:21:57 +00003533 .block_erase = spi_block_erase_d8,
3534 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003535 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00003536 .block_erase = spi_block_erase_60,
3537 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003538 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00003539 .block_erase = spi_block_erase_c7,
3540 }
3541 },
3542 .unlock = spi_disable_blockprotect,
3543 .write = spi_chip_write_256,
3544 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10003545 .voltage = {2700, 3600},
Alan Green35299002019-06-25 16:14:02 +10003546 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00003547 },
3548
3549 {
3550 .vendor = "Eon",
3551 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00003552 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00003553 .manufacture_id = EON_ID_NOPREFIX,
3554 .model_id = EON_EN25QH16,
3555 .total_size = 2048,
3556 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003557 /* supports SFDP */
3558 /* OTP: 512B total; enter 0x3A */
3559 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00003560 .tested = TEST_UNTESTED,
3561 .probe = probe_spi_rdid,
3562 .probe_timing = TIMING_ZERO,
3563 .block_erasers =
3564 {
3565 {
3566 .eraseblocks = { {4 * 1024, 512} },
3567 .block_erase = spi_block_erase_20,
3568 }, {
3569 .eraseblocks = { {64 * 1024, 32} },
3570 .block_erase = spi_block_erase_d8,
3571 }, {
3572 .eraseblocks = { {1024 * 2048, 1} },
3573 .block_erase = spi_block_erase_60,
3574 }, {
3575 .eraseblocks = { {1024 * 2048, 1} },
3576 .block_erase = spi_block_erase_c7,
3577 }
3578 },
3579 .unlock = spi_disable_blockprotect,
3580 .write = spi_chip_write_256,
3581 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003582 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00003583 },
Alan Greena7cfa332019-06-24 15:48:14 +10003584
Marc Jonesb2f90022014-04-29 17:37:23 -06003585 {
3586 .vendor = "Eon",
3587 .name = "EN25S64",
3588 .bustype = BUS_SPI,
3589 .manufacture_id = EON_ID_NOPREFIX,
3590 .model_id = EON_EN25S64,
3591 .total_size = 8192,
3592 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07003593 /* FIXME: add FEATURE_QPI removed */
Marc Jonesb2f90022014-04-29 17:37:23 -06003594 /* OTP: 512B total; enter 0x3A */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003595 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08003596 .tested = TEST_OK_PREWU,
Marc Jonesb2f90022014-04-29 17:37:23 -06003597 .probe = probe_spi_rdid,
3598 .probe_timing = TIMING_ZERO,
Alan Greena7cfa332019-06-24 15:48:14 +10003599 .block_erasers =
3600 {
Marc Jonesb2f90022014-04-29 17:37:23 -06003601 {
3602 .eraseblocks = { {4 * 1024, 2048} },
3603 .block_erase = spi_block_erase_20,
3604 }, {
3605 .eraseblocks = { {64 * 1024, 128} },
3606 .block_erase = spi_block_erase_d8,
3607 }, {
3608 .eraseblocks = { {8192 * 1024, 1} },
3609 .block_erase = spi_block_erase_60,
3610 }, {
3611 .eraseblocks = { {8192 * 1024, 1} },
3612 .block_erase = spi_block_erase_c7,
3613 }
3614 },
3615 .unlock = spi_disable_blockprotect,
3616 .write = spi_chip_write_256,
3617 .read = spi_chip_read,
3618 .voltage = {1650, 1950},
Marc Jones51c8a162014-05-06 15:02:14 -06003619 .wp = &wp_w25,
Marc Jonesb2f90022014-04-29 17:37:23 -06003620 },
stefanct5d10cff2011-07-24 22:21:57 +00003621
3622 {
3623 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00003624 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00003625 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003626 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003627 .model_id = EON_EN29F002B,
hailfinger286829b2009-01-08 03:40:17 +00003628 .total_size = 256,
3629 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003630 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00003631 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00003632 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003633 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003634 .block_erasers =
3635 {
3636 {
Simon Glass8dc82732013-07-16 10:13:51 -06003637 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003638 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00003639 {8 * 1024, 2},
3640 {32 * 1024, 1},
3641 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00003642 },
3643 .block_erase = erase_sector_jedec,
3644 }, {
3645 .eraseblocks = { {256 * 1024, 1} },
3646 .block_erase = erase_chip_block_jedec,
3647 },
3648 },
hailfingerfff99532009-11-27 17:49:42 +00003649 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003650 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003651 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003652 },
3653
hailfinger286829b2009-01-08 03:40:17 +00003654 {
hailfinger61958912010-07-28 22:20:20 +00003655 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00003656 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003657 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003658 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003659 .model_id = EON_EN29F002T,
hailfinger286829b2009-01-08 03:40:17 +00003660 .total_size = 256,
3661 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003662 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003663 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00003664 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003665 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003666 .block_erasers =
3667 {
3668 {
Simon Glass8dc82732013-07-16 10:13:51 -06003669 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003670 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00003671 {32 * 1024, 1},
3672 {8 * 1024, 2},
3673 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00003674 },
3675 .block_erase = erase_sector_jedec,
3676 }, {
3677 .eraseblocks = { {256 * 1024, 1} },
3678 .block_erase = erase_chip_block_jedec,
3679 },
3680 },
hailfingerfff99532009-11-27 17:49:42 +00003681 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003682 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003683 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003684 },
3685
hailfinger286829b2009-01-08 03:40:17 +00003686 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003687 .vendor = "Eon",
3688 .name = "EN29F010",
3689 .bustype = BUS_PARALLEL,
3690 .manufacture_id = EON_ID,
3691 .model_id = EON_EN29F010,
3692 .total_size = 128,
3693 .page_size = 128,
3694 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
3695 .tested = TEST_OK_PRE,
3696 .probe = probe_jedec,
3697 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3698 .block_erasers =
3699 {
3700 {
3701 .eraseblocks = { {16 * 1024, 8} },
3702 .block_erase = erase_sector_jedec,
3703 },
3704 {
3705 .eraseblocks = { {128 * 1024, 1} },
3706 .block_erase = erase_chip_block_jedec,
3707 },
3708 },
3709 .write = write_jedec_1,
3710 .read = read_memmapped,
3711 .voltage = {4500, 5500},
3712 },
3713
3714 {
hailfinger286829b2009-01-08 03:40:17 +00003715 .vendor = "Fujitsu",
3716 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003717 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003718 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003719 .model_id = FUJITSU_MBM29F004BC,
hailfinger286829b2009-01-08 03:40:17 +00003720 .total_size = 512,
3721 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003722 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00003723 .tested = TEST_UNTESTED,
3724 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003725 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003726 .block_erasers =
3727 {
3728 {
Simon Glass8dc82732013-07-16 10:13:51 -06003729 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003730 {16 * 1024, 1},
3731 {8 * 1024, 2},
3732 {32 * 1024, 1},
3733 {64 * 1024, 7},
3734 },
snelsonc6855342010-01-28 23:55:12 +00003735 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003736 }, {
3737 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003738 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003739 },
3740 },
hailfinger286829b2009-01-08 03:40:17 +00003741 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00003742 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003743 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003744 },
3745
hailfinger286829b2009-01-08 03:40:17 +00003746 {
3747 .vendor = "Fujitsu",
3748 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00003749 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003750 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003751 .model_id = FUJITSU_MBM29F004TC,
hailfinger286829b2009-01-08 03:40:17 +00003752 .total_size = 512,
3753 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003754 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00003755 .tested = TEST_UNTESTED,
3756 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003757 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00003758 .block_erasers =
3759 {
3760 {
Simon Glass8dc82732013-07-16 10:13:51 -06003761 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003762 {64 * 1024, 7},
3763 {32 * 1024, 1},
3764 {8 * 1024, 2},
3765 {16 * 1024, 1},
3766 },
snelsonc6855342010-01-28 23:55:12 +00003767 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003768 }, {
3769 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00003770 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00003771 },
3772 },
hailfinger286829b2009-01-08 03:40:17 +00003773 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00003774 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003775 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003776 },
3777
hailfinger286829b2009-01-08 03:40:17 +00003778 {
snelsonc6855342010-01-28 23:55:12 +00003779 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00003780 .vendor = "Fujitsu",
3781 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00003782 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003783 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003784 .model_id = FUJITSU_MBM29F400BC,
hailfinger286829b2009-01-08 03:40:17 +00003785 .total_size = 512,
3786 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00003787 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00003788 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00003789 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00003790 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelson1c03aa12009-12-23 17:05:59 +00003791 .block_erasers =
3792 {
3793 {
Simon Glass8dc82732013-07-16 10:13:51 -06003794 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00003795 {16 * 1024, 1},
3796 {8 * 1024, 2},
3797 {32 * 1024, 1},
3798 {64 * 1024, 7},
3799 },
3800 .block_erase = block_erase_m29f400bt,
3801 }, {
3802 .eraseblocks = { {512 * 1024, 1} },
3803 .block_erase = block_erase_chip_m29f400bt,
3804 },
3805 },
hailfinger86bf3b52010-10-13 21:49:30 +00003806 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00003807 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00003808 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00003809 },
3810
hailfinger286829b2009-01-08 03:40:17 +00003811 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003812 .vendor = "Fujitsu",
3813 .name = "MBM29F400TC",
3814 .bustype = BUS_PARALLEL,
3815 .manufacture_id = FUJITSU_ID,
3816 .model_id = FUJITSU_MBM29F400TC,
3817 .total_size = 512,
3818 .page_size = 64 * 1024,
3819 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003820 .tested = TEST_UNTESTED,
Alan Greend76dc1f2019-06-26 15:38:19 +10003821 .probe = probe_m29f400bt,
3822 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003823 .block_erasers =
3824 {
3825 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003826 .eraseblocks = {
3827 {64 * 1024, 7},
3828 {32 * 1024, 1},
3829 {8 * 1024, 2},
3830 {16 * 1024, 1},
3831 },
3832 .block_erase = block_erase_m29f400bt,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003833 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003834 .eraseblocks = { {512 * 1024, 1} },
3835 .block_erase = block_erase_chip_m29f400bt,
3836 },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003837 },
Alan Greend76dc1f2019-06-26 15:38:19 +10003838 .write = write_m29f400bt,
3839 .read = read_memmapped,
3840 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003841 },
3842
3843 {
3844 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10003845 .name = "GD25LQ128C/GD25LQ128D",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003846 .bustype = BUS_SPI,
3847 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10003848 .model_id = GIGADEVICE_GD25LQ128CD,
3849 .total_size = 16384,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003850 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08003851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Alan Greend76dc1f2019-06-26 15:38:19 +10003852 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003853 .probe = probe_spi_rdid,
3854 .probe_timing = TIMING_ZERO,
3855 .block_erasers =
3856 {
3857 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003858 .eraseblocks = { {4 * 1024, 4096} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003859 .block_erase = spi_block_erase_20,
3860 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003861 .eraseblocks = { {32 * 1024, 512} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003862 .block_erase = spi_block_erase_52,
3863 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003864 .eraseblocks = { {64 * 1024, 256} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003865 .block_erase = spi_block_erase_d8,
3866 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003867 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003868 .block_erase = spi_block_erase_60,
3869 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10003870 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003871 .block_erase = spi_block_erase_c7,
3872 }
3873 },
3874 .unlock = spi_disable_blockprotect,
3875 .write = spi_chip_write_256,
3876 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10003877 .wp = &wp_generic,
3878 },
3879
3880 {
3881 .vendor = "GigaDevice",
3882 .name = "GD25LQ32",
3883 .bustype = BUS_SPI,
3884 .manufacture_id = GIGADEVICE_ID,
3885 .model_id = GIGADEVICE_GD25LQ32,
3886 .total_size = 4096,
3887 .page_size = 256,
3888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3889 .tested = TEST_OK_PREWU,
3890 .probe = probe_spi_rdid,
3891 .probe_timing = TIMING_ZERO,
3892 .block_erasers =
3893 {
3894 {
3895 .eraseblocks = { {4 * 1024, 1024} },
3896 .block_erase = spi_block_erase_20,
3897 }, {
3898 .eraseblocks = { {32 * 1024, 128} },
3899 .block_erase = spi_block_erase_52,
3900 }, {
3901 .eraseblocks = { {64 * 1024, 64} },
3902 .block_erase = spi_block_erase_d8,
3903 }, {
3904 .eraseblocks = { {4 * 1024 * 1024, 1} },
3905 .block_erase = spi_block_erase_60,
3906 }, {
3907 .eraseblocks = { {4 * 1024 * 1024, 1} },
3908 .block_erase = spi_block_erase_c7,
3909 }
3910 },
3911 .unlock = spi_disable_blockprotect,
3912 .write = spi_chip_write_256,
3913 .read = spi_chip_read,
3914 .voltage = {1700, 1950},
3915 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003916 },
3917
3918 {
3919 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07003920 .name = "GD25LQ40",
3921 .bustype = BUS_SPI,
3922 .manufacture_id = GIGADEVICE_ID,
3923 .model_id = GIGADEVICE_GD25LQ40,
3924 .total_size = 512,
3925 .page_size = 256,
3926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
3927 .tested = TEST_UNTESTED,
3928 .probe = probe_spi_rdid,
3929 .probe_timing = TIMING_ZERO,
3930 .block_erasers =
3931 {
3932 {
3933 .eraseblocks = { {4 * 1024, 128} },
3934 .block_erase = spi_block_erase_20,
3935 }, {
3936 .eraseblocks = { {32 * 1024, 16} },
3937 .block_erase = spi_block_erase_52,
3938 }, {
3939 .eraseblocks = { {64 * 1024, 8} },
3940 .block_erase = spi_block_erase_d8,
3941 }, {
3942 .eraseblocks = { {512 * 1024, 1} },
3943 .block_erase = spi_block_erase_60,
3944 }, {
3945 .eraseblocks = { {512 * 1024, 1} },
3946 .block_erase = spi_block_erase_c7,
3947 }
3948 },
3949 .unlock = spi_disable_blockprotect,
3950 .write = spi_chip_write_256,
3951 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10003952 .voltage = {1650, 1950},
David Schneider59543cd2016-04-27 02:11:00 -07003953 },
3954
3955 {
3956 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10003957 .name = "GD25LQ64",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003958 .bustype = BUS_SPI,
3959 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10003960 .model_id = GIGADEVICE_GD25LQ64,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003961 .total_size = 8192,
3962 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003963 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003964 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08003965 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003966 .probe = probe_spi_rdid,
3967 .probe_timing = TIMING_ZERO,
3968 .block_erasers =
3969 {
3970 {
3971 .eraseblocks = { {4 * 1024, 2048} },
3972 .block_erase = spi_block_erase_20,
3973 }, {
3974 .eraseblocks = { {32 * 1024, 256} },
3975 .block_erase = spi_block_erase_52,
3976 }, {
3977 .eraseblocks = { {64 * 1024, 128} },
3978 .block_erase = spi_block_erase_d8,
3979 }, {
3980 .eraseblocks = { {8 * 1024 * 1024, 1} },
3981 .block_erase = spi_block_erase_60,
3982 }, {
3983 .eraseblocks = { {8 * 1024 * 1024, 1} },
3984 .block_erase = spi_block_erase_c7,
3985 }
3986 },
3987 .unlock = spi_disable_blockprotect,
3988 .write = spi_chip_write_256,
3989 .read = spi_chip_read,
3990 .wp = &wp_w25,
3991 },
3992
3993 {
David Hendricksf5c122d2016-03-14 15:46:04 -07003994 /*
Stefan Tauner9816fc82016-08-12 15:47:49 -07003995 * TODO: There is a GD25Q128B without QPI support which can
3996 * be differentiated using SFDP, but for now we only care
3997 * about the GD25Q128C.
David Hendricksf5c122d2016-03-14 15:46:04 -07003998 */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07003999 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06004000 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004001 .bustype = BUS_SPI,
4002 .manufacture_id = GIGADEVICE_ID,
4003 .model_id = GIGADEVICE_GD25Q128,
4004 .total_size = 16384,
4005 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004006 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07004007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksf5c122d2016-03-14 15:46:04 -07004008 .tested = TEST_OK_PREWU,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004009 .probe = probe_spi_rdid,
4010 .probe_timing = TIMING_ZERO,
4011 .block_erasers =
4012 {
4013 {
4014 .eraseblocks = { {4 * 1024, 4096} },
4015 .block_erase = spi_block_erase_20,
4016 }, {
4017 .eraseblocks = { {32 * 1024, 512} },
4018 .block_erase = spi_block_erase_52,
4019 }, {
4020 .eraseblocks = { {64 * 1024, 256} },
4021 .block_erase = spi_block_erase_d8,
4022 }, {
4023 .eraseblocks = { {16 * 1024 * 1024, 1} },
4024 .block_erase = spi_block_erase_60,
4025 }, {
4026 .eraseblocks = { {16 * 1024 * 1024, 1} },
4027 .block_erase = spi_block_erase_c7,
4028 }
4029 },
4030 .unlock = spi_disable_blockprotect,
4031 .write = spi_chip_write_256,
4032 .read = spi_chip_read,
Martin Roth95785bd2017-05-09 23:47:20 -06004033 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07004034 },
4035
4036 {
Duncan Laurie0c383552019-03-16 12:35:16 -07004037 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10004038 .name = "GD25Q16",
4039 .bustype = BUS_SPI,
4040 .manufacture_id = GIGADEVICE_ID,
4041 .model_id = GIGADEVICE_GD25Q16,
4042 .total_size = 2048,
4043 .page_size = 256,
4044 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4045 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
4046 .tested = TEST_UNTESTED,
4047 .probe = probe_spi_rdid,
4048 .probe_timing = TIMING_ZERO,
4049 .block_erasers =
4050 {
4051 {
4052 .eraseblocks = { {4 * 1024, 512} },
4053 .block_erase = spi_block_erase_20,
4054 }, {
4055 .eraseblocks = { {32 * 1024, 64} },
4056 .block_erase = spi_block_erase_52,
4057 }, {
4058 .eraseblocks = { {64 * 1024, 32} },
4059 .block_erase = spi_block_erase_d8,
4060 }, {
4061 .eraseblocks = { {2 * 1024 * 1024, 1} },
4062 .block_erase = spi_block_erase_60,
4063 }, {
4064 .eraseblocks = { {2 * 1024 * 1024, 1} },
4065 .block_erase = spi_block_erase_c7,
4066 }
4067 },
4068 .unlock = spi_disable_blockprotect,
4069 .write = spi_chip_write_256,
4070 .read = spi_chip_read,
4071 .voltage = {2700, 3600},
4072 },
4073
4074 {
4075 .vendor = "GigaDevice",
4076 .name = "GD25Q20",
4077 .bustype = BUS_SPI,
4078 .manufacture_id = GIGADEVICE_ID,
4079 .model_id = GIGADEVICE_GD25Q20,
4080 .total_size = 256,
4081 .page_size = 256,
4082 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4083 .tested = TEST_UNTESTED,
4084 .probe = probe_spi_rdid,
4085 .probe_timing = TIMING_ZERO,
4086 .block_erasers =
4087 {
4088 {
4089 .eraseblocks = { {4 * 1024, 64} },
4090 .block_erase = spi_block_erase_20,
4091 }, {
4092 .eraseblocks = { {32 * 1024, 8} },
4093 .block_erase = spi_block_erase_52,
4094 }, {
4095 .eraseblocks = { {64 * 1024, 4} },
4096 .block_erase = spi_block_erase_d8,
4097 }, {
4098 .eraseblocks = { {256 * 1024, 1} },
4099 .block_erase = spi_block_erase_60,
4100 }, {
4101 .eraseblocks = { {256 * 1024, 1} },
4102 .block_erase = spi_block_erase_c7,
4103 }
4104 },
4105 .unlock = spi_disable_blockprotect,
4106 .write = spi_chip_write_256,
4107 .read = spi_chip_read,
4108 .voltage = {2700, 3600},
4109 },
4110
4111 {
4112 .vendor = "GigaDevice",
Duncan Laurie0c383552019-03-16 12:35:16 -07004113 .name = "GD25Q256D",
4114 .bustype = BUS_SPI,
4115 .manufacture_id = GIGADEVICE_ID,
4116 .model_id = GIGADEVICE_GD25Q256D,
4117 .total_size = 32768,
4118 .page_size = 256,
Edward O'Callaghan3d0cbd42019-06-24 15:37:01 +10004119 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_WREN,
Duncan Laurie0c383552019-03-16 12:35:16 -07004120 .tested = TEST_OK_PREWU,
4121 .probe = probe_spi_rdid,
4122 .probe_timing = TIMING_ZERO,
4123 .block_erasers =
4124 {
4125 {
4126 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004127 .block_erase = spi_block_erase_20,
Duncan Laurie0c383552019-03-16 12:35:16 -07004128 }, {
4129 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004130 .block_erase = spi_block_erase_52,
Duncan Laurie0c383552019-03-16 12:35:16 -07004131 }, {
4132 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004133 .block_erase = spi_block_erase_d8,
Duncan Laurie0c383552019-03-16 12:35:16 -07004134 }, {
4135 .eraseblocks = { {32 * 1024 * 1024, 1} },
4136 .block_erase = spi_block_erase_60,
4137 }, {
4138 .eraseblocks = { {32 * 1024 * 1024, 1} },
4139 .block_erase = spi_block_erase_c7,
4140 }
4141 },
4142 .unlock = spi_disable_blockprotect,
4143 .write = spi_chip_write_256,
4144 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10004145 .set_4ba = spi_enter_4ba_b7_we,
Duncan Laurie0c383552019-03-16 12:35:16 -07004146 .voltage = {2700, 3600},
4147 .wp = &wp_w25q_large,
4148 },
4149
4150 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07004151 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10004152 .name = "GD25Q32",
Bryan Freed9a0051f2012-05-22 16:06:09 -07004153 .bustype = BUS_SPI,
4154 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004155 .model_id = GIGADEVICE_GD25Q32,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004156 .total_size = 4096,
4157 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004158 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08004160 .tested = TEST_OK_PREWU,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004161 .probe = probe_spi_rdid,
4162 .probe_timing = TIMING_ZERO,
4163 .block_erasers =
4164 {
4165 {
4166 .eraseblocks = { {4 * 1024, 1024} },
4167 .block_erase = spi_block_erase_20,
4168 }, {
4169 .eraseblocks = { {32 * 1024, 128} },
4170 .block_erase = spi_block_erase_52,
4171 }, {
4172 .eraseblocks = { {64 * 1024, 64} },
4173 .block_erase = spi_block_erase_d8,
4174 }, {
4175 .eraseblocks = { {4 * 1024 * 1024, 1} },
4176 .block_erase = spi_block_erase_60,
4177 }, {
4178 .eraseblocks = { {4 * 1024 * 1024, 1} },
4179 .block_erase = spi_block_erase_c7,
4180 }
4181 },
4182 .unlock = spi_disable_blockprotect,
4183 .write = spi_chip_write_256,
4184 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10004185 .voltage = {2700, 3600},
4186 .wp = &wp_generic,
Bryan Freed9a0051f2012-05-22 16:06:09 -07004187 },
4188
4189 {
Alan Green753a38e2019-06-07 14:44:32 +10004190 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10004191 .name = "GD25Q40",
Alan Green753a38e2019-06-07 14:44:32 +10004192 .bustype = BUS_SPI,
4193 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004194 .model_id = GIGADEVICE_GD25Q40,
4195 .total_size = 512,
4196 .page_size = 256,
4197 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4198 .tested = TEST_UNTESTED,
4199 .probe = probe_spi_rdid,
4200 .probe_timing = TIMING_ZERO,
4201 .block_erasers =
4202 {
4203 {
4204 .eraseblocks = { {4 * 1024, 128} },
4205 .block_erase = spi_block_erase_20,
4206 }, {
4207 .eraseblocks = { {32 * 1024, 16} },
4208 .block_erase = spi_block_erase_52,
4209 }, {
4210 .eraseblocks = { {64 * 1024, 8} },
4211 .block_erase = spi_block_erase_d8,
4212 }, {
4213 .eraseblocks = { {512 * 1024, 1} },
4214 .block_erase = spi_block_erase_60,
4215 }, {
4216 .eraseblocks = { {512 * 1024, 1} },
4217 .block_erase = spi_block_erase_c7,
4218 }
4219 },
4220 .unlock = spi_disable_blockprotect,
4221 .write = spi_chip_write_256,
4222 .read = spi_chip_read,
4223 .voltage = {2700, 3600},
4224 },
4225
4226 {
4227 .vendor = "GigaDevice",
4228 .name = "GD25Q64",
4229 .bustype = BUS_SPI,
4230 .manufacture_id = GIGADEVICE_ID,
4231 .model_id = GIGADEVICE_GD25Q64,
Alan Green753a38e2019-06-07 14:44:32 +10004232 .total_size = 8192,
4233 .page_size = 256,
4234 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4235 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
4236 .tested = TEST_OK_PREWU,
4237 .probe = probe_spi_rdid,
4238 .probe_timing = TIMING_ZERO,
4239 .block_erasers =
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004240 {
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004241 {
Alan Green753a38e2019-06-07 14:44:32 +10004242 .eraseblocks = { {4 * 1024, 2048} },
4243 .block_erase = spi_block_erase_20,
4244 }, {
4245 .eraseblocks = { {32 * 1024, 256} },
4246 .block_erase = spi_block_erase_52,
4247 }, {
4248 .eraseblocks = { {64 * 1024, 128} },
4249 .block_erase = spi_block_erase_d8,
4250 }, {
4251 .eraseblocks = { {8 * 1024 * 1024, 1} },
4252 .block_erase = spi_block_erase_60,
4253 }, {
4254 .eraseblocks = { {8 * 1024 * 1024, 1} },
4255 .block_erase = spi_block_erase_c7,
4256 }
Furquan Shaikh62cd8102016-07-17 23:04:06 -07004257 },
Alan Green753a38e2019-06-07 14:44:32 +10004258 .unlock = spi_disable_blockprotect,
4259 .write = spi_chip_write_256,
4260 .read = spi_chip_read,
4261 .wp = &wp_w25,
4262 },
4263
4264 {
4265 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10004266 .name = "GD25Q80",
Alan Green753a38e2019-06-07 14:44:32 +10004267 .bustype = BUS_SPI,
4268 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004269 .model_id = GIGADEVICE_GD25Q80,
4270 .total_size = 1024,
Alan Green753a38e2019-06-07 14:44:32 +10004271 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004272 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
4273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Alan Green753a38e2019-06-07 14:44:32 +10004274 .tested = TEST_OK_PREWU,
4275 .probe = probe_spi_rdid,
4276 .probe_timing = TIMING_ZERO,
4277 .block_erasers =
4278 {
4279 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004280 .eraseblocks = { {4 * 1024, 256} },
Alan Green753a38e2019-06-07 14:44:32 +10004281 .block_erase = spi_block_erase_20,
4282 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004283 .eraseblocks = { {32 * 1024, 32} },
Alan Green753a38e2019-06-07 14:44:32 +10004284 .block_erase = spi_block_erase_52,
4285 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004286 .eraseblocks = { {64 * 1024, 16} },
Alan Green753a38e2019-06-07 14:44:32 +10004287 .block_erase = spi_block_erase_d8,
4288 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004289 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10004290 .block_erase = spi_block_erase_60,
4291 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004292 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10004293 .block_erase = spi_block_erase_c7,
4294 }
4295 },
4296 .unlock = spi_disable_blockprotect,
4297 .write = spi_chip_write_256,
4298 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10004299 .voltage = {2700, 3600},
hailfingerc6950ad2010-06-21 16:12:22 +00004300 },
4301
4302 {
4303 .vendor = "Hyundai",
4304 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00004305 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00004306 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00004307 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00004308 .total_size = 256,
4309 .page_size = 256 * 1024,
4310 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4311 .tested = TEST_UNTESTED,
4312 .probe = probe_jedec,
4313 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4314 .block_erasers =
4315 {
4316 {
4317 .eraseblocks = {
4318 {16 * 1024, 1},
4319 {8 * 1024, 2},
4320 {32 * 1024, 1},
4321 {64 * 1024, 3},
4322 },
4323 .block_erase = erase_sector_jedec,
4324 }, {
4325 .eraseblocks = { {256 * 1024, 1} },
4326 .block_erase = erase_chip_block_jedec,
4327 },
4328 },
4329 .write = write_jedec_1,
4330 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004331 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00004332 },
4333
4334 {
mhme8e87912010-09-16 00:51:51 +00004335 .vendor = "Hyundai",
Alan Greend76dc1f2019-06-26 15:38:19 +10004336 .name = "HY29F002T",
4337 .bustype = BUS_PARALLEL,
4338 .manufacture_id = HYUNDAI_ID,
4339 .model_id = HYUNDAI_HY29F002T,
4340 .total_size = 256,
4341 .page_size = 256 * 1024,
4342 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
4343 .tested = TEST_OK_PRE,
4344 .probe = probe_jedec,
4345 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4346 .block_erasers =
4347 {
4348 {
4349 .eraseblocks = {
4350 {64 * 1024, 3},
4351 {32 * 1024, 1},
4352 {8 * 1024, 2},
4353 {16 * 1024, 1},
4354 },
4355 .block_erase = erase_sector_jedec,
4356 }, {
4357 .eraseblocks = { {256 * 1024, 1} },
4358 .block_erase = erase_chip_block_jedec,
4359 },
4360 },
4361 .write = write_jedec_1,
4362 .read = read_memmapped,
4363 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
4364 },
4365
4366 {
4367 .vendor = "Hyundai",
mhme8e87912010-09-16 00:51:51 +00004368 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00004369 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00004370 .manufacture_id = HYUNDAI_ID,
4371 .model_id = HYUNDAI_HY29F040A,
4372 .total_size = 512,
4373 .page_size = 64 * 1024,
4374 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
4375 .tested = TEST_UNTESTED,
4376 .probe = probe_jedec,
4377 .probe_timing = TIMING_ZERO,
4378 .block_erasers =
4379 {
4380 {
4381 .eraseblocks = { {64 * 1024, 8} },
4382 .block_erase = erase_sector_jedec,
4383 }, {
4384 .eraseblocks = { {512 * 1024, 1} },
4385 .block_erase = erase_chip_block_jedec,
4386 },
4387 },
4388 .write = write_jedec_1,
4389 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00004390 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00004391 },
4392
4393 {
hailfinger286829b2009-01-08 03:40:17 +00004394 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004395 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004396 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004397 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004398 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00004399 .total_size = 128,
4400 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00004401 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00004402 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004403 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004404 .block_erasers =
4405 {
4406 {
Simon Glass8dc82732013-07-16 10:13:51 -06004407 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004408 {8 * 1024, 1},
4409 {4 * 1024, 2},
4410 {112 * 1024, 1},
4411 },
snelsonc0acbeb2010-03-19 18:47:06 +00004412 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004413 },
4414 },
snelsona013bf62010-03-22 04:39:31 +00004415 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004416 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004417 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004418 },
4419
4420 {
4421 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004422 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004423 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00004424 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004425 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00004426 .total_size = 128,
4427 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
stefanctd6efe1a2011-09-03 11:22:27 +00004428 .tested = TEST_OK_PR,
hailfingerd4d97b92009-05-29 12:55:31 +00004429 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00004430 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00004431 .block_erasers =
4432 {
4433 {
stefanctd6efe1a2011-09-03 11:22:27 +00004434 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00004435 {112 * 1024, 1},
4436 {4 * 1024, 2},
4437 {8 * 1024, 1},
4438 },
snelsonc0acbeb2010-03-19 18:47:06 +00004439 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004440 },
4441 },
snelsona013bf62010-03-22 04:39:31 +00004442 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00004443 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004444 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00004445 },
4446
4447 {
4448 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004449 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004450 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00004451 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004452 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00004453 .total_size = 256,
4454 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00004455 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00004456 .probe = probe_82802ab,
4457 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4458 .block_erasers =
4459 {
4460 {
4461 .eraseblocks = {
4462 {128 * 1024, 1},
4463 {96 * 1024, 1},
4464 {8 * 1024, 2},
4465 {16 * 1024, 1},
4466 },
4467 .block_erase = erase_block_82802ab,
4468 },
4469 },
4470 .write = write_82802ab,
4471 .read = read_memmapped,
4472 },
4473
4474 {
4475 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004476 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004477 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004478 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004479 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004480 .total_size = 512,
4481 .page_size = 128 * 1024, /* maximal block size */
4482 .tested = TEST_UNTESTED,
4483 .probe = probe_82802ab,
4484 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4485 .block_erasers =
4486 {
4487 {
Simon Glass8dc82732013-07-16 10:13:51 -06004488 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004489 {16 * 1024, 1},
4490 {8 * 1024, 2},
4491 {96 * 1024, 1},
4492 {128 * 1024, 3},
4493 },
4494 .block_erase = erase_block_82802ab,
4495 },
4496 },
4497 .write = write_82802ab,
4498 .read = read_memmapped,
4499 },
4500
4501 {
4502 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004503 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004504 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004505 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004506 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004507 .total_size = 512,
4508 .page_size = 128 * 1024, /* maximal block size */
4509 .tested = TEST_UNTESTED,
4510 .probe = probe_82802ab,
4511 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4512 .block_erasers =
4513 {
4514 {
Simon Glass8dc82732013-07-16 10:13:51 -06004515 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004516 {128 * 1024, 3},
4517 {96 * 1024, 1},
4518 {8 * 1024, 2},
4519 {16 * 1024, 1},
4520 },
4521 .block_erase = erase_block_82802ab,
4522 },
4523 },
4524 .write = write_82802ab,
4525 .read = read_memmapped,
4526 },
4527
4528 {
4529 .vendor = "Intel",
Alan Greend76dc1f2019-06-26 15:38:19 +10004530 .name = "28F008S3/S5/SC",
4531 .bustype = BUS_PARALLEL,
4532 .manufacture_id = INTEL_ID,
4533 .model_id = INTEL_28F004S3,
4534 .total_size = 512,
4535 .page_size = 256,
4536 .tested = TEST_UNTESTED,
4537 .probe = probe_82802ab,
4538 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4539 .block_erasers =
4540 {
4541 {
4542 .eraseblocks = { {64 * 1024, 8} },
4543 .block_erase = erase_block_82802ab,
4544 },
4545 },
4546 .unlock = unlock_28f004s5,
4547 .write = write_82802ab,
4548 .read = read_memmapped,
4549 },
4550
4551 {
4552 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004553 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00004554 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004555 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004556 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00004557 .total_size = 512,
4558 .page_size = 128 * 1024, /* maximal block size */
4559 .feature_bits = FEATURE_ADDR_SHIFTED,
4560 .tested = TEST_UNTESTED,
4561 .probe = probe_82802ab,
4562 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4563 .block_erasers =
4564 {
4565 {
Simon Glass8dc82732013-07-16 10:13:51 -06004566 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004567 {16 * 1024, 1},
4568 {8 * 1024, 2},
4569 {96 * 1024, 1},
4570 {128 * 1024, 3},
4571 },
4572 .block_erase = erase_block_82802ab,
4573 },
4574 },
4575 .write = write_82802ab,
4576 .read = read_memmapped,
4577 },
4578
4579 {
4580 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00004581 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00004582 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00004583 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004584 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00004585 .total_size = 512,
4586 .page_size = 128 * 1024, /* maximal block size */
4587 .feature_bits = FEATURE_ADDR_SHIFTED,
4588 .tested = TEST_UNTESTED,
4589 .probe = probe_82802ab,
4590 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
4591 .block_erasers =
4592 {
4593 {
Simon Glass8dc82732013-07-16 10:13:51 -06004594 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00004595 {128 * 1024, 3},
4596 {96 * 1024, 1},
4597 {8 * 1024, 2},
4598 {16 * 1024, 1},
4599 },
4600 .block_erase = erase_block_82802ab,
4601 },
4602 },
4603 .write = write_82802ab,
4604 .read = read_memmapped,
4605 },
4606
4607 {
4608 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00004609 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00004610 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004611 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004612 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00004613 .total_size = 512,
4614 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004615 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00004616 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00004617 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004618 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004619 .block_erasers =
4620 {
4621 {
4622 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00004623 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004624 },
4625 },
snelsonc0acbeb2010-03-19 18:47:06 +00004626 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004627 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004628 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004629 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004630 },
4631
hailfinger286829b2009-01-08 03:40:17 +00004632 {
4633 .vendor = "Intel",
4634 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00004635 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00004636 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00004637 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00004638 .total_size = 1024,
4639 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00004640 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00004641 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00004642 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00004643 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00004644 .block_erasers =
4645 {
4646 {
4647 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00004648 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00004649 },
4650 },
snelsonc0acbeb2010-03-19 18:47:06 +00004651 .unlock = unlock_82802ab,
hailfinger286829b2009-01-08 03:40:17 +00004652 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00004653 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00004654 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004655 },
4656
hailfinger286829b2009-01-08 03:40:17 +00004657 {
4658 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08004659 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00004660 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004661 .manufacture_id = MACRONIX_ID,
4662 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00004663 .total_size = 128,
4664 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08004665 /* MX25L1006E supports SFDP */
David Hendricks488cf072015-11-23 16:45:07 -08004666 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4667 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004668 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004669 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00004670 .block_erasers =
4671 {
4672 {
4673 .eraseblocks = { {4 * 1024, 32} },
4674 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00004675 }, {
hailfinger7df21362009-09-05 02:30:58 +00004676 .eraseblocks = { {64 * 1024, 2} },
4677 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00004678 }, {
hailfinger7df21362009-09-05 02:30:58 +00004679 .eraseblocks = { {128 * 1024, 1} },
4680 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00004681 }, {
hailfinger7df21362009-09-05 02:30:58 +00004682 .eraseblocks = { {128 * 1024, 1} },
4683 .block_erase = spi_block_erase_c7,
4684 },
4685 },
hailfingerb9560ee2010-07-14 20:21:22 +00004686 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004687 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08004688 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00004689 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004690 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004691 },
4692
hailfinger286829b2009-01-08 03:40:17 +00004693 {
4694 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10004695 .name = "MX25L12805",
hailfingere1e41ea2011-07-27 07:13:06 +00004696 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004697 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004698 .model_id = MACRONIX_MX25L12805,
4699 .total_size = 16384,
hailfinger286829b2009-01-08 03:40:17 +00004700 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004701 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00004702 .tested = TEST_UNTESTED,
4703 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004704 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00004705 .block_erasers =
4706 {
4707 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004708 .eraseblocks = { {4 * 1024, 4096} },
hailfinger91cf1032009-10-01 13:15:01 +00004709 .block_erase = spi_block_erase_20,
4710 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004711 .eraseblocks = { {64 * 1024, 256} },
hailfinger91cf1032009-10-01 13:15:01 +00004712 .block_erase = spi_block_erase_d8,
4713 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004714 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00004715 .block_erase = spi_block_erase_60,
4716 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004717 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00004718 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10004719 }
hailfinger91cf1032009-10-01 13:15:01 +00004720 },
hailfingerb9560ee2010-07-14 20:21:22 +00004721 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004722 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00004723 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004724 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00004725 },
4726
hailfinger286829b2009-01-08 03:40:17 +00004727 {
4728 .vendor = "Macronix",
4729 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00004730 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004731 .manufacture_id = MACRONIX_ID,
4732 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00004733 .total_size = 2048,
4734 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004735 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4736 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004737 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004738 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00004739 .block_erasers =
4740 {
4741 {
4742 .eraseblocks = { {4 * 1024, 512} },
4743 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
4744 }, {
4745 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
4746 .block_erase = spi_block_erase_52,
4747 }, {
4748 .eraseblocks = { {64 * 1024, 32} },
4749 .block_erase = spi_block_erase_d8,
4750 }, {
4751 .eraseblocks = { {2 * 1024 * 1024, 1} },
4752 .block_erase = spi_block_erase_60,
4753 }, {
4754 .eraseblocks = { {2 * 1024 * 1024, 1} },
4755 .block_erase = spi_block_erase_c7,
4756 },
4757 },
hailfingerb9560ee2010-07-14 20:21:22 +00004758 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004759 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00004760 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004761 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004762 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004763 },
4764
hailfinger286829b2009-01-08 03:40:17 +00004765 {
4766 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00004767 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00004768 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004769 .manufacture_id = MACRONIX_ID,
4770 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00004771 .total_size = 2048,
4772 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004773 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfinger0a2fef02009-04-19 23:04:00 +00004774 .tested = TEST_UNTESTED,
4775 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004776 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004777 .block_erasers =
4778 {
4779 {
4780 .eraseblocks = { {4 * 1024, 512} },
4781 .block_erase = spi_block_erase_20,
4782 }, {
4783 .eraseblocks = { {64 * 1024, 32} },
4784 .block_erase = spi_block_erase_d8,
4785 }, {
4786 .eraseblocks = { {2 * 1024 * 1024, 1} },
4787 .block_erase = spi_block_erase_60,
4788 }, {
4789 .eraseblocks = { {2 * 1024 * 1024, 1} },
4790 .block_erase = spi_block_erase_c7,
4791 }
4792 },
hailfingerb9560ee2010-07-14 20:21:22 +00004793 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004794 .write = spi_chip_write_256,
hailfinger0a2fef02009-04-19 23:04:00 +00004795 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004796 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00004797 },
hailfingerf1255892009-04-20 22:54:13 +00004798
hailfinger0a2fef02009-04-19 23:04:00 +00004799 {
4800 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00004801 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00004802 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004803 .manufacture_id = MACRONIX_ID,
4804 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00004805 .total_size = 2048,
4806 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004807 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
uwef926ca22010-09-13 19:59:28 +00004808 .tested = TEST_UNTESTED,
4809 .probe = probe_spi_rdid,
4810 .probe_timing = TIMING_ZERO,
4811 .block_erasers =
4812 {
4813 {
4814 .eraseblocks = { {4 * 1024, 512} },
4815 .block_erase = spi_block_erase_20,
4816 }, {
4817 .eraseblocks = { {64 * 1024, 32} },
4818 .block_erase = spi_block_erase_d8,
4819 }, {
4820 .eraseblocks = { {2 * 1024 * 1024, 1} },
4821 .block_erase = spi_block_erase_60,
4822 }, {
4823 .eraseblocks = { {2 * 1024 * 1024, 1} },
4824 .block_erase = spi_block_erase_c7,
4825 }
4826 },
4827 .unlock = spi_disable_blockprotect,
4828 .write = spi_chip_write_256,
4829 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00004830 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00004831 },
4832
4833 {
4834 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10004835 .name = "MX25L2005(C)",
4836 .bustype = BUS_SPI,
4837 .manufacture_id = MACRONIX_ID,
4838 .model_id = MACRONIX_MX25L2005,
4839 .total_size = 256,
4840 .page_size = 256,
4841 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4842 .tested = TEST_UNTESTED,
4843 .probe = probe_spi_rdid,
4844 .probe_timing = TIMING_ZERO,
4845 .block_erasers =
4846 {
4847 {
4848 .eraseblocks = { {4 * 1024, 64} },
4849 .block_erase = spi_block_erase_20,
4850 }, {
4851 .eraseblocks = { {64 * 1024, 4} },
4852 .block_erase = spi_block_erase_52,
4853 }, {
4854 .eraseblocks = { {64 * 1024, 4} },
4855 .block_erase = spi_block_erase_d8,
4856 }, {
4857 .eraseblocks = { {256 * 1024, 1} },
4858 .block_erase = spi_block_erase_60,
4859 }, {
4860 .eraseblocks = { {256 * 1024, 1} },
4861 .block_erase = spi_block_erase_c7,
4862 },
4863 },
4864 .unlock = spi_disable_blockprotect,
4865 .write = spi_chip_write_256,
4866 .read = spi_chip_read, /* Fast read (0x0B) supported */
4867 .voltage = {2700, 3600},
4868 .wp = &wp_w25,
4869 },
4870
4871 {
4872 .vendor = "Macronix",
4873 .name = "MX25L25635F/MX25L25645G",
4874 .bustype = BUS_SPI,
4875 .manufacture_id = MACRONIX_ID,
4876 .model_id = MACRONIX_MX25L25635F,
4877 .total_size = 32768,
4878 .page_size = 256,
4879 .feature_bits =
4880 FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_4BA_WREN,
4881 .tested = TEST_UNTESTED,
4882 .probe = probe_spi_rdid,
4883 .probe_timing = TIMING_ZERO,
4884 .block_erasers =
4885 {
4886 {
4887 .eraseblocks = { {4 * 1024, 8192} },
4888 .block_erase = spi_block_erase_21,
4889 }, {
4890 .eraseblocks = { {32 * 1024, 1024} },
4891 .block_erase = spi_block_erase_5c,
4892 }, {
4893 .eraseblocks = { {64 * 1024, 512} },
4894 .block_erase = spi_block_erase_dc,
4895 }, {
4896 .eraseblocks = { {32768 * 1024, 1} },
4897 .block_erase = spi_block_erase_60,
4898 }, {
4899 .eraseblocks = { {32768 * 1024, 1} },
4900 .block_erase = spi_block_erase_c7,
4901 },
4902 },
4903 .unlock = spi_disable_blockprotect,
4904 .write = spi_chip_write_256,
4905 .read = spi_chip_read,
4906 .set_4ba = spi_enter_4ba_b7,
4907 .voltage = {2700, 3600},
4908 .wp = &wp_generic,
4909 },
4910
4911 {
4912 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00004913 .name = "MX25L3205",
hailfingere1e41ea2011-07-27 07:13:06 +00004914 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004915 .manufacture_id = MACRONIX_ID,
4916 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00004917 .total_size = 4096,
4918 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004919 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
4920 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00004921 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004922 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00004923 .block_erasers =
4924 {
4925 {
4926 .eraseblocks = { {4 * 1024, 1024} },
4927 .block_erase = spi_block_erase_20,
4928 }, {
4929 .eraseblocks = { {4 * 1024, 1024} },
4930 .block_erase = spi_block_erase_d8,
4931 }, {
4932 .eraseblocks = { {4 * 1024 * 1024, 1} },
4933 .block_erase = spi_block_erase_60,
4934 }, {
4935 .eraseblocks = { {4 * 1024 * 1024, 1} },
4936 .block_erase = spi_block_erase_c7,
4937 },
4938 },
hailfingerb9560ee2010-07-14 20:21:22 +00004939 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004940 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00004941 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004942 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08004943 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00004944 },
4945
hailfinger286829b2009-01-08 03:40:17 +00004946 {
4947 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00004948 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00004949 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00004950 .manufacture_id = MACRONIX_ID,
4951 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00004952 .total_size = 4096,
4953 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004954 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuge38d77d22009-04-23 22:51:56 +00004955 .tested = TEST_UNTESTED,
4956 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00004957 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004958 .block_erasers =
4959 {
4960 {
4961 .eraseblocks = { {4 * 1024, 1024} },
4962 .block_erase = spi_block_erase_20,
4963 }, {
4964 .eraseblocks = { {64 * 1024, 64} },
4965 .block_erase = spi_block_erase_d8,
4966 }, {
4967 .eraseblocks = { {4 * 1024 * 1024, 1} },
4968 .block_erase = spi_block_erase_60,
4969 }, {
4970 .eraseblocks = { {4 * 1024 * 1024, 1} },
4971 .block_erase = spi_block_erase_c7,
4972 }
4973 },
hailfingerb9560ee2010-07-14 20:21:22 +00004974 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00004975 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00004976 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004977 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00004978 },
4979
Vincent Palatin87e092a2013-02-28 15:46:14 -08004980 {
4981 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10004982 .name = "MX25L4005(A/C)",
Vincent Palatin87e092a2013-02-28 15:46:14 -08004983 .bustype = BUS_SPI,
4984 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10004985 .model_id = MACRONIX_MX25L4005,
4986 .total_size = 512,
Vincent Palatin87e092a2013-02-28 15:46:14 -08004987 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08004988 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Alan Greend76dc1f2019-06-26 15:38:19 +10004989 .tested = TEST_OK_PREWU,
4990 .probe = probe_spi_rdid,
4991 .probe_timing = TIMING_ZERO,
4992 .block_erasers =
4993 {
4994 {
4995 .eraseblocks = { {4 * 1024, 128} },
4996 .block_erase = spi_block_erase_20,
4997 }, {
4998 .eraseblocks = { {64 * 1024, 8} },
4999 .block_erase = spi_block_erase_52,
5000 }, {
5001 .eraseblocks = { {64 * 1024, 8} },
5002 .block_erase = spi_block_erase_d8,
5003 }, {
5004 .eraseblocks = { {512 * 1024, 1} },
5005 .block_erase = spi_block_erase_60,
5006 }, {
5007 .eraseblocks = { {512 * 1024, 1} },
5008 .block_erase = spi_block_erase_c7,
5009 },
5010 },
5011 .unlock = spi_disable_blockprotect,
5012 .write = spi_chip_write_256,
5013 .read = spi_chip_read, /* Fast read (0x0B) supported */
5014 .voltage = {2700, 3600},
5015 .wp = &wp_w25,
5016 },
5017
5018 {
5019 .vendor = "Macronix",
5020 .name = "MX25L512(E)/MX25V512(C)",
5021 .bustype = BUS_SPI,
5022 .manufacture_id = MACRONIX_ID,
5023 .model_id = MACRONIX_MX25L512,
5024 .total_size = 64,
5025 .page_size = 256,
5026 /* MX25L512E supports SFDP */
5027 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
Vincent Palatin87e092a2013-02-28 15:46:14 -08005028 .tested = TEST_UNTESTED,
5029 .probe = probe_spi_rdid,
5030 .probe_timing = TIMING_ZERO,
5031 .block_erasers =
5032 {
5033 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005034 .eraseblocks = { {4 * 1024, 16} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005035 .block_erase = spi_block_erase_20,
5036 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005037 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005038 .block_erase = spi_block_erase_52,
5039 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005040 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005041 .block_erase = spi_block_erase_d8,
5042 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005043 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005044 .block_erase = spi_block_erase_60,
5045 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005046 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005047 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10005048 },
Vincent Palatin87e092a2013-02-28 15:46:14 -08005049 },
5050 .unlock = spi_disable_blockprotect,
5051 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10005052 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
5053 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
Vincent Palatin87e092a2013-02-28 15:46:14 -08005054 },
5055
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005056 {
5057 /* FIXME: This is an evil twin of the MX25L6405, with the same
5058 * ID bytes but different block erase capabilities */
5059 .vendor = "Macronix",
5060 .name = "MX25L6406E",
hailfingere1e41ea2011-07-27 07:13:06 +00005061 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005062 .manufacture_id = MACRONIX_ID,
5063 .model_id = MACRONIX_MX25L6405,
5064 .total_size = 8192,
5065 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005066 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5067 .tested = TEST_OK_PREWU,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005068 .probe = probe_spi_rdid,
5069 .probe_timing = TIMING_ZERO,
5070 .block_erasers =
5071 {
5072 {
5073 .eraseblocks = { {4 * 1024, 2048} },
5074 .block_erase = spi_block_erase_20,
5075 }, {
5076 .eraseblocks = { {64 * 1024, 128} },
5077 .block_erase = spi_block_erase_d8,
5078 }, {
5079 .eraseblocks = { {64 * 1024, 128} },
5080 .block_erase = spi_block_erase_52,
5081 }, {
5082 .eraseblocks = { {8 * 1024 * 1024, 1} },
5083 .block_erase = spi_block_erase_60,
5084 }, {
5085 .eraseblocks = { {8 * 1024 * 1024, 1} },
5086 .block_erase = spi_block_erase_c7,
5087 }
5088 },
5089 .unlock = spi_disable_blockprotect,
5090 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08005091 .read = spi_chip_read, /* Fast read (0x0B) supported */
5092 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
David Hendricks83541d32014-07-15 20:58:21 -07005093 .wp = &wp_generic,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07005094 },
stepanaa1b6a22008-12-08 18:15:10 +00005095
hailfinger286829b2009-01-08 03:40:17 +00005096 {
5097 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08005098 .name = "MX25L6495F",
5099 .bustype = BUS_SPI,
5100 .manufacture_id = MACRONIX_ID,
5101 .model_id = MACRONIX_MX25L6495F,
5102 .total_size = 8192,
5103 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5105 .tested = TEST_OK_PREWU,
David Hendricksc3496092014-11-13 17:20:55 -08005106 .probe = probe_spi_rdid,
5107 .probe_timing = TIMING_ZERO,
5108 .block_erasers =
5109 {
5110 {
5111 .eraseblocks = { {4 * 1024, 2048} },
5112 .block_erase = spi_block_erase_20,
5113 }, {
5114 .eraseblocks = { {64 * 1024, 128} },
5115 .block_erase = spi_block_erase_d8,
5116 }, {
5117 .eraseblocks = { {32 * 1024, 256} },
5118 .block_erase = spi_block_erase_52,
5119 }, {
5120 .eraseblocks = { {8 * 1024 * 1024, 1} },
5121 .block_erase = spi_block_erase_60,
5122 }, {
5123 .eraseblocks = { {8 * 1024 * 1024, 1} },
5124 .block_erase = spi_block_erase_c7,
5125 }
5126 },
5127 .unlock = spi_disable_blockprotect,
5128 .write = spi_chip_write_256,
5129 .read = spi_chip_read, /* Fast read (0x0B) supported */
5130 .voltage = {2700, 3600},
5131 .wp = &wp_generic,
5132 },
5133
5134 {
5135 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10005136 .name = "MX25L8005/MX25V8005",
Jongpil66a96492014-08-14 17:59:06 +09005137 .bustype = BUS_SPI,
5138 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005139 .model_id = MACRONIX_MX25L8005,
5140 .total_size = 1024,
Jongpil66a96492014-08-14 17:59:06 +09005141 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5143 .tested = TEST_OK_PREWU,
Jongpil66a96492014-08-14 17:59:06 +09005144 .probe = probe_spi_rdid,
5145 .probe_timing = TIMING_ZERO,
5146 .block_erasers =
5147 {
5148 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005149 .eraseblocks = { {4 * 1024, 256} },
Jongpil66a96492014-08-14 17:59:06 +09005150 .block_erase = spi_block_erase_20,
5151 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005152 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09005153 .block_erase = spi_block_erase_52,
5154 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005155 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09005156 .block_erase = spi_block_erase_d8,
5157 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005158 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09005159 .block_erase = spi_block_erase_60,
5160 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005161 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09005162 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10005163 },
Jongpil66a96492014-08-14 17:59:06 +09005164 },
5165 .unlock = spi_disable_blockprotect,
5166 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10005167 .read = spi_chip_read,
5168 .voltage = {2700, 3600},
Jongpil66a96492014-08-14 17:59:06 +09005169 .wp = &wp_w25,
5170 },
5171
Alex Lu831c6092017-11-02 23:19:34 -07005172 {
5173 .vendor = "Macronix",
5174 .name = "MX25U12835F",
5175 .bustype = BUS_SPI,
5176 .manufacture_id = MACRONIX_ID,
Alan Greendc0792e2019-07-01 15:01:34 +10005177 .model_id = MACRONIX_MX25U12835E,
Alex Lu831c6092017-11-02 23:19:34 -07005178 .total_size = 16384,
5179 .page_size = 256,
5180 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5181 .tested = TEST_OK_PREWU,
5182 .probe = probe_spi_rdid,
5183 .probe_timing = TIMING_ZERO,
5184 .block_erasers =
5185 {
5186 {
5187 .eraseblocks = { {4 * 1024, 4096} },
5188 .block_erase = spi_block_erase_20,
5189 }, {
5190 .eraseblocks = { {32 * 1024, 512} },
5191 .block_erase = spi_block_erase_52,
5192 }, {
5193 .eraseblocks = { {64 * 1024, 256} },
5194 .block_erase = spi_block_erase_d8,
5195 }, {
5196 .eraseblocks = { {8 * 1024 * 2048, 1} },
5197 .block_erase = spi_block_erase_60,
5198 }, {
5199 .eraseblocks = { {8 * 1024 * 2048, 1} },
5200 .block_erase = spi_block_erase_c7,
5201 }
5202 },
5203 .unlock = spi_disable_blockprotect,
5204 .write = spi_chip_write_256,
5205 .read = spi_chip_read, /* Fast read (0x0B) supported */
5206 .voltage = {1650, 2000},
Paul Fagerburg50a120d2019-05-17 09:47:36 -06005207 .wp = &wp_w25q_large,
Alex Lu831c6092017-11-02 23:19:34 -07005208 },
5209
Jongpil66a96492014-08-14 17:59:06 +09005210 {
5211 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07005212 .name = "MX25U25635F",
5213 .bustype = BUS_SPI,
5214 .manufacture_id = MACRONIX_ID,
5215 .model_id = MACRONIX_MX25U25635F,
5216 /* FIXME(dhendrix): support 32-bit addressing */
5217 .total_size = 32768/2,
5218 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5220 .tested = TEST_OK_PREWU,
David Hendricks419e32a2015-04-07 17:25:14 -07005221 .probe = probe_spi_rdid,
5222 .probe_timing = TIMING_ZERO,
5223 .block_erasers =
5224 {
5225 /* FIXME(dhendrix): support 32-bit addressing */
5226 {
5227 .eraseblocks = { {4 * 1024, 8192/2} },
5228 .block_erase = spi_block_erase_20,
5229 }, {
5230 .eraseblocks = { {32 * 1024, 1024/2} },
5231 .block_erase = spi_block_erase_52,
5232 }, {
5233 .eraseblocks = { {64 * 1024, 512/2} },
5234 .block_erase = spi_block_erase_d8,
5235 }, {
5236 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5237 .block_erase = spi_block_erase_60,
5238 }, {
5239 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
5240 .block_erase = spi_block_erase_c7,
5241 }
5242 },
5243 .unlock = spi_disable_blockprotect,
5244 .write = spi_chip_write_256,
5245 .read = spi_chip_read, /* Fast read (0x0B) supported */
5246 .voltage = {1650, 2000},
5247 /* FIXME(dhendrix): write-protect support */
Alan Greena7cfa332019-06-24 15:48:14 +10005248 /* .wp = &wp_generic, */
David Hendricks419e32a2015-04-07 17:25:14 -07005249 },
5250
5251 {
5252 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10005253 .name = "MX25U3235E/F",
hailfingere1e41ea2011-07-27 07:13:06 +00005254 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00005255 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10005256 .model_id = MACRONIX_MX25U3235E,
5257 .total_size = 4096,
stuged8f34912009-04-21 01:47:16 +00005258 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005259 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stuged8f34912009-04-21 01:47:16 +00005260 .tested = TEST_UNTESTED,
5261 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005262 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005263 .block_erasers =
5264 {
5265 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005266 .eraseblocks = { {4 * 1024, 1024} },
snelson2d471072010-01-09 05:30:14 +00005267 .block_erase = spi_block_erase_20,
5268 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005269 .eraseblocks = { {32 * 1024, 128} },
5270 .block_erase = spi_block_erase_52,
5271 }, {
5272 .eraseblocks = { {64 * 1024, 64} },
snelson2d471072010-01-09 05:30:14 +00005273 .block_erase = spi_block_erase_d8,
5274 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005275 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00005276 .block_erase = spi_block_erase_60,
5277 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005278 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00005279 .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,
Alan Greend76dc1f2019-06-26 15:38:19 +10005284 .read = spi_chip_read, /* Fast read (0x0B) supported */
5285 .voltage = {1650, 2000},
5286 .wp = &wp_w25,
5287 },
5288
5289 {
5290 .vendor = "Macronix",
5291 .name = "MX25U6435E/F",
5292 .bustype = BUS_SPI,
5293 .manufacture_id = MACRONIX_ID,
5294 .model_id = MACRONIX_MX25U6435E,
5295 .total_size = 8192,
5296 .page_size = 256,
5297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
5298 .tested = TEST_OK_PREWU,
5299 .probe = probe_spi_rdid,
5300 .probe_timing = TIMING_ZERO,
5301 .block_erasers =
5302 {
5303 {
5304 .eraseblocks = { {4 * 1024, 2048} },
5305 .block_erase = spi_block_erase_20,
5306 }, {
5307 .eraseblocks = { {32 * 1024, 256} },
5308 .block_erase = spi_block_erase_52,
5309 }, {
5310 .eraseblocks = { {64 * 1024, 128} },
5311 .block_erase = spi_block_erase_d8,
5312 }, {
5313 .eraseblocks = { {8 * 1024 * 1024, 1} },
5314 .block_erase = spi_block_erase_60,
5315 }, {
5316 .eraseblocks = { {8 * 1024 * 1024, 1} },
5317 .block_erase = spi_block_erase_c7,
5318 }
5319 },
5320 .unlock = spi_disable_blockprotect,
5321 .write = spi_chip_write_256,
5322 .read = spi_chip_read, /* Fast read (0x0B) supported */
5323 .voltage = {1650, 2000},
5324 .wp = &wp_w25,
stuged8f34912009-04-21 01:47:16 +00005325 },
5326
5327 {
5328 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00005329 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00005330 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005331 .manufacture_id = MACRONIX_ID,
5332 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00005333 .total_size = 128,
5334 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005335 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5336 .tested = TEST_UNTESTED,
5337 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005338 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005339 .block_erasers =
5340 {
5341 {
Simon Glass8dc82732013-07-16 10:13:51 -06005342 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005343 {8 * 1024, 1},
5344 {4 * 1024, 2},
5345 {8 * 1024, 2},
5346 {32 * 1024, 1},
5347 {64 * 1024, 1},
5348 },
snelsonc6855342010-01-28 23:55:12 +00005349 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005350 }, {
5351 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005352 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005353 }
5354 },
hailfingerfff99532009-11-27 17:49:42 +00005355 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005356 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005357 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005358 },
5359
5360 {
5361 .vendor = "Macronix",
5362 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00005363 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005364 .manufacture_id = MACRONIX_ID,
5365 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00005366 .total_size = 128,
5367 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005368 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00005369 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005370 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005371 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005372 .block_erasers =
5373 {
5374 {
Simon Glass8dc82732013-07-16 10:13:51 -06005375 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00005376 {64 * 1024, 1},
5377 {32 * 1024, 1},
5378 {8 * 1024, 2},
5379 {4 * 1024, 2},
5380 {8 * 1024, 1},
5381 },
snelsonc6855342010-01-28 23:55:12 +00005382 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005383 }, {
5384 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005385 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005386 }
5387 },
hailfingerfff99532009-11-27 17:49:42 +00005388 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00005389 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005390 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00005391 },
5392
5393 {
5394 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005395 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005396 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005397 .manufacture_id = MACRONIX_ID,
5398 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005399 .total_size = 256,
5400 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005401 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005402 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00005403 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005404 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005405 .block_erasers =
5406 {
5407 {
5408 .eraseblocks = {
5409 {16 * 1024, 1},
5410 {8 * 1024, 2},
5411 {32 * 1024, 1},
5412 {64 * 1024, 3},
5413 },
snelsonc6855342010-01-28 23:55:12 +00005414 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005415 }, {
5416 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005417 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005418 },
5419 },
hailfingerfff99532009-11-27 17:49:42 +00005420 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005421 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005422 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005423 },
5424
hailfinger286829b2009-01-08 03:40:17 +00005425 {
5426 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00005427 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005428 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005429 .manufacture_id = MACRONIX_ID,
5430 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005431 .total_size = 256,
5432 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005433 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005434 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00005435 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005436 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00005437 .block_erasers =
5438 {
5439 {
5440 .eraseblocks = {
5441 {64 * 1024, 3},
5442 {32 * 1024, 1},
5443 {8 * 1024, 2},
5444 {16 * 1024, 1},
5445 },
snelsonc6855342010-01-28 23:55:12 +00005446 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005447 }, {
5448 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005449 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005450 },
5451 },
hailfingerfff99532009-11-27 17:49:42 +00005452 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005453 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005454 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005455 },
5456
hailfinger286829b2009-01-08 03:40:17 +00005457 {
5458 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00005459 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00005460 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00005461 .manufacture_id = MACRONIX_ID,
5462 .model_id = MACRONIX_MX29F040,
5463 .total_size = 512,
5464 .page_size = 64 * 1024,
5465 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5466 .tested = TEST_UNTESTED,
5467 .probe = probe_jedec,
5468 .probe_timing = TIMING_ZERO,
5469 .block_erasers =
5470 {
5471 {
5472 .eraseblocks = { {64 * 1024, 8} },
5473 .block_erase = erase_sector_jedec,
5474 }, {
5475 .eraseblocks = { {512 * 1024, 1} },
5476 .block_erase = erase_chip_block_jedec,
5477 },
5478 },
5479 .write = write_jedec_1,
5480 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00005481 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00005482 },
5483
5484 {
5485 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00005486 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00005487 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00005488 .manufacture_id = MACRONIX_ID,
5489 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00005490 .total_size = 512,
5491 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005492 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5493 .tested = TEST_UNTESTED,
5494 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00005495 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00005496 .block_erasers =
5497 {
5498 {
5499 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00005500 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00005501 }, {
5502 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005503 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00005504 },
5505 },
hailfingerfff99532009-11-27 17:49:42 +00005506 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005507 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005508 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00005509 },
5510
hailfinger286829b2009-01-08 03:40:17 +00005511 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005512 .vendor = "Micron",
5513 .name = "N25Q512..3E/MT25QL512", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
5514 .bustype = BUS_SPI,
5515 .manufacture_id = ST_ID,
5516 .model_id = ST_N25Q512__3E,
5517 .total_size = 65536,
5518 .page_size = 256,
5519 /* supports SFDP */
5520 /* OTP: 64B total; read 0x4B, write 0x42 */
5521 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
5522 .tested = TEST_OK_PREW,
5523 .probe = probe_spi_rdid,
5524 .probe_timing = TIMING_ZERO,
5525 .block_erasers =
5526 {
5527 {
5528 .eraseblocks = { {4 * 1024, 16384} },
5529 .block_erase = spi_block_erase_21,
5530 }, {
5531 .eraseblocks = { {64 * 1024, 1024} },
5532 .block_erase = spi_block_erase_dc,
5533 }, {
5534 .eraseblocks = { {65536 * 1024, 1} },
5535 .block_erase = spi_block_erase_c7,
5536 }
5537 },
5538 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
5539 .write = spi_chip_write_256, /* Multi I/O supported */
5540 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5541 .voltage = {2700, 3600},
5542 },
5543
5544 {
hailfinger0ae231d2010-07-29 20:01:13 +00005545 .vendor = "MoselVitelic",
5546 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +00005547 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005548 .manufacture_id = SYNCMOS_MVC_ID,
5549 .model_id = MVC_V29C51000B,
5550 .total_size = 64,
5551 .page_size = 512,
5552 .feature_bits = FEATURE_EITHER_RESET,
5553 .tested = TEST_UNTESTED,
5554 .probe = probe_jedec,
5555 .probe_timing = TIMING_ZERO,
5556 .block_erasers =
5557 {
5558 {
5559 .eraseblocks = { {512, 128} },
5560 .block_erase = erase_sector_jedec,
5561 }, {
5562 .eraseblocks = { {64 * 1024, 1} },
5563 .block_erase = erase_chip_block_jedec,
5564 },
5565 },
5566 .write = write_jedec_1,
5567 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005568 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005569 },
5570
5571 {
5572 .vendor = "MoselVitelic",
5573 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +00005574 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005575 .manufacture_id = SYNCMOS_MVC_ID,
5576 .model_id = MVC_V29C51000T,
5577 .total_size = 64,
5578 .page_size = 512,
5579 .feature_bits = FEATURE_EITHER_RESET,
5580 .tested = TEST_UNTESTED,
5581 .probe = probe_jedec,
5582 .probe_timing = TIMING_ZERO,
5583 .block_erasers =
5584 {
5585 {
5586 .eraseblocks = { {512, 128} },
5587 .block_erase = erase_sector_jedec,
5588 }, {
5589 .eraseblocks = { {64 * 1024, 1} },
5590 .block_erase = erase_chip_block_jedec,
5591 },
5592 },
5593 .write = write_jedec_1,
5594 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005595 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005596 },
5597
5598 {
5599 .vendor = "MoselVitelic",
5600 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +00005601 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005602 .manufacture_id = SYNCMOS_MVC_ID,
5603 .model_id = MVC_V29C51400B,
5604 .total_size = 512,
5605 .page_size = 1024,
5606 .feature_bits = FEATURE_EITHER_RESET,
5607 .tested = TEST_UNTESTED,
5608 .probe = probe_jedec,
5609 .probe_timing = TIMING_ZERO,
5610 .block_erasers =
5611 {
5612 {
5613 .eraseblocks = { {1024, 512} },
5614 .block_erase = erase_sector_jedec,
5615 }, {
5616 .eraseblocks = { {512 * 1024, 1} },
5617 .block_erase = erase_chip_block_jedec,
5618 },
5619 },
5620 .write = write_jedec_1,
5621 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005622 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005623 },
5624
5625 {
5626 .vendor = "MoselVitelic",
5627 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +00005628 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005629 .manufacture_id = SYNCMOS_MVC_ID,
5630 .model_id = MVC_V29C51400T,
5631 .total_size = 512,
5632 .page_size = 1024,
5633 .feature_bits = FEATURE_EITHER_RESET,
5634 .tested = TEST_UNTESTED,
5635 .probe = probe_jedec,
5636 .probe_timing = TIMING_ZERO,
5637 .block_erasers =
5638 {
5639 {
5640 .eraseblocks = { {1024, 512} },
5641 .block_erase = erase_sector_jedec,
5642 }, {
5643 .eraseblocks = { {512 * 1024, 1} },
5644 .block_erase = erase_chip_block_jedec,
5645 },
5646 },
5647 .write = write_jedec_1,
5648 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005649 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005650 },
5651
5652 {
5653 .vendor = "MoselVitelic",
5654 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +00005655 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005656 .manufacture_id = SYNCMOS_MVC_ID,
5657 .model_id = MVC_V29LC51000,
5658 .total_size = 64,
5659 .page_size = 512,
5660 .feature_bits = FEATURE_EITHER_RESET,
5661 .tested = TEST_UNTESTED,
5662 .probe = probe_jedec,
5663 .probe_timing = TIMING_ZERO,
5664 .block_erasers =
5665 {
5666 {
5667 .eraseblocks = { {512, 128} },
5668 .block_erase = erase_sector_jedec,
5669 }, {
5670 .eraseblocks = { {64 * 1024, 1} },
5671 .block_erase = erase_chip_block_jedec,
5672 },
5673 },
5674 .write = write_jedec_1,
5675 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005676 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005677 },
5678
5679 {
5680 .vendor = "MoselVitelic",
5681 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +00005682 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005683 .manufacture_id = SYNCMOS_MVC_ID,
5684 .model_id = MVC_V29LC51001,
5685 .total_size = 128,
5686 .page_size = 512,
5687 .feature_bits = FEATURE_EITHER_RESET,
5688 .tested = TEST_UNTESTED,
5689 .probe = probe_jedec,
5690 .probe_timing = TIMING_ZERO,
5691 .block_erasers =
5692 {
5693 {
5694 .eraseblocks = { {512, 256} },
5695 .block_erase = erase_sector_jedec,
5696 }, {
5697 .eraseblocks = { {128 * 1024, 1} },
5698 .block_erase = erase_chip_block_jedec,
5699 },
5700 },
5701 .write = write_jedec_1,
5702 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005703 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005704 },
5705
5706 {
5707 .vendor = "MoselVitelic",
5708 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +00005709 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00005710 .manufacture_id = SYNCMOS_MVC_ID,
5711 .model_id = MVC_V29LC51002,
5712 .total_size = 256,
5713 .page_size = 512,
5714 .feature_bits = FEATURE_EITHER_RESET,
5715 .tested = TEST_UNTESTED,
5716 .probe = probe_jedec,
5717 .probe_timing = TIMING_ZERO,
5718 .block_erasers =
5719 {
5720 {
5721 .eraseblocks = { {512, 512} },
5722 .block_erase = erase_sector_jedec,
5723 }, {
5724 .eraseblocks = { {256 * 1024, 1} },
5725 .block_erase = erase_chip_block_jedec,
5726 },
5727 },
5728 .write = write_jedec_1,
5729 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005730 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00005731 },
5732
5733 {
hailfinger286829b2009-01-08 03:40:17 +00005734 .vendor = "Numonyx",
5735 .name = "M25PE10",
hailfingere1e41ea2011-07-27 07:13:06 +00005736 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005737 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005738 .model_id = ST_M25PE10,
hailfinger286829b2009-01-08 03:40:17 +00005739 .total_size = 128,
5740 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005741 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005742 .tested = TEST_UNTESTED,
5743 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005744 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005745 .block_erasers =
5746 {
5747 {
5748 .eraseblocks = { {4 * 1024, 32} },
5749 .block_erase = spi_block_erase_20,
5750 }, {
5751 .eraseblocks = { {64 * 1024, 2} },
5752 .block_erase = spi_block_erase_d8,
5753 }, {
5754 .eraseblocks = { {128 * 1024, 1} },
5755 .block_erase = spi_block_erase_c7,
5756 }
5757 },
hailfingerb9560ee2010-07-14 20:21:22 +00005758 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005759 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005760 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005761 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005762 },
5763
hailfinger286829b2009-01-08 03:40:17 +00005764 {
5765 .vendor = "Numonyx",
Alan Greend76dc1f2019-06-26 15:38:19 +10005766 .name = "M25PE16",
5767 .bustype = BUS_SPI,
5768 .manufacture_id = ST_ID,
5769 .model_id = ST_M25PE16,
5770 .total_size = 2048,
5771 .page_size = 256,
5772 .feature_bits = FEATURE_UNBOUND_READ,
5773 .tested = TEST_UNTESTED,
5774 .probe = probe_spi_rdid,
5775 .probe_timing = TIMING_ZERO,
5776 .block_erasers =
5777 {
5778 {
5779 .eraseblocks = { {4 * 1024, 512} },
5780 .block_erase = spi_block_erase_20,
5781 }, {
5782 .eraseblocks = { {64 * 1024, 32} },
5783 .block_erase = spi_block_erase_d8,
5784 }, {
5785 .eraseblocks = { {2 * 1024 * 1024, 1} },
5786 .block_erase = spi_block_erase_c7,
5787 }
5788 },
5789 .unlock = spi_disable_blockprotect,
5790 .write = spi_chip_write_256,
5791 .read = spi_chip_read,
5792 .voltage = {2700, 3600},
5793 },
5794
5795 {
5796 .vendor = "Numonyx",
hailfinger286829b2009-01-08 03:40:17 +00005797 .name = "M25PE20",
hailfingere1e41ea2011-07-27 07:13:06 +00005798 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005799 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005800 .model_id = ST_M25PE20,
hailfinger286829b2009-01-08 03:40:17 +00005801 .total_size = 256,
5802 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005803 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005804 .tested = TEST_UNTESTED,
5805 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005806 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005807 .block_erasers =
5808 {
5809 {
5810 .eraseblocks = { {4 * 1024, 64} },
5811 .block_erase = spi_block_erase_20,
5812 }, {
5813 .eraseblocks = { {64 * 1024, 4} },
5814 .block_erase = spi_block_erase_d8,
5815 }, {
5816 .eraseblocks = { {256 * 1024, 1} },
5817 .block_erase = spi_block_erase_c7,
5818 }
5819 },
hailfingerb9560ee2010-07-14 20:21:22 +00005820 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005821 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005822 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005823 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005824 },
5825
hailfinger286829b2009-01-08 03:40:17 +00005826 {
5827 .vendor = "Numonyx",
5828 .name = "M25PE40",
hailfingere1e41ea2011-07-27 07:13:06 +00005829 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005830 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005831 .model_id = ST_M25PE40,
snelson4d31f0d2010-01-19 03:23:07 +00005832 .total_size = 512,
hailfinger286829b2009-01-08 03:40:17 +00005833 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005834 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00005835 .tested = TEST_UNTESTED,
5836 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005837 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005838 .block_erasers =
5839 {
5840 {
5841 .eraseblocks = { {4 * 1024, 128} },
5842 .block_erase = spi_block_erase_20,
5843 }, {
5844 .eraseblocks = { {64 * 1024, 8} },
5845 .block_erase = spi_block_erase_d8,
5846 }, {
5847 .eraseblocks = { {512 * 1024, 1} },
5848 .block_erase = spi_block_erase_c7,
5849 }
5850 },
hailfingerb9560ee2010-07-14 20:21:22 +00005851 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005852 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005853 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005854 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005855 },
5856
hailfinger286829b2009-01-08 03:40:17 +00005857 {
5858 .vendor = "Numonyx",
5859 .name = "M25PE80",
hailfingere1e41ea2011-07-27 07:13:06 +00005860 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005861 .manufacture_id = ST_ID,
hailfingerc391ccb2009-06-12 11:45:10 +00005862 .model_id = ST_M25PE80,
hailfinger286829b2009-01-08 03:40:17 +00005863 .total_size = 1024,
5864 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005865 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07005866 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00005867 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00005868 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00005869 .block_erasers =
5870 {
5871 {
5872 .eraseblocks = { {4 * 1024, 256} },
5873 .block_erase = spi_block_erase_20,
5874 }, {
5875 .eraseblocks = { {64 * 1024, 16} },
5876 .block_erase = spi_block_erase_d8,
5877 }, {
5878 .eraseblocks = { {1024 * 1024, 1} },
5879 .block_erase = spi_block_erase_c7,
5880 }
5881 },
hailfingerb9560ee2010-07-14 20:21:22 +00005882 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00005883 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00005884 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00005885 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00005886 },
5887
hailfinger286829b2009-01-08 03:40:17 +00005888 {
5889 .vendor = "Numonyx",
David Hendricksbfa624b2012-07-24 12:47:59 -07005890 /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
5891 .name = "N25Q064..1E",
5892 .bustype = BUS_SPI,
5893 .manufacture_id = ST_ID,
5894 .model_id = ST_N25Q064__1E,
5895 .total_size = 8192,
5896 .page_size = 256,
5897 /* supports SFDP */
5898 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07005899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08005900 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07005901 .probe = probe_spi_rdid,
5902 .probe_timing = TIMING_ZERO,
5903 .block_erasers =
5904 {
5905 {
5906 .eraseblocks = { {4 * 1024, 2048 } },
5907 .block_erase = spi_block_erase_20,
5908 }, {
5909 .eraseblocks = { {64 * 1024, 128} },
5910 .block_erase = spi_block_erase_d8,
5911 }, {
5912 .eraseblocks = { {8 * 1024 * 1024, 1} },
5913 .block_erase = spi_block_erase_c7,
5914 }
5915 },
5916 .unlock = spi_disable_blockprotect,
5917 .write = spi_chip_write_256,
5918 .read = spi_chip_read,
5919 .voltage = {1700, 2000},
5920 .wp = &wp_w25,
5921 },
5922
5923 {
5924 .vendor = "Numonyx",
5925 /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
5926 .name = "N25Q064..3E",
5927 .bustype = BUS_SPI,
5928 .manufacture_id = ST_ID,
5929 .model_id = ST_N25Q064__3E,
5930 .total_size = 8192,
5931 .page_size = 256,
5932 /* supports SFDP */
5933 /* OTP: 64B total; read 0x4B, write 0x42 */
Stefan Tauner9816fc82016-08-12 15:47:49 -07005934 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08005935 .tested = TEST_OK_PREWU,
David Hendricksbfa624b2012-07-24 12:47:59 -07005936 .probe = probe_spi_rdid,
5937 .probe_timing = TIMING_ZERO,
5938 .block_erasers =
5939 {
5940 {
5941 .eraseblocks = { {4 * 1024, 2048 } },
5942 .block_erase = spi_block_erase_20,
5943 }, {
5944 .eraseblocks = { {64 * 1024, 128} },
5945 .block_erase = spi_block_erase_d8,
5946 }, {
5947 .eraseblocks = { {8 * 1024 * 1024, 1} },
5948 .block_erase = spi_block_erase_c7,
5949 }
5950 },
5951 .unlock = spi_disable_blockprotect,
5952 .write = spi_chip_write_256,
5953 .read = spi_chip_read,
5954 .voltage = {2700, 3600},
5955 .wp = &wp_w25,
5956 },
5957
5958 {
David Hendricks828a9b12015-03-20 11:24:28 -07005959 .vendor = "Numonyx",
Ed Swierkc3290082017-07-03 13:33:44 -07005960 .name = "N25Q256..3E/MT25QL256", /* ..3E/L = 3V, uniform 64KB/4KB blocks/sectors */
David Hendricks828a9b12015-03-20 11:24:28 -07005961 .bustype = BUS_SPI,
Alan Greena7cfa332019-06-24 15:48:14 +10005962 .manufacture_id = ST_ID,
David Hendricks828a9b12015-03-20 11:24:28 -07005963 .model_id = ST_N25Q256__3E,
Ed Swierkc3290082017-07-03 13:33:44 -07005964 .total_size = 32768,
David Hendricks828a9b12015-03-20 11:24:28 -07005965 .page_size = 256,
5966 /* supports SFDP */
5967 /* OTP: 64B total; read 0x4B, write 0x42 */
Edward O'Callaghan3d0cbd42019-06-24 15:37:01 +10005968 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_WREN,
David Hendricks488cf072015-11-23 16:45:07 -08005969 .tested = TEST_OK_PREWU,
David Hendricks828a9b12015-03-20 11:24:28 -07005970 .probe = probe_spi_rdid,
5971 .probe_timing = TIMING_ZERO,
Alan Greena7cfa332019-06-24 15:48:14 +10005972 .block_erasers =
5973 {
David Hendricks828a9b12015-03-20 11:24:28 -07005974 {
Ed Swierkc3290082017-07-03 13:33:44 -07005975 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10005976 .block_erase = spi_block_erase_21,
David Hendricks828a9b12015-03-20 11:24:28 -07005977 }, {
5978 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10005979 .block_erase = spi_block_erase_dc,
David Hendricks828a9b12015-03-20 11:24:28 -07005980 }, {
Ed Swierkc3290082017-07-03 13:33:44 -07005981 .eraseblocks = { {32768 * 1024, 1} },
David Hendricks828a9b12015-03-20 11:24:28 -07005982 .block_erase = spi_block_erase_c7,
5983 }
5984 },
Ed Swierkc3290082017-07-03 13:33:44 -07005985 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
5986 .write = spi_chip_write_256, /* Multi I/O supported */
5987 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
David Hendricks828a9b12015-03-20 11:24:28 -07005988 .voltage = {2700, 3600},
Ed Swierkc3290082017-07-03 13:33:44 -07005989 },
5990
5991 {
hailfinger286829b2009-01-08 03:40:17 +00005992 .vendor = "PMC",
5993 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00005994 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00005995 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005996 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +00005997 .total_size = 128,
5998 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08005999 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006000 .tested = TEST_UNTESTED,
6001 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006002 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006003 .block_erasers =
6004 {
6005 {
6006 .eraseblocks = { {4 * 1024, 32} },
6007 .block_erase = spi_block_erase_d7,
6008 }, {
6009 .eraseblocks = { {32 * 1024, 4} },
6010 .block_erase = spi_block_erase_d8,
6011 }, {
6012 .eraseblocks = { {128 * 1024, 1} },
6013 .block_erase = spi_block_erase_c7,
6014 }
6015 },
hailfingerb9560ee2010-07-14 20:21:22 +00006016 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006017 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006018 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006019 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006020 },
6021
hailfinger286829b2009-01-08 03:40:17 +00006022 {
6023 .vendor = "PMC",
6024 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +00006025 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006026 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006027 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +00006028 .total_size = 2048,
6029 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006030 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006031 .tested = TEST_UNTESTED,
6032 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006033 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006034 .block_erasers =
6035 {
6036 {
6037 .eraseblocks = { {4 * 1024, 512} },
6038 .block_erase = spi_block_erase_d7,
6039 }, {
6040 .eraseblocks = { {4 * 1024, 512} },
6041 .block_erase = spi_block_erase_20,
6042 }, {
6043 .eraseblocks = { {64 * 1024, 32} },
6044 .block_erase = spi_block_erase_d8,
6045 }, {
6046 .eraseblocks = { {2 * 1024 * 1024, 1} },
6047 .block_erase = spi_block_erase_60,
6048 }, {
6049 .eraseblocks = { {2 * 1024 * 1024, 1} },
6050 .block_erase = spi_block_erase_c7,
6051 }
6052 },
hailfingerb9560ee2010-07-14 20:21:22 +00006053 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006054 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006055 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006056 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006057 },
6058
hailfinger286829b2009-01-08 03:40:17 +00006059 {
6060 .vendor = "PMC",
6061 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006062 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006063 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006064 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +00006065 .total_size = 256,
6066 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006067 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006068 .tested = TEST_UNTESTED,
6069 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006070 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006071 .block_erasers =
6072 {
6073 {
6074 .eraseblocks = { {4 * 1024, 64} },
6075 .block_erase = spi_block_erase_d7,
6076 }, {
6077 .eraseblocks = { {64 * 1024, 4} },
6078 .block_erase = spi_block_erase_d8,
6079 }, {
6080 .eraseblocks = { {256 * 1024, 1} },
6081 .block_erase = spi_block_erase_c7,
6082 }
6083 },
hailfingerb9560ee2010-07-14 20:21:22 +00006084 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006085 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006086 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006087 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006088 },
6089
hailfinger286829b2009-01-08 03:40:17 +00006090 {
6091 .vendor = "PMC",
6092 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006093 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006094 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006095 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +00006096 .total_size = 512,
6097 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006098 .feature_bits = FEATURE_UNBOUND_READ,
6099 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006100 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006101 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006102 .block_erasers =
6103 {
6104 {
6105 .eraseblocks = { {4 * 1024, 128} },
6106 .block_erase = spi_block_erase_d7,
6107 }, {
6108 .eraseblocks = { {64 * 1024, 8} },
6109 .block_erase = spi_block_erase_d8,
6110 }, {
6111 .eraseblocks = { {512 * 1024, 1} },
6112 .block_erase = spi_block_erase_c7,
6113 }
6114 },
hailfingerb9560ee2010-07-14 20:21:22 +00006115 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006116 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006117 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006118 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006119 },
6120
hailfinger286829b2009-01-08 03:40:17 +00006121 {
6122 .vendor = "PMC",
6123 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +00006124 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006125 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006126 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +00006127 .total_size = 1024,
6128 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006129 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006130 .tested = TEST_UNTESTED,
6131 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006132 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006133 .block_erasers =
6134 {
6135 {
6136 .eraseblocks = { {4 * 1024, 256} },
6137 .block_erase = spi_block_erase_d7,
6138 }, {
6139 .eraseblocks = { {4 * 1024, 256} },
6140 .block_erase = spi_block_erase_20,
6141 }, {
6142 .eraseblocks = { {64 * 1024, 16} },
6143 .block_erase = spi_block_erase_d8,
6144 }, {
6145 .eraseblocks = { {1024 * 1024, 1} },
6146 .block_erase = spi_block_erase_60,
6147 }, {
6148 .eraseblocks = { {1024 * 1024, 1} },
6149 .block_erase = spi_block_erase_c7,
6150 }
6151 },
hailfingerb9560ee2010-07-14 20:21:22 +00006152 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006153 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006154 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006155 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006156 },
6157
hailfinger286829b2009-01-08 03:40:17 +00006158 {
6159 .vendor = "PMC",
6160 .name = "Pm25LV512",
hailfingere1e41ea2011-07-27 07:13:06 +00006161 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006162 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006163 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +00006164 .total_size = 64,
6165 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006166 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006167 .tested = TEST_UNTESTED,
6168 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006169 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +00006170 .block_erasers =
6171 {
6172 {
6173 .eraseblocks = { {4 * 1024, 16} },
6174 .block_erase = spi_block_erase_d7,
6175 }, {
6176 .eraseblocks = { {32 * 1024, 2} },
6177 .block_erase = spi_block_erase_d8,
6178 }, {
6179 .eraseblocks = { {64 * 1024, 1} },
6180 .block_erase = spi_block_erase_c7,
6181 }
6182 },
hailfingerb9560ee2010-07-14 20:21:22 +00006183 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006184 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00006185 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006186 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006187 },
6188
hailfinger286829b2009-01-08 03:40:17 +00006189 {
6190 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +00006191 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00006192 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +00006193 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006194 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +00006195 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +00006196 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006197 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +00006198 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00006199 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006200 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +00006201 .block_erasers =
6202 {
6203 {
6204 .eraseblocks = {
6205 {16 * 1024, 1},
6206 {8 * 1024, 2},
6207 {96 * 1024, 1},
6208 {128 * 1024, 1},
6209 },
snelsonc6855342010-01-28 23:55:12 +00006210 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006211 }, {
6212 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006213 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +00006214 },
6215 },
snelsonc6855342010-01-28 23:55:12 +00006216 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +00006217 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006218 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +00006219 },
6220
6221 {
6222 .vendor = "PMC",
Alan Greend76dc1f2019-06-26 15:38:19 +10006223 .name = "Pm29F002T",
6224 .bustype = BUS_PARALLEL,
6225 .manufacture_id = PMC_ID_NOPREFIX,
6226 .model_id = PMC_PM29F002T,
6227 .total_size = 256,
6228 .page_size = 8 * 1024,
6229 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6230 .tested = TEST_OK_PREW,
6231 .probe = probe_jedec,
6232 .probe_timing = TIMING_FIXME,
6233 .block_erasers =
6234 {
6235 {
6236 .eraseblocks = {
6237 {128 * 1024, 1},
6238 {96 * 1024, 1},
6239 {8 * 1024, 2},
6240 {16 * 1024, 1},
6241 },
6242 .block_erase = erase_sector_jedec,
6243 }, {
6244 .eraseblocks = { {256 * 1024, 1} },
6245 .block_erase = erase_chip_block_jedec,
6246 },
6247 },
6248 .write = write_jedec_1,
6249 .read = read_memmapped,
6250 .voltage = {4500, 5500},
6251 },
6252
6253 {
6254 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +00006255 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +00006256 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +00006257 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006258 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +00006259 .total_size = 128,
6260 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006261 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006262 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +00006263 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006264 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +00006265 .block_erasers =
6266 {
6267 {
6268 .eraseblocks = { {4 * 1024, 32} },
6269 .block_erase = erase_sector_jedec,
6270 }, {
6271 .eraseblocks = { {64 * 1024, 2} },
6272 .block_erase = erase_block_jedec,
6273 }, {
6274 .eraseblocks = { {128 * 1024, 1} },
6275 .block_erase = erase_chip_block_jedec,
6276 }
6277 },
snelsonc6855342010-01-28 23:55:12 +00006278 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +00006279 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006280 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +00006281 },
6282
6283 {
6284 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +00006285 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +00006286 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006287 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006288 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +00006289 .total_size = 256,
6290 .page_size = 4096,
6291 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6292 .tested = TEST_UNTESTED,
6293 .probe = probe_jedec,
6294 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +10006295 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +00006296 {
6297 {
6298 .eraseblocks = { {4 * 1024, 64} },
6299 .block_erase = erase_sector_jedec,
6300 }, {
6301 .eraseblocks = { {64 * 1024, 4} },
6302 .block_erase = erase_block_jedec,
6303 }, {
6304 .eraseblocks = { {256 * 1024, 1} },
6305 .block_erase = erase_chip_block_jedec,
6306 }
6307 },
6308 .write = write_jedec_1,
6309 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006310 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006311 },
6312
6313 {
6314 .vendor = "PMC",
6315 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00006316 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +00006317 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006318 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +00006319 .total_size = 512,
6320 .page_size = 4096,
6321 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00006322 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +00006323 .probe = probe_jedec,
6324 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +10006325 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +00006326 {
6327 {
6328 .eraseblocks = { {4 * 1024, 128} },
6329 .block_erase = erase_sector_jedec,
6330 }, {
6331 .eraseblocks = { {64 * 1024, 8} },
6332 .block_erase = erase_block_jedec,
6333 }, {
6334 .eraseblocks = { {512 * 1024, 1} },
6335 .block_erase = erase_chip_block_jedec,
6336 }
6337 },
6338 .write = write_jedec_1,
6339 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006340 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +00006341 },
Simon Glass8dc82732013-07-16 10:13:51 -06006342
hailfingerd444cc72010-03-27 23:25:14 +00006343 {
6344 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +00006345 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +00006346 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006347 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006348 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +00006349 .total_size = 256,
6350 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006351 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006352 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006353 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006354 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006355 .block_erasers =
6356 {
6357 {
6358 .eraseblocks = { {4 * 1024, 64} },
6359 .block_erase = erase_sector_jedec,
6360 }, {
6361 .eraseblocks = { {16 * 1024, 16} },
6362 .block_erase = erase_block_jedec,
6363 }, {
6364 .eraseblocks = { {256 * 1024, 1} },
6365 .block_erase = erase_chip_block_jedec,
6366 }
6367 },
snelson1ee293c2010-02-19 00:52:10 +00006368 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006369 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006370 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006371 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006372 },
6373
hailfinger286829b2009-01-08 03:40:17 +00006374 {
6375 .vendor = "PMC",
6376 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +00006377 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00006378 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00006379 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +00006380 .total_size = 512,
6381 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006382 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006383 .tested = TEST_OK_PRE,
hailfingerafac00e2010-01-09 02:24:17 +00006384 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006385 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +00006386 .block_erasers =
6387 {
6388 {
6389 .eraseblocks = { {4 * 1024, 128} },
6390 .block_erase = erase_sector_jedec,
6391 }, {
6392 .eraseblocks = { {64 * 1024, 8} },
6393 .block_erase = erase_block_jedec,
6394 }, {
6395 .eraseblocks = { {512 * 1024, 1} },
6396 .block_erase = erase_chip_block_jedec,
6397 }
6398 },
snelson1ee293c2010-02-19 00:52:10 +00006399 .unlock = unlock_49fl00x,
snelson59c83d22010-02-27 18:01:15 +00006400 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006401 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006402 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006403 },
6404
hailfinger286829b2009-01-08 03:40:17 +00006405 {
hailfinger286829b2009-01-08 03:40:17 +00006406 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +00006407 .name = "SST25LF040A",
6408 .bustype = BUS_SPI,
6409 .manufacture_id = SST_ID,
6410 .model_id = SST_SST25VF040_REMS,
6411 .total_size = 512,
6412 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006413 .feature_bits = FEATURE_UNBOUND_READ,
6414 .tested = TEST_OK_PREWU,
stefanct753c1a52011-08-17 09:50:11 +00006415 .probe = probe_spi_res2,
6416 .probe_timing = TIMING_ZERO,
6417 .block_erasers =
6418 {
6419 {
6420 .eraseblocks = { {4 * 1024, 128} },
6421 .block_erase = spi_block_erase_20,
6422 }, {
6423 .eraseblocks = { {32 * 1024, 16} },
6424 .block_erase = spi_block_erase_52,
6425 }, {
6426 .eraseblocks = { {512 * 1024, 1} },
6427 .block_erase = spi_block_erase_60,
6428 },
6429 },
6430 .unlock = spi_disable_blockprotect,
6431 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6432 .read = spi_chip_read,
6433 .voltage = {3000, 3600},
6434 },
6435
6436 {
6437 .vendor = "SST",
6438 .name = "SST25LF080A",
6439 .bustype = BUS_SPI,
6440 .manufacture_id = SST_ID,
6441 .model_id = SST_SST25VF080_REMS,
6442 .total_size = 1024,
6443 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006444 .feature_bits = FEATURE_UNBOUND_READ,
stefanct753c1a52011-08-17 09:50:11 +00006445 .tested = TEST_UNTESTED,
6446 .probe = probe_spi_res2,
6447 .probe_timing = TIMING_ZERO,
6448 .block_erasers =
6449 {
6450 {
6451 .eraseblocks = { {4 * 1024, 256} },
6452 .block_erase = spi_block_erase_20,
6453 }, {
6454 .eraseblocks = { {32 * 1024, 32} },
6455 .block_erase = spi_block_erase_52,
6456 }, {
6457 .eraseblocks = { {1024 * 1024, 1} },
6458 .block_erase = spi_block_erase_60,
6459 },
6460 },
6461 .unlock = spi_disable_blockprotect,
6462 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
6463 .read = spi_chip_read,
6464 .voltage = {3000, 3600},
6465 },
6466
6467 {
6468 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00006469 .name = "SST25VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00006470 .bustype = BUS_SPI,
hailfingerfb1f31f2010-12-03 14:48:11 +00006471 .manufacture_id = SST_ID,
6472 .model_id = SST_SST25VF010_REMS,
6473 .total_size = 128,
6474 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006475 .feature_bits = FEATURE_UNBOUND_READ,
6476 .tested = TEST_OK_PREWU,
hailfingerfb1f31f2010-12-03 14:48:11 +00006477 .probe = probe_spi_rems,
6478 .probe_timing = TIMING_ZERO,
6479 .block_erasers =
6480 {
6481 {
6482 .eraseblocks = { {4 * 1024, 32} },
6483 .block_erase = spi_block_erase_20,
6484 }, {
6485 .eraseblocks = { {32 * 1024, 4} },
6486 .block_erase = spi_block_erase_52,
6487 }, {
6488 .eraseblocks = { {128 * 1024, 1} },
6489 .block_erase = spi_block_erase_60,
6490 },
6491 },
6492 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00006493 .write = spi_aai_write,
hailfingerfb1f31f2010-12-03 14:48:11 +00006494 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006495 .voltage = {2700, 3600},
hailfingerfb1f31f2010-12-03 14:48:11 +00006496 },
6497
6498 {
David Hendricks668f29d2011-01-27 18:51:45 -08006499 .vendor = "SST",
6500 .name = "SST25VF010.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00006501 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -08006502 .manufacture_id = SST_ID,
6503 .model_id = SST_SST25VF010_REMS,
6504 .total_size = 128,
6505 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006506 .feature_bits = FEATURE_UNBOUND_READ,
6507 .tested = TEST_OK_PREWU,
David Hendricks668f29d2011-01-27 18:51:45 -08006508 .probe = probe_spi_rems,
6509 .probe_timing = TIMING_ZERO,
6510 .block_erasers =
6511 {
6512 {
6513 .eraseblocks = { {4 * 1024, 32} },
6514 .block_erase = spi_block_erase_20,
6515 }, {
6516 .eraseblocks = { {32 * 1024, 4} },
6517 .block_erase = spi_block_erase_52,
6518 }, {
6519 .eraseblocks = { {128 * 1024, 1} },
6520 .block_erase = spi_block_erase_60,
6521 },
6522 },
6523 .unlock = spi_disable_blockprotect,
6524 .write = spi_chip_write_1,
6525 .read = spi_chip_read,
6526 },
6527
6528 {
hailfingerfb1f31f2010-12-03 14:48:11 +00006529 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00006530 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +00006531 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006532 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006533 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +00006534 .total_size = 2048,
6535 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006536 .feature_bits = FEATURE_UNBOUND_READ,
6537 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006538 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006539 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006540 .block_erasers =
6541 {
6542 {
6543 .eraseblocks = { {4 * 1024, 512} },
6544 .block_erase = spi_block_erase_20,
6545 }, {
6546 .eraseblocks = { {32 * 1024, 64} },
6547 .block_erase = spi_block_erase_52,
6548 }, {
6549 .eraseblocks = { {64 * 1024, 32} },
6550 .block_erase = spi_block_erase_d8,
6551 }, {
6552 .eraseblocks = { {2 * 1024 * 1024, 1} },
6553 .block_erase = spi_block_erase_60,
6554 }, {
6555 .eraseblocks = { {2 * 1024 * 1024, 1} },
6556 .block_erase = spi_block_erase_c7,
6557 },
6558 },
hailfingerb9560ee2010-07-14 20:21:22 +00006559 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00006560 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +00006561 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006562 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006563 },
6564
hailfinger286829b2009-01-08 03:40:17 +00006565 {
6566 .vendor = "SST",
6567 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +00006568 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006569 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006570 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +00006571 .total_size = 4096,
6572 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006573 .feature_bits = FEATURE_UNBOUND_READ,
6574 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00006575 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006576 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006577 .block_erasers =
6578 {
6579 {
6580 .eraseblocks = { {4 * 1024, 1024} },
6581 .block_erase = spi_block_erase_20,
6582 }, {
6583 .eraseblocks = { {32 * 1024, 128} },
6584 .block_erase = spi_block_erase_52,
6585 }, {
6586 .eraseblocks = { {64 * 1024, 64} },
6587 .block_erase = spi_block_erase_d8,
6588 }, {
6589 .eraseblocks = { {4 * 1024 * 1024, 1} },
6590 .block_erase = spi_block_erase_60,
6591 }, {
6592 .eraseblocks = { {4 * 1024 * 1024, 1} },
6593 .block_erase = spi_block_erase_c7,
6594 },
6595 },
hailfingerb9560ee2010-07-14 20:21:22 +00006596 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +00006597 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +00006598 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006599 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +00006600 },
6601
6602 {
6603 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +00006604 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00006605 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +00006606 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006607 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +00006608 .total_size = 512,
6609 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006610 .feature_bits = FEATURE_UNBOUND_READ,
6611 .tested = TEST_OK_PRU,
hailfinger3aa0df12009-12-23 12:16:47 +00006612 .probe = probe_spi_rems,
6613 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006614 .block_erasers =
6615 {
6616 {
6617 .eraseblocks = { {4 * 1024, 128} },
6618 .block_erase = spi_block_erase_20,
6619 }, {
6620 .eraseblocks = { {32 * 1024, 16} },
6621 .block_erase = spi_block_erase_52,
6622 }, {
6623 .eraseblocks = { {512 * 1024, 1} },
6624 .block_erase = spi_block_erase_60,
6625 },
6626 },
hailfingerb9560ee2010-07-14 20:21:22 +00006627 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00006628 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +00006629 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006630 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006631 },
6632
hailfinger286829b2009-01-08 03:40:17 +00006633 {
6634 .vendor = "SST",
6635 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00006636 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006637 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006638 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +00006639 .total_size = 512,
6640 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006641 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00006642 .tested = TEST_UNTESTED,
6643 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006644 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006645 .block_erasers =
6646 {
6647 {
6648 .eraseblocks = { {4 * 1024, 128} },
6649 .block_erase = spi_block_erase_20,
6650 }, {
6651 .eraseblocks = { {32 * 1024, 16} },
6652 .block_erase = spi_block_erase_52,
6653 }, {
6654 .eraseblocks = { {64 * 1024, 8} },
6655 .block_erase = spi_block_erase_d8,
6656 }, {
6657 .eraseblocks = { {512 * 1024, 1} },
6658 .block_erase = spi_block_erase_60,
6659 }, {
6660 .eraseblocks = { {512 * 1024, 1} },
6661 .block_erase = spi_block_erase_c7,
6662 },
6663 },
hailfingerb9560ee2010-07-14 20:21:22 +00006664 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00006665 .write = spi_aai_write,
stuge48dda5c2009-02-25 08:07:33 +00006666 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006667 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +00006668 },
6669
6670 {
6671 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +00006672 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +00006673 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +00006674 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006675 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +00006676 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +00006677 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006678 .feature_bits = FEATURE_UNBOUND_READ,
6679 .tested = TEST_OK_PRU,
stuge712ce862009-01-26 03:37:40 +00006680 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +00006681 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006682 .block_erasers =
6683 {
6684 {
6685 .eraseblocks = { {4 * 1024, 128} },
6686 .block_erase = spi_block_erase_20,
6687 }, {
6688 .eraseblocks = { {32 * 1024, 16} },
6689 .block_erase = spi_block_erase_52,
6690 }, {
6691 .eraseblocks = { {64 * 1024, 8} },
6692 .block_erase = spi_block_erase_d8,
6693 }, {
6694 .eraseblocks = { {512 * 1024, 1} },
6695 .block_erase = spi_block_erase_60,
6696 }, {
6697 .eraseblocks = { {512 * 1024, 1} },
6698 .block_erase = spi_block_erase_c7,
6699 },
6700 },
hailfingerb9560ee2010-07-14 20:21:22 +00006701 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +00006702 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +00006703 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00006704 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +00006705 },
6706
6707 {
6708 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10006709 .name = "SST25VF064C",
6710 .bustype = BUS_SPI,
6711 .manufacture_id = SST_ID,
6712 .model_id = SST_SST25VF064C,
6713 .total_size = 8192,
6714 .page_size = 256,
6715 .feature_bits = FEATURE_UNBOUND_READ,
6716 .tested = TEST_OK_PREU,
6717 .probe = probe_spi_rdid,
6718 .probe_timing = TIMING_ZERO,
6719 .block_erasers =
6720 {
6721 {
6722 .eraseblocks = { {4 * 1024, 2048} },
6723 .block_erase = spi_block_erase_20,
6724 }, {
6725 .eraseblocks = { {32 * 1024, 256} },
6726 .block_erase = spi_block_erase_52,
6727 }, {
6728 .eraseblocks = { {64 * 1024, 128} },
6729 .block_erase = spi_block_erase_d8,
6730 }, {
6731 .eraseblocks = { {8 * 1024 * 1024, 1} },
6732 .block_erase = spi_block_erase_60,
6733 }, {
6734 .eraseblocks = { {8 * 1024 * 1024, 1} },
6735 .block_erase = spi_block_erase_c7,
6736 },
6737 },
6738 .unlock = spi_disable_blockprotect,
6739 .write = spi_chip_write_256,
6740 .read = spi_chip_read,
6741 .voltage = {2700, 3600},
6742 },
6743
6744 {
6745 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00006746 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +00006747 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00006748 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006749 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +00006750 .total_size = 1024,
6751 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08006752 .feature_bits = FEATURE_UNBOUND_READ,
6753 .tested = TEST_OK_PREU,
hailfinger286829b2009-01-08 03:40:17 +00006754 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00006755 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +00006756 .block_erasers =
6757 {
6758 {
6759 .eraseblocks = { {4 * 1024, 256} },
6760 .block_erase = spi_block_erase_20,
6761 }, {
6762 .eraseblocks = { {32 * 1024, 32} },
6763 .block_erase = spi_block_erase_52,
6764 }, {
6765 .eraseblocks = { {64 * 1024, 16} },
6766 .block_erase = spi_block_erase_d8,
6767 }, {
6768 .eraseblocks = { {1024 * 1024, 1} },
6769 .block_erase = spi_block_erase_60,
6770 }, {
6771 .eraseblocks = { {1024 * 1024, 1} },
6772 .block_erase = spi_block_erase_c7,
6773 },
6774 },
hailfingerb9560ee2010-07-14 20:21:22 +00006775 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00006776 .write = spi_chip_write_1,
hailfinger286829b2009-01-08 03:40:17 +00006777 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00006778 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006779 },
6780
hailfinger286829b2009-01-08 03:40:17 +00006781 {
6782 .vendor = "SST",
6783 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00006784 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006785 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006786 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +00006787 .total_size = 512,
6788 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00006789 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +00006790 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00006791 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00006792 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +00006793 .block_erasers =
6794 {
6795 {
6796 .eraseblocks = { {128, 4096} },
6797 .block_erase = erase_sector_28sf040,
6798 }, {
6799 .eraseblocks = { {512 * 1024, 1} },
6800 .block_erase = erase_chip_28sf040,
6801 }
6802 },
hailfinger86bf3b52010-10-13 21:49:30 +00006803 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +00006804 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +00006805 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006806 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006807 },
6808
hailfinger286829b2009-01-08 03:40:17 +00006809 {
6810 .vendor = "SST",
6811 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +00006812 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006813 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006814 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +00006815 .total_size = 128,
6816 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00006817 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00006818 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00006819 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006820 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00006821 .block_erasers =
6822 {
6823 {
6824 .eraseblocks = { {128 * 1024, 1} },
6825 .block_erase = erase_chip_block_jedec,
6826 }
6827 },
hailfinger286829b2009-01-08 03:40:17 +00006828 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00006829 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006830 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006831 },
6832
hailfinger286829b2009-01-08 03:40:17 +00006833 {
6834 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00006835 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +00006836 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006837 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006838 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +00006839 .total_size = 256,
6840 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00006841 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00006842 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00006843 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006844 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00006845 .block_erasers =
6846 {
6847 {
6848 .eraseblocks = { {256 * 1024, 1} },
6849 .block_erase = erase_chip_block_jedec,
6850 }
6851 },
hailfinger286829b2009-01-08 03:40:17 +00006852 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00006853 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006854 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006855 },
6856
hailfinger286829b2009-01-08 03:40:17 +00006857 {
6858 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10006859 .name = "SST29LE010",
6860 .bustype = BUS_PARALLEL,
6861 .manufacture_id = SST_ID,
6862 .model_id = SST_SST29LE010,
6863 .total_size = 128,
6864 .page_size = 128,
6865 .feature_bits = FEATURE_LONG_RESET,
6866 .tested = TEST_UNTESTED,
6867 .probe = probe_jedec,
6868 .probe_timing = 10,
6869 .block_erasers =
6870 {
6871 {
6872 .eraseblocks = { {128 * 1024, 1} },
6873 .block_erase = erase_chip_block_jedec,
6874 }
6875 },
6876 .write = write_jedec,
6877 .read = read_memmapped,
6878 .voltage = {3000, 3600},
6879 },
6880
6881 {
6882 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00006883 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +00006884 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006885 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006886 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +00006887 .total_size = 256,
6888 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00006889 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00006890 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00006891 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06006892 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +00006893 .block_erasers =
6894 {
6895 {
6896 .eraseblocks = { {256 * 1024, 1} },
6897 .block_erase = erase_chip_block_jedec,
6898 }
6899 },
hailfinger286829b2009-01-08 03:40:17 +00006900 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00006901 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006902 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00006903 },
6904
hailfinger286829b2009-01-08 03:40:17 +00006905 {
6906 .vendor = "SST",
6907 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +00006908 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006909 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006910 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +00006911 .total_size = 128,
6912 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006913 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +00006914 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00006915 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +00006916 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00006917 .block_erasers =
6918 {
6919 {
6920 .eraseblocks = { {4 * 1024, 32} },
6921 .block_erase = erase_sector_jedec,
6922 }, {
6923 .eraseblocks = { {128 * 1024, 1} },
6924 .block_erase = erase_chip_block_jedec,
6925 }
6926 },
snelsonc6855342010-01-28 23:55:12 +00006927 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006928 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006929 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006930 },
6931
hailfinger286829b2009-01-08 03:40:17 +00006932 {
6933 .vendor = "SST",
6934 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00006935 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006936 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006937 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +00006938 .total_size = 256,
6939 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006940 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08006941 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00006942 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00006943 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00006944 .block_erasers =
6945 {
6946 {
6947 .eraseblocks = { {4 * 1024, 64} },
6948 .block_erase = erase_sector_jedec,
6949 }, {
6950 .eraseblocks = { {256 * 1024, 1} },
6951 .block_erase = erase_chip_block_jedec,
6952 }
6953 },
snelsonc6855342010-01-28 23:55:12 +00006954 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006955 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006956 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006957 },
6958
hailfinger286829b2009-01-08 03:40:17 +00006959 {
6960 .vendor = "SST",
6961 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +00006962 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006963 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006964 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +00006965 .total_size = 512,
6966 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006967 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +00006968 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00006969 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00006970 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00006971 .block_erasers =
6972 {
6973 {
6974 .eraseblocks = { {4 * 1024, 128} },
6975 .block_erase = erase_sector_jedec,
6976 }, {
6977 .eraseblocks = { {512 * 1024, 1} },
6978 .block_erase = erase_chip_block_jedec,
6979 }
6980 },
snelsonc6855342010-01-28 23:55:12 +00006981 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006982 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006983 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006984 },
6985
hailfinger286829b2009-01-08 03:40:17 +00006986 {
6987 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10006988 .name = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +00006989 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006990 .manufacture_id = SST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006991 .model_id = SST_SST39SF512,
hailfinger286829b2009-01-08 03:40:17 +00006992 .total_size = 64,
6993 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00006994 .feature_bits = FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +10006995 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00006996 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00006997 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00006998 .block_erasers =
6999 {
7000 {
7001 .eraseblocks = { {4 * 1024, 16} },
7002 .block_erase = erase_sector_jedec,
7003 }, {
7004 .eraseblocks = { {64 * 1024, 1} },
7005 .block_erase = erase_chip_block_jedec,
7006 }
7007 },
snelsonc6855342010-01-28 23:55:12 +00007008 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007009 .read = read_memmapped,
Alan Greend76dc1f2019-06-26 15:38:19 +10007010 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00007011 },
7012
hailfinger286829b2009-01-08 03:40:17 +00007013 {
7014 .vendor = "SST",
7015 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +00007016 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007017 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007018 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +00007019 .total_size = 128,
7020 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007021 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007022 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007023 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007024 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007025 .block_erasers =
7026 {
7027 {
7028 .eraseblocks = { {4 * 1024, 32} },
7029 .block_erase = erase_sector_jedec,
7030 }, {
7031 .eraseblocks = { {128 * 1024, 1} },
7032 .block_erase = erase_chip_block_jedec,
7033 }
7034 },
snelsonc6855342010-01-28 23:55:12 +00007035 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007036 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007037 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007038 },
7039
hailfinger286829b2009-01-08 03:40:17 +00007040 {
7041 .vendor = "SST",
7042 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +00007043 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007044 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007045 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +00007046 .total_size = 256,
7047 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007048 .feature_bits = FEATURE_EITHER_RESET,
7049 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007050 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007051 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007052 .block_erasers =
7053 {
7054 {
7055 .eraseblocks = { {4 * 1024, 64} },
7056 .block_erase = erase_sector_jedec,
7057 }, {
7058 .eraseblocks = { {256 * 1024, 1} },
7059 .block_erase = erase_chip_block_jedec,
7060 }
7061 },
snelsonc6855342010-01-28 23:55:12 +00007062 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007063 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007064 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007065 },
7066
hailfinger286829b2009-01-08 03:40:17 +00007067 {
7068 .vendor = "SST",
7069 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007070 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00007071 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007072 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +00007073 .total_size = 512,
7074 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007075 .feature_bits = FEATURE_EITHER_RESET,
7076 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007077 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007078 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007079 .block_erasers =
7080 {
7081 {
7082 .eraseblocks = { {4 * 1024, 128} },
7083 .block_erase = erase_sector_jedec,
7084 }, {
7085 .eraseblocks = { {512 * 1024, 1} },
7086 .block_erase = erase_chip_block_jedec,
7087 }
7088 },
snelsonc6855342010-01-28 23:55:12 +00007089 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007090 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007091 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +00007092 },
stepanaa1b6a22008-12-08 18:15:10 +00007093
hailfinger286829b2009-01-08 03:40:17 +00007094 {
7095 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +00007096 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +00007097 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +00007098 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007099 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +00007100 .total_size = 1024,
7101 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007102 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +00007103 .tested = TEST_UNTESTED,
7104 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007105 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007106 .block_erasers =
7107 {
7108 {
7109 .eraseblocks = { {4 * 1024, 256} },
7110 .block_erase = erase_sector_jedec,
7111 }, {
7112 .eraseblocks = { {64 * 1024, 16} },
7113 .block_erase = erase_block_jedec,
7114 }, {
7115 .eraseblocks = { {1024 * 1024, 1} },
7116 .block_erase = erase_chip_block_jedec,
7117 }
7118 },
snelsonc6855342010-01-28 23:55:12 +00007119 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007120 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007121 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +00007122 },
7123
7124 {
7125 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007126 .name = "SST39VF512",
7127 .bustype = BUS_PARALLEL,
7128 .manufacture_id = SST_ID,
7129 .model_id = SST_SST39VF512,
7130 .total_size = 64,
7131 .page_size = 4096,
7132 .feature_bits = FEATURE_EITHER_RESET,
7133 .tested = TEST_OK_PRE,
7134 .probe = probe_jedec,
7135 .probe_timing = 1, /* 150 ns */
7136 .block_erasers =
7137 {
7138 {
7139 .eraseblocks = { {4 * 1024, 16} },
7140 .block_erase = erase_sector_jedec,
7141 }, {
7142 .eraseblocks = { {64 * 1024, 1} },
7143 .block_erase = erase_chip_block_jedec,
7144 }
7145 },
7146 .write = write_jedec_1,
7147 .read = read_memmapped,
7148 .voltage = {2700, 3600},
7149 },
7150
7151 {
7152 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +00007153 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007154 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007155 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007156 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +00007157 .total_size = 256,
7158 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007159 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007160 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007161 .probe = probe_jedec,
7162 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007163 .block_erasers =
7164 {
7165 {
7166 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +00007167 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007168 }, {
7169 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00007170 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007171 }, {
7172 .eraseblocks = { {256 * 1024, 1} },
7173 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7174 }
7175 },
hailfingerb8e4e212010-03-15 03:48:42 +00007176 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007177 .unlock = unlock_sst_fwhub,
7178 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007179 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007180 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007181 },
7182
hailfinger286829b2009-01-08 03:40:17 +00007183 {
7184 .vendor = "SST",
7185 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007186 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007187 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007188 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +00007189 .total_size = 384,
7190 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007191 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
uwe63555e62009-09-25 01:09:18 +00007192 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00007193 .probe = probe_jedec,
7194 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007195 .block_erasers =
7196 {
7197 {
7198 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +00007199 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007200 }, {
7201 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +00007202 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007203 }, {
7204 .eraseblocks = { {384 * 1024, 1} },
7205 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7206 }
7207 },
hailfingerb8e4e212010-03-15 03:48:42 +00007208 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007209 .unlock = unlock_sst_fwhub,
7210 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007211 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007212 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007213 },
7214
hailfinger286829b2009-01-08 03:40:17 +00007215 {
hailfinger80f48682009-09-23 22:01:33 +00007216 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
7217 * and is only honored for 64k block erase, but not 4k sector erase.
7218 */
hailfinger286829b2009-01-08 03:40:17 +00007219 .vendor = "SST",
7220 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +00007221 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007222 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007223 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +00007224 .total_size = 512,
7225 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007226 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007227 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007228 .probe = probe_jedec,
7229 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +00007230 .block_erasers =
7231 {
7232 {
7233 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +00007234 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +00007235 }, {
7236 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +00007237 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +00007238 }, {
7239 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +00007240 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +00007241 },
7242 },
hailfingerb8e4e212010-03-15 03:48:42 +00007243 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007244 .unlock = unlock_sst_fwhub,
7245 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007246 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007247 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007248 },
7249
hailfinger286829b2009-01-08 03:40:17 +00007250 {
7251 .vendor = "SST",
7252 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +00007253 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007254 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007255 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +00007256 .total_size = 512,
7257 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007258 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00007259 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007260 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007261 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00007262 .block_erasers =
7263 {
7264 {
7265 .eraseblocks = { {4 * 1024, 128} },
7266 .block_erase = erase_sector_49lfxxxc,
7267 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06007268 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00007269 {64 * 1024, 7},
7270 {32 * 1024, 1},
7271 {8 * 1024, 2},
7272 {16 * 1024, 1},
7273 },
snelson3a69e422010-03-23 17:10:28 +00007274 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00007275 }
7276 },
snelson3a69e422010-03-23 17:10:28 +00007277 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00007278 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007279 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007280 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007281 },
7282
hailfinger286829b2009-01-08 03:40:17 +00007283 {
7284 .vendor = "SST",
7285 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +00007286 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007287 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007288 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +00007289 .total_size = 1024,
7290 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007291 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00007292 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +00007293 .probe = probe_jedec,
7294 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007295 .block_erasers =
7296 {
7297 {
7298 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +00007299 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +00007300 }, {
7301 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +00007302 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +00007303 }, {
7304 .eraseblocks = { {1024 * 1024, 1} },
7305 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
7306 }
7307 },
hailfingerb8e4e212010-03-15 03:48:42 +00007308 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +00007309 .unlock = unlock_sst_fwhub,
7310 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007311 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007312 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007313 },
7314
hailfinger286829b2009-01-08 03:40:17 +00007315 {
7316 .vendor = "SST",
7317 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +00007318 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007319 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007320 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +00007321 .total_size = 1024,
7322 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007323 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00007324 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +00007325 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007326 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00007327 .block_erasers =
7328 {
7329 {
7330 .eraseblocks = { {4 * 1024, 256} },
7331 .block_erase = erase_sector_49lfxxxc,
7332 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06007333 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00007334 {64 * 1024, 15},
7335 {32 * 1024, 1},
7336 {8 * 1024, 2},
7337 {16 * 1024, 1},
7338 },
snelson3a69e422010-03-23 17:10:28 +00007339 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00007340 }
7341 },
snelson3a69e422010-03-23 17:10:28 +00007342 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00007343 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007344 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007345 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007346 },
7347
hailfinger286829b2009-01-08 03:40:17 +00007348 {
7349 .vendor = "SST",
7350 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +00007351 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007352 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007353 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +00007354 .total_size = 2048,
7355 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007356 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00007357 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +00007358 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007359 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00007360 .block_erasers =
7361 {
7362 {
7363 .eraseblocks = { {4 * 1024, 512} },
7364 .block_erase = erase_sector_49lfxxxc,
7365 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06007366 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00007367 {64 * 1024, 31},
7368 {32 * 1024, 1},
7369 {8 * 1024, 2},
7370 {16 * 1024, 1},
7371 },
snelson3a69e422010-03-23 17:10:28 +00007372 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00007373 }
7374 },
snelson3a69e422010-03-23 17:10:28 +00007375 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00007376 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007377 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007378 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007379 },
7380
hailfinger286829b2009-01-08 03:40:17 +00007381 {
7382 .vendor = "SST",
7383 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +00007384 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00007385 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007386 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +00007387 .total_size = 256,
7388 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007389 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007390 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007391 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007392 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007393 .block_erasers =
7394 {
7395 {
7396 .eraseblocks = { {4 * 1024, 64} },
7397 .block_erase = erase_sector_jedec,
7398 }, {
7399 .eraseblocks = { {16 * 1024, 16} },
7400 .block_erase = erase_block_jedec,
7401 }, {
7402 .eraseblocks = { {256 * 1024, 1} },
7403 .block_erase = NULL,
7404 }
7405 },
snelsonc6855342010-01-28 23:55:12 +00007406 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007407 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007408 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +00007409 },
7410
hailfinger286829b2009-01-08 03:40:17 +00007411 {
7412 .vendor = "SST",
7413 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +00007414 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00007415 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007416 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +00007417 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +00007418 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +00007419 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007420 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007421 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007422 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007423 .block_erasers =
7424 {
7425 {
7426 .eraseblocks = { {4 * 1024, 64} },
7427 .block_erase = erase_sector_jedec,
7428 }, {
7429 .eraseblocks = { {16 * 1024, 16} },
7430 .block_erase = erase_block_jedec,
7431 }, {
7432 .eraseblocks = { {256 * 1024, 1} },
7433 .block_erase = NULL,
7434 }
7435 },
snelsonc6855342010-01-28 23:55:12 +00007436 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007437 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007438 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007439 },
7440
hailfinger286829b2009-01-08 03:40:17 +00007441 {
7442 .vendor = "SST",
7443 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +00007444 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00007445 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007446 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +00007447 .total_size = 512,
7448 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007449 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00007450 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007451 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00007452 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +00007453 .block_erasers =
7454 {
7455 {
7456 .eraseblocks = { {4 * 1024, 128} },
7457 .block_erase = erase_sector_jedec,
7458 }, {
7459 .eraseblocks = { {64 * 1024, 8} },
7460 .block_erase = erase_block_jedec,
7461 }, {
7462 .eraseblocks = { {512 * 1024, 1} },
7463 .block_erase = NULL,
7464 }
7465 },
snelsonc6855342010-01-28 23:55:12 +00007466 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007467 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007468 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007469 },
7470
hailfinger286829b2009-01-08 03:40:17 +00007471 {
7472 .vendor = "SST",
7473 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +00007474 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007475 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007476 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +00007477 .total_size = 512,
7478 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +00007479 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +00007480 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +00007481 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +00007482 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +00007483 .block_erasers =
7484 {
7485 {
7486 .eraseblocks = { {4 * 1024, 128} },
7487 .block_erase = erase_sector_jedec,
7488 }, {
7489 .eraseblocks = { {64 * 1024, 8} },
7490 .block_erase = erase_block_jedec,
7491 }, {
7492 .eraseblocks = { {512 * 1024, 1} },
7493 .block_erase = NULL,
7494 }
7495 },
mkarcher83414fc2010-08-16 22:12:39 +00007496 .unlock = unlock_82802ab,
snelsonc6855342010-01-28 23:55:12 +00007497 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007498 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007499 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007500 },
7501
hailfinger286829b2009-01-08 03:40:17 +00007502 {
7503 .vendor = "SST",
7504 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +00007505 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00007506 .manufacture_id = SST_ID,
Alan Greena7cfa332019-06-24 15:48:14 +10007507 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +00007508 .total_size = 1024,
7509 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +00007510 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -08007511 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +00007512 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -06007513 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +00007514 .block_erasers =
7515 {
7516 {
7517 .eraseblocks = { {4 * 1024, 256} },
7518 .block_erase = erase_sector_jedec,
7519 }, {
7520 .eraseblocks = { {64 * 1024, 16} },
7521 .block_erase = erase_block_jedec,
7522 }, {
7523 .eraseblocks = { {1024 * 1024, 1} },
7524 .block_erase = NULL,
7525 }
7526 },
snelsonc6855342010-01-28 23:55:12 +00007527 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00007528 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007529 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007530 },
7531
hailfinger286829b2009-01-08 03:40:17 +00007532 {
7533 .vendor = "SST",
7534 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +00007535 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +00007536 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007537 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +00007538 .total_size = 2048,
7539 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007540 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00007541 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +00007542 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00007543 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +00007544 .block_erasers =
7545 {
7546 {
7547 .eraseblocks = { {4 * 1024, 512} },
7548 .block_erase = erase_sector_49lfxxxc,
7549 }, {
Simon Glass8dc82732013-07-16 10:13:51 -06007550 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +00007551 {64 * 1024, 31},
7552 {32 * 1024, 1},
7553 {8 * 1024, 2},
7554 {16 * 1024, 1},
7555 },
snelson3a69e422010-03-23 17:10:28 +00007556 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +00007557 }
7558 },
snelson1ee293c2010-02-19 00:52:10 +00007559 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +00007560 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007561 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007562 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007563 },
7564
hailfingerfb513de2009-07-23 01:40:20 +00007565 /* The ST M25P05 is a bit of a problem. It has the same ID as the
7566 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
hailfinger59a83572010-05-28 17:07:57 +00007567 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
hailfingerfb513de2009-07-23 01:40:20 +00007568 * only is successful if RDID does not work.
7569 */
7570 {
7571 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00007572 .name = "M25P05",
hailfingere1e41ea2011-07-27 07:13:06 +00007573 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00007574 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00007575 .model_id = ST_M25P05_RES,
7576 .total_size = 64,
7577 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007578 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00007579 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00007580 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00007581 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007582 .block_erasers =
7583 {
7584 {
7585 .eraseblocks = { {32 * 1024, 2} },
7586 .block_erase = spi_block_erase_d8,
7587 }, {
7588 .eraseblocks = { {64 * 1024, 1} },
7589 .block_erase = spi_block_erase_c7,
7590 }
7591 },
hailfingerb9560ee2010-07-14 20:21:22 +00007592 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00007593 .write = spi_chip_write_1, /* 128 */
7594 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007595 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00007596 },
7597
hailfinger286829b2009-01-08 03:40:17 +00007598 {
7599 .vendor = "ST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007600 .name = "M25P05-A",
hailfingere1e41ea2011-07-27 07:13:06 +00007601 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007602 .manufacture_id = ST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10007603 .model_id = ST_M25P05A,
7604 .total_size = 64,
hailfinger286829b2009-01-08 03:40:17 +00007605 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007606 .feature_bits = FEATURE_UNBOUND_READ,
Alan Greend76dc1f2019-06-26 15:38:19 +10007607 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00007608 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007609 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007610 .block_erasers =
7611 {
7612 {
Alan Greend76dc1f2019-06-26 15:38:19 +10007613 .eraseblocks = { {32 * 1024, 2} },
snelsone0c56352010-01-19 16:08:51 +00007614 .block_erase = spi_block_erase_d8,
7615 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10007616 .eraseblocks = { {64 * 1024, 1} },
snelsone0c56352010-01-19 16:08:51 +00007617 .block_erase = spi_block_erase_c7,
7618 }
7619 },
hailfingerb9560ee2010-07-14 20:21:22 +00007620 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007621 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007622 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007623 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007624 },
7625
hailfingerfb513de2009-07-23 01:40:20 +00007626 /* The ST M25P10 has the same problem as the M25P05. */
7627 {
7628 .vendor = "ST",
stefanctd6efe1a2011-09-03 11:22:27 +00007629 .name = "M25P10",
hailfingere1e41ea2011-07-27 07:13:06 +00007630 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00007631 .manufacture_id = 0, /* Not used. */
hailfingerfb513de2009-07-23 01:40:20 +00007632 .model_id = ST_M25P10_RES,
7633 .total_size = 128,
7634 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007635 .feature_bits = FEATURE_UNBOUND_READ,
hailfingerfb513de2009-07-23 01:40:20 +00007636 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00007637 .probe = probe_spi_res1,
hailfingerfb513de2009-07-23 01:40:20 +00007638 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007639 .block_erasers =
7640 {
7641 {
7642 .eraseblocks = { {32 * 1024, 4} },
7643 .block_erase = spi_block_erase_d8,
7644 }, {
7645 .eraseblocks = { {128 * 1024, 1} },
7646 .block_erase = spi_block_erase_c7,
7647 }
7648 },
hailfingerb9560ee2010-07-14 20:21:22 +00007649 .unlock = spi_disable_blockprotect,
hailfingerfb513de2009-07-23 01:40:20 +00007650 .write = spi_chip_write_1, /* 128 */
7651 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007652 .voltage = {2700, 3600},
hailfingerfb513de2009-07-23 01:40:20 +00007653 },
7654
hailfinger286829b2009-01-08 03:40:17 +00007655 {
7656 .vendor = "ST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007657 .name = "M25P10-A",
7658 .bustype = BUS_SPI,
7659 .manufacture_id = ST_ID,
7660 .model_id = ST_M25P10A,
7661 .total_size = 128,
7662 .page_size = 256,
7663 .feature_bits = FEATURE_UNBOUND_READ,
7664 .tested = TEST_OK_PREU,
7665 .probe = probe_spi_rdid,
7666 .probe_timing = TIMING_ZERO,
7667 .block_erasers =
7668 {
7669 {
7670 .eraseblocks = { {32 * 1024, 4} },
7671 .block_erase = spi_block_erase_d8,
7672 }, {
7673 .eraseblocks = { {128 * 1024, 1} },
7674 .block_erase = spi_block_erase_c7,
7675 }
7676 },
7677 .unlock = spi_disable_blockprotect,
7678 .write = spi_chip_write_256,
7679 .read = spi_chip_read,
7680 .voltage = {2700, 3600},
7681 },
7682
7683 {
7684 .vendor = "ST",
7685 .name = "M25P128",
7686 .bustype = BUS_SPI,
7687 .manufacture_id = ST_ID,
7688 .model_id = ST_M25P128,
7689 .total_size = 16384,
7690 .page_size = 256,
7691 .feature_bits = FEATURE_UNBOUND_READ,
7692 .tested = TEST_OK_PREWU,
7693 .probe = probe_spi_rdid,
7694 .probe_timing = TIMING_ZERO,
7695 .block_erasers =
7696 {
7697 {
7698 .eraseblocks = { {256 * 1024, 64} },
7699 .block_erase = spi_block_erase_d8,
7700 }, {
7701 .eraseblocks = { {16 * 1024 * 1024, 1} },
7702 .block_erase = spi_block_erase_c7,
7703 }
7704 },
7705 .unlock = spi_disable_blockprotect,
7706 .write = spi_chip_write_256,
7707 .read = spi_chip_read,
7708 .voltage = {2700, 3600},
7709 },
7710
7711 {
7712 .vendor = "ST",
7713 .name = "M25P16",
7714 .bustype = BUS_SPI,
7715 .manufacture_id = ST_ID,
7716 .model_id = ST_M25P16,
7717 .total_size = 2048,
7718 .page_size = 256,
7719 .feature_bits = FEATURE_UNBOUND_READ,
7720 .tested = TEST_OK_PRU,
7721 .probe = probe_spi_rdid,
7722 .probe_timing = TIMING_ZERO,
7723 .block_erasers =
7724 {
7725 {
7726 .eraseblocks = { {64 * 1024, 32} },
7727 .block_erase = spi_block_erase_d8,
7728 }, {
7729 .eraseblocks = { {2 * 1024 * 1024, 1} },
7730 .block_erase = spi_block_erase_c7,
7731 }
7732 },
7733 .unlock = spi_disable_blockprotect,
7734 .write = spi_chip_write_256,
7735 .read = spi_chip_read,
7736 .voltage = {2700, 3600},
7737 },
7738
7739 {
7740 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00007741 .name = "M25P20",
hailfingere1e41ea2011-07-27 07:13:06 +00007742 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007743 .manufacture_id = ST_ID,
7744 .model_id = ST_M25P20,
7745 .total_size = 256,
7746 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007747 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00007748 .tested = TEST_UNTESTED,
7749 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007750 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007751 .block_erasers =
7752 {
7753 {
7754 .eraseblocks = { {64 * 1024, 4} },
7755 .block_erase = spi_block_erase_d8,
7756 }, {
7757 .eraseblocks = { {256 * 1024, 1} },
7758 .block_erase = spi_block_erase_c7,
7759 }
7760 },
hailfingerb9560ee2010-07-14 20:21:22 +00007761 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007762 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007763 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007764 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007765 },
7766
hailfinger286829b2009-01-08 03:40:17 +00007767 {
Alan Greend76dc1f2019-06-26 15:38:19 +10007768 .vendor = "ST",
7769 .name = "M25P32",
7770 .bustype = BUS_SPI,
7771 .manufacture_id = ST_ID,
7772 .model_id = ST_M25P32,
7773 .total_size = 4096,
7774 .page_size = 256,
7775 .feature_bits = FEATURE_UNBOUND_READ,
7776 .tested = TEST_OK_PREWU,
7777 .probe = probe_spi_rdid,
7778 .probe_timing = TIMING_ZERO,
7779 .block_erasers =
7780 {
7781 {
7782 .eraseblocks = { {64 * 1024, 64} },
7783 .block_erase = spi_block_erase_d8,
7784 }, {
7785 .eraseblocks = { {4 * 1024 * 1024, 1} },
7786 .block_erase = spi_block_erase_c7,
7787 }
7788 },
7789 .unlock = spi_disable_blockprotect,
7790 .write = spi_chip_write_256,
7791 .read = spi_chip_read,
7792 .voltage = {2700, 3600},
7793 },
7794
7795 {
stefanctd6efe1a2011-09-03 11:22:27 +00007796 .vendor = "ST", /* Numonyx */
hailfinger286829b2009-01-08 03:40:17 +00007797 .name = "M25P40",
hailfingere1e41ea2011-07-27 07:13:06 +00007798 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007799 .manufacture_id = ST_ID,
7800 .model_id = ST_M25P40,
7801 .total_size = 512,
7802 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007803 .feature_bits = FEATURE_UNBOUND_READ,
Stefan Tauner718d1eb2016-08-18 18:00:53 -07007804 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007805 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007806 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007807 .block_erasers =
7808 {
7809 {
7810 .eraseblocks = { {64 * 1024, 8} },
7811 .block_erase = spi_block_erase_d8,
7812 }, {
7813 .eraseblocks = { {512 * 1024, 1} },
7814 .block_erase = spi_block_erase_c7,
7815 }
7816 },
hailfingerb9560ee2010-07-14 20:21:22 +00007817 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007818 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007819 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007820 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007821 },
7822
hailfinger286829b2009-01-08 03:40:17 +00007823 {
7824 .vendor = "ST",
7825 .name = "M25P40-old",
hailfingere1e41ea2011-07-27 07:13:06 +00007826 .bustype = BUS_SPI,
hailfinger59a83572010-05-28 17:07:57 +00007827 .manufacture_id = 0, /* Not used. */
hailfinger286829b2009-01-08 03:40:17 +00007828 .model_id = ST_M25P40_RES,
7829 .total_size = 512,
7830 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007831 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00007832 .tested = TEST_UNTESTED,
hailfinger59a83572010-05-28 17:07:57 +00007833 .probe = probe_spi_res1,
hailfingere3095d92009-06-05 13:46:17 +00007834 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007835 .block_erasers =
7836 {
7837 {
7838 .eraseblocks = { {64 * 1024, 8} },
7839 .block_erase = spi_block_erase_d8,
7840 }, {
7841 .eraseblocks = { {512 * 1024, 1} },
7842 .block_erase = spi_block_erase_c7,
7843 }
7844 },
hailfingerb9560ee2010-07-14 20:21:22 +00007845 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007846 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007847 .read = spi_chip_read,
stepanaa1b6a22008-12-08 18:15:10 +00007848 },
7849
hailfinger286829b2009-01-08 03:40:17 +00007850 {
7851 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00007852 .name = "M25P64",
hailfingere1e41ea2011-07-27 07:13:06 +00007853 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007854 .manufacture_id = ST_ID,
7855 .model_id = ST_M25P64,
7856 .total_size = 8192,
7857 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007858 .feature_bits = FEATURE_UNBOUND_READ,
hailfinger286829b2009-01-08 03:40:17 +00007859 .tested = TEST_UNTESTED,
7860 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007861 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007862 .block_erasers =
7863 {
7864 {
7865 .eraseblocks = { {64 * 1024, 128} },
7866 .block_erase = spi_block_erase_d8,
7867 }, {
7868 .eraseblocks = { {8 * 1024 * 1024, 1} },
7869 .block_erase = spi_block_erase_c7,
7870 }
7871 },
hailfingerb9560ee2010-07-14 20:21:22 +00007872 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007873 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007874 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007875 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007876 },
7877
hailfinger286829b2009-01-08 03:40:17 +00007878 {
7879 .vendor = "ST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007880 .name = "M25P80",
hailfingere1e41ea2011-07-27 07:13:06 +00007881 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00007882 .manufacture_id = ST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10007883 .model_id = ST_M25P80,
7884 .total_size = 1024,
hailfinger286829b2009-01-08 03:40:17 +00007885 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007886 .feature_bits = FEATURE_UNBOUND_READ,
7887 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00007888 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00007889 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00007890 .block_erasers =
7891 {
7892 {
Alan Greend76dc1f2019-06-26 15:38:19 +10007893 .eraseblocks = { {64 * 1024, 16} },
snelsone0c56352010-01-19 16:08:51 +00007894 .block_erase = spi_block_erase_d8,
7895 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10007896 .eraseblocks = { {1024 * 1024, 1} },
snelsone0c56352010-01-19 16:08:51 +00007897 .block_erase = spi_block_erase_c7,
7898 }
7899 },
hailfingerb9560ee2010-07-14 20:21:22 +00007900 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00007901 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00007902 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00007903 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007904 },
7905
hailfinger286829b2009-01-08 03:40:17 +00007906 {
7907 .vendor = "ST",
hailfinger38fd4992011-03-06 18:45:40 +00007908 .name = "M25PX16",
hailfingere1e41ea2011-07-27 07:13:06 +00007909 .bustype = BUS_SPI,
hailfinger38fd4992011-03-06 18:45:40 +00007910 .manufacture_id = ST_ID,
7911 .model_id = ST_M25PX16,
7912 .total_size = 2048,
7913 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07007914 /* OTP: 64B total; read 0x4B; write 0x42 */
7915 .feature_bits = FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricks488cf072015-11-23 16:45:07 -08007916 .tested = TEST_OK_PREWU,
hailfinger38fd4992011-03-06 18:45:40 +00007917 .probe = probe_spi_rdid,
7918 .probe_timing = TIMING_ZERO,
7919 .block_erasers =
7920 {
7921 {
7922 .eraseblocks = { { 4 * 1024, 512 } },
7923 .block_erase = spi_block_erase_20,
7924 }, {
7925 .eraseblocks = { {64 * 1024, 32} },
7926 .block_erase = spi_block_erase_d8,
7927 }, {
7928 .eraseblocks = { {2 * 1024 * 1024, 1} },
7929 .block_erase = spi_block_erase_c7,
7930 }
7931 },
7932 .unlock = spi_disable_blockprotect,
7933 .write = spi_chip_write_256,
7934 .read = spi_chip_read,
7935 },
7936
7937 {
7938 .vendor = "ST",
uwe8b50b592010-09-14 13:16:01 +00007939 .name = "M25PX32",
hailfingere1e41ea2011-07-27 07:13:06 +00007940 .bustype = BUS_SPI,
uwe8b50b592010-09-14 13:16:01 +00007941 .manufacture_id = ST_ID,
7942 .model_id = ST_M25PX32,
7943 .total_size = 4096,
7944 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08007945 .feature_bits = FEATURE_UNBOUND_READ,
7946 .tested = TEST_OK_PREU,
uwe8b50b592010-09-14 13:16:01 +00007947 .probe = probe_spi_rdid,
7948 .probe_timing = TIMING_ZERO,
7949 .block_erasers =
7950 {
7951 {
7952 .eraseblocks = { { 4 * 1024, 1024 } },
7953 .block_erase = spi_block_erase_20,
7954 }, {
7955 .eraseblocks = { {64 * 1024, 64} },
7956 .block_erase = spi_block_erase_d8,
7957 }, {
7958 .eraseblocks = { {4 * 1024 * 1024, 1} },
7959 .block_erase = spi_block_erase_c7,
7960 }
7961 },
7962 .unlock = spi_disable_blockprotect,
7963 .write = spi_chip_write_256,
7964 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00007965 .voltage = {2700, 3600},
uwe8b50b592010-09-14 13:16:01 +00007966 },
7967
7968 {
7969 .vendor = "ST",
Alan Greend76dc1f2019-06-26 15:38:19 +10007970 .name = "M25PX64",
7971 .bustype = BUS_SPI,
7972 .manufacture_id = ST_ID,
7973 .model_id = ST_M25PX64,
7974 .total_size = 8192,
7975 .page_size = 256,
7976 .feature_bits = FEATURE_UNBOUND_READ,
7977 .tested = TEST_OK_PREU,
7978 .probe = probe_spi_rdid,
7979 .probe_timing = TIMING_ZERO,
7980 .block_erasers =
7981 {
7982 {
7983 .eraseblocks = { { 4 * 1024, 2048 } },
7984 .block_erase = spi_block_erase_20,
7985 }, {
7986 .eraseblocks = { {64 * 1024, 128} },
7987 .block_erase = spi_block_erase_d8,
7988 }, {
7989 .eraseblocks = { {8 * 1024 * 1024, 1} },
7990 .block_erase = spi_block_erase_c7,
7991 }
7992 },
7993 .unlock = spi_disable_blockprotect,
7994 .write = spi_chip_write_256,
7995 .read = spi_chip_read,
7996 },
7997
7998 {
7999 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008000 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00008001 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008002 .manufacture_id = ST_ID,
8003 .model_id = ST_M29F002B,
8004 .total_size = 256,
8005 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008006 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008007 .tested = TEST_UNTESTED,
8008 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008009 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008010 .block_erasers =
8011 {
8012 {
8013 .eraseblocks = {
8014 {16 * 1024, 1},
8015 {8 * 1024, 2},
8016 {32 * 1024, 1},
8017 {64 * 1024, 3},
8018 },
8019 .block_erase = erase_sector_jedec,
8020 }, {
8021 .eraseblocks = { {256 * 1024, 1} },
8022 .block_erase = erase_chip_block_jedec,
8023 }
8024 },
snelsonc6855342010-01-28 23:55:12 +00008025 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008026 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008027 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008028 },
8029
hailfinger286829b2009-01-08 03:40:17 +00008030 {
8031 .vendor = "ST",
8032 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +00008033 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008034 .manufacture_id = ST_ID,
8035 .model_id = ST_M29F002T,
8036 .total_size = 256,
8037 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008038 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
8039 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00008040 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008041 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008042 .block_erasers =
8043 {
8044 {
8045 .eraseblocks = {
8046 {64 * 1024, 3},
8047 {32 * 1024, 1},
8048 {8 * 1024, 2},
8049 {16 * 1024, 1},
8050 },
8051 .block_erase = erase_sector_jedec,
8052 }, {
8053 .eraseblocks = { {256 * 1024, 1} },
8054 .block_erase = erase_chip_block_jedec,
8055 }
8056 },
snelsonc6855342010-01-28 23:55:12 +00008057 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008058 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00008059 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00008060 },
8061
hailfinger286829b2009-01-08 03:40:17 +00008062 {
8063 .vendor = "ST",
8064 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008065 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008066 .manufacture_id = ST_ID,
8067 .model_id = ST_M29F040B,
8068 .total_size = 512,
8069 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008070 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
8071 .tested = TEST_UNTESTED,
8072 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00008073 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +00008074 .block_erasers =
8075 {
8076 {
8077 .eraseblocks = { {64 * 1024, 8}, },
snelsonc6855342010-01-28 23:55:12 +00008078 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +00008079 }, {
8080 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00008081 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +00008082 }
8083 },
snelsonc6855342010-01-28 23:55:12 +00008084 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008085 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008086 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008087 },
8088
hailfinger286829b2009-01-08 03:40:17 +00008089 {
snelsonc6855342010-01-28 23:55:12 +00008090 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00008091 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +00008092 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +00008093 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +00008094 .manufacture_id = ST_ID,
8095 .model_id = ST_M29F400BB,
8096 .total_size = 512,
8097 .page_size = 64 * 1024,
8098 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00008099 .tested = TEST_UNTESTED,
hailfingerfa513302010-07-16 22:07:20 +00008100 .probe = probe_m29f400bt,
8101 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
8102 .block_erasers =
8103 {
8104 {
8105 .eraseblocks = {
8106 {16 * 1024, 1},
8107 {8 * 1024, 2},
8108 {32 * 1024, 1},
8109 {64 * 1024, 7},
8110 },
8111 .block_erase = block_erase_m29f400bt,
8112 }, {
8113 .eraseblocks = { {512 * 1024, 1} },
8114 .block_erase = block_erase_chip_m29f400bt,
8115 }
8116 },
hailfinger86bf3b52010-10-13 21:49:30 +00008117 .write = write_m29f400bt,
hailfingerfa513302010-07-16 22:07:20 +00008118 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008119 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +00008120 },
Alan Green753a38e2019-06-07 14:44:32 +10008121
hailfingerfa513302010-07-16 22:07:20 +00008122 {
8123 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
8124 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +00008125 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +00008126 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008127 .manufacture_id = ST_ID,
8128 .model_id = ST_M29F400BT,
8129 .total_size = 512,
8130 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008131 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008132 .tested = TEST_UNTESTED,
8133 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +00008134 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelsone0c56352010-01-19 16:08:51 +00008135 .block_erasers =
8136 {
8137 {
8138 .eraseblocks = {
8139 {64 * 1024, 7},
8140 {32 * 1024, 1},
8141 {8 * 1024, 2},
8142 {16 * 1024, 1},
8143 },
8144 .block_erase = block_erase_m29f400bt,
8145 }, {
8146 .eraseblocks = { {512 * 1024, 1} },
8147 .block_erase = block_erase_chip_m29f400bt,
8148 }
8149 },
hailfingerfa513302010-07-16 22:07:20 +00008150 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +00008151 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008152 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008153 },
8154
hailfinger286829b2009-01-08 03:40:17 +00008155 {
8156 .vendor = "ST",
8157 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +00008158 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008159 .manufacture_id = ST_ID,
8160 .model_id = ST_M29W010B,
8161 .total_size = 128,
8162 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008163 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008164 .tested = TEST_UNTESTED,
8165 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008166 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008167 .block_erasers =
8168 {
8169 {
8170 .eraseblocks = { {16 * 1024, 8}, },
8171 .block_erase = erase_sector_jedec,
8172 }, {
8173 .eraseblocks = { {128 * 1024, 1} },
8174 .block_erase = erase_chip_block_jedec,
8175 }
8176 },
snelsonc6855342010-01-28 23:55:12 +00008177 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008178 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008179 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008180 },
8181
hailfinger286829b2009-01-08 03:40:17 +00008182 {
8183 .vendor = "ST",
8184 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008185 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00008186 .manufacture_id = ST_ID,
8187 .model_id = ST_M29W040B,
8188 .total_size = 512,
8189 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00008190 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008191 .tested = TEST_UNTESTED,
8192 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008193 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008194 .block_erasers =
8195 {
8196 {
8197 .eraseblocks = { {64 * 1024, 8}, },
8198 .block_erase = erase_sector_jedec,
8199 }, {
8200 .eraseblocks = { {512 * 1024, 1} },
8201 .block_erase = erase_chip_block_jedec,
8202 }
8203 },
snelsonc6855342010-01-28 23:55:12 +00008204 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008205 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008206 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008207 },
8208
Alan Green753a38e2019-06-07 14:44:32 +10008209 {
8210 .vendor = "ST",
8211 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +00008212 .bustype = BUS_PARALLEL,
Alan Green753a38e2019-06-07 14:44:32 +10008213 .manufacture_id = ST_ID,
8214 .model_id = ST_M29W512B,
Alan Greena7cfa332019-06-24 15:48:14 +10008215 .total_size = 64,
8216 .page_size = 64 * 1024,
8217 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00008218 .tested = TEST_OK_PRE,
Alan Green753a38e2019-06-07 14:44:32 +10008219 .probe = probe_jedec,
8220 .probe_timing = TIMING_ZERO,
8221 .block_erasers =
8222 {
8223 {
8224 .eraseblocks = { {64 * 1024, 1} },
8225 .block_erase = erase_chip_block_jedec,
8226 }
8227 },
8228 .write = write_jedec_1,
8229 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008230 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +10008231 },
snelson91cd0662010-02-01 05:49:46 +00008232
hailfinger286829b2009-01-08 03:40:17 +00008233 {
8234 .vendor = "ST",
8235 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +00008236 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008237 .manufacture_id = ST_ID,
8238 .model_id = ST_M50FLW040A,
8239 .total_size = 512,
8240 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008241 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008242 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008243 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008244 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008245 .block_erasers =
8246 {
8247 {
snelsonf88616b2010-01-19 16:39:19 +00008248 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008249 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008250 {64 * 1024, 5}, /* block */
8251 {4 * 1024, 16}, /* sector */
8252 {4 * 1024, 16}, /* sector */
8253 },
8254 .block_erase = NULL,
8255 }, {
snelsone0c56352010-01-19 16:08:51 +00008256 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008257 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008258 }
8259 },
snelsonc0acbeb2010-03-19 18:47:06 +00008260 .unlock = unlock_stm50flw0x0x,
8261 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008262 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008263 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008264 },
8265
hailfinger286829b2009-01-08 03:40:17 +00008266 {
8267 .vendor = "ST",
8268 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +00008269 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008270 .manufacture_id = ST_ID,
8271 .model_id = ST_M50FLW040B,
8272 .total_size = 512,
8273 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008274 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008275 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008276 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008277 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008278 .block_erasers =
8279 {
8280 {
snelsonf88616b2010-01-19 16:39:19 +00008281 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008282 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008283 {4 * 1024, 16}, /* sector */
8284 {64 * 1024, 5}, /* block */
8285 {4 * 1024, 16}, /* sector */
8286 },
8287 .block_erase = NULL,
8288 }, {
snelsone0c56352010-01-19 16:08:51 +00008289 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008290 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008291 }
8292 },
snelsonc0acbeb2010-03-19 18:47:06 +00008293 .unlock = unlock_stm50flw0x0x,
8294 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008295 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008296 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008297 },
8298
hailfinger286829b2009-01-08 03:40:17 +00008299 {
8300 .vendor = "ST",
8301 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +00008302 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008303 .manufacture_id = ST_ID,
8304 .model_id = ST_M50FLW080A,
8305 .total_size = 1024,
8306 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008307 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +00008308 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +00008309 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008310 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008311 .block_erasers =
8312 {
8313 {
snelsonf88616b2010-01-19 16:39:19 +00008314 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008315 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008316 {64 * 1024, 13}, /* block */
8317 {4 * 1024, 16}, /* sector */
8318 {4 * 1024, 16}, /* sector */
8319 },
8320 .block_erase = NULL,
8321 }, {
snelsone0c56352010-01-19 16:08:51 +00008322 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008323 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008324 }
8325 },
snelsonc0acbeb2010-03-19 18:47:06 +00008326 .unlock = unlock_stm50flw0x0x,
8327 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008328 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008329 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008330 },
8331
hailfinger286829b2009-01-08 03:40:17 +00008332 {
8333 .vendor = "ST",
8334 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +00008335 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008336 .manufacture_id = ST_ID,
8337 .model_id = ST_M50FLW080B,
8338 .total_size = 1024,
8339 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008340 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008341 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008342 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +00008343 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +00008344 .block_erasers =
8345 {
8346 {
snelsonf88616b2010-01-19 16:39:19 +00008347 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +00008348 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +00008349 {4 * 1024, 16}, /* sector */
8350 {64 * 1024, 13}, /* block */
8351 {4 * 1024, 16}, /* sector */
8352 },
8353 .block_erase = NULL,
8354 }, {
snelsone0c56352010-01-19 16:08:51 +00008355 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008356 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008357 }
8358 },
snelsonc0acbeb2010-03-19 18:47:06 +00008359 .unlock = unlock_stm50flw0x0x,
8360 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008361 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008362 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008363 },
8364
hailfinger286829b2009-01-08 03:40:17 +00008365 {
8366 .vendor = "ST",
8367 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +00008368 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008369 .manufacture_id = ST_ID,
8370 .model_id = ST_M50FW002,
8371 .total_size = 256,
8372 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008373 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008374 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008375 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008376 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelsone0c56352010-01-19 16:08:51 +00008377 .block_erasers =
8378 {
8379 {
8380 .eraseblocks = {
8381 {64 * 1024, 3},
8382 {32 * 1024, 1},
8383 {8 * 1024, 2},
8384 {16 * 1024, 1},
8385 },
snelsonc0acbeb2010-03-19 18:47:06 +00008386 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008387 }
8388 },
snelsonc0acbeb2010-03-19 18:47:06 +00008389 .unlock = unlock_stm50flw0x0x,
8390 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008391 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008392 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008393 },
8394
hailfinger286829b2009-01-08 03:40:17 +00008395 {
8396 .vendor = "ST",
8397 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +00008398 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008399 .manufacture_id = ST_ID,
8400 .model_id = ST_M50FW016,
8401 .total_size = 2048,
8402 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008403 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008404 .tested = TEST_UNTESTED,
8405 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008406 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008407 .block_erasers =
8408 {
8409 {
8410 .eraseblocks = { {64 * 1024, 32}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008411 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008412 }
8413 },
snelsonc0acbeb2010-03-19 18:47:06 +00008414 .unlock = unlock_stm50flw0x0x,
8415 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008416 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008417 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008418 },
8419
hailfinger286829b2009-01-08 03:40:17 +00008420 {
8421 .vendor = "ST",
8422 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +00008423 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008424 .manufacture_id = ST_ID,
8425 .model_id = ST_M50FW040,
8426 .total_size = 512,
8427 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008428 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00008429 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00008430 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008431 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008432 .block_erasers =
8433 {
8434 {
8435 .eraseblocks = { {64 * 1024, 8}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008436 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008437 }
8438 },
snelsonc0acbeb2010-03-19 18:47:06 +00008439 .unlock = unlock_stm50flw0x0x,
8440 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008441 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008442 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008443 },
8444
hailfinger286829b2009-01-08 03:40:17 +00008445 {
8446 .vendor = "ST",
8447 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +00008448 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008449 .manufacture_id = ST_ID,
8450 .model_id = ST_M50FW080,
8451 .total_size = 1024,
8452 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008453 .feature_bits = FEATURE_REGISTERMAP,
stefancte0e52902011-05-26 14:28:51 +00008454 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008455 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +00008456 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +00008457 .block_erasers =
8458 {
8459 {
8460 .eraseblocks = { {64 * 1024, 16}, },
snelsonc0acbeb2010-03-19 18:47:06 +00008461 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008462 }
8463 },
snelsonc0acbeb2010-03-19 18:47:06 +00008464 .unlock = unlock_stm50flw0x0x,
8465 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008466 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008467 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008468 },
8469
hailfinger286829b2009-01-08 03:40:17 +00008470 {
8471 .vendor = "ST",
8472 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +00008473 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +00008474 .manufacture_id = ST_ID,
8475 .model_id = ST_M50LPW116,
8476 .total_size = 2048,
8477 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008478 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +00008479 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00008480 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +00008481 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008482 .block_erasers =
8483 {
8484 {
8485 .eraseblocks = {
8486 {4 * 1024, 16},
8487 {64 * 1024, 30},
8488 {32 * 1024, 1},
8489 {8 * 1024, 2},
8490 {16 * 1024, 1},
8491 },
snelsonc0acbeb2010-03-19 18:47:06 +00008492 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +00008493 }
8494 },
snelsonc0acbeb2010-03-19 18:47:06 +00008495 .unlock = unlock_stm50flw0x0x,
8496 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008497 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008498 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +00008499 },
8500
hailfinger286829b2009-01-08 03:40:17 +00008501 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008502 .vendor = "Sanyo",
8503 .name = "LF25FW203A",
8504 .bustype = BUS_SPI,
8505 .manufacture_id = SANYO_ID,
8506 .model_id = SANYO_LE25FW203A,
8507 .total_size = 2048,
8508 .page_size = 256,
8509 .feature_bits = FEATURE_UNBOUND_READ,
8510 .tested = TEST_UNTESTED,
8511 .probe = probe_spi_rdid,
8512 .probe_timing = TIMING_ZERO,
8513 .block_erasers =
8514 {
8515 {
8516 .eraseblocks = { {64 * 1024, 32} },
8517 .block_erase = spi_block_erase_d8,
8518 }, {
8519 .eraseblocks = { {2 * 1024 * 1024, 1} },
8520 .block_erase = spi_block_erase_c7,
8521 }
8522 },
8523 .unlock = spi_disable_blockprotect,
8524 .write = spi_chip_write_256,
8525 .read = spi_chip_read,
8526 },
8527
8528 {
8529 .vendor = "Sharp",
8530 .name = "LH28F008BJT-BTLZ1",
8531 .bustype = BUS_PARALLEL,
8532 .manufacture_id = SHARP_ID,
8533 .model_id = SHARP_LH28F008BJ__PB,
8534 .total_size = 1024,
8535 .page_size = 64 * 1024,
8536 .tested = TEST_OK_PREW,
8537 .probe = probe_82802ab,
8538 .probe_timing = TIMING_ZERO,
8539 .block_erasers =
8540 {
8541 {
8542 .eraseblocks = {
8543 {8 * 1024, 8},
8544 {64 * 1024, 15}
8545 },
8546 .block_erase = erase_block_82802ab,
8547 }, {
8548 .eraseblocks = { {1024 * 1024, 1} },
8549 .block_erase = erase_sector_49lfxxxc,
8550 }
8551 },
8552 .unlock = unlock_lh28f008bjt,
8553 .write = write_82802ab,
8554 .read = read_memmapped,
8555 .voltage = {2700, 3600},
8556 },
8557
8558 {
8559 .vendor = "Sharp",
8560 .name = "LHF00L04",
8561 .bustype = BUS_FWH, /* A/A Mux */
8562 .manufacture_id = SHARP_ID,
8563 .model_id = SHARP_LHF00L04,
8564 .total_size = 1024,
8565 .page_size = 64 * 1024,
8566 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
8567 .tested = TEST_UNTESTED,
8568 .probe = probe_82802ab,
8569 .probe_timing = TIMING_ZERO,
8570 .block_erasers =
8571 {
8572 {
8573 .eraseblocks = {
8574 {64 * 1024, 15},
8575 {8 * 1024, 8}
8576 },
8577 .block_erase = erase_block_82802ab,
8578 }, {
8579 .eraseblocks = {
8580 {1024 * 1024, 1}
8581 },
8582 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
8583 },
8584 },
8585 .unlock = unlock_82802ab,
8586 .write = write_82802ab,
8587 .read = read_memmapped,
8588 .voltage = {3000, 3600},
8589 },
8590
8591 {
8592 .vendor = "Spansion",
8593 .name = "S25FL004A",
8594 .bustype = BUS_SPI,
8595 .manufacture_id = SPANSION_ID,
8596 .model_id = SPANSION_S25FL004A,
8597 .total_size = 512,
8598 .page_size = 256,
8599 .feature_bits = FEATURE_UNBOUND_READ,
8600 .tested = TEST_UNTESTED,
8601 .probe = probe_spi_rdid,
8602 .probe_timing = TIMING_ZERO,
8603 .block_erasers =
8604 {
8605 {
8606 .eraseblocks = { {64 * 1024, 8} },
8607 .block_erase = spi_block_erase_d8,
8608 }, {
8609 .eraseblocks = { {512 * 1024, 1} },
8610 .block_erase = spi_block_erase_c7,
8611 }
8612 },
8613 .unlock = spi_disable_blockprotect,
8614 .write = spi_chip_write_256,
8615 .read = spi_chip_read,
8616 .voltage = {2700, 3600},
8617 },
8618
8619 {
8620 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +10008621 .name = "S25FL008A",
8622 .bustype = BUS_SPI,
8623 .manufacture_id = SPANSION_ID,
8624 .model_id = SPANSION_S25FL008A,
8625 .total_size = 1024,
8626 .page_size = 256,
8627 .feature_bits = FEATURE_UNBOUND_READ,
8628 .tested = TEST_OK_PREU,
8629 .probe = probe_spi_rdid,
8630 .probe_timing = TIMING_ZERO,
8631 .block_erasers =
8632 {
8633 {
8634 .eraseblocks = { {64 * 1024, 16} },
8635 .block_erase = spi_block_erase_d8,
8636 }, {
8637 .eraseblocks = { {1024 * 1024, 1} },
8638 .block_erase = spi_block_erase_c7,
8639 }
8640 },
8641 .unlock = spi_disable_blockprotect,
8642 .write = spi_chip_write_256,
8643 .read = spi_chip_read,
8644 .voltage = {2700, 3600},
8645 },
8646
8647 {
8648 .vendor = "Spansion",
8649 .name = "S25FL016A",
8650 .bustype = BUS_SPI,
8651 .manufacture_id = SPANSION_ID,
8652 .model_id = SPANSION_S25FL016A,
8653 .total_size = 2048,
8654 .page_size = 256,
8655 .feature_bits = FEATURE_UNBOUND_READ,
8656 .tested = TEST_OK_PRU,
8657 .probe = probe_spi_rdid,
8658 .probe_timing = TIMING_ZERO,
8659 .block_erasers =
8660 {
8661 {
8662 .eraseblocks = { {64 * 1024, 32} },
8663 .block_erase = spi_block_erase_d8,
8664 }, {
8665 .eraseblocks = { {2 * 1024 * 1024, 1} },
8666 .block_erase = spi_block_erase_c7,
8667 }
8668 },
8669 .unlock = spi_disable_blockprotect,
8670 .write = spi_chip_write_256,
8671 .read = spi_chip_read,
8672 .voltage = {2700, 3600},
8673 },
8674
8675 {
8676 .vendor = "Spansion",
8677 .name = "S25FL032A",
8678 .bustype = BUS_SPI,
8679 .manufacture_id = SPANSION_ID,
8680 .model_id = SPANSION_S25FL032A,
8681 .total_size = 4096,
8682 .page_size = 256,
8683 .feature_bits = FEATURE_UNBOUND_READ,
8684 .tested = TEST_UNTESTED,
8685 .probe = probe_spi_rdid,
8686 .probe_timing = TIMING_ZERO,
8687 .block_erasers =
8688 {
8689 {
8690 .eraseblocks = { {64 * 1024, 64} },
8691 .block_erase = spi_block_erase_d8,
8692 }, {
8693 .eraseblocks = { {4 * 1024 * 1024, 1} },
8694 .block_erase = spi_block_erase_c7,
8695 }
8696 },
8697 .unlock = spi_disable_blockprotect,
8698 .write = spi_chip_write_256,
8699 .read = spi_chip_read,
8700 .voltage = {2700, 3600},
8701 },
8702
8703 {
8704 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +10008705 .name = "S25FL064A",
8706 .bustype = BUS_SPI,
8707 .manufacture_id = SPANSION_ID,
8708 .model_id = SPANSION_S25FL064A,
8709 .total_size = 8192,
8710 .page_size = 256,
8711 .feature_bits = FEATURE_UNBOUND_READ,
8712 .tested = TEST_OK_PREWU,
8713 .probe = probe_spi_rdid,
8714 .probe_timing = TIMING_ZERO,
8715 .block_erasers =
8716 {
8717 {
8718 .eraseblocks = { {64 * 1024, 128} },
8719 .block_erase = spi_block_erase_d8,
8720 }, {
8721 .eraseblocks = { {8 * 1024 * 1024, 1} },
8722 .block_erase = spi_block_erase_c7,
8723 }
8724 },
8725 .unlock = spi_disable_blockprotect,
8726 .write = spi_chip_write_256,
8727 .read = spi_chip_read,
8728 .voltage = {2700, 3600},
8729 },
8730
8731 {
8732 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +10008733 .name = "S25FL116K",
8734 .bustype = BUS_SPI,
8735 .manufacture_id = SPANSION_ID,
8736 .model_id = SPANSION_S25FL116K,
8737 .total_size = 2048,
8738 .page_size = 256,
8739 .feature_bits = FEATURE_UNBOUND_READ,
8740 .tested = TEST_OK_PREWU,
8741 .probe = probe_spi_rdid,
8742 .probe_timing = TIMING_ZERO,
8743 .block_erasers =
8744 {
8745 {
8746 .eraseblocks = { {4 * 1024, 512} },
8747 .block_erase = spi_block_erase_20,
8748 }, {
8749 .eraseblocks = { {64 * 1024, 32} },
8750 .block_erase = spi_block_erase_d8,
8751 }, {
8752 .eraseblocks = { {2 * 1024 * 1024, 1} },
8753 .block_erase = spi_block_erase_c7,
8754 }
8755 },
8756 .unlock = spi_disable_blockprotect,
8757 .write = spi_chip_write_256,
8758 .read = spi_chip_read,
8759 .voltage = {2700, 3600},
8760 /* TODO: write-protection */
8761 },
8762
8763 {
8764 .vendor = "Spansion",
8765 .name = "S25FL128S_UL Uniform 128 kB Sectors",
8766 .bustype = BUS_SPI,
8767 .manufacture_id = SPANSION_ID,
8768 .model_id = SPANSION_S25FL128S_UL,
8769 .total_size = 16384,
8770 .page_size = 256,
8771 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
8772 .tested = TEST_UNTESTED,
8773 .probe = probe_spi_big_spansion,
8774 .probe_timing = TIMING_ZERO,
8775 .block_erasers =
8776 {
8777 {
8778 .eraseblocks = { {128 * 1024, 128} },
8779 .block_erase = spi_block_erase_d8,
8780 }, {
8781 .eraseblocks = { {16 * 1024 * 1024, 1} },
8782 .block_erase = spi_block_erase_60,
8783 }, {
8784 .eraseblocks = { {16 * 1024 * 1024, 1} },
8785 .block_erase = spi_block_erase_c7,
8786 },
8787 },
8788 .unlock = spi_disable_blockprotect,
8789 .write = spi_chip_write_256,
8790 .read = spi_chip_read,
8791 .voltage = {1700, 2000},
8792 .wp = &wp_generic,
8793 },
8794
8795 {
8796 .vendor = "Spansion",
8797 .name = "S25FL128S_US Uniform 64 kB Sectors",
8798 .bustype = BUS_SPI,
8799 .manufacture_id = SPANSION_ID,
8800 .model_id = SPANSION_S25FL128S_US,
8801 .total_size = 16384,
8802 .page_size = 256,
8803 .feature_bits = FEATURE_WRSR_WREN,
8804 .tested = TEST_UNTESTED,
8805 .probe = probe_spi_big_spansion,
8806 .probe_timing = TIMING_ZERO,
8807 .block_erasers =
8808 {
8809 {
8810 .eraseblocks = { {64 * 1024, 256} },
8811 .block_erase = spi_block_erase_d8,
8812 }, {
8813 .eraseblocks = { {16 * 1024 * 1024, 1} },
8814 .block_erase = spi_block_erase_60,
8815 }, {
8816 .eraseblocks = { {16 * 1024 * 1024, 1} },
8817 .block_erase = spi_block_erase_c7,
8818 },
8819 },
8820 .unlock = spi_disable_blockprotect,
8821 .write = spi_chip_write_256,
8822 .read = spi_chip_read,
8823 .voltage = {1700, 2000},
8824 .wp = &wp_generic,
8825 },
8826
8827 {
8828 .vendor = "Spansion",
8829 .name = "S25FL256S Large Sectors",
8830 .bustype = BUS_SPI,
8831 .manufacture_id = SPANSION_ID,
8832 .model_id = SPANSION_S25FL256S_UL,
8833 .total_size = 16384, /* This is just half the size.... */
8834 .page_size = 256,
8835 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
8836 .tested = TEST_UNTESTED,
8837 .probe = probe_spi_big_spansion,
8838 .probe_timing = TIMING_ZERO,
8839 .block_erasers =
8840 {
8841 {
8842 .eraseblocks = { {256 * 1024, 64} },
8843 .block_erase = s25fl_block_erase,
8844 }, {
8845 .eraseblocks = { {16 * 1024 * 1024, 1} },
8846 .block_erase = spi_block_erase_60,
8847 },
8848 },
8849 .unlock = spi_disable_blockprotect,
8850 .write = spi_chip_write_256,
8851 .read = spi_chip_read,
8852 .voltage = {1700, 2000},
8853 .wp = &wp_generic,
8854 },
8855
8856 {
8857 .vendor = "Spansion",
8858 .name = "S25FL256S Small Sectors",
8859 .bustype = BUS_SPI,
8860 .manufacture_id = SPANSION_ID,
8861 .model_id = SPANSION_S25FL256S_US,
8862 .total_size = 16384, /* This is just half the size.... */
8863 .page_size = 256,
8864 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
8865 .tested = TEST_OK_PREWU,
8866 .probe = probe_spi_big_spansion,
8867 .probe_timing = TIMING_ZERO,
8868 .block_erasers =
8869 {
8870 {
8871 .eraseblocks = { {64 * 1024, 256} },
8872 .block_erase = s25fl_block_erase,
8873 }, {
8874 .eraseblocks = { {16 * 1024 * 1024, 1} },
8875 .block_erase = spi_block_erase_60,
8876 },
8877 },
8878 .unlock = spi_disable_blockprotect,
8879 .write = spi_chip_write_256,
8880 .read = spi_chip_read,
8881 .voltage = {1700, 2000},
8882 .wp = &wp_generic,
8883 },
8884
8885 {
8886 .vendor = "Spansion",
8887 .name = "S25FS128S Large Sectors",
8888 .bustype = BUS_SPI,
8889 .manufacture_id = SPANSION_ID,
8890 .model_id = SPANSION_S25FS128S_L,
8891 .total_size = 16384,
8892 .page_size = 256,
8893 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
8894 .tested = TEST_UNTESTED,
8895 .probe = probe_spi_big_spansion,
8896 .probe_timing = TIMING_ZERO,
8897 .block_erasers =
8898 {
8899 {
8900 .eraseblocks = { {64 * 1024, 256} },
8901 .block_erase = s25fs_block_erase_d8,
8902 }, {
8903 .eraseblocks = { {16 * 1024 * 1024, 1} },
8904 .block_erase = spi_block_erase_60,
8905 }, {
8906 .eraseblocks = { {16 * 1024 * 1024, 1} },
8907 .block_erase = spi_block_erase_c7,
8908 },
8909 },
8910 .unlock = spi_disable_blockprotect,
8911 .write = spi_chip_write_256,
8912 .read = spi_chip_read,
8913 .voltage = {1700, 2000},
8914 .wp = &wp_generic,
8915 },
8916
8917 {
8918 .vendor = "Spansion",
8919 .name = "S25FS128S Small Sectors",
8920 .bustype = BUS_SPI,
8921 .manufacture_id = SPANSION_ID,
8922 .model_id = SPANSION_S25FS128S_S,
8923 .total_size = 16384,
8924 .page_size = 256,
8925 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
8926 .tested = TEST_OK_PREWU,
8927 .probe = probe_spi_big_spansion,
8928 .probe_timing = TIMING_ZERO,
8929 .block_erasers =
8930 {
8931 {
8932 .eraseblocks = { {64 * 1024, 256} },
8933 .block_erase = s25fs_block_erase_d8,
8934 }, {
8935 .eraseblocks = { {16 * 1024 * 1024, 1} },
8936 .block_erase = spi_block_erase_60,
8937 }, {
8938 .eraseblocks = { {16 * 1024 * 1024, 1} },
8939 .block_erase = spi_block_erase_c7,
8940 },
8941 },
8942 .unlock = spi_disable_blockprotect,
8943 .write = spi_chip_write_256,
8944 .read = spi_chip_read,
8945 .voltage = {1700, 2000},
8946 .wp = &wp_generic,
8947 },
8948
8949 {
hailfinger0ae231d2010-07-29 20:01:13 +00008950 .vendor = "SyncMOS/MoselVitelic",
8951 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +00008952 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00008953 .manufacture_id = SYNCMOS_MVC_ID,
8954 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +00008955 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +00008956 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00008957 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00008958 .tested = TEST_UNTESTED,
8959 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00008960 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00008961 .block_erasers =
8962 {
8963 {
8964 .eraseblocks = { {512, 256} },
8965 .block_erase = erase_sector_jedec,
8966 }, {
8967 .eraseblocks = { {128 * 1024, 1} },
8968 .block_erase = erase_chip_block_jedec,
8969 },
8970 },
snelsonc6855342010-01-28 23:55:12 +00008971 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00008972 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008973 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00008974 },
8975
hailfinger286829b2009-01-08 03:40:17 +00008976 {
hailfinger0ae231d2010-07-29 20:01:13 +00008977 .vendor = "SyncMOS/MoselVitelic",
8978 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +00008979 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00008980 .manufacture_id = SYNCMOS_MVC_ID,
8981 .model_id = SM_MVC_29C51001T,
8982 .total_size = 128,
8983 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +00008984 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +00008985 .tested = TEST_UNTESTED,
8986 .probe = probe_jedec,
8987 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8988 .block_erasers =
8989 {
8990 {
8991 .eraseblocks = { {512, 256} },
8992 .block_erase = erase_sector_jedec,
8993 }, {
8994 .eraseblocks = { {128 * 1024, 1} },
8995 .block_erase = erase_chip_block_jedec,
8996 },
8997 },
8998 .write = write_jedec_1,
8999 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009000 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009001 },
9002
9003 {
9004 .vendor = "SyncMOS/MoselVitelic",
9005 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +00009006 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009007 .manufacture_id = SYNCMOS_MVC_ID,
9008 .model_id = SM_MVC_29C51002B,
9009 .total_size = 256,
9010 .page_size = 512,
9011 .feature_bits = FEATURE_EITHER_RESET,
9012 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00009013 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009014 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009015 .block_erasers =
9016 {
9017 {
9018 .eraseblocks = { {512, 512} },
9019 .block_erase = erase_sector_jedec,
9020 }, {
9021 .eraseblocks = { {256 * 1024, 1} },
9022 .block_erase = erase_chip_block_jedec,
9023 },
9024 },
snelsonc6855342010-01-28 23:55:12 +00009025 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009026 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +00009027 },
9028
hailfinger286829b2009-01-08 03:40:17 +00009029 {
hailfinger0ae231d2010-07-29 20:01:13 +00009030 .vendor = "SyncMOS/MoselVitelic",
9031 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +00009032 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009033 .manufacture_id = SYNCMOS_MVC_ID,
9034 .model_id = SM_MVC_29C51002T,
9035 .total_size = 256,
9036 .page_size = 512,
9037 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009038 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +00009039 .probe = probe_jedec,
9040 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9041 .block_erasers =
9042 {
9043 {
9044 .eraseblocks = { {512, 512} },
9045 .block_erase = erase_sector_jedec,
9046 }, {
9047 .eraseblocks = { {256 * 1024, 1} },
9048 .block_erase = erase_chip_block_jedec,
9049 },
9050 },
9051 .write = write_jedec_1,
9052 .read = read_memmapped,
9053 },
9054
9055 {
9056 .vendor = "SyncMOS/MoselVitelic",
9057 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009058 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009059 .manufacture_id = SYNCMOS_MVC_ID,
9060 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +00009061 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +00009062 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +00009063 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009064 .tested = TEST_UNTESTED,
9065 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009066 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +00009067 .block_erasers =
9068 {
9069 {
hailfinger0ae231d2010-07-29 20:01:13 +00009070 .eraseblocks = { {1024, 512} },
9071 .block_erase = erase_sector_jedec,
9072 }, {
9073 .eraseblocks = { {512 * 1024, 1} },
9074 .block_erase = erase_chip_block_jedec,
9075 },
9076 },
9077 .write = write_jedec_1,
9078 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009079 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009080 },
9081
9082 {
9083 .vendor = "SyncMOS/MoselVitelic",
9084 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009085 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009086 .manufacture_id = SYNCMOS_MVC_ID,
9087 .model_id = SM_MVC_29C51004T,
9088 .total_size = 512,
9089 .page_size = 1024,
9090 .feature_bits = FEATURE_EITHER_RESET,
9091 .tested = TEST_UNTESTED,
9092 .probe = probe_jedec,
9093 .probe_timing = TIMING_ZERO,
9094 .block_erasers =
9095 {
9096 {
9097 .eraseblocks = { {1024, 512} },
9098 .block_erase = erase_sector_jedec,
9099 }, {
9100 .eraseblocks = { {512 * 1024, 1} },
9101 .block_erase = erase_chip_block_jedec,
9102 },
9103 },
9104 .write = write_jedec_1,
9105 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009106 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +00009107 },
9108
9109 {
9110 .vendor = "SyncMOS/MoselVitelic",
9111 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +00009112 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009113 .manufacture_id = SYNCMOS_MVC_ID,
9114 .model_id = SM_MVC_29C31004B,
9115 .total_size = 512,
9116 .page_size = 1024,
9117 .feature_bits = FEATURE_EITHER_RESET,
9118 .tested = TEST_UNTESTED,
9119 .probe = probe_jedec,
9120 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9121 .block_erasers =
9122 {
9123 {
9124 .eraseblocks = { {1024, 512} },
9125 .block_erase = erase_sector_jedec,
9126 }, {
9127 .eraseblocks = { {512 * 1024, 1} },
9128 .block_erase = erase_chip_block_jedec,
9129 },
9130 },
9131 .write = write_jedec_1,
9132 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009133 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +00009134 },
9135
9136 {
9137 .vendor = "SyncMOS/MoselVitelic",
9138 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +00009139 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +00009140 .manufacture_id = SYNCMOS_MVC_ID,
9141 .model_id = SM_MVC_29C31004T,
9142 .total_size = 512,
9143 .page_size = 1024,
9144 .feature_bits = FEATURE_EITHER_RESET,
9145 .tested = TEST_UNTESTED,
9146 .probe = probe_jedec,
9147 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
9148 .block_erasers =
9149 {
9150 {
9151 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +00009152 .block_erase = erase_sector_jedec,
9153 }, {
9154 .eraseblocks = { {512 * 1024, 1} },
9155 .block_erase = erase_chip_block_jedec,
9156 },
9157 },
snelsonc6855342010-01-28 23:55:12 +00009158 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009159 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009160 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00009161 },
9162
hailfinger286829b2009-01-08 03:40:17 +00009163 {
uwe77048c72009-05-27 23:17:40 +00009164 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009165 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +00009166 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009167 .manufacture_id = TI_OLD_ID,
9168 .model_id = TI_TMS29F002RB,
9169 .total_size = 256,
9170 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009171 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009172 .tested = TEST_UNTESTED,
9173 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009174 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009175 .block_erasers =
9176 {
9177 {
9178 .eraseblocks = {
9179 {16 * 1024, 1},
9180 {8 * 1024, 2},
9181 {32 * 1024, 1},
9182 {64 * 1024, 3},
9183 },
9184 .block_erase = erase_sector_jedec,
9185 }, {
9186 .eraseblocks = { {256 * 1024, 1} },
9187 .block_erase = erase_chip_block_jedec,
9188 },
9189 },
snelsonc6855342010-01-28 23:55:12 +00009190 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009191 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009192 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009193 },
9194
9195 {
uwe77048c72009-05-27 23:17:40 +00009196 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +00009197 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +00009198 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +00009199 .manufacture_id = TI_OLD_ID,
9200 .model_id = TI_TMS29F002RT,
9201 .total_size = 256,
9202 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +00009203 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +00009204 .tested = TEST_UNTESTED,
9205 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009206 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +00009207 .block_erasers =
9208 {
9209 {
9210 .eraseblocks = {
9211 {64 * 1024, 3},
9212 {32 * 1024, 1},
9213 {8 * 1024, 2},
9214 {16 * 1024, 1},
9215 },
9216 .block_erase = erase_sector_jedec,
9217 }, {
9218 .eraseblocks = { {256 * 1024, 1} },
9219 .block_erase = erase_chip_block_jedec,
9220 },
9221 },
snelsonc6855342010-01-28 23:55:12 +00009222 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +00009223 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009224 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +00009225 },
9226
9227 {
hailfinger286829b2009-01-08 03:40:17 +00009228 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -08009229 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +00009230 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +00009231 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009232 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -08009233 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +00009234 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07009235 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9236 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
Duncan Laurie96c67aa2015-10-26 13:21:46 -07009237 .tested = TEST_OK_PREWU,
stefancte0e52902011-05-26 14:28:51 +00009238 .probe = probe_spi_rdid,
9239 .probe_timing = TIMING_ZERO,
9240 .block_erasers =
9241 {
9242 {
David Hendricks9356d162015-03-06 14:07:25 -08009243 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +00009244 .block_erase = spi_block_erase_20,
9245 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009246 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +00009247 .block_erase = spi_block_erase_52,
9248 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009249 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +00009250 .block_erase = spi_block_erase_d8,
9251 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009252 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009253 .block_erase = spi_block_erase_60,
9254 }, {
David Hendricks9356d162015-03-06 14:07:25 -08009255 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +00009256 .block_erase = spi_block_erase_c7,
9257 }
9258 },
9259 .unlock = spi_disable_blockprotect,
9260 .write = spi_chip_write_256,
9261 .read = spi_chip_read,
Duncan Laurieed32d7b2015-05-27 11:28:18 -07009262 .wp = &wp_w25q,
stefancte0e52902011-05-26 14:28:51 +00009263 },
9264
9265 {
9266 .vendor = "Winbond",
Stephen Barber6e15a532015-05-22 16:23:39 -07009267 .name = "W25Q128FW",
9268 .bustype = BUS_SPI,
9269 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +01009270 .model_id = WINBOND_NEX_W25Q128_W,
Stephen Barber6e15a532015-05-22 16:23:39 -07009271 .total_size = 16384,
9272 .page_size = 256,
David Hendricks07153282016-12-22 16:07:00 -08009273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
David Hendricksb8696182016-05-20 16:38:35 -07009274 .tested = TEST_OK_PREWU,
Stephen Barber6e15a532015-05-22 16:23:39 -07009275 .probe = probe_spi_rdid,
9276 .probe_timing = TIMING_ZERO,
9277 .block_erasers =
9278 {
9279 {
9280 .eraseblocks = { {4 * 1024, 4096} },
9281 .block_erase = spi_block_erase_20,
9282 }, {
9283 .eraseblocks = { {32 * 1024, 512} },
9284 .block_erase = spi_block_erase_52,
9285 }, {
9286 .eraseblocks = { {64 * 1024, 256} },
9287 .block_erase = spi_block_erase_d8,
9288 }, {
9289 .eraseblocks = { {16 * 1024 * 1024, 1} },
9290 .block_erase = spi_block_erase_60,
9291 }, {
9292 .eraseblocks = { {16 * 1024 * 1024, 1} },
9293 .block_erase = spi_block_erase_c7,
9294 }
9295 },
9296 .unlock = spi_disable_blockprotect,
9297 .write = spi_chip_write_256,
9298 .read = spi_chip_read,
David Hendricks07153282016-12-22 16:07:00 -08009299 /*
9300 * W25Q128FW is a 1.8V chip, however 3.3V variants with the same
9301 * model ID exist. We'll err on the side of caution here. A user
9302 * with a 3.3V chip sharing the model ID will need to either
9303 * specify voltage on the command line or duplicate this struct
9304 * with a different name/voltage and specify it with "-c".
9305 */
9306 .voltage = {1650, 1950},
Duncan Laurieed32d7b2015-05-27 11:28:18 -07009307 .wp = &wp_w25q,
Stephen Barber6e15a532015-05-22 16:23:39 -07009308 },
9309
9310 {
9311 .vendor = "Winbond",
Martin Rothee8dcf92017-05-10 19:16:19 -06009312 .name = "W25Q128J",
9313 .bustype = BUS_SPI,
9314 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +10009315 .model_id = WINBOND_NEX_W25Q128_V_M,
Martin Rothee8dcf92017-05-10 19:16:19 -06009316 .total_size = 16384,
9317 .page_size = 256,
9318 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9319 .tested = TEST_OK_PREWU,
9320 .probe = probe_spi_rdid,
9321 .probe_timing = TIMING_ZERO,
9322 .block_erasers =
9323 {
9324 {
9325 .eraseblocks = { {4 * 1024, 4096} },
9326 .block_erase = spi_block_erase_20,
9327 }, {
9328 .eraseblocks = { {32 * 1024, 512} },
9329 .block_erase = spi_block_erase_52,
9330 }, {
9331 .eraseblocks = { {64 * 1024, 256} },
9332 .block_erase = spi_block_erase_d8,
9333 }, {
9334 .eraseblocks = { {16 * 1024 * 1024, 1} },
9335 .block_erase = spi_block_erase_60,
9336 }, {
9337 .eraseblocks = { {16 * 1024 * 1024, 1} },
9338 .block_erase = spi_block_erase_c7,
9339 }
9340 },
9341 .unlock = spi_disable_blockprotect,
9342 .write = spi_chip_write_256,
9343 .read = spi_chip_read,
9344 .voltage = {2700, 3600},
9345 .wp = &wp_w25,
9346 },
Alan Greena7cfa332019-06-24 15:48:14 +10009347
Martin Rothee8dcf92017-05-10 19:16:19 -06009348 {
9349 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009350 .name = "W25Q16",
9351 .bustype = BUS_SPI,
9352 .manufacture_id = WINBOND_NEX_ID,
9353 .model_id = WINBOND_NEX_W25Q16_V,
9354 .total_size = 2048,
9355 .page_size = 256,
9356 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9357 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9358 .tested = TEST_OK_PREWU,
9359 .probe = probe_spi_rdid,
9360 .probe_timing = TIMING_ZERO,
9361 .block_erasers =
9362 {
9363 {
9364 .eraseblocks = { {4 * 1024, 512} },
9365 .block_erase = spi_block_erase_20,
9366 }, {
9367 .eraseblocks = { {32 * 1024, 64} },
9368 .block_erase = spi_block_erase_52,
9369 }, {
9370 .eraseblocks = { {64 * 1024, 32} },
9371 .block_erase = spi_block_erase_d8,
9372 }, {
9373 .eraseblocks = { {2 * 1024 * 1024, 1} },
9374 .block_erase = spi_block_erase_60,
9375 }, {
9376 .eraseblocks = { {2 * 1024 * 1024, 1} },
9377 .block_erase = spi_block_erase_c7,
9378 }
9379 },
9380 .unlock = spi_disable_blockprotect,
9381 .write = spi_chip_write_256,
9382 .read = spi_chip_read,
9383 .voltage = {2700, 3600},
9384 .wp = &wp_w25q,
9385 },
9386
9387 {
9388 .vendor = "Winbond",
9389 .name = "W25Q256.V",
9390 .bustype = BUS_SPI,
9391 .manufacture_id = WINBOND_NEX_ID,
9392 .model_id = WINBOND_NEX_W25Q256_V,
9393 .total_size = 32768,
9394 .page_size = 256,
9395 /* supports SFDP */
9396 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
9397 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
9398 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_WREN,
9399 .tested = TEST_OK_PREWU,
9400 .probe = probe_spi_rdid,
9401 .probe_timing = TIMING_ZERO,
9402 .block_erasers =
9403 {
9404 {
9405 .eraseblocks = { {4 * 1024, 8192} },
9406 .block_erase = spi_block_erase_20,
9407 }, {
9408 .eraseblocks = { {32 * 1024, 1024} },
9409 .block_erase = spi_block_erase_52,
9410 }, {
9411 .eraseblocks = { {64 * 1024, 512} },
9412 .block_erase = spi_block_erase_d8,
9413 }, {
9414 .eraseblocks = { {32 * 1024 * 1024, 1} },
9415 .block_erase = spi_block_erase_60,
9416 }, {
9417 .eraseblocks = { {32 * 1024 * 1024, 1} },
9418 .block_erase = spi_block_erase_c7,
9419 }
9420 },
9421 .unlock = spi_disable_blockprotect,
9422 .write = spi_chip_write_256,
9423 .read = spi_chip_read,
9424 .set_4ba = spi_enter_4ba_b7_we,
9425 .voltage = {2700, 3600},
9426 },
9427
9428 {
9429 .vendor = "Winbond",
Shelley Chenfc338ee2018-07-20 16:27:15 -07009430 .name = "W25Q256JV",
9431 .bustype = BUS_SPI,
9432 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +10009433 .model_id = WINBOND_NEX_W25Q256JV_M,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009434 .total_size = 32768,
9435 .page_size = 256,
Edward O'Callaghan3d0cbd42019-06-24 15:37:01 +10009436 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP | FEATURE_4BA_WREN,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009437 .tested = TEST_OK_PREWU,
9438 .probe = probe_spi_rdid,
9439 .probe_timing = TIMING_ZERO,
9440 .block_erasers =
9441 {
9442 {
9443 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009444 .block_erase = spi_block_erase_20,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009445 }, {
9446 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009447 .block_erase = spi_block_erase_52,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009448 }, {
9449 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009450 .block_erase = spi_block_erase_d8,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009451 }, {
9452 .eraseblocks = { {32 * 1024 * 1024, 1} },
9453 .block_erase = spi_block_erase_60,
9454 }, {
9455 .eraseblocks = { {32 * 1024 * 1024, 1} },
9456 .block_erase = spi_block_erase_c7,
9457 }
9458 },
9459 .unlock = spi_disable_blockprotect,
9460 .write = spi_chip_write_256,
9461 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10009462 .set_4ba = spi_enter_4ba_b7_we,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009463 .voltage = {2700, 3600},
Duncan Laurie1801f7c2019-01-09 18:02:51 -08009464 .wp = &wp_w25q_large,
Shelley Chenfc338ee2018-07-20 16:27:15 -07009465 },
Alan Greena7cfa332019-06-24 15:48:14 +10009466
Shelley Chenfc338ee2018-07-20 16:27:15 -07009467 {
9468 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009469 .name = "W25Q32",
9470 .bustype = BUS_SPI,
9471 .manufacture_id = WINBOND_NEX_ID,
9472 .model_id = WINBOND_NEX_W25Q32_V,
9473 .total_size = 4096,
9474 .page_size = 256,
9475 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9476 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9477 .tested = TEST_OK_PREWU,
9478 .probe = probe_spi_rdid,
9479 .probe_timing = TIMING_ZERO,
9480 .block_erasers =
9481 {
9482 {
9483 .eraseblocks = { {4 * 1024, 1024} },
9484 .block_erase = spi_block_erase_20,
9485 }, {
9486 .eraseblocks = { {32 * 1024, 128} },
9487 .block_erase = spi_block_erase_52,
9488 }, {
9489 .eraseblocks = { {64 * 1024, 64} },
9490 .block_erase = spi_block_erase_d8,
9491 }, {
9492 .eraseblocks = { {4 * 1024 * 1024, 1} },
9493 .block_erase = spi_block_erase_60,
9494 }, {
9495 .eraseblocks = { {4 * 1024 * 1024, 1} },
9496 .block_erase = spi_block_erase_c7,
9497 }
9498 },
9499 .unlock = spi_disable_blockprotect,
9500 .write = spi_chip_write_256,
9501 .read = spi_chip_read,
9502 .voltage = {2700, 3600},
9503 .wp = &wp_w25q,
9504 },
9505
9506 {
9507 .vendor = "Winbond",
9508 .name = "W25Q32DW",
9509 .bustype = BUS_SPI,
9510 .manufacture_id = WINBOND_NEX_ID,
9511 .model_id = WINBOND_NEX_W25Q32_W,
9512 .total_size = 4096,
9513 .page_size = 256,
9514 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9515 .tested = TEST_OK_PREWU,
9516 .probe = probe_spi_rdid,
9517 .probe_timing = TIMING_ZERO,
9518 .block_erasers =
9519 {
9520 {
9521 .eraseblocks = { {4 * 1024, 1024} },
9522 .block_erase = spi_block_erase_20,
9523 }, {
9524 .eraseblocks = { {32 * 1024, 128} },
9525 .block_erase = spi_block_erase_52,
9526 }, {
9527 .eraseblocks = { {64 * 1024, 64} },
9528 .block_erase = spi_block_erase_d8,
9529 }, {
9530 .eraseblocks = { {4 * 1024 * 1024, 1} },
9531 .block_erase = spi_block_erase_60,
9532 }, {
9533 .eraseblocks = { {4 * 1024 * 1024, 1} },
9534 .block_erase = spi_block_erase_c7,
9535 }
9536 },
9537 .unlock = spi_disable_blockprotect,
9538 .write = spi_chip_write_256,
9539 .read = spi_chip_read,
9540 .voltage = {1700, 1950},
9541 .wp = &wp_w25q,
9542 },
9543
9544 {
9545 .vendor = "Winbond",
Edward O'Callaghand80cf712019-05-24 22:06:36 +10009546 .name = "W25Q32JW",
9547 .bustype = BUS_SPI,
9548 .manufacture_id = WINBOND_NEX_ID,
9549 .model_id = WINBOND_NEX_W25Q32JW,
9550 .total_size = 4096,
9551 .page_size = 256,
9552 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9553 .tested = TEST_OK_PREWU,
9554 .probe = probe_spi_rdid,
9555 .probe_timing = TIMING_ZERO,
9556 .block_erasers =
9557 {
9558 {
9559 .eraseblocks = { {4 * 1024, 1024} },
9560 .block_erase = spi_block_erase_20,
9561 }, {
9562 .eraseblocks = { {32 * 1024, 128} },
9563 .block_erase = spi_block_erase_52,
9564 }, {
9565 .eraseblocks = { {64 * 1024, 64} },
9566 .block_erase = spi_block_erase_d8,
9567 }, {
9568 .eraseblocks = { {4 * 1024 * 1024, 1} },
9569 .block_erase = spi_block_erase_60,
9570 }, {
9571 .eraseblocks = { {4 * 1024 * 1024, 1} },
9572 .block_erase = spi_block_erase_c7,
9573 }
9574 },
9575 .unlock = spi_disable_blockprotect,
9576 .write = spi_chip_write_256,
9577 .read = spi_chip_read,
9578 .voltage = {1700, 1950},
9579 .wp = &wp_w25q,
9580 },
Alan Greena7cfa332019-06-24 15:48:14 +10009581
Edward O'Callaghand80cf712019-05-24 22:06:36 +10009582 {
9583 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009584 .name = "W25Q40EW",
9585 .bustype = BUS_SPI,
9586 .manufacture_id = WINBOND_NEX_ID,
9587 .model_id = WINBOND_NEX_W25Q40EW,
9588 .total_size = 512,
9589 .page_size = 256,
9590 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9591 .tested = TEST_OK_PREWU,
9592 .probe = probe_spi_rdid,
9593 .probe_timing = TIMING_ZERO,
9594 .block_erasers =
9595 {
9596 {
9597 .eraseblocks = { {4 * 1024, 128} },
9598 .block_erase = spi_block_erase_20,
9599 }, {
9600 .eraseblocks = { {32 * 1024, 16} },
9601 .block_erase = spi_block_erase_52,
9602 }, {
9603 .eraseblocks = { {64 * 1024, 8} },
9604 .block_erase = spi_block_erase_d8,
9605 }, {
9606 .eraseblocks = { {1024 * 512, 1} },
9607 .block_erase = spi_block_erase_60,
9608 }, {
9609 .eraseblocks = { {1024 * 512, 1} },
9610 .block_erase = spi_block_erase_c7,
9611 }
9612 },
9613 .unlock = spi_disable_blockprotect,
9614 .write = spi_chip_write_256,
9615 .read = spi_chip_read,
9616 .voltage = {1650, 1950},
9617 /* FIXME(dhendrix): Add write-protection support */
9618 },
9619
9620 {
9621 .vendor = "Winbond",
9622 .name = "W25Q64",
9623 .bustype = BUS_SPI,
9624 .manufacture_id = WINBOND_NEX_ID,
9625 .model_id = WINBOND_NEX_W25Q64_V,
9626 .total_size = 8192,
9627 .page_size = 256,
9628 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9629 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9630 .tested = TEST_OK_PREWU,
9631 .probe = probe_spi_rdid,
9632 .probe_timing = TIMING_ZERO,
9633 .block_erasers =
9634 {
9635 {
9636 .eraseblocks = { {4 * 1024, 2048} },
9637 .block_erase = spi_block_erase_20,
9638 }, {
9639 .eraseblocks = { {32 * 1024, 256} },
9640 .block_erase = spi_block_erase_52,
9641 }, {
9642 .eraseblocks = { {64 * 1024, 128} },
9643 .block_erase = spi_block_erase_d8,
9644 }, {
9645 .eraseblocks = { {8 * 1024 * 1024, 1} },
9646 .block_erase = spi_block_erase_60,
9647 }, {
9648 .eraseblocks = { {8 * 1024 * 1024, 1} },
9649 .block_erase = spi_block_erase_c7,
9650 }
9651 },
9652 .unlock = spi_disable_blockprotect,
9653 .write = spi_chip_write_256,
9654 .read = spi_chip_read,
9655 .voltage = {2700, 3600},
9656 .wp = &wp_w25q,
9657 },
9658
9659 {
9660 .vendor = "Winbond",
9661 .name = "W25Q64DW",
9662 .bustype = BUS_SPI,
9663 .manufacture_id = WINBOND_NEX_ID,
9664 .model_id = WINBOND_NEX_W25Q64_W,
9665 .total_size = 8192,
9666 .page_size = 256,
9667 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9668 .tested = TEST_OK_PREWU,
9669 .probe = probe_spi_rdid,
9670 .probe_timing = TIMING_ZERO,
9671 .block_erasers =
9672 {
9673 {
9674 .eraseblocks = { {4 * 1024, 2048} },
9675 .block_erase = spi_block_erase_20,
9676 }, {
9677 .eraseblocks = { {32 * 1024, 256} },
9678 .block_erase = spi_block_erase_52,
9679 }, {
9680 .eraseblocks = { {64 * 1024, 128} },
9681 .block_erase = spi_block_erase_d8,
9682 }, {
9683 .eraseblocks = { {8 * 1024 * 1024, 1} },
9684 .block_erase = spi_block_erase_60,
9685 }, {
9686 .eraseblocks = { {8 * 1024 * 1024, 1} },
9687 .block_erase = spi_block_erase_c7,
9688 }
9689 },
9690 .unlock = spi_disable_blockprotect,
9691 .write = spi_chip_write_256,
9692 .read = spi_chip_read,
9693 .voltage = {1700, 1950},
9694 .wp = &wp_w25q,
9695 },
9696
9697 {
9698 .vendor = "Winbond",
9699 .name = "W25Q80",
9700 .bustype = BUS_SPI,
9701 .manufacture_id = WINBOND_NEX_ID,
9702 .model_id = WINBOND_NEX_W25Q80_V,
9703 .total_size = 1024,
9704 .page_size = 256,
9705 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
9706 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ | FEATURE_OTP,
9707 .tested = TEST_OK_PREWU,
9708 .probe = probe_spi_rdid,
9709 .probe_timing = TIMING_ZERO,
9710 .block_erasers =
9711 {
9712 {
9713 .eraseblocks = { {4 * 1024, 256} },
9714 .block_erase = spi_block_erase_20,
9715 }, {
9716 .eraseblocks = { {32 * 1024, 32} },
9717 .block_erase = spi_block_erase_52,
9718 }, {
9719 .eraseblocks = { {64 * 1024, 16} },
9720 .block_erase = spi_block_erase_d8,
9721 }, {
9722 .eraseblocks = { {1024 * 1024, 1} },
9723 .block_erase = spi_block_erase_60,
9724 }, {
9725 .eraseblocks = { {1024 * 1024, 1} },
9726 .block_erase = spi_block_erase_c7,
9727 }
9728 },
9729 .unlock = spi_disable_blockprotect,
9730 .write = spi_chip_write_256,
9731 .read = spi_chip_read,
9732 .voltage = {2700, 3600},
9733 .wp = &wp_w25q,
9734 },
9735
9736 {
9737 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +00009738 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +00009739 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00009740 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +00009741 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +00009742 .total_size = 128,
9743 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009744 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9745 .tested = TEST_OK_PREWU,
hailfinger286829b2009-01-08 03:40:17 +00009746 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00009747 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +00009748 .block_erasers =
9749 {
9750 {
9751 .eraseblocks = { {4 * 1024, 32} },
9752 .block_erase = spi_block_erase_20,
9753 }, {
snelson376060c2010-01-19 03:24:55 +00009754 .eraseblocks = { {64 * 1024, 2} },
9755 .block_erase = spi_block_erase_d8,
9756 }, {
9757 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +00009758 .block_erase = spi_block_erase_c7,
9759 }
9760 },
hailfingerb9560ee2010-07-14 20:21:22 +00009761 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00009762 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00009763 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009764 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +08009765 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00009766 },
9767
hailfinger286829b2009-01-08 03:40:17 +00009768 {
9769 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +00009770 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +00009771 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +00009772 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +00009773 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +00009774 .total_size = 2048,
9775 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009776 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9777 .tested = TEST_OK_PREWU,
hailfingerea04a9e2009-07-11 19:39:11 +00009778 .probe = probe_spi_rdid,
9779 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +00009780 .block_erasers =
9781 {
9782 {
9783 .eraseblocks = { {4 * 1024, 512} },
9784 .block_erase = spi_block_erase_20,
9785 }, {
9786 .eraseblocks = { {32 * 1024, 64} },
9787 .block_erase = spi_block_erase_52,
9788 }, {
9789 .eraseblocks = { {64 * 1024, 32} },
9790 .block_erase = spi_block_erase_d8,
9791 }, {
9792 .eraseblocks = { {2 * 1024 * 1024, 1} },
9793 .block_erase = spi_block_erase_60,
9794 }, {
9795 .eraseblocks = { {2 * 1024 * 1024, 1} },
9796 .block_erase = spi_block_erase_c7,
9797 }
9798 },
hailfingerb9560ee2010-07-14 20:21:22 +00009799 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +00009800 .write = spi_chip_write_256,
9801 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009802 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +00009803 },
9804
9805 {
9806 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009807 .name = "W25X20",
9808 .bustype = BUS_SPI,
9809 .manufacture_id = WINBOND_NEX_ID,
9810 .model_id = WINBOND_NEX_W25X20,
9811 .total_size = 256,
9812 .page_size = 256,
9813 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9814 .tested = TEST_UNTESTED,
9815 .probe = probe_spi_rdid,
9816 .probe_timing = TIMING_ZERO,
9817 .block_erasers =
9818 {
9819 {
9820 .eraseblocks = { {4 * 1024, 64} },
9821 .block_erase = spi_block_erase_20,
9822 }, {
9823 .eraseblocks = { {64 * 1024, 4} },
9824 .block_erase = spi_block_erase_d8,
9825 }, {
9826 .eraseblocks = { {256 * 1024, 1} },
9827 .block_erase = spi_block_erase_c7,
9828 }
9829 },
9830 .unlock = spi_disable_blockprotect,
9831 .write = spi_chip_write_256,
9832 .read = spi_chip_read,
9833 .voltage = {2700, 3600},
9834 .wp = &wp_w25,
9835 },
9836
9837 {
9838 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +00009839 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +00009840 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +00009841 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +00009842 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +00009843 .total_size = 4096,
9844 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009845 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
hailfingerd5431fb2009-11-26 11:05:01 +00009846 .tested = TEST_OK_PROBE,
9847 .probe = probe_spi_rdid,
9848 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +00009849 .block_erasers =
9850 {
9851 {
9852 .eraseblocks = { {4 * 1024, 1024} },
9853 .block_erase = spi_block_erase_20,
9854 }, {
9855 .eraseblocks = { {32 * 1024, 128} },
9856 .block_erase = spi_block_erase_52,
9857 }, {
9858 .eraseblocks = { {64 * 1024, 64} },
9859 .block_erase = spi_block_erase_d8,
9860 }, {
9861 .eraseblocks = { {4 * 1024 * 1024, 1} },
9862 .block_erase = spi_block_erase_60,
9863 }, {
9864 .eraseblocks = { {4 * 1024 * 1024, 1} },
9865 .block_erase = spi_block_erase_c7,
9866 }
9867 },
hailfingerb9560ee2010-07-14 20:21:22 +00009868 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +00009869 .write = spi_chip_write_256,
9870 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009871 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +00009872 },
9873
9874 {
9875 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009876 .name = "W25X40",
9877 .bustype = BUS_SPI,
9878 .manufacture_id = WINBOND_NEX_ID,
9879 .model_id = WINBOND_NEX_W25X40,
9880 .total_size = 512,
9881 .page_size = 256,
9882 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9883 .tested = TEST_OK_PREWU,
9884 .probe = probe_spi_rdid,
9885 .probe_timing = TIMING_ZERO,
9886 .block_erasers =
9887 {
9888 {
9889 .eraseblocks = { {4 * 1024, 128} },
9890 .block_erase = spi_block_erase_20,
9891 }, {
9892 .eraseblocks = { {64 * 1024, 8} },
9893 .block_erase = spi_block_erase_d8,
9894 }, {
9895 .eraseblocks = { {512 * 1024, 1} },
9896 .block_erase = spi_block_erase_c7,
9897 }
9898 },
9899 .unlock = spi_disable_blockprotect,
9900 .write = spi_chip_write_256,
9901 .read = spi_chip_read,
9902 .voltage = {2700, 3600},
9903 .wp = &wp_w25,
9904 },
9905
9906 {
9907 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +00009908 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +00009909 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +00009910 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +00009911 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +00009912 .total_size = 8192,
9913 .page_size = 256,
David Hendricks488cf072015-11-23 16:45:07 -08009914 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
stefancte0e52902011-05-26 14:28:51 +00009915 .tested = TEST_OK_PROBE,
hailfingerd5431fb2009-11-26 11:05:01 +00009916 .probe = probe_spi_rdid,
9917 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +00009918 .block_erasers =
9919 {
9920 {
9921 .eraseblocks = { {4 * 1024, 2048} },
9922 .block_erase = spi_block_erase_20,
9923 }, {
9924 .eraseblocks = { {32 * 1024, 256} },
9925 .block_erase = spi_block_erase_52,
9926 }, {
9927 .eraseblocks = { {64 * 1024, 128} },
9928 .block_erase = spi_block_erase_d8,
9929 }, {
9930 .eraseblocks = { {8 * 1024 * 1024, 1} },
9931 .block_erase = spi_block_erase_60,
9932 }, {
9933 .eraseblocks = { {8 * 1024 * 1024, 1} },
9934 .block_erase = spi_block_erase_c7,
9935 }
9936 },
hailfingerb9560ee2010-07-14 20:21:22 +00009937 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +00009938 .write = spi_chip_write_256,
9939 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00009940 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +00009941 },
9942
9943 {
9944 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +10009945 .name = "W25X80",
9946 .bustype = BUS_SPI,
9947 .manufacture_id = WINBOND_NEX_ID,
9948 .model_id = WINBOND_NEX_W25X80,
9949 .total_size = 1024,
9950 .page_size = 256,
9951 .feature_bits = FEATURE_WRSR_WREN | FEATURE_UNBOUND_READ,
9952 .tested = TEST_OK_PREWU,
9953 .probe = probe_spi_rdid,
9954 .probe_timing = TIMING_ZERO,
hailfingere51a2012011-07-26 14:18:52 +00009955 .block_erasers =
9956 {
9957 {
Alan Greend76dc1f2019-06-26 15:38:19 +10009958 .eraseblocks = { {4 * 1024, 256} },
9959 .block_erase = spi_block_erase_20,
9960 }, {
9961 .eraseblocks = { {64 * 1024, 16} },
9962 .block_erase = spi_block_erase_d8,
9963 }, {
9964 .eraseblocks = { {1024 * 1024, 1} },
9965 .block_erase = spi_block_erase_c7,
hailfingere51a2012011-07-26 14:18:52 +00009966 }
9967 },
Alan Greend76dc1f2019-06-26 15:38:19 +10009968 .unlock = spi_disable_blockprotect,
9969 .write = spi_chip_write_256,
9970 .read = spi_chip_read,
9971 .voltage = {2700, 3600},
9972 .wp = &wp_w25,
hailfingere51a2012011-07-26 14:18:52 +00009973 },
9974
Alan Green753a38e2019-06-07 14:44:32 +10009975 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
9976 {
hailfingere51a2012011-07-26 14:18:52 +00009977 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +00009978 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +00009979 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00009980 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +00009981 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +00009982 .total_size = 128,
9983 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00009984 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +00009985 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00009986 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00009987 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +00009988 .block_erasers =
9989 {
9990 {
9991 .eraseblocks = { {128 * 1024, 1} },
9992 .block_erase = erase_chip_block_jedec,
9993 }
9994 },
hailfinger286829b2009-01-08 03:40:17 +00009995 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00009996 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +00009997 },
9998
hailfinger286829b2009-01-08 03:40:17 +00009999 {
10000 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010001 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
10002 .bustype = BUS_PARALLEL,
10003 .manufacture_id = WINBOND_ID,
10004 .model_id = WINBOND_W29C010,
10005 .total_size = 128,
10006 .page_size = 128,
10007 .feature_bits = FEATURE_LONG_RESET,
10008 .tested = TEST_OK_PRE,
10009 .probe = probe_w29ee011,
10010 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
10011 .block_erasers =
10012 {
10013 {
10014 .eraseblocks = { {128 * 1024, 1} },
10015 .block_erase = erase_chip_block_jedec,
10016 }
10017 },
10018 .write = write_jedec,
10019 .read = read_memmapped,
10020 },
10021
10022 {
10023 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010024 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000010025 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010026 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010027 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000010028 .total_size = 256,
10029 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010030 .feature_bits = FEATURE_LONG_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010031 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010032 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010033 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010034 .block_erasers =
10035 {
10036 {
10037 .eraseblocks = { {256 * 1024, 1} },
10038 .block_erase = erase_chip_block_jedec,
10039 }
10040 },
hailfinger286829b2009-01-08 03:40:17 +000010041 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010042 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010043 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010044 },
10045
hailfinger286829b2009-01-08 03:40:17 +000010046 {
10047 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010048 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000010049 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010050 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010051 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000010052 .total_size = 512,
10053 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000010054 .feature_bits = FEATURE_LONG_RESET,
10055 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000010056 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010057 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010058 .block_erasers =
10059 {
10060 {
10061 .eraseblocks = { {512 * 1024, 1} },
10062 .block_erase = erase_chip_block_jedec,
10063 }
10064 },
hailfinger286829b2009-01-08 03:40:17 +000010065 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000010066 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010067 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010068 },
10069
hailfinger286829b2009-01-08 03:40:17 +000010070 {
10071 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000010072 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000010073 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000010074 .manufacture_id = WINBOND_ID,
10075 .model_id = WINBOND_W39L040,
10076 .total_size = 512,
10077 .page_size = 64 * 1024,
10078 .feature_bits = FEATURE_EITHER_RESET,
10079 .tested = TEST_OK_PR,
10080 .probe = probe_jedec,
10081 .probe_timing = 10,
10082 .block_erasers =
10083 {
10084 {
10085 .eraseblocks = { {4 * 1024, 128} },
10086 .block_erase = erase_block_jedec,
10087 }, {
10088 .eraseblocks = { {64 * 1024, 8} },
10089 .block_erase = erase_sector_jedec,
10090 }, {
10091 .eraseblocks = { {512 * 1024, 1} },
10092 .block_erase = erase_chip_block_jedec,
10093 }
10094 },
10095 .printlock = printlock_w39l040,
10096 .write = write_jedec_1,
10097 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010098 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000010099 },
10100
10101 {
10102 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010103 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000010104 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010105 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010106 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000010107 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010108 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010109 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010110 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010111 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000010112 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010113 .block_erasers =
10114 {
10115 {
10116 .eraseblocks = { {64 * 1024, 8} },
10117 .block_erase = erase_sector_jedec,
10118 }, {
10119 .eraseblocks = { {512 * 1024, 1} },
10120 .block_erase = erase_chip_block_jedec,
10121 }
10122 },
hailfingerf8993012010-12-05 16:33:59 +000010123 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000010124 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010125 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010126 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010127 },
10128
hailfinger286829b2009-01-08 03:40:17 +000010129 {
10130 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010131 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000010132 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010133 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010134 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000010135 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010136 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010137 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010138 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010139 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000010140 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010141 .block_erasers =
10142 {
10143 {
10144 .eraseblocks = { {64 * 1024, 8} },
10145 .block_erase = erase_sector_jedec,
10146 }, {
10147 .eraseblocks = { {512 * 1024, 1} },
10148 .block_erase = erase_chip_block_jedec,
10149 }
10150 },
hailfingerf8993012010-12-05 16:33:59 +000010151 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000010152 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010153 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010154 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010155 },
10156
hailfinger286829b2009-01-08 03:40:17 +000010157 {
10158 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010159 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000010160 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010161 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010162 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000010163 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010164 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010165 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000010166 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000010167 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000010168 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010169 .block_erasers =
10170 {
10171 {
10172 .eraseblocks = { {64 * 1024, 8} },
10173 .block_erase = erase_sector_jedec,
10174 }, {
10175 .eraseblocks = { {512 * 1024, 1} },
10176 .block_erase = erase_chip_block_jedec,
10177 }
10178 },
snelson1ee293c2010-02-19 00:52:10 +000010179 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000010180 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010181 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010182 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010183 },
10184
hailfinger286829b2009-01-08 03:40:17 +000010185 {
10186 .vendor = "Winbond",
10187 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010188 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010189 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010190 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000010191 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000010192 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000010193 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010194 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010195 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000010196 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010197 .block_erasers =
10198 {
10199 {
10200 .eraseblocks = { {4 * 1024, 128} },
10201 .block_erase = erase_block_jedec,
10202 }, {
10203 .eraseblocks = { {64 * 1024, 8} },
10204 .block_erase = erase_sector_jedec,
10205 }, {
10206 .eraseblocks = { {512 * 1024, 1} },
10207 .block_erase = erase_chip_block_jedec,
10208 }
10209 },
hailfingerf8993012010-12-05 16:33:59 +000010210 .printlock = printlock_w39v040fa,
mkarcher74173032010-05-30 16:55:18 +000010211 .unlock = unlock_sst_fwhub,
snelsonc6855342010-01-28 23:55:12 +000010212 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010213 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010214 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010215 },
10216
hailfinger286829b2009-01-08 03:40:17 +000010217 {
10218 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000010219 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000010220 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000010221 .manufacture_id = WINBOND_ID,
10222 .model_id = WINBOND_W39V040B,
10223 .total_size = 512,
10224 .page_size = 64 * 1024,
10225 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000010226 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000010227 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010228 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000010229 .block_erasers =
10230 {
10231 {
10232 .eraseblocks = { {64 * 1024, 8} },
10233 .block_erase = erase_sector_jedec,
10234 }, {
10235 .eraseblocks = { {512 * 1024, 1} },
10236 .block_erase = erase_chip_block_jedec,
10237 }
10238 },
10239 .printlock = printlock_w39v040fb,
mkarcher64dbd922010-12-26 23:55:12 +000010240 .unlock = unlock_w39v040fb,
hailfingerf8993012010-12-05 16:33:59 +000010241 .write = write_jedec_1,
10242 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000010243 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000010244 },
10245
10246 {
10247 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080010248 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000010249 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080010250 .manufacture_id = WINBOND_ID,
10251 .model_id = WINBOND_W39V040C,
10252 .total_size = 512,
10253 .page_size = 64 * 1024,
10254 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100010255 .tested = TEST_OK_PREW,
10256 .probe = probe_jedec,
10257 .probe_timing = 10,
10258 .block_erasers =
10259 {
10260 {
10261 .eraseblocks = { {64 * 1024, 8} },
10262 .block_erase = erase_sector_jedec,
10263 }, {
10264 .eraseblocks = { {512 * 1024, 1} },
10265 .block_erase = erase_chip_block_jedec,
10266 }
10267 },
10268 .printlock = printlock_w39v040fc,
10269 .write = write_jedec_1,
10270 .read = read_memmapped,
10271 .voltage = {3000, 3600}, /* Also has 12V fast program */
10272 },
10273
10274 {
10275 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010276 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000010277 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010278 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010279 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000010280 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000010281 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000010282 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070010283 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010284 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060010285 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010286 .block_erasers =
10287 {
10288 {
10289 .eraseblocks = { {64 * 1024, 16} },
10290 .block_erase = erase_sector_jedec,
10291 }, {
10292 .eraseblocks = { {1024 * 1024, 1} },
10293 .block_erase = erase_chip_block_jedec,
10294 }
10295 },
hailfingerf8993012010-12-05 16:33:59 +000010296 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000010297 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010298 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010299 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010300 },
10301
hailfinger286829b2009-01-08 03:40:17 +000010302 {
10303 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100010304 .name = "W39V080FA",
10305 .bustype = BUS_FWH,
10306 .manufacture_id = WINBOND_ID,
10307 .model_id = WINBOND_W39V080FA,
10308 .total_size = 1024,
10309 .page_size = 64 * 1024,
10310 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10311 .tested = TEST_OK_PREW,
10312 .probe = probe_jedec,
10313 .probe_timing = 10,
10314 .block_erasers =
10315 {
10316 {
10317 .eraseblocks = { {64 * 1024, 16}, },
10318 .block_erase = erase_sector_jedec,
10319 }, {
10320 .eraseblocks = { {1024 * 1024, 1} },
10321 .block_erase = erase_chip_block_jedec,
10322 }
10323 },
10324 .printlock = printlock_w39v080fa,
10325 .unlock = unlock_w39v080fa,
10326 .write = write_jedec_1,
10327 .read = read_memmapped,
10328 .voltage = {3000, 3600}, /* Also has 12V fast program */
10329 },
10330
10331 {
10332 .vendor = "Winbond",
10333 .name = "W39V080FA (dual mode)",
10334 .bustype = BUS_FWH,
10335 .manufacture_id = WINBOND_ID,
10336 .model_id = WINBOND_W39V080FA_DM,
10337 .total_size = 512,
10338 .page_size = 64 * 1024,
10339 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
10340 .tested = TEST_UNTESTED,
10341 .probe = probe_jedec,
10342 .probe_timing = 10,
10343 .block_erasers =
10344 {
10345 {
10346 .eraseblocks = { {64 * 1024, 8}, },
10347 .block_erase = erase_sector_jedec,
10348 }, {
10349 .eraseblocks = { {512 * 1024, 1} },
10350 .block_erase = erase_chip_block_jedec,
10351 }
10352 },
10353 .printlock = printlock_w39v080fa_dual,
10354 .write = write_jedec_1,
10355 .read = read_memmapped,
10356 .voltage = {3000, 3600}, /* Also has 12V fast program */
10357 },
10358
10359 {
10360 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000010361 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000010362 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000010363 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010364 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000010365 .total_size = 256,
10366 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010367 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000010368 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010369 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010370 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010371 .block_erasers =
10372 {
10373 {
10374 .eraseblocks = {
10375 {128 * 1024, 1},
10376 {96 * 1024, 1},
10377 {8 * 1024, 2},
10378 {16 * 1024, 1},
10379 },
10380 .block_erase = erase_sector_jedec,
10381 }, {
10382 .eraseblocks = { {256 * 1024, 1} },
10383 .block_erase = erase_chip_block_jedec,
10384 }
10385 },
snelsonc6855342010-01-28 23:55:12 +000010386 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010387 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010388 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000010389 },
10390
hailfinger286829b2009-01-08 03:40:17 +000010391 {
10392 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000010393 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000010394 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000010395 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010396 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000010397 .total_size = 256,
10398 .page_size = 128,
10399 .feature_bits = FEATURE_EITHER_RESET,
10400 .tested = TEST_OK_PROBE,
10401 .probe = probe_jedec,
10402 .probe_timing = 10,
10403 .block_erasers =
10404 {
10405 {
10406 .eraseblocks = { {256 * 1024, 1} },
10407 .block_erase = erase_chip_block_jedec,
10408 }
10409 },
10410 .write = write_jedec_1,
10411 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010412 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000010413 },
10414
10415 {
10416 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000010417 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000010418 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000010419 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010420 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000010421 .total_size = 256,
10422 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010423 .feature_bits = FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080010424 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000010425 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000010426 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010427 .block_erasers =
10428 {
10429 {
10430 .eraseblocks = {
10431 {64 * 1024, 3},
10432 {32 * 1024, 1},
10433 {8 * 1024, 2},
10434 {16 * 1024, 1},
10435 },
10436 .block_erase = erase_sector_jedec,
10437 }, {
10438 .eraseblocks = { {256 * 1024, 1} },
10439 .block_erase = erase_chip_block_jedec,
10440 }
10441 },
snelsonc6855342010-01-28 23:55:12 +000010442 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010443 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010444 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010445 },
10446
hailfinger286829b2009-01-08 03:40:17 +000010447 {
10448 .vendor = "Winbond",
10449 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000010450 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000010451 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000010452 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000010453 .total_size = 256,
10454 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000010455 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000010456 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000010457 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000010458 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000010459 .block_erasers =
10460 {
10461 {
10462 .eraseblocks = {
10463 {64 * 1024, 3},
10464 {32 * 1024, 1},
10465 {8 * 1024, 2},
10466 {16 * 1024, 1},
10467 },
10468 .block_erase = erase_sector_jedec,
10469 }, {
10470 .eraseblocks = { {256 * 1024, 1} },
10471 .block_erase = erase_chip_block_jedec,
10472 }
10473 },
snelsonc6855342010-01-28 23:55:12 +000010474 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000010475 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000010476 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000010477 },
10478
hailfinger286829b2009-01-08 03:40:17 +000010479 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000010480 .vendor = "Programmer",
10481 .name = "Opaque flash chip",
10482 .bustype = BUS_PROG,
10483 .manufacture_id = PROGMANUF_ID,
10484 .model_id = PROGDEV_ID,
10485 .total_size = 0,
10486 .page_size = 256,
10487 /* probe is assumed to work, rest will be filled in by probe */
10488 .tested = TEST_OK_PROBE,
10489 .probe = probe_opaque,
10490 /* eraseblock sizes will be set by the probing function */
10491 .block_erasers =
10492 {
10493 {
10494 .block_erase = erase_opaque,
10495 }
10496 },
10497 .write = write_opaque,
10498 .read = read_opaque,
10499 },
10500
10501 {
hailfinger867df6b2010-07-22 11:44:38 +000010502 .vendor = "AMIC",
10503 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010504 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000010505 .manufacture_id = AMIC_ID,
10506 .model_id = GENERIC_DEVICE_ID,
10507 .total_size = 0,
10508 .page_size = 256,
10509 .tested = TEST_BAD_PREW,
10510 .probe = probe_spi_rdid4,
10511 .probe_timing = TIMING_ZERO,
10512 .write = NULL,
10513 .read = NULL,
10514 },
10515
10516 {
hailfinger286829b2009-01-08 03:40:17 +000010517 .vendor = "Atmel",
10518 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010519 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010520 .manufacture_id = ATMEL_ID,
10521 .model_id = GENERIC_DEVICE_ID,
10522 .total_size = 0,
10523 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010524 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010525 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010526 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010527 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010528 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010529 },
10530
hailfinger286829b2009-01-08 03:40:17 +000010531 {
hailfinger61958912010-07-28 22:20:20 +000010532 .vendor = "Eon",
10533 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010534 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010535 .manufacture_id = EON_ID_NOPREFIX,
10536 .model_id = GENERIC_DEVICE_ID,
10537 .total_size = 0,
10538 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010539 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010540 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010541 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010542 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010543 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010544 },
10545
hailfinger286829b2009-01-08 03:40:17 +000010546 {
10547 .vendor = "Macronix",
10548 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010549 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000010550 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000010551 .model_id = GENERIC_DEVICE_ID,
10552 .total_size = 0,
10553 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010554 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010555 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010556 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010557 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010558 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010559 },
10560
hailfinger286829b2009-01-08 03:40:17 +000010561 {
10562 .vendor = "PMC",
10563 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010564 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010565 .manufacture_id = PMC_ID,
10566 .model_id = GENERIC_DEVICE_ID,
10567 .total_size = 0,
10568 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010569 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010570 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010571 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010572 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010573 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010574 },
10575
hailfinger286829b2009-01-08 03:40:17 +000010576 {
10577 .vendor = "SST",
10578 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010579 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010580 .manufacture_id = SST_ID,
10581 .model_id = GENERIC_DEVICE_ID,
10582 .total_size = 0,
10583 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010584 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010585 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010586 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010587 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010588 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010589 },
10590
hailfinger286829b2009-01-08 03:40:17 +000010591 {
10592 .vendor = "ST",
10593 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010594 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000010595 .manufacture_id = ST_ID,
10596 .model_id = GENERIC_DEVICE_ID,
10597 .total_size = 0,
10598 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000010599 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000010600 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000010601 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000010602 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000010603 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000010604 },
uwec93fbdb2008-03-16 02:06:25 +000010605
hailfinger63165602009-11-20 01:12:45 +000010606 {
hailfinger201f62f2009-11-24 02:08:11 +000010607 .vendor = "Sanyo",
10608 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010609 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000010610 .manufacture_id = SANYO_ID,
10611 .model_id = GENERIC_DEVICE_ID,
10612 .total_size = 0,
10613 .page_size = 256,
10614 .tested = TEST_BAD_PREW,
10615 .probe = probe_spi_rdid,
10616 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000010617 .write = NULL,
10618 .read = NULL,
10619 },
10620
10621 {
hailfinger63165602009-11-20 01:12:45 +000010622 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080010623 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000010624 .bustype = BUS_SPI,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080010625 .manufacture_id = VARIABLE_SIZE_MANUF_ID,
10626 .model_id = VARIABLE_SIZE_DEVICE_ID,
10627 .total_size = 64, /* This size is set temporarily */
10628 .page_size = 256,
10629 .tested = TEST_OK_PREW,
10630 .probe = probe_variable_size,
10631 .block_erasers =
10632 {
10633 {
10634 .eraseblocks = { {4 * 1024, 16} },
10635 .block_erase = spi_block_erase_20,
10636 }, {
10637 .eraseblocks = { {64 * 1024, 1} },
10638 .block_erase = spi_block_erase_d8,
10639 }
10640 },
10641 .write = spi_chip_write_256,
10642 .read = spi_chip_read,
10643 },
10644
10645 {
10646 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000010647 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000010648 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000010649 .manufacture_id = GENERIC_MANUF_ID,
10650 .model_id = GENERIC_DEVICE_ID,
10651 .total_size = 0,
10652 .page_size = 256,
10653 .tested = TEST_BAD_PREW,
10654 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000010655 .write = NULL,
10656 },
David Hendricks07af3a42011-07-11 22:13:02 -070010657
hailfinger63165602009-11-20 01:12:45 +000010658 {
10659 .vendor = "Generic",
10660 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000010661 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000010662 .manufacture_id = GENERIC_MANUF_ID,
10663 .model_id = GENERIC_DEVICE_ID,
10664 .total_size = 0,
10665 .page_size = 256,
10666 .tested = TEST_BAD_PREW,
10667 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000010668 .write = NULL,
10669 },
10670
hailfinger286829b2009-01-08 03:40:17 +000010671 { NULL }
stuge7be5d032009-04-21 01:46:07 +000010672};
Simon Glass4c214132013-07-16 10:09:28 -060010673
David Hendricks07153282016-12-22 16:07:00 -080010674/* Generic flashchip struct for platforms that use Intel hardware sequencing. */
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053010675const struct flashchip flashchips_hwseq[] = {
10676 {
David Hendricks07153282016-12-22 16:07:00 -080010677 .vendor = "Generic",
10678 .name = "HWSEQ chip",
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053010679 .bustype = BUS_PROG,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053010680 /* probe is assumed to work, rest will be filled in by probe */
David Hendricksb8696182016-05-20 16:38:35 -070010681 .tested = TEST_OK_PREWU,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053010682 .probe = probe_opaque,
10683 /* eraseblock sizes will be set by the probing function */
10684 .block_erasers =
10685 {
10686 {
10687 .block_erase = erase_opaque,
10688 }
10689 },
10690 .write = write_opaque,
10691 .read = read_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053010692 .read_status = read_status_opaque,
10693 .write_status = write_status_opaque,
Duncan Laurie25a4ca22019-04-25 12:08:52 -070010694 .check_access = check_access_opaque,
Ramya Vijaykumar4af3f822016-01-27 11:51:27 +053010695 .wp = &wp_w25,
Furquan Shaikhc5bc5cd2019-01-07 04:25:59 -080010696 .unlock = &spi_disable_blockprotect,
Ramya Vijaykumare6a7ca82015-05-12 14:27:29 +053010697 },
10698
10699 {NULL}
10700};
10701
Souvik Ghoshd75cd672016-06-17 14:21:39 -070010702int flash_erase_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060010703{
Patrick Georgif3fa2992017-02-02 16:24:44 +010010704 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0 : 0xff;
Simon Glass4c214132013-07-16 10:09:28 -060010705}
10706
Souvik Ghoshd75cd672016-06-17 14:21:39 -070010707int flash_unerased_value(struct flashctx *flash)
Simon Glass4c214132013-07-16 10:09:28 -060010708{
Patrick Georgif3fa2992017-02-02 16:24:44 +010010709 return flash->chip->feature_bits & FEATURE_ERASE_TO_ZERO ? 0xff : 0;
Simon Glass4c214132013-07-16 10:09:28 -060010710}
David Hendricks8c084212015-11-17 22:29:36 -080010711
David Hendricks40df5b52016-12-22 15:36:28 -080010712const struct flashchip *flash_id_to_entry(uint32_t mfg_id, uint32_t model_id)
10713{
10714 const struct flashchip *chip;
10715
10716 for (chip = &flashchips[0]; chip->vendor; chip++) {
10717 if ((chip->manufacture_id == mfg_id) &&
10718 (chip->model_id == model_id))
10719 return chip;
10720 }
10721
10722 return NULL;
10723}
10724
David Hendricks8c084212015-11-17 22:29:36 -080010725struct voltage_range voltage_ranges[NUM_VOLTAGE_RANGES];
10726
10727static int compar(const void *_x, const void *_y)
10728{
10729 const struct voltage_range *x = _x;
10730 const struct voltage_range *y = _y;
10731
10732 /*
10733 * qsort() places entries in ascending order. We will sort by minimum
10734 * voltage primarily and max voltage secondarily, and move empty sets
10735 * to the end of array.
10736 */
10737 if (x->min == 0)
10738 return 1;
10739 if (y->min == 0)
10740 return -1;
10741
10742 if (x->min < y->min)
10743 return -1;
10744 if (x->min > y->min)
10745 return 1;
10746
10747 if (x->min == y->min) {
10748 if (x->max < y->max)
10749 return -1;
10750 if (x->max > y->max)
10751 return 1;
10752 }
10753
10754 return 0;
10755}
10756
10757int flash_supported_voltage_ranges(enum chipbustype bus)
10758{
10759 int i;
10760 int unique_ranges = 0;
10761
10762 /* clear array in case user calls this function multiple times */
10763 memset(voltage_ranges, 0, sizeof(voltage_ranges));
10764
10765 for (i = 0; i < ARRAY_SIZE(flashchips); i++) {
10766 int j;
10767 int match_found = 0;
10768
10769 if (unique_ranges >= NUM_VOLTAGE_RANGES) {
10770 msg_cerr("Increase NUM_VOLTAGE_RANGES.\n");
10771 return -1;
10772 }
10773
10774 if (!(flashchips[i].bustype & bus))
10775 continue;
10776
10777 for (j = 0; j < NUM_VOLTAGE_RANGES; j++) {
10778 if ((flashchips[i].voltage.min == voltage_ranges[j].min) &&
10779 (flashchips[i].voltage.max == voltage_ranges[j].max))
10780 match_found |= 1;
10781
10782 if (!voltage_ranges[j].min && !voltage_ranges[j].max)
10783 break;
10784 }
10785
10786 if (!match_found) {
10787 voltage_ranges[j] = flashchips[i].voltage;
10788 unique_ranges++;
10789 }
10790 }
10791
10792 qsort(&voltage_ranges[0], NUM_VOLTAGE_RANGES,
10793 sizeof(voltage_ranges[0]), compar);
10794
10795 for (i = 0; i < NUM_VOLTAGE_RANGES; i++) {
10796 msg_cspew("%s: voltage_range[%d]: { %u, %u }\n",
10797 __func__, i, voltage_ranges[i].min, voltage_ranges[i].max);
10798 }
10799
10800 return unique_ranges;
10801}