blob: 024eda5d9f1d887e6e928a78b3fd053809ba3b27 [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 */
20
21#include "flash.h"
hailfinger66966da2009-06-15 14:14:48 +000022#include "flashchips.h"
snelson8913d082010-02-26 05:48:29 +000023#include "chipdrivers.h"
ollie6a600992005-11-26 21:55:36 +000024
uwec93fbdb2008-03-16 02:06:25 +000025/**
uwe3cfe8a52009-05-21 15:55:46 +000026 * List of supported flash chips.
uwec93fbdb2008-03-16 02:06:25 +000027 *
28 * Please keep the list sorted by vendor name and chip name, so that
29 * the output of 'flashrom -L' is alphabetically sorted.
30 */
hailfinger48ed3e22011-05-04 00:39:50 +000031const struct flashchip flashchips[] = {
uwec93fbdb2008-03-16 02:06:25 +000032
hailfinger3000b1f2009-07-23 12:42:01 +000033 /*
34 * .vendor = Vendor name
35 * .name = Chip name
36 * .bustype = Supported flash bus types (Parallel, LPC...)
37 * .manufacture_id = Manufacturer chip ID
38 * .model_id = Model chip ID
39 * .total_size = Total size in (binary) kbytes
40 * .page_size = Page or eraseblock(?) size in bytes
41 * .tested = Test status
42 * .probe = Probe function
43 * .probe_timing = Probe function delay
hailfinger91cf1032009-10-01 13:15:01 +000044 * .block_erasers[] = Array of erase layouts and erase functions
45 * {
46 * .eraseblocks[] = Array of { blocksize, blockcount }
47 * .block_erase = Block erase function
48 * }
snelson1ee293c2010-02-19 00:52:10 +000049 * .printlock = Chip lock status function
50 * .unlock = Chip unlock function
hailfinger3000b1f2009-07-23 12:42:01 +000051 * .write = Chip write function
52 * .read = Chip read function
stefanct7e00e222011-06-03 07:26:31 +000053 * .voltage = Voltage range in millivolt
stepanaa1b6a22008-12-08 18:15:10 +000054 */
55
hailfinger286829b2009-01-08 03:40:17 +000056 {
57 .vendor = "AMD",
58 .name = "Am29F002(N)BB",
hailfingere1e41ea2011-07-27 07:13:06 +000059 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000060 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000061 .model_id = AMD_AM29F002BB,
hailfinger286829b2009-01-08 03:40:17 +000062 .total_size = 256,
63 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000064 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
hailfinger286829b2009-01-08 03:40:17 +000065 .tested = TEST_UNTESTED,
66 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000067 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +000068 .block_erasers =
69 {
70 {
71 .eraseblocks = {
72 {16 * 1024, 1},
73 {8 * 1024, 2},
74 {32 * 1024, 1},
75 {64 * 1024, 3},
76 },
77 .block_erase = erase_sector_jedec,
78 }, {
79 .eraseblocks = { {256 * 1024, 1} },
80 .block_erase = erase_chip_block_jedec,
81 },
82 },
hailfingerfff99532009-11-27 17:49:42 +000083 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000084 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000085 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000086 },
87
hailfinger286829b2009-01-08 03:40:17 +000088 {
89 .vendor = "AMD",
90 .name = "Am29F002(N)BT",
hailfingere1e41ea2011-07-27 07:13:06 +000091 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000092 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000093 .model_id = AMD_AM29F002BT,
hailfinger286829b2009-01-08 03:40:17 +000094 .total_size = 256,
95 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000096 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
97 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000098 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000099 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000100 .block_erasers =
101 {
102 {
103 .eraseblocks = {
104 {64 * 1024, 3},
105 {32 * 1024, 1},
106 {8 * 1024, 2},
107 {16 * 1024, 1},
108 },
109 .block_erase = erase_sector_jedec,
110 }, {
111 .eraseblocks = { {256 * 1024, 1} },
112 .block_erase = erase_chip_block_jedec,
113 },
114 },
hailfingerfff99532009-11-27 17:49:42 +0000115 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000116 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000117 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +0000118 },
119
hailfinger286829b2009-01-08 03:40:17 +0000120 {
121 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000122 .name = "Am29F010",
123 .bustype = BUS_PARALLEL,
124 .manufacture_id = AMD_ID,
125 .model_id = AMD_AM29F010,
126 .total_size = 128,
127 .page_size = 16 * 1024,
128 .feature_bits = FEATURE_SHORT_RESET,
129 .tested = TEST_UNTESTED,
130 .probe = probe_jedec,
131 .probe_timing = TIMING_ZERO,
132 .block_erasers =
133 {
134 {
135 .eraseblocks = { {16 * 1024, 8} },
136 .block_erase = erase_sector_jedec,
137 }, {
138 .eraseblocks = { {128 * 1024, 1} },
139 .block_erase = erase_chip_block_jedec,
140 },
141 },
142 .write = write_jedec_1,
143 .read = read_memmapped,
144 .voltage = {4500, 5500},
145 },
146
147 {
148 .vendor = "AMD",
Alan Greend76dc1f2019-06-26 15:38:19 +1000149 .name = "Am29F010A/B",
150 .bustype = BUS_PARALLEL,
151 .manufacture_id = AMD_ID,
Nikolai Artemievdc39c032021-01-20 15:30:50 +1100152 .model_id = AMD_AM29F010,
Alan Greend76dc1f2019-06-26 15:38:19 +1000153 .total_size = 128,
154 .page_size = 16 * 1024,
155 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
156 .tested = TEST_OK_PRE,
157 .probe = probe_jedec,
158 .probe_timing = TIMING_ZERO,
159 .block_erasers =
160 {
161 {
162 .eraseblocks = { {16 * 1024, 8} },
163 .block_erase = erase_sector_jedec,
164 }, {
165 .eraseblocks = { {128 * 1024, 1} },
166 .block_erase = erase_chip_block_jedec,
167 },
168 },
169 .write = write_jedec_1,
170 .read = read_memmapped,
171 .voltage = {4500, 5500},
172 },
173
174 {
175 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000176 .name = "Am29F016D",
hailfingere1e41ea2011-07-27 07:13:06 +0000177 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000178 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000179 .model_id = AMD_AM29F016D,
hailfingerc43afc92009-12-22 22:15:33 +0000180 .total_size = 2 * 1024,
hailfinger286829b2009-01-08 03:40:17 +0000181 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000182 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +0000183 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000184 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000185 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000186 .block_erasers =
187 {
188 {
189 .eraseblocks = { {64 * 1024, 32} },
snelsonc6855342010-01-28 23:55:12 +0000190 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000191 }, {
192 .eraseblocks = { {2048 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000193 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000194 },
195 },
snelsonc6855342010-01-28 23:55:12 +0000196 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000197 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000198 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000199 },
200
hailfinger286829b2009-01-08 03:40:17 +0000201 {
202 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000203 .name = "Am29F040",
204 .bustype = BUS_PARALLEL,
205 .manufacture_id = AMD_ID,
206 .model_id = AMD_AM29F040,
207 .total_size = 512,
208 .page_size = 64 * 1024,
209 .feature_bits = FEATURE_EITHER_RESET,
210 .tested = TEST_UNTESTED,
211 .probe = probe_jedec,
212 .probe_timing = TIMING_ZERO,
213 .block_erasers =
214 {
215 {
216 .eraseblocks = { {64 * 1024, 8} },
217 .block_erase = erase_sector_jedec,
218 }, {
219 .eraseblocks = { {512 * 1024, 1} },
220 .block_erase = erase_chip_block_jedec,
221 },
222 },
223 .write = write_jedec_1,
224 .read = read_memmapped,
225 .voltage = {4500, 5500},
226 },
227
228 {
229 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000230 .name = "Am29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000231 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000232 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100233 .model_id = AMD_AM29F040,
hailfinger286829b2009-01-08 03:40:17 +0000234 .total_size = 512,
235 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000236 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
237 .tested = TEST_UNTESTED,
238 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000239 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000240 .block_erasers =
241 {
242 {
243 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000244 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000245 }, {
246 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000247 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000248 },
249 },
snelsonc6855342010-01-28 23:55:12 +0000250 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000251 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000252 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000253 },
254
hailfinger286829b2009-01-08 03:40:17 +0000255 {
256 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000257 .name = "Am29F080",
258 .bustype = BUS_PARALLEL,
259 .manufacture_id = AMD_ID,
260 .model_id = AMD_AM29F080,
261 .total_size = 1024,
262 .page_size = 64 * 1024,
263 .feature_bits = FEATURE_EITHER_RESET,
264 .tested = TEST_UNTESTED,
265 .probe = probe_jedec,
266 .probe_timing = TIMING_ZERO,
267 .block_erasers =
268 {
269 {
270 .eraseblocks = { {64 * 1024, 16} },
271 .block_erase = erase_sector_jedec,
272 }, {
273 .eraseblocks = { {1024 * 1024, 1} },
274 .block_erase = erase_chip_block_jedec,
275 },
276 },
277 .write = write_jedec_1,
278 .read = read_memmapped,
279 .voltage = {4500, 5500},
280 },
281
282 {
283 .vendor = "AMD",
stuged9f66152009-01-25 23:55:12 +0000284 .name = "Am29F080B",
hailfingere1e41ea2011-07-27 07:13:06 +0000285 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000286 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100287 .model_id = AMD_AM29F080,
stuged9f66152009-01-25 23:55:12 +0000288 .total_size = 1024,
289 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000290 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stuged9f66152009-01-25 23:55:12 +0000291 .tested = TEST_UNTESTED,
292 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000293 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000294 .block_erasers =
295 {
296 {
297 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000298 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000299 }, {
300 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000301 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000302 },
303 },
snelsonc6855342010-01-28 23:55:12 +0000304 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000305 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000306 .voltage = {4500, 5500},
stuged9f66152009-01-25 23:55:12 +0000307 },
308
309 {
310 .vendor = "AMD",
hailfinger5a8bd5a2011-02-05 12:11:17 +0000311 .name = "Am29LV001BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000312 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000313 .manufacture_id = AMD_ID,
314 .model_id = AMD_AM29LV001BB,
315 .total_size = 128,
316 .page_size = 64 * 1024, /* unused */
317 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
318 .tested = TEST_OK_PREW,
319 .probe = probe_jedec,
320 .probe_timing = TIMING_ZERO,
321 .block_erasers =
322 {
323 {
324 .eraseblocks = {
325 {8 * 1024, 1},
326 {4 * 1024, 2},
327 {16 * 1024, 7},
328 },
329 .block_erase = erase_sector_jedec,
330 }, {
331 .eraseblocks = { {128 * 1024, 1} },
332 .block_erase = erase_chip_block_jedec,
333 },
334 },
335 .write = write_jedec_1,
336 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000337 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000338 },
339
340 {
341 .vendor = "AMD",
342 .name = "Am29LV001BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000343 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000344 .manufacture_id = AMD_ID,
345 .model_id = AMD_AM29LV001BT,
346 .total_size = 128,
347 .page_size = 64 * 1024, /* unused */
348 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
349 .tested = TEST_UNTESTED,
350 .probe = probe_jedec,
351 .probe_timing = TIMING_ZERO,
352 .block_erasers =
353 {
354 {
355 .eraseblocks = {
356 {16 * 1024, 7},
357 {4 * 1024, 2},
358 {8 * 1024, 1},
359 },
360 .block_erase = erase_sector_jedec,
361 }, {
362 .eraseblocks = { {128 * 1024, 1} },
363 .block_erase = erase_chip_block_jedec,
364 },
365 },
366 .write = write_jedec_1,
367 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000368 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000369 },
370
371 {
372 .vendor = "AMD",
373 .name = "Am29LV002BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000374 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000375 .manufacture_id = AMD_ID,
376 .model_id = AMD_AM29LV002BB,
377 .total_size = 256,
378 .page_size = 64 * 1024, /* unused */
379 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
380 .tested = TEST_UNTESTED,
381 .probe = probe_jedec,
382 .probe_timing = TIMING_ZERO,
383 .block_erasers =
384 {
385 {
386 .eraseblocks = {
387 {16 * 1024, 1},
388 {8 * 1024, 2},
389 {32 * 1024, 1},
390 {64 * 1024, 3},
391 },
392 .block_erase = erase_sector_jedec,
393 }, {
394 .eraseblocks = { {256 * 1024, 1} },
395 .block_erase = erase_chip_block_jedec,
396 },
397 },
398 .write = write_jedec_1,
399 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000400 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000401 },
402
403 {
404 .vendor = "AMD",
405 .name = "Am29LV002BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000406 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000407 .manufacture_id = AMD_ID,
408 .model_id = AMD_AM29LV002BT,
409 .total_size = 256,
410 .page_size = 64 * 1024, /* unused */
411 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
412 .tested = TEST_UNTESTED,
413 .probe = probe_jedec,
414 .probe_timing = TIMING_ZERO,
415 .block_erasers =
416 {
417 {
418 .eraseblocks = {
419 {64 * 1024, 3},
420 {32 * 1024, 1},
421 {8 * 1024, 2},
422 {16 * 1024, 1},
423 },
424 .block_erase = erase_sector_jedec,
425 }, {
426 .eraseblocks = { {256 * 1024, 1} },
427 .block_erase = erase_chip_block_jedec,
428 },
429 },
430 .write = write_jedec_1,
431 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000432 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000433 },
434
435 {
436 .vendor = "AMD",
437 .name = "Am29LV004BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000438 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000439 .manufacture_id = AMD_ID,
440 .model_id = AMD_AM29LV004BB,
441 .total_size = 512,
442 .page_size = 64 * 1024, /* unused */
443 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
444 .tested = TEST_UNTESTED,
445 .probe = probe_jedec,
446 .probe_timing = TIMING_ZERO,
447 .block_erasers =
448 {
449 {
450 .eraseblocks = {
451 {16 * 1024, 1},
452 {8 * 1024, 2},
453 {32 * 1024, 1},
454 {64 * 1024, 7},
455 },
456 .block_erase = erase_sector_jedec,
457 }, {
458 .eraseblocks = { {512 * 1024, 1} },
459 .block_erase = erase_chip_block_jedec,
460 },
461 },
462 .write = write_jedec_1,
463 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000464 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000465 },
466
467 {
468 .vendor = "AMD",
469 .name = "Am29LV004BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000470 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000471 .manufacture_id = AMD_ID,
472 .model_id = AMD_AM29LV004BT,
473 .total_size = 512,
474 .page_size = 64 * 1024, /* unused */
475 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
476 .tested = TEST_UNTESTED,
477 .probe = probe_jedec,
478 .probe_timing = TIMING_ZERO,
479 .block_erasers =
480 {
481 {
482 .eraseblocks = {
483 {64 * 1024, 7},
484 {32 * 1024, 1},
485 {8 * 1024, 2},
486 {16 * 1024, 1},
487 },
488 .block_erase = erase_sector_jedec,
489 }, {
490 .eraseblocks = { {512 * 1024, 1} },
491 .block_erase = erase_chip_block_jedec,
492 },
493 },
494 .write = write_jedec_1,
495 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000496 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000497 },
498
499 {
500 .vendor = "AMD",
501 .name = "Am29LV008BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000502 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000503 .manufacture_id = AMD_ID,
504 .model_id = AMD_AM29LV008BB,
505 .total_size = 1024,
506 .page_size = 64 * 1024, /* unused */
507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
uwe67f685c2011-08-25 22:54:23 +0000508 .tested = TEST_OK_PREW,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000509 .probe = probe_jedec,
510 .probe_timing = TIMING_ZERO,
511 .block_erasers =
512 {
513 {
514 .eraseblocks = {
515 {16 * 1024, 1},
516 {8 * 1024, 2},
517 {32 * 1024, 1},
518 {64 * 1024, 15},
519 },
520 .block_erase = erase_sector_jedec,
521 }, {
522 .eraseblocks = { {1024 * 1024, 1} },
523 .block_erase = erase_chip_block_jedec,
524 },
525 },
526 .write = write_jedec_1,
527 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000528 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000529 },
530
531 {
532 .vendor = "AMD",
533 .name = "Am29LV008BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000534 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000535 .manufacture_id = AMD_ID,
536 .model_id = AMD_AM29LV008BT,
537 .total_size = 1024,
538 .page_size = 64 * 1024, /* unused */
539 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
540 .tested = TEST_UNTESTED,
541 .probe = probe_jedec,
542 .probe_timing = TIMING_ZERO,
543 .block_erasers =
544 {
545 {
546 .eraseblocks = {
547 {64 * 1024, 15},
548 {32 * 1024, 1},
549 {8 * 1024, 2},
550 {16 * 1024, 1},
551 },
552 .block_erase = erase_sector_jedec,
553 }, {
554 .eraseblocks = { {1024 * 1024, 1} },
555 .block_erase = erase_chip_block_jedec,
556 },
557 },
558 .write = write_jedec_1,
559 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000560 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000561 },
562
563 {
564 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000565 .name = "Am29LV040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000566 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000567 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000568 .model_id = AMD_AM29LV040B,
hailfinger286829b2009-01-08 03:40:17 +0000569 .total_size = 512,
570 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000571 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfingerd217d122010-10-08 18:52:29 +0000572 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +0000573 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000574 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000575 .block_erasers =
576 {
577 {
578 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000579 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000580 }, {
581 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000582 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000583 },
584 },
snelsonc6855342010-01-28 23:55:12 +0000585 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000586 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000587 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
stepanaa1b6a22008-12-08 18:15:10 +0000588 },
589
hailfinger286829b2009-01-08 03:40:17 +0000590 {
stuged9f66152009-01-25 23:55:12 +0000591 .vendor = "AMD",
592 .name = "Am29LV081B",
hailfingere1e41ea2011-07-27 07:13:06 +0000593 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000594 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000595 .model_id = AMD_AM29LV080B,
stuged9f66152009-01-25 23:55:12 +0000596 .total_size = 1024,
597 .page_size = 64 * 1024,
hailfinger8ddaff32010-12-04 03:26:40 +0000598 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
stuged9f66152009-01-25 23:55:12 +0000599 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000600 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000601 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000602 .block_erasers =
603 {
604 {
605 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000606 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000607 }, {
608 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000609 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000610 },
611 },
snelsonc6855342010-01-28 23:55:12 +0000612 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000613 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000614 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
stuged9f66152009-01-25 23:55:12 +0000615 },
616
617 {
hailfinger61958912010-07-28 22:20:20 +0000618 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000619 .name = "A25L010",
620 .bustype = BUS_SPI,
621 .manufacture_id = AMIC_ID_NOPREFIX,
622 .model_id = AMIC_A25L010,
623 .total_size = 128,
624 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000625 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000626 .tested = TEST_UNTESTED,
627 .probe = probe_spi_rdid,
628 .probe_timing = TIMING_ZERO,
629 .block_erasers =
630 {
631 {
632 .eraseblocks = { { 4 * 1024, 32 } },
633 .block_erase = spi_block_erase_20,
634 }, {
635 .eraseblocks = { { 64 * 1024, 2 } },
636 .block_erase = spi_block_erase_d8,
637 }, {
638 .eraseblocks = { { 128 * 1024, 1 } },
639 .block_erase = spi_block_erase_c7,
640 }
641 },
Alan Green0c65ed02019-07-26 08:07:01 +1000642 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000643 .unlock = spi_disable_blockprotect,
644 .write = spi_chip_write_256,
645 .read = spi_chip_read,
646 .voltage = {2700, 3600},
647 },
648
649 {
650 .vendor = "AMIC",
651 .name = "A25L016",
652 .bustype = BUS_SPI,
653 .manufacture_id = AMIC_ID_NOPREFIX,
654 .model_id = AMIC_A25L016,
655 .total_size = 2048,
656 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000657 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000658 .tested = TEST_UNTESTED,
659 .probe = probe_spi_rdid,
660 .probe_timing = TIMING_ZERO,
661 .block_erasers =
662 {
663 {
664 .eraseblocks = { { 4 * 1024, 512 } },
665 .block_erase = spi_block_erase_20,
666 }, {
667 .eraseblocks = { { 64 * 1024, 32 } },
668 .block_erase = spi_block_erase_d8,
669 }, {
670 .eraseblocks = { { 2048 * 1024, 1 } },
671 .block_erase = spi_block_erase_c7,
672 }
673 },
Alan Green0c65ed02019-07-26 08:07:01 +1000674 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000675 .unlock = spi_disable_blockprotect,
676 .write = spi_chip_write_256,
677 .read = spi_chip_read,
678 .voltage = {2700, 3600},
679 },
680
681 {
682 .vendor = "AMIC",
683 .name = "A25L020",
684 .bustype = BUS_SPI,
685 .manufacture_id = AMIC_ID_NOPREFIX,
686 .model_id = AMIC_A25L020,
687 .total_size = 256,
688 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000689 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000690 .tested = TEST_UNTESTED,
691 .probe = probe_spi_rdid,
692 .probe_timing = TIMING_ZERO,
693 .block_erasers =
694 {
695 {
696 .eraseblocks = { { 4 * 1024, 64 } },
697 .block_erase = spi_block_erase_20,
698 }, {
699 .eraseblocks = { { 64 * 1024, 4 } },
700 .block_erase = spi_block_erase_d8,
701 }, {
702 .eraseblocks = { { 256 * 1024, 1 } },
703 .block_erase = spi_block_erase_c7,
704 }
705 },
Alan Green0c65ed02019-07-26 08:07:01 +1000706 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000707 .unlock = spi_disable_blockprotect,
708 .write = spi_chip_write_256,
709 .read = spi_chip_read,
710 .voltage = {2700, 3600},
711 },
712
713 {
714 .vendor = "AMIC",
715 .name = "A25L032",
716 .bustype = BUS_SPI,
717 .manufacture_id = AMIC_ID_NOPREFIX,
718 .model_id = AMIC_A25L032,
719 .total_size = 4096,
720 .page_size = 256,
721 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +1000722 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greena3e041d2019-07-26 08:24:53 +1000723 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +1000724 .probe = probe_spi_rdid,
725 .probe_timing = TIMING_ZERO,
726 .block_erasers =
727 {
728 {
729 .eraseblocks = { { 4 * 1024, 1024 } },
730 .block_erase = spi_block_erase_20,
731 }, {
732 .eraseblocks = { { 64 * 1024, 64 } },
733 .block_erase = spi_block_erase_52,
734 }, {
735 .eraseblocks = { { 64 * 1024, 64 } },
736 .block_erase = spi_block_erase_d8,
737 }, {
738 .eraseblocks = { { 4096 * 1024, 1 } },
739 .block_erase = spi_block_erase_60,
740 }, {
741 .eraseblocks = { { 4096 * 1024, 1 } },
742 .block_erase = spi_block_erase_c7,
743 }
744 },
Alan Greena3e041d2019-07-26 08:24:53 +1000745 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
746 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +1000747 .write = spi_chip_write_256,
748 .read = spi_chip_read,
749 .voltage = {2700, 3600},
750 },
751
752 {
753 .vendor = "AMIC",
754 .name = "A25L040",
755 .bustype = BUS_SPI,
756 .manufacture_id = AMIC_ID_NOPREFIX,
757 .model_id = AMIC_A25L040,
758 .total_size = 512,
759 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000760 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000761 .tested = TEST_UNTESTED,
762 .probe = probe_spi_rdid,
763 .probe_timing = TIMING_ZERO,
764 .block_erasers =
765 {
766 {
767 .eraseblocks = { { 4 * 1024, 128 } },
768 .block_erase = spi_block_erase_20,
769 }, {
770 .eraseblocks = { { 64 * 1024, 8 } },
771 .block_erase = spi_block_erase_d8,
772 }, {
773 .eraseblocks = { { 512 * 1024, 1 } },
774 .block_erase = spi_block_erase_c7,
775 }
776 },
Alan Green0c65ed02019-07-26 08:07:01 +1000777 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000778 .unlock = spi_disable_blockprotect,
779 .write = spi_chip_write_256,
780 .read = spi_chip_read,
781 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +1000782 },
783
784 {
785 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000786 .name = "A25L05PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000787 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000788 .manufacture_id = AMIC_ID,
789 .model_id = AMIC_A25L05PT,
790 .total_size = 64,
791 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000792 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000793 .tested = TEST_UNTESTED,
794 .probe = probe_spi_rdid4,
795 .probe_timing = TIMING_ZERO,
796 .block_erasers =
797 {
798 {
799 .eraseblocks = {
800 {32 * 1024, 1},
801 {16 * 1024, 1},
802 {8 * 1024, 1},
803 {4 * 1024, 2},
804 },
805 .block_erase = spi_block_erase_d8,
806 }, {
807 .eraseblocks = { {64 * 1024, 1} },
808 .block_erase = spi_block_erase_c7,
809 }
810 },
Alan Green1ca1c862019-07-26 08:35:15 +1000811 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000812 .unlock = spi_disable_blockprotect,
813 .write = spi_chip_write_256,
814 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000815 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000816 },
817
818 {
819 .vendor = "AMIC",
820 .name = "A25L05PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000821 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000822 .manufacture_id = AMIC_ID,
823 .model_id = AMIC_A25L05PU,
824 .total_size = 64,
825 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000826 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000827 .tested = TEST_UNTESTED,
828 .probe = probe_spi_rdid4,
829 .probe_timing = TIMING_ZERO,
830 .block_erasers =
831 {
832 {
833 .eraseblocks = {
834 {4 * 1024, 2},
835 {8 * 1024, 1},
836 {16 * 1024, 1},
837 {32 * 1024, 1},
838 },
839 .block_erase = spi_block_erase_d8,
840 }, {
841 .eraseblocks = { {64 * 1024, 1} },
842 .block_erase = spi_block_erase_c7,
843 }
844 },
Alan Green1ca1c862019-07-26 08:35:15 +1000845 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000846 .unlock = spi_disable_blockprotect,
847 .write = spi_chip_write_256,
848 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +0000849 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000850 },
851
852 {
853 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000854 .name = "A25L080",
855 .bustype = BUS_SPI,
856 .manufacture_id = AMIC_ID_NOPREFIX,
857 .model_id = AMIC_A25L080,
858 .total_size = 1024,
859 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000860 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000861 .tested = TEST_UNTESTED,
862 .probe = probe_spi_rdid,
863 .probe_timing = TIMING_ZERO,
864 .block_erasers =
865 {
866 {
867 .eraseblocks = { { 4 * 1024, 256 } },
868 .block_erase = spi_block_erase_20,
869 }, {
870 .eraseblocks = { { 64 * 1024, 16 } },
871 .block_erase = spi_block_erase_d8,
872 }, {
873 .eraseblocks = { { 1024 * 1024, 1 } },
874 .block_erase = spi_block_erase_c7,
875 }
876 },
Alan Green0c65ed02019-07-26 08:07:01 +1000877 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000878 .unlock = spi_disable_blockprotect,
879 .write = spi_chip_write_256,
880 .read = spi_chip_read,
881 .voltage = {2700, 3600},
882 },
883
884 {
885 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000886 .name = "A25L10PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000887 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000888 .manufacture_id = AMIC_ID,
889 .model_id = AMIC_A25L10PT,
890 .total_size = 128,
891 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000892 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000893 .tested = TEST_UNTESTED,
894 .probe = probe_spi_rdid4,
895 .probe_timing = TIMING_ZERO,
896 .block_erasers =
897 {
898 {
899 .eraseblocks = {
900 {64 * 1024, 1},
901 {32 * 1024, 1},
902 {16 * 1024, 1},
903 {8 * 1024, 1},
904 {4 * 1024, 2},
905 },
906 .block_erase = spi_block_erase_d8,
907 }, {
908 .eraseblocks = { {128 * 1024, 1} },
909 .block_erase = spi_block_erase_c7,
910 }
911 },
Alan Green1ca1c862019-07-26 08:35:15 +1000912 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000913 .unlock = spi_disable_blockprotect,
914 .write = spi_chip_write_256,
915 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000916 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000917 },
918
919 {
920 .vendor = "AMIC",
921 .name = "A25L10PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000922 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000923 .manufacture_id = AMIC_ID,
924 .model_id = AMIC_A25L10PU,
925 .total_size = 128,
926 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000927 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000928 .tested = TEST_UNTESTED,
929 .probe = probe_spi_rdid4,
930 .probe_timing = TIMING_ZERO,
931 .block_erasers =
932 {
933 {
934 .eraseblocks = {
935 {4 * 1024, 2},
936 {8 * 1024, 1},
937 {16 * 1024, 1},
938 {32 * 1024, 1},
939 {64 * 1024, 1},
940 },
941 .block_erase = spi_block_erase_d8,
942 }, {
943 .eraseblocks = { {128 * 1024, 1} },
944 .block_erase = spi_block_erase_c7,
945 }
946 },
Alan Green1ca1c862019-07-26 08:35:15 +1000947 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000948 .unlock = spi_disable_blockprotect,
949 .write = spi_chip_write_256,
950 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000951 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000952 },
953
954 {
955 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000956 .name = "A25L16PT",
957 .bustype = BUS_SPI,
958 .manufacture_id = AMIC_ID,
959 .model_id = AMIC_A25L16PT,
960 .total_size = 2048,
961 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000962 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000963 .tested = TEST_UNTESTED,
964 .probe = probe_spi_rdid4,
965 .probe_timing = TIMING_ZERO,
966 .block_erasers =
967 {
968 {
969 .eraseblocks = {
970 {64 * 1024, 31},
971 {32 * 1024, 1},
972 {16 * 1024, 1},
973 {8 * 1024, 1},
974 {4 * 1024, 2},
975 },
976 .block_erase = spi_block_erase_d8,
977 }, {
978 .eraseblocks = { {2048 * 1024, 1} },
979 .block_erase = spi_block_erase_60,
980 }, {
981 .eraseblocks = { {2048 * 1024, 1} },
982 .block_erase = spi_block_erase_c7,
983 }
984 },
Alan Green0c65ed02019-07-26 08:07:01 +1000985 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000986 .unlock = spi_disable_blockprotect,
987 .write = spi_chip_write_256,
988 .read = spi_chip_read,
989 .voltage = {2700, 3600},
990 },
991
992 {
993 .vendor = "AMIC",
994 .name = "A25L16PU",
995 .bustype = BUS_SPI,
996 .manufacture_id = AMIC_ID,
997 .model_id = AMIC_A25L16PU,
998 .total_size = 2048,
999 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001000 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001001 .tested = TEST_OK_PR,
Alan Greend76dc1f2019-06-26 15:38:19 +10001002 .probe = probe_spi_rdid4,
1003 .probe_timing = TIMING_ZERO,
1004 .block_erasers =
1005 {
1006 {
1007 .eraseblocks = {
1008 {4 * 1024, 2},
1009 {8 * 1024, 1},
1010 {16 * 1024, 1},
1011 {32 * 1024, 1},
1012 {64 * 1024, 31},
1013 },
1014 .block_erase = spi_block_erase_d8,
1015 }, {
1016 .eraseblocks = { {2048 * 1024, 1} },
1017 .block_erase = spi_block_erase_60,
1018 }, {
1019 .eraseblocks = { {2048 * 1024, 1} },
1020 .block_erase = spi_block_erase_c7,
1021 }
1022 },
Alan Green0c65ed02019-07-26 08:07:01 +10001023 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10001024 .unlock = spi_disable_blockprotect,
1025 .write = spi_chip_write_256,
1026 .read = spi_chip_read,
1027 .voltage = {2700, 3600},
1028 },
1029
1030 {
1031 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001032 .name = "A25L20PT",
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_A25L20PT,
1036 .total_size = 256,
1037 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001038 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +00001039 .tested = TEST_UNTESTED,
1040 .probe = probe_spi_rdid4,
1041 .probe_timing = TIMING_ZERO,
1042 .block_erasers =
1043 {
1044 {
1045 .eraseblocks = {
1046 {64 * 1024, 3},
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 = { {256 * 1024, 1} },
1055 .block_erase = spi_block_erase_c7,
1056 }
1057 },
Alan Green1ca1c862019-07-26 08:35:15 +10001058 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +00001059 .unlock = spi_disable_blockprotect,
1060 .write = spi_chip_write_256,
1061 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001062 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001063 },
1064
1065 {
1066 .vendor = "AMIC",
1067 .name = "A25L20PU",
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_A25L20PU,
1071 .total_size = 256,
1072 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001073 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +00001074 .tested = TEST_UNTESTED,
1075 .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, 3},
1086 },
1087 .block_erase = spi_block_erase_d8,
1088 }, {
1089 .eraseblocks = { {256 * 1024, 1} },
1090 .block_erase = spi_block_erase_c7,
1091 }
1092 },
Alan Green1ca1c862019-07-26 08:35:15 +10001093 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +00001094 .unlock = spi_disable_blockprotect,
1095 .write = spi_chip_write_256,
1096 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001097 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001098 },
1099
1100 /* The A25L40P{T,U} chips are distinguished by their
1101 * erase block layouts, but without any distinction in RDID.
1102 * This inexplicable quirk was verified by Rudolf Marek
1103 * and discussed on the flashrom mailing list on 2010-07-12.
1104 */
1105 {
1106 .vendor = "AMIC",
1107 .name = "A25L40PT",
hailfingere1e41ea2011-07-27 07:13:06 +00001108 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001109 .manufacture_id = AMIC_ID,
1110 .model_id = AMIC_A25L40PT,
1111 .total_size = 512,
1112 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001113 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001114 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001115 .probe = probe_spi_rdid4,
1116 .probe_timing = TIMING_ZERO,
1117 .block_erasers =
1118 {
1119 {
1120 .eraseblocks = {
1121 {64 * 1024, 7},
1122 {32 * 1024, 1},
1123 {16 * 1024, 1},
1124 {8 * 1024, 1},
1125 {4 * 1024, 2},
1126 },
1127 .block_erase = spi_block_erase_d8,
1128 }, {
1129 .eraseblocks = { {512 * 1024, 1} },
1130 .block_erase = spi_block_erase_c7,
1131 }
1132 },
Alan Green0c65ed02019-07-26 08:07:01 +10001133 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001134 .unlock = spi_disable_blockprotect,
1135 .write = spi_chip_write_256,
1136 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001137 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001138 },
1139
1140 {
1141 .vendor = "AMIC",
1142 .name = "A25L40PU",
hailfingere1e41ea2011-07-27 07:13:06 +00001143 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001144 .manufacture_id = AMIC_ID,
1145 .model_id = AMIC_A25L40PU,
1146 .total_size = 512,
1147 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001148 .feature_bits = FEATURE_WRSR_WREN,
Alan Greene3e4fb82019-09-09 16:28:33 +10001149 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001150 .probe = probe_spi_rdid4,
1151 .probe_timing = TIMING_ZERO,
1152 .block_erasers =
1153 {
1154 {
1155 .eraseblocks = {
1156 {4 * 1024, 2},
1157 {8 * 1024, 1},
1158 {16 * 1024, 1},
1159 {32 * 1024, 1},
1160 {64 * 1024, 7},
1161 },
1162 .block_erase = spi_block_erase_d8,
1163 }, {
1164 .eraseblocks = { {512 * 1024, 1} },
1165 .block_erase = spi_block_erase_c7,
1166 }
1167 },
Alan Green0c65ed02019-07-26 08:07:01 +10001168 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001169 .unlock = spi_disable_blockprotect,
1170 .write = spi_chip_write_256,
1171 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001172 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001173 },
1174
1175 {
1176 .vendor = "AMIC",
hailfinger6eb433a2010-07-29 15:00:40 +00001177 .name = "A25L512",
hailfingere1e41ea2011-07-27 07:13:06 +00001178 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001179 .manufacture_id = AMIC_ID_NOPREFIX,
1180 .model_id = AMIC_A25L512,
1181 .total_size = 64,
1182 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001183 .feature_bits = FEATURE_WRSR_WREN,
hailfinger6eb433a2010-07-29 15:00:40 +00001184 .tested = TEST_UNTESTED,
1185 .probe = probe_spi_rdid,
1186 .probe_timing = TIMING_ZERO,
1187 .block_erasers =
1188 {
1189 {
1190 .eraseblocks = { { 4 * 1024, 16 } },
1191 .block_erase = spi_block_erase_20,
1192 }, {
1193 .eraseblocks = { { 64 * 1024, 1 } },
1194 .block_erase = spi_block_erase_d8,
1195 }, {
1196 .eraseblocks = { { 64 * 1024, 1 } },
1197 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001198 }
hailfinger6eb433a2010-07-29 15:00:40 +00001199 },
Alan Green0c65ed02019-07-26 08:07:01 +10001200 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001201 .unlock = spi_disable_blockprotect,
1202 .write = spi_chip_write_256,
1203 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001204 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001205 },
1206
1207 {
1208 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +10001209 .name = "A25L80P",
hailfingere1e41ea2011-07-27 07:13:06 +00001210 .bustype = BUS_SPI,
Alan Greend76dc1f2019-06-26 15:38:19 +10001211 .manufacture_id = AMIC_ID,
1212 .model_id = AMIC_A25L80P,
hailfinger6eb433a2010-07-29 15:00:40 +00001213 .total_size = 1024,
1214 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001215 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001216 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +10001217 .probe = probe_spi_rdid4,
hailfinger6eb433a2010-07-29 15:00:40 +00001218 .probe_timing = TIMING_ZERO,
1219 .block_erasers =
1220 {
1221 {
Alan Greend76dc1f2019-06-26 15:38:19 +10001222 .eraseblocks = {
1223 {4 * 1024, 2},
1224 {8 * 1024, 1},
1225 {16 * 1024, 1},
1226 {32 * 1024, 1},
1227 {64 * 1024, 15},
1228 },
hailfinger6eb433a2010-07-29 15:00:40 +00001229 .block_erase = spi_block_erase_d8,
1230 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10001231 .eraseblocks = { {1024 * 1024, 1} },
hailfinger6eb433a2010-07-29 15:00:40 +00001232 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001233 }
hailfinger6eb433a2010-07-29 15:00:40 +00001234 },
Alan Green0c65ed02019-07-26 08:07:01 +10001235 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001236 .unlock = spi_disable_blockprotect,
1237 .write = spi_chip_write_256,
1238 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001239 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001240 },
1241
1242 {
1243 .vendor = "AMIC",
Alan Greenbacd3232019-07-26 09:32:45 +10001244 .name = "A25LQ032/A25LQ32A",
hailfingere1e41ea2011-07-27 07:13:06 +00001245 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001246 .manufacture_id = AMIC_ID_NOPREFIX,
1247 .model_id = AMIC_A25LQ032,
1248 .total_size = 4096,
1249 .page_size = 256,
Alan Greenbacd3232019-07-26 09:32:45 +10001250 /* A25LQ32A supports SFDP */
Stefan Tauner9816fc82016-08-12 15:47:49 -07001251 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001253 .tested = TEST_UNTESTED,
1254 .probe = probe_spi_rdid,
1255 .probe_timing = TIMING_ZERO,
1256 .block_erasers =
1257 {
1258 {
1259 .eraseblocks = { { 4 * 1024, 1024 } },
1260 .block_erase = spi_block_erase_20,
1261 }, {
1262 .eraseblocks = { { 64 * 1024, 64 } },
1263 .block_erase = spi_block_erase_52,
1264 }, {
1265 .eraseblocks = { { 64 * 1024, 64 } },
1266 .block_erase = spi_block_erase_d8,
1267 }, {
1268 .eraseblocks = { { 4096 * 1024, 1 } },
1269 .block_erase = spi_block_erase_60,
1270 }, {
1271 .eraseblocks = { { 4096 * 1024, 1 } },
1272 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001273 }
hailfinger6eb433a2010-07-29 15:00:40 +00001274 },
Alan Greene2e73402019-09-02 15:47:59 +10001275 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1276 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
hailfinger6eb433a2010-07-29 15:00:40 +00001277 .write = spi_chip_write_256,
1278 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001279 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001280 },
1281
1282 {
1283 .vendor = "AMIC",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001284 .name = "A25LQ16",
1285 .bustype = BUS_SPI,
1286 .manufacture_id = AMIC_ID_NOPREFIX,
1287 .model_id = AMIC_A25LQ16,
1288 .total_size = 2048,
1289 .page_size = 256,
1290 /* supports SFDP */
1291 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1293 .tested = TEST_UNTESTED,
1294 .probe = probe_spi_rdid,
1295 .probe_timing = TIMING_ZERO,
1296 .block_erasers =
1297 {
1298 {
1299 .eraseblocks = { { 4 * 1024, 512 } },
1300 .block_erase = spi_block_erase_20,
1301 }, {
1302 .eraseblocks = { { 64 * 1024, 32 } },
1303 .block_erase = spi_block_erase_52,
1304 }, {
1305 .eraseblocks = { { 64 * 1024, 32 } },
1306 .block_erase = spi_block_erase_d8,
1307 }, {
1308 .eraseblocks = { { 2048 * 1024, 1 } },
1309 .block_erase = spi_block_erase_60,
1310 }, {
1311 .eraseblocks = { { 2048 * 1024, 1 } },
1312 .block_erase = spi_block_erase_c7,
1313 }
1314 },
1315 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1316 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1317 .write = spi_chip_write_256,
1318 .read = spi_chip_read,
1319 .voltage = {2700, 3600},
1320 },
1321
1322 {
1323 .vendor = "AMIC",
1324 .name = "A25LQ64",
1325 .bustype = BUS_SPI,
1326 .manufacture_id = AMIC_ID_NOPREFIX,
1327 .model_id = AMIC_A25LQ64,
1328 .total_size = 8192,
1329 .page_size = 256,
1330 /* supports SFDP */
1331 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1332 /* QPI enable 0x35, disable 0xF5 */
1333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1334 .tested = TEST_UNTESTED,
1335 .probe = probe_spi_rdid,
1336 .probe_timing = TIMING_ZERO,
1337 .block_erasers =
1338 {
1339 {
1340 .eraseblocks = { { 4 * 1024, 2048 } },
1341 .block_erase = spi_block_erase_20,
1342 }, {
1343 .eraseblocks = { { 32 * 1024, 256 } },
1344 .block_erase = spi_block_erase_52,
1345 }, {
1346 .eraseblocks = { { 64 * 1024, 128 } },
1347 .block_erase = spi_block_erase_d8,
1348 }, {
1349 .eraseblocks = { { 8192 * 1024, 1 } },
1350 .block_erase = spi_block_erase_60,
1351 }, {
1352 .eraseblocks = { { 8192 * 1024, 1 } },
1353 .block_erase = spi_block_erase_c7,
1354 }
1355 },
1356 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
1357 .unlock = spi_disable_blockprotect_bp3_srwd,
1358 .write = spi_chip_write_256,
1359 .read = spi_chip_read,
1360 .voltage = {2700, 3600},
1361 },
1362
1363 {
1364 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001365 .name = "A29002B",
hailfingere1e41ea2011-07-27 07:13:06 +00001366 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001367 .manufacture_id = AMIC_ID_NOPREFIX,
1368 .model_id = AMIC_A29002B,
1369 .total_size = 256,
1370 .page_size = 64 * 1024,
1371 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1372 .tested = TEST_UNTESTED,
1373 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001374 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001375 .block_erasers =
1376 {
1377 {
Simon Glass8dc82732013-07-16 10:13:51 -06001378 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001379 {16 * 1024, 1},
1380 {8 * 1024, 2},
1381 {32 * 1024, 1},
1382 {64 * 1024, 3},
1383 },
1384 .block_erase = erase_sector_jedec,
1385 }, {
1386 .eraseblocks = { {256 * 1024, 1} },
1387 .block_erase = erase_chip_block_jedec,
1388 },
1389 },
1390 .write = write_jedec_1,
1391 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001392 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001393 },
1394
1395 {
1396 .vendor = "AMIC",
1397 .name = "A29002T",
hailfingere1e41ea2011-07-27 07:13:06 +00001398 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001399 .manufacture_id = AMIC_ID_NOPREFIX,
1400 .model_id = AMIC_A29002T,
1401 .total_size = 256,
1402 .page_size = 64 * 1024,
1403 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00001404 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001405 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001406 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001407 .block_erasers =
1408 {
1409 {
Simon Glass8dc82732013-07-16 10:13:51 -06001410 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001411 {64 * 1024, 3},
1412 {32 * 1024, 1},
1413 {8 * 1024, 2},
1414 {16 * 1024, 1},
1415 },
1416 .block_erase = erase_sector_jedec,
1417 }, {
1418 .eraseblocks = { {256 * 1024, 1} },
1419 .block_erase = erase_chip_block_jedec,
1420 },
1421 },
1422 .write = write_jedec_1,
1423 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001424 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001425 },
1426
1427 {
1428 .vendor = "AMIC",
1429 .name = "A29040B",
hailfingere1e41ea2011-07-27 07:13:06 +00001430 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001431 .manufacture_id = AMIC_ID_NOPREFIX,
1432 .model_id = AMIC_A29040B,
1433 .total_size = 512,
1434 .page_size = 64 * 1024,
1435 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Alan Greena9956bd2019-07-26 09:10:41 +10001436 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001437 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001438 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001439 .block_erasers =
1440 {
1441 {
1442 .eraseblocks = { {64 * 1024, 8} },
1443 .block_erase = erase_sector_jedec,
1444 }, {
1445 .eraseblocks = { {512 * 1024, 1} },
1446 .block_erase = erase_chip_block_jedec,
1447 },
1448 },
1449 .write = write_jedec_1,
1450 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001451 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001452 },
1453
1454 {
1455 .vendor = "AMIC",
1456 .name = "A49LF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00001457 .bustype = BUS_LPC,
hailfinger61958912010-07-28 22:20:20 +00001458 .manufacture_id = AMIC_ID_NOPREFIX,
1459 .model_id = AMIC_A49LF040A,
1460 .total_size = 512,
1461 .page_size = 64 * 1024,
1462 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +10001463 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001464 .probe = probe_jedec,
1465 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1466 .block_erasers =
1467 {
1468 {
1469 .eraseblocks = { {64 * 1024, 8} },
1470 .block_erase = erase_block_jedec,
1471 }, {
1472 .eraseblocks = { {512 * 1024, 1} },
1473 .block_erase = erase_chip_block_jedec,
1474 }
1475 },
Alan Green90539742019-09-02 17:06:30 +10001476 .unlock = unlock_regspace2_uniform_64k,
hailfinger61958912010-07-28 22:20:20 +00001477 .write = write_jedec_1,
1478 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001479 .voltage = {3000, 3600},
hailfinger61958912010-07-28 22:20:20 +00001480 },
1481
1482 {
hailfinger286829b2009-01-08 03:40:17 +00001483 .vendor = "Atmel",
1484 .name = "AT25DF021",
hailfingere1e41ea2011-07-27 07:13:06 +00001485 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001486 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001487 .model_id = ATMEL_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001488 .total_size = 256,
1489 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001490 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001491 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001492 .tested = TEST_UNTESTED,
1493 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001494 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001495 .block_erasers =
1496 {
1497 {
1498 .eraseblocks = { {4 * 1024, 64} },
1499 .block_erase = spi_block_erase_20,
1500 }, {
1501 .eraseblocks = { {32 * 1024, 8} },
1502 .block_erase = spi_block_erase_52,
1503 }, {
1504 .eraseblocks = { {64 * 1024, 4} },
1505 .block_erase = spi_block_erase_d8,
1506 }, {
1507 .eraseblocks = { {256 * 1024, 1} },
1508 .block_erase = spi_block_erase_60,
1509 }, {
1510 .eraseblocks = { {256 * 1024, 1} },
1511 .block_erase = spi_block_erase_c7,
1512 }
1513 },
hailfingerc33d4732010-07-29 13:09:18 +00001514 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001515 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001516 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001517 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001518 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001519 },
1520
hailfinger286829b2009-01-08 03:40:17 +00001521 {
1522 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001523 .name = "AT25DF021A",
1524 .bustype = BUS_SPI,
1525 .manufacture_id = ATMEL_ID,
1526 .model_id = ATMEL_AT25DF021A,
1527 .total_size = 256,
1528 .page_size = 256,
1529 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1531 .tested = TEST_OK_PREW,
1532 .probe = probe_spi_rdid,
1533 .probe_timing = TIMING_ZERO,
1534 .block_erasers =
1535 {
1536 {
1537 .eraseblocks = { {4 * 1024, 64} },
1538 .block_erase = spi_block_erase_20,
1539 }, {
1540 .eraseblocks = { {32 * 1024, 8} },
1541 .block_erase = spi_block_erase_52,
1542 }, {
1543 .eraseblocks = { {64 * 1024, 4} },
1544 .block_erase = spi_block_erase_d8,
1545 }, {
1546 .eraseblocks = { {256 * 1024, 1} },
1547 .block_erase = spi_block_erase_60,
1548 }, {
1549 .eraseblocks = { {256 * 1024, 1} },
1550 .block_erase = spi_block_erase_c7,
1551 }
1552 },
1553 .printlock = spi_prettyprint_status_register_at25df,
1554 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1555 .write = spi_chip_write_256,
1556 .read = spi_chip_read,
1557 .voltage = {1650, 3600},
1558 },
1559
1560 {
1561 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001562 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001563 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001564 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001565 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001566 .total_size = 512,
1567 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001568 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001569 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001570 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001571 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001572 .block_erasers =
1573 {
1574 {
1575 .eraseblocks = { {4 * 1024, 128} },
1576 .block_erase = spi_block_erase_20,
1577 }, {
1578 .eraseblocks = { {32 * 1024, 16} },
1579 .block_erase = spi_block_erase_52,
1580 }, {
1581 .eraseblocks = { {64 * 1024, 8} },
1582 .block_erase = spi_block_erase_d8,
1583 }, {
1584 .eraseblocks = { {512 * 1024, 1} },
1585 .block_erase = spi_block_erase_60,
1586 }, {
1587 .eraseblocks = { {512 * 1024, 1} },
1588 .block_erase = spi_block_erase_c7,
1589 }
1590 },
hailfingerc33d4732010-07-29 13:09:18 +00001591 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001592 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001593 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001594 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001595 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001596 },
1597
hailfinger286829b2009-01-08 03:40:17 +00001598 {
1599 .vendor = "Atmel",
1600 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001601 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001602 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001603 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001604 .total_size = 1024,
1605 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001606 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00001607 .tested = TEST_UNTESTED,
1608 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001609 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001610 .block_erasers =
1611 {
1612 {
1613 .eraseblocks = { {4 * 1024, 256} },
1614 .block_erase = spi_block_erase_20,
1615 }, {
1616 .eraseblocks = { {32 * 1024, 32} },
1617 .block_erase = spi_block_erase_52,
1618 }, {
1619 .eraseblocks = { {64 * 1024, 16} },
1620 .block_erase = spi_block_erase_d8,
1621 }, {
1622 .eraseblocks = { {1024 * 1024, 1} },
1623 .block_erase = spi_block_erase_60,
1624 }, {
1625 .eraseblocks = { {1024 * 1024, 1} },
1626 .block_erase = spi_block_erase_c7,
1627 }
1628 },
hailfingerc33d4732010-07-29 13:09:18 +00001629 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001630 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfingerc33d4732010-07-29 13:09:18 +00001631 .write = spi_chip_write_256,
1632 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001633 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001634 },
1635
1636 {
1637 .vendor = "Atmel",
1638 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001639 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001640 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001641 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001642 .total_size = 1024,
1643 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001644 .feature_bits = FEATURE_WRSR_WREN,
hailfingerc33d4732010-07-29 13:09:18 +00001645 .tested = TEST_UNTESTED,
1646 .probe = probe_spi_rdid,
1647 .probe_timing = TIMING_ZERO,
1648 .block_erasers =
1649 {
1650 {
1651 .eraseblocks = { {4 * 1024, 256} },
1652 .block_erase = spi_block_erase_20,
1653 }, {
1654 .eraseblocks = { {32 * 1024, 32} },
1655 .block_erase = spi_block_erase_52,
1656 }, {
1657 .eraseblocks = { {64 * 1024, 16} },
1658 .block_erase = spi_block_erase_d8,
1659 }, {
1660 .eraseblocks = { {1024 * 1024, 1} },
1661 .block_erase = spi_block_erase_60,
1662 }, {
1663 .eraseblocks = { {1024 * 1024, 1} },
1664 .block_erase = spi_block_erase_c7,
1665 }
1666 },
1667 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001668 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001669 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001670 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001671 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001672 },
1673
hailfinger286829b2009-01-08 03:40:17 +00001674 {
1675 .vendor = "Atmel",
1676 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001677 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001678 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001679 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001680 .total_size = 2048,
1681 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001682 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001683 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001684 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001685 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001686 .block_erasers =
1687 {
1688 {
1689 .eraseblocks = { {4 * 1024, 512} },
1690 .block_erase = spi_block_erase_20,
1691 }, {
1692 .eraseblocks = { {32 * 1024, 64} },
1693 .block_erase = spi_block_erase_52,
1694 }, {
1695 .eraseblocks = { {64 * 1024, 32} },
1696 .block_erase = spi_block_erase_d8,
1697 }, {
1698 .eraseblocks = { {2 * 1024 * 1024, 1} },
1699 .block_erase = spi_block_erase_60,
1700 }, {
1701 .eraseblocks = { {2 * 1024 * 1024, 1} },
1702 .block_erase = spi_block_erase_c7,
1703 }
1704 },
hailfingerc33d4732010-07-29 13:09:18 +00001705 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001706 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001707 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001708 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001709 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001710 },
1711
Nikolai Artemiev860d4912021-02-16 15:12:53 +11001712 /*The AT26DF321 has the same ID as the AT25DF321. */
hailfinger286829b2009-01-08 03:40:17 +00001713 {
1714 .vendor = "Atmel",
1715 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001716 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001717 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001718 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001719 .total_size = 4096,
1720 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001721 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001722 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001723 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001724 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001725 .block_erasers =
1726 {
1727 {
1728 .eraseblocks = { {4 * 1024, 1024} },
1729 .block_erase = spi_block_erase_20,
1730 }, {
1731 .eraseblocks = { {32 * 1024, 128} },
1732 .block_erase = spi_block_erase_52,
1733 }, {
1734 .eraseblocks = { {64 * 1024, 64} },
1735 .block_erase = spi_block_erase_d8,
1736 }, {
1737 .eraseblocks = { {4 * 1024 * 1024, 1} },
1738 .block_erase = spi_block_erase_60,
1739 }, {
1740 .eraseblocks = { {4 * 1024 * 1024, 1} },
1741 .block_erase = spi_block_erase_c7,
1742 }
1743 },
hailfingerc33d4732010-07-29 13:09:18 +00001744 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001745 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001746 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001747 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001748 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001749 },
1750
hailfinger286829b2009-01-08 03:40:17 +00001751 {
1752 .vendor = "Atmel",
1753 .name = "AT25DF321A",
hailfingere1e41ea2011-07-27 07:13:06 +00001754 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001755 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001756 .model_id = ATMEL_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001757 .total_size = 4096,
1758 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001759 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001760 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenb2d50132019-09-16 12:26:24 +10001761 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001762 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001763 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001764 .block_erasers =
1765 {
1766 {
1767 .eraseblocks = { {4 * 1024, 1024} },
1768 .block_erase = spi_block_erase_20,
1769 }, {
1770 .eraseblocks = { {32 * 1024, 128} },
1771 .block_erase = spi_block_erase_52,
1772 }, {
1773 .eraseblocks = { {64 * 1024, 64} },
1774 .block_erase = spi_block_erase_d8,
1775 }, {
1776 .eraseblocks = { {4 * 1024 * 1024, 1} },
1777 .block_erase = spi_block_erase_60,
1778 }, {
1779 .eraseblocks = { {4 * 1024 * 1024, 1} },
1780 .block_erase = spi_block_erase_c7,
1781 }
1782 },
hailfingerc33d4732010-07-29 13:09:18 +00001783 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001784 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001785 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001786 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001787 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001788 },
1789
hailfinger286829b2009-01-08 03:40:17 +00001790 {
1791 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001792 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001793 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001794 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001795 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001796 .total_size = 8192,
1797 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001798 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001799 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001800 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001801 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001802 .block_erasers =
1803 {
1804 {
1805 .eraseblocks = { {4 * 1024, 2048} },
1806 .block_erase = spi_block_erase_20,
1807 }, {
1808 .eraseblocks = { {32 * 1024, 256} },
1809 .block_erase = spi_block_erase_52,
1810 }, {
1811 .eraseblocks = { {64 * 1024, 128} },
1812 .block_erase = spi_block_erase_d8,
1813 }, {
1814 .eraseblocks = { {8 * 1024 * 1024, 1} },
1815 .block_erase = spi_block_erase_60,
1816 }, {
1817 .eraseblocks = { {8 * 1024 * 1024, 1} },
1818 .block_erase = spi_block_erase_c7,
1819 }
1820 },
hailfingerc33d4732010-07-29 13:09:18 +00001821 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001822 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfingerc33d4732010-07-29 13:09:18 +00001823 .write = spi_chip_write_256,
1824 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001825 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001826 },
1827
1828 {
1829 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001830 .name = "AT25DL081",
1831 .bustype = BUS_SPI,
1832 .manufacture_id = ATMEL_ID,
1833 .model_id = ATMEL_AT25DF081,
1834 .total_size = 1024,
1835 .page_size = 256,
1836 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1838 .tested = TEST_UNTESTED,
1839 .probe = probe_spi_rdid,
1840 .probe_timing = TIMING_ZERO,
1841 .block_erasers =
1842 {
1843 {
1844 .eraseblocks = { {4 * 1024, 256} },
1845 .block_erase = spi_block_erase_20,
1846 }, {
1847 .eraseblocks = { {32 * 1024, 32} },
1848 .block_erase = spi_block_erase_52,
1849 }, {
1850 .eraseblocks = { {64 * 1024, 16} },
1851 .block_erase = spi_block_erase_d8,
1852 }, {
1853 .eraseblocks = { {1 * 1024 * 1024, 1} },
1854 .block_erase = spi_block_erase_60,
1855 }, {
1856 .eraseblocks = { {1 * 1024 * 1024, 1} },
1857 .block_erase = spi_block_erase_c7,
1858 }
1859 },
1860 .printlock = spi_prettyprint_status_register_at25df_sec,
1861 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1862 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1863 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1864 .voltage = {1650, 1950},
1865 },
1866
1867 {
1868 .vendor = "Atmel",
1869 .name = "AT25DL161",
1870 .bustype = BUS_SPI,
1871 .manufacture_id = ATMEL_ID,
1872 .model_id = ATMEL_AT25DL161,
1873 .total_size = 2048,
1874 .page_size = 256,
1875 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1877 .tested = TEST_UNTESTED,
1878 .probe = probe_spi_rdid,
1879 .probe_timing = TIMING_ZERO,
1880 .block_erasers =
1881 {
1882 {
1883 .eraseblocks = { {4 * 1024, 512} },
1884 .block_erase = spi_block_erase_20,
1885 }, {
1886 .eraseblocks = { {32 * 1024, 64} },
1887 .block_erase = spi_block_erase_52,
1888 }, {
1889 .eraseblocks = { {64 * 1024, 32} },
1890 .block_erase = spi_block_erase_d8,
1891 }, {
1892 .eraseblocks = { {2 * 1024 * 1024, 1} },
1893 .block_erase = spi_block_erase_60,
1894 }, {
1895 .eraseblocks = { {2 * 1024 * 1024, 1} },
1896 .block_erase = spi_block_erase_c7,
1897 }
1898 },
1899 .printlock = spi_prettyprint_status_register_at25df_sec,
1900 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1901 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1902 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1903 .voltage = {1650, 1950},
1904 },
1905
1906 {
1907 .vendor = "Atmel",
hailfingerc33d4732010-07-29 13:09:18 +00001908 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001909 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001910 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001911 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001912 .total_size = 2048,
1913 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001914 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001915 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerc33d4732010-07-29 13:09:18 +00001916 .tested = TEST_UNTESTED,
1917 .probe = probe_spi_rdid,
1918 .probe_timing = TIMING_ZERO,
1919 .block_erasers =
1920 {
1921 {
1922 .eraseblocks = { {4 * 1024, 512} },
1923 .block_erase = spi_block_erase_20,
1924 }, {
1925 .eraseblocks = { {32 * 1024, 64} },
1926 .block_erase = spi_block_erase_52,
1927 }, {
1928 .eraseblocks = { {64 * 1024, 32} },
1929 .block_erase = spi_block_erase_d8,
1930 }, {
1931 .eraseblocks = { {2 * 1024 * 1024, 1} },
1932 .block_erase = spi_block_erase_60,
1933 }, {
1934 .eraseblocks = { {2 * 1024 * 1024, 1} },
1935 .block_erase = spi_block_erase_c7,
1936 }
1937 },
1938 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001939 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001940 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001941 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001942 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001943 },
1944
hailfinger286829b2009-01-08 03:40:17 +00001945 {
1946 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001947 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1948 * All other properties seem to be the same.*/
1949 .name = "AT25F1024(A)",
1950 .bustype = BUS_SPI,
1951 .manufacture_id = ATMEL_ID,
1952 .model_id = ATMEL_AT25F1024,
1953 .total_size = 128,
1954 .page_size = 256,
1955 .feature_bits = FEATURE_WRSR_WREN,
1956 .tested = TEST_OK_PREW,
1957 .probe = probe_spi_at25f,
1958 .probe_timing = TIMING_ZERO,
1959 .block_erasers =
1960 {
1961 {
1962 .eraseblocks = { {32 * 1024, 4} },
1963 .block_erase = spi_block_erase_52,
1964 }, {
1965 .eraseblocks = { {128 * 1024, 1} },
1966 .block_erase = spi_block_erase_62,
1967 }
1968 },
1969 .printlock = spi_prettyprint_status_register_at25f,
1970 .unlock = spi_disable_blockprotect_at25f,
1971 .write = spi_chip_write_256,
1972 .read = spi_chip_read,
1973 .voltage = {2700, 3600},
1974 },
1975
1976 {
1977 .vendor = "Atmel",
1978 .name = "AT25F2048",
1979 .bustype = BUS_SPI,
1980 .manufacture_id = ATMEL_ID,
1981 .model_id = ATMEL_AT25F2048,
1982 .total_size = 256,
1983 .page_size = 256,
1984 .feature_bits = FEATURE_WRSR_WREN,
1985 .tested = TEST_UNTESTED,
1986 .probe = probe_spi_at25f,
1987 .probe_timing = TIMING_ZERO,
1988 .block_erasers =
1989 {
1990 {
1991 .eraseblocks = { {64 * 1024, 4} },
1992 .block_erase = spi_block_erase_52,
1993 }, {
1994 .eraseblocks = { {256 * 1024, 1} },
1995 .block_erase = spi_block_erase_62,
1996 }
1997 },
1998 .printlock = spi_prettyprint_status_register_at25f,
1999 .unlock = spi_disable_blockprotect_at25f,
2000 .write = spi_chip_write_256,
2001 .read = spi_chip_read,
2002 .voltage = {2700, 3600},
2003 },
2004
2005 {
2006 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002007 .name = "AT25F4096",
2008 .bustype = BUS_SPI,
2009 .manufacture_id = ATMEL_ID,
2010 .model_id = ATMEL_AT25F4096,
2011 .total_size = 512,
2012 .page_size = 256,
2013 .feature_bits = FEATURE_WRSR_WREN,
2014 .tested = TEST_OK_PREW,
2015 .probe = probe_spi_at25f,
2016 .probe_timing = TIMING_ZERO,
2017 .block_erasers =
2018 {
2019 {
2020 .eraseblocks = { {64 * 1024, 8} },
2021 .block_erase = spi_block_erase_52,
2022 }, {
2023 .eraseblocks = { {512 * 1024, 1} },
2024 .block_erase = spi_block_erase_62,
2025 }
2026 },
2027 .printlock = spi_prettyprint_status_register_at25f4096,
2028 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2029 .unlock = spi_disable_blockprotect_bp2_srwd,
2030 .write = spi_chip_write_256,
2031 .read = spi_chip_read,
2032 .voltage = {2700, 3600},
2033 },
2034
2035 {
2036 .vendor = "Atmel",
2037 .name = "AT25F512",
2038 .bustype = BUS_SPI,
2039 .manufacture_id = ATMEL_ID,
2040 .model_id = ATMEL_AT25F512,
2041 .total_size = 64,
2042 .page_size = 256,
2043 .feature_bits = FEATURE_WRSR_WREN,
2044 .tested = TEST_OK_PREW,
2045 .probe = probe_spi_at25f,
2046 .probe_timing = TIMING_ZERO,
2047 .block_erasers =
2048 {
2049 {
2050 .eraseblocks = { {32 * 1024, 2} },
2051 .block_erase = spi_block_erase_52,
2052 }, {
2053 .eraseblocks = { {64 * 1024, 1} },
2054 .block_erase = spi_block_erase_62,
2055 }
2056 },
2057 .printlock = spi_prettyprint_status_register_at25f,
2058 .unlock = spi_disable_blockprotect_at25f,
2059 .write = spi_chip_write_256,
2060 .read = spi_chip_read,
2061 .voltage = {2700, 3600},
2062 },
2063
2064 {
2065 .vendor = "Atmel",
2066 .name = "AT25F512A",
2067 .bustype = BUS_SPI,
2068 .manufacture_id = ATMEL_ID,
2069 .model_id = ATMEL_AT25F512A,
2070 .total_size = 64,
2071 .page_size = 128,
2072 .feature_bits = FEATURE_WRSR_WREN,
2073 .tested = TEST_OK_PREW,
2074 .probe = probe_spi_at25f,
2075 .probe_timing = TIMING_ZERO,
2076 .block_erasers =
2077 {
2078 {
2079 .eraseblocks = { {32 * 1024, 2} },
2080 .block_erase = spi_block_erase_52,
2081 }, {
2082 .eraseblocks = { {64 * 1024, 1} },
2083 .block_erase = spi_block_erase_62,
2084 }
2085 },
2086 .printlock = spi_prettyprint_status_register_at25f512a,
2087 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2088 .unlock = spi_disable_blockprotect_at25f512a,
2089 .write = spi_chip_write_256,
2090 .read = spi_chip_read,
2091 .voltage = {2700, 3600},
2092 },
2093
2094 {
2095 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002096 .name = "AT25F512B",
hailfingere1e41ea2011-07-27 07:13:06 +00002097 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002098 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002099 .model_id = ATMEL_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00002100 .total_size = 64,
2101 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07002102 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10002103 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00002104 .tested = TEST_UNTESTED,
2105 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002106 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002107 .block_erasers =
2108 {
2109 {
2110 .eraseblocks = { {4 * 1024, 16} },
2111 .block_erase = spi_block_erase_20,
2112 }, {
2113 .eraseblocks = { {32 * 1024, 2} },
2114 .block_erase = spi_block_erase_52,
2115 }, {
2116 .eraseblocks = { {32 * 1024, 2} },
2117 .block_erase = spi_block_erase_d8,
2118 }, {
2119 .eraseblocks = { {64 * 1024, 1} },
2120 .block_erase = spi_block_erase_60,
2121 }, {
2122 .eraseblocks = { {64 * 1024, 1} },
2123 .block_erase = spi_block_erase_c7,
Alan Green5d709732019-09-16 12:32:25 +10002124 }, {
2125 .eraseblocks = { {64 * 1024, 1} },
2126 .block_erase = spi_block_erase_62,
hailfinger22155a82009-12-23 12:02:55 +00002127 }
2128 },
Alan Green5d709732019-09-16 12:32:25 +10002129 .printlock = spi_prettyprint_status_register_at25f512b,
2130 .unlock = spi_disable_blockprotect_at25f512b,
hailfinger87c05482009-05-09 02:34:18 +00002131 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002132 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002133 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002134 },
2135
hailfinger286829b2009-01-08 03:40:17 +00002136 {
2137 .vendor = "Atmel",
2138 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00002139 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002140 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002141 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00002142 .total_size = 128,
2143 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002144 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002145 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002146 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002147 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002148 .block_erasers =
2149 {
2150 {
2151 .eraseblocks = { {4 * 1024, 32} },
2152 .block_erase = spi_block_erase_20,
2153 }, {
hailfingerc33d4732010-07-29 13:09:18 +00002154 .eraseblocks = { {4 * 1024, 32} },
2155 .block_erase = spi_block_erase_d7,
2156 }, {
hailfinger22155a82009-12-23 12:02:55 +00002157 .eraseblocks = { {32 * 1024, 4} },
2158 .block_erase = spi_block_erase_52,
2159 }, {
2160 .eraseblocks = { {32 * 1024, 4} },
2161 .block_erase = spi_block_erase_d8,
2162 }, {
2163 .eraseblocks = { {128 * 1024, 1} },
2164 .block_erase = spi_block_erase_60,
2165 }, {
2166 .eraseblocks = { {128 * 1024, 1} },
2167 .block_erase = spi_block_erase_c7,
2168 }
2169 },
hailfingerc33d4732010-07-29 13:09:18 +00002170 .printlock = spi_prettyprint_status_register_at25fs010,
2171 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00002172 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002173 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002174 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002175 },
2176
hailfinger286829b2009-01-08 03:40:17 +00002177 {
2178 .vendor = "Atmel",
2179 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00002180 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002181 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002182 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00002183 .total_size = 512,
2184 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002185 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00002186 .tested = TEST_UNTESTED,
2187 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002188 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002189 .block_erasers =
2190 {
2191 {
2192 .eraseblocks = { {4 * 1024, 128} },
2193 .block_erase = spi_block_erase_20,
2194 }, {
2195 .eraseblocks = { {64 * 1024, 8} },
2196 .block_erase = spi_block_erase_52,
2197 }, {
2198 .eraseblocks = { {64 * 1024, 8} },
2199 .block_erase = spi_block_erase_d8,
2200 }, {
2201 .eraseblocks = { {512 * 1024, 1} },
2202 .block_erase = spi_block_erase_60,
2203 }, {
2204 .eraseblocks = { {512 * 1024, 1} },
2205 .block_erase = spi_block_erase_c7,
2206 }
2207 },
hailfingerc33d4732010-07-29 13:09:18 +00002208 .printlock = spi_prettyprint_status_register_at25fs040,
2209 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00002210 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002211 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002212 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002213 },
2214
hailfinger286829b2009-01-08 03:40:17 +00002215 {
2216 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002217 .name = "AT25SF041",
2218 .bustype = BUS_SPI,
2219 .manufacture_id = ATMEL_ID,
2220 .model_id = ATMEL_AT25SF041,
2221 .total_size = 512,
2222 .page_size = 256,
2223 .feature_bits = FEATURE_WRSR_WREN,
2224 .tested = TEST_OK_PREW,
2225 .probe = probe_spi_rdid,
2226 .probe_timing = TIMING_ZERO,
2227 .block_erasers =
2228 {
2229 {
2230 .eraseblocks = { {4 * 1024, 128} },
2231 .block_erase = spi_block_erase_20,
2232 }, {
2233 .eraseblocks = { {32 * 1024, 16} },
2234 .block_erase = spi_block_erase_52,
2235 }, {
2236 .eraseblocks = { {64 * 1024, 8} },
2237 .block_erase = spi_block_erase_d8,
2238 }, {
2239 .eraseblocks = { {512 * 1024, 1} },
2240 .block_erase = spi_block_erase_60,
2241 }, {
2242 .eraseblocks = { {512 * 1024, 1} },
2243 .block_erase = spi_block_erase_c7,
2244 }
2245 },
2246 .printlock = spi_prettyprint_status_register_plain,
2247 .unlock = spi_disable_blockprotect,
2248 .write = spi_chip_write_256,
2249 .read = spi_chip_read,
2250 .voltage = {2500, 3600},
2251 },
2252
2253 {
2254 .vendor = "Atmel",
2255 .name = "AT25SF081",
2256 .bustype = BUS_SPI,
2257 .manufacture_id = ATMEL_ID,
2258 .model_id = ATMEL_AT25SF081,
2259 .total_size = 1024,
2260 .page_size = 256,
2261 .feature_bits = FEATURE_WRSR_WREN,
2262 .tested = TEST_OK_PREW,
2263 .probe = probe_spi_rdid,
2264 .probe_timing = TIMING_ZERO,
2265 .block_erasers =
2266 {
2267 {
2268 .eraseblocks = { {4 * 1024, 256} },
2269 .block_erase = spi_block_erase_20,
2270 }, {
2271 .eraseblocks = { {32 * 1024, 32} },
2272 .block_erase = spi_block_erase_52,
2273 }, {
2274 .eraseblocks = { {64 * 1024, 16} },
2275 .block_erase = spi_block_erase_d8,
2276 }, {
2277 .eraseblocks = { {1024 * 1024, 1} },
2278 .block_erase = spi_block_erase_60,
2279 }, {
2280 .eraseblocks = { {1024 * 1024, 1} },
2281 .block_erase = spi_block_erase_c7,
2282 }
2283 },
2284 .printlock = spi_prettyprint_status_register_plain,
2285 .unlock = spi_disable_blockprotect,
2286 .write = spi_chip_write_256,
2287 .read = spi_chip_read,
2288 .voltage = {2300, 3600},
2289 },
2290
2291 {
2292 .vendor = "Atmel",
Alan Greenab43dc02019-08-06 15:56:21 +10002293 .name = "AT25SF128A",
2294 .bustype = BUS_SPI,
2295 .manufacture_id = ATMEL_ID,
2296 .model_id = ATMEL_AT25SF128A,
2297 .total_size = 16384,
2298 .page_size = 256,
2299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green597a4122019-09-02 10:57:28 +10002300 .tested = TEST_OK_PR,
Alan Greenab43dc02019-08-06 15:56:21 +10002301 .probe = probe_spi_rdid,
2302 .probe_timing = TIMING_ZERO,
2303 .block_erasers =
2304 {
2305 {
2306 .eraseblocks = { {4 * 1024, 4096} },
2307 .block_erase = spi_block_erase_20,
2308 }, {
2309 .eraseblocks = { {32 * 1024, 512} },
2310 .block_erase = spi_block_erase_52,
2311 }, {
2312 .eraseblocks = { {64 * 1024, 256} },
2313 .block_erase = spi_block_erase_d8,
2314 }, {
2315 .eraseblocks = { {16 * 1024 * 1024, 1} },
2316 .block_erase = spi_block_erase_60,
2317 }, {
2318 .eraseblocks = { {16 * 1024 * 1024, 1} },
2319 .block_erase = spi_block_erase_c7,
2320 }
2321 },
Alan Green597a4122019-09-02 10:57:28 +10002322 .printlock = spi_prettyprint_status_register_bp4_srwd,
2323 .unlock = spi_disable_blockprotect_bp4_srwd,
Alan Greenab43dc02019-08-06 15:56:21 +10002324 .write = spi_chip_write_256,
2325 .read = spi_chip_read,
2326 .voltage = {1700, 2000},
Alan Greenab43dc02019-08-06 15:56:21 +10002327 },
2328
2329 {
2330 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002331 .name = "AT25SF161",
2332 .bustype = BUS_SPI,
2333 .manufacture_id = ATMEL_ID,
2334 .model_id = ATMEL_AT25SF161,
2335 .total_size = 2048,
2336 .page_size = 256,
2337 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2338 .tested = TEST_OK_PREW,
2339 .probe = probe_spi_rdid,
2340 .probe_timing = TIMING_ZERO,
2341 .block_erasers =
2342 {
2343 {
2344 .eraseblocks = { {4 * 1024, 512} },
2345 .block_erase = spi_block_erase_20,
2346 }, {
2347 .eraseblocks = { {32 * 1024, 64} },
2348 .block_erase = spi_block_erase_52,
2349 }, {
2350 .eraseblocks = { {64 * 1024, 32} },
2351 .block_erase = spi_block_erase_d8,
2352 }, {
2353 .eraseblocks = { {2048 * 1024, 1} },
2354 .block_erase = spi_block_erase_60,
2355 }, {
2356 .eraseblocks = { {2048 * 1024, 1} },
2357 .block_erase = spi_block_erase_c7,
2358 }
2359 },
2360 .printlock = spi_prettyprint_status_register_plain,
2361 .unlock = spi_disable_blockprotect,
2362 .write = spi_chip_write_256,
2363 .read = spi_chip_read,
2364 .voltage = {2500, 3600},
2365 },
2366
2367 {
2368 .vendor = "Atmel",
darkarniumdfec39a2019-11-04 20:06:48 +00002369 .name = "AT25SF321",
2370 .bustype = BUS_SPI,
2371 .manufacture_id = ATMEL_ID,
2372 .model_id = ATMEL_AT25SF321,
2373 .total_size = 4096,
2374 .page_size = 256,
2375 .feature_bits = FEATURE_WRSR_WREN,
2376 .tested = TEST_OK_PR,
2377 .probe = probe_spi_rdid,
2378 .probe_timing = TIMING_ZERO,
2379 .block_erasers =
2380 {
2381 {
2382 .eraseblocks = { {4 * 1024, 1024} },
2383 .block_erase = spi_block_erase_20,
2384 }, {
2385 .eraseblocks = { {32 * 1024, 128} },
2386 .block_erase = spi_block_erase_52,
2387 }, {
2388 .eraseblocks = { {64 * 1024, 64} },
2389 .block_erase = spi_block_erase_d8,
2390 }, {
2391 .eraseblocks = { {4096 * 1024, 1} },
2392 .block_erase = spi_block_erase_60,
2393 }, {
2394 .eraseblocks = { {4096 * 1024, 1} },
2395 .block_erase = spi_block_erase_c7,
2396 }
2397 },
2398 .printlock = spi_prettyprint_status_register_plain,
2399 .unlock = spi_disable_blockprotect,
2400 .write = spi_chip_write_256,
2401 .read = spi_chip_read,
2402 .voltage = {2500, 3600},
2403 },
2404
2405 {
2406 .vendor = "Atmel",
Alan Greenab43dc02019-08-06 15:56:21 +10002407 .name = "AT25SL128A",
2408 .bustype = BUS_SPI,
2409 .manufacture_id = ATMEL_ID,
2410 .model_id = ATMEL_AT25SL128A,
2411 .total_size = 16384,
2412 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10002413 /* supports SFDP */
2414 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Greenab43dc02019-08-06 15:56:21 +10002415 .tested = TEST_OK_PREW,
2416 .probe = probe_spi_rdid,
2417 .probe_timing = TIMING_ZERO,
2418 .block_erasers =
2419 {
2420 {
2421 .eraseblocks = { {4 * 1024, 4096} },
2422 .block_erase = spi_block_erase_20,
2423 }, {
2424 .eraseblocks = { {32 * 1024, 512} },
2425 .block_erase = spi_block_erase_52,
2426 }, {
2427 .eraseblocks = { {64 * 1024, 256} },
2428 .block_erase = spi_block_erase_d8,
2429 }, {
2430 .eraseblocks = { {16 * 1024 * 1024, 1} },
2431 .block_erase = spi_block_erase_60,
2432 }, {
2433 .eraseblocks = { {16 * 1024 * 1024, 1} },
2434 .block_erase = spi_block_erase_c7,
2435 }
2436 },
Nikolai Artemievea73e4b2021-02-16 16:08:02 +11002437 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Nikolai Artemiev84d1e7a2020-12-08 16:02:10 +11002438 .unlock = spi_disable_blockprotect,
Alan Greenab43dc02019-08-06 15:56:21 +10002439 .write = spi_chip_write_256,
2440 .read = spi_chip_read,
2441 .voltage = {1700, 2000},
Alan Greenab43dc02019-08-06 15:56:21 +10002442 },
2443
2444 {
2445 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002446 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00002447 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002448 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002449 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00002450 .total_size = 512,
2451 .page_size = 256,
Alan Green1fdf13b2019-09-16 12:54:45 +10002452 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2453 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002454 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002455 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002456 .block_erasers =
2457 {
2458 {
Alan Green1fdf13b2019-09-16 12:54:45 +10002459 .eraseblocks = { {256, 2048} },
2460 .block_erase = spi_block_erase_81,
2461 }, {
2462 .eraseblocks = { {2 * 1024, 256} },
2463 .block_erase = spi_block_erase_50,
2464 }, {
hailfinger22155a82009-12-23 12:02:55 +00002465 .eraseblocks = { {4 * 1024, 128} },
2466 .block_erase = spi_block_erase_20,
2467 }
2468 },
Alan Green6cfd0182019-07-26 13:50:04 +10002469 .printlock = spi_prettyprint_status_register_plain,
Alan Green1fdf13b2019-09-16 12:54:45 +10002470 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
2471 .write = spi_chip_write_1,
2472 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002473 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00002474 },
2475
hailfinger286829b2009-01-08 03:40:17 +00002476 {
2477 .vendor = "Atmel",
2478 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00002479 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002480 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002481 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00002482 .total_size = 1024,
2483 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00002484 .feature_bits = FEATURE_WRSR_WREN,
2485 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002486 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002487 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002488 .block_erasers =
2489 {
2490 {
2491 .eraseblocks = { {4 * 1024, 256} },
2492 .block_erase = spi_block_erase_20,
2493 }, {
2494 .eraseblocks = { {32 * 1024, 32} },
2495 .block_erase = spi_block_erase_52,
2496 }, {
2497 .eraseblocks = { {64 * 1024, 16} },
2498 .block_erase = spi_block_erase_d8,
2499 }, {
2500 .eraseblocks = { {1024 * 1024, 1} },
2501 .block_erase = spi_block_erase_60,
2502 }, {
2503 .eraseblocks = { {1024 * 1024, 1} },
2504 .block_erase = spi_block_erase_c7,
2505 }
2506 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002507 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Green64b91de2019-09-09 16:34:07 +10002508 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002509 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002510 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002511 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002512 },
2513
hailfinger286829b2009-01-08 03:40:17 +00002514 {
2515 .vendor = "Atmel",
2516 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00002517 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002518 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002519 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00002520 .total_size = 2048,
2521 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002522 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10002523 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002524 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002525 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002526 .block_erasers =
2527 {
2528 {
2529 .eraseblocks = { {4 * 1024, 512} },
2530 .block_erase = spi_block_erase_20,
2531 }, {
2532 .eraseblocks = { {32 * 1024, 64} },
2533 .block_erase = spi_block_erase_52,
2534 }, {
2535 .eraseblocks = { {64 * 1024, 32} },
2536 .block_erase = spi_block_erase_d8,
2537 }, {
2538 .eraseblocks = { {2 * 1024 * 1024, 1} },
2539 .block_erase = spi_block_erase_60,
2540 }, {
2541 .eraseblocks = { {2 * 1024 * 1024, 1} },
2542 .block_erase = spi_block_erase_c7,
2543 }
2544 },
hailfinger7533bc82011-05-19 00:06:06 +00002545 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10002546 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002547 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002548 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002549 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002550 },
2551
hailfinger286829b2009-01-08 03:40:17 +00002552 {
2553 .vendor = "Atmel",
2554 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00002555 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002556 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002557 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00002558 .total_size = 2048,
2559 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002560 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10002561 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002562 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002563 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002564 .block_erasers =
2565 {
2566 {
2567 .eraseblocks = { {4 * 1024, 512} },
2568 .block_erase = spi_block_erase_20,
2569 }, {
2570 .eraseblocks = { {32 * 1024, 64} },
2571 .block_erase = spi_block_erase_52,
2572 }, {
2573 .eraseblocks = { {64 * 1024, 32} },
2574 .block_erase = spi_block_erase_d8,
2575 }, {
2576 .eraseblocks = { {2 * 1024 * 1024, 1} },
2577 .block_erase = spi_block_erase_60,
2578 }, {
2579 .eraseblocks = { {2 * 1024 * 1024, 1} },
2580 .block_erase = spi_block_erase_c7,
2581 }
2582 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002583 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Greenb2d50132019-09-16 12:26:24 +10002584 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002585 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002586 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002587 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002588 },
2589
hailfinger286829b2009-01-08 03:40:17 +00002590 {
2591 .vendor = "Atmel",
2592 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00002593 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002594 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002595 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00002596 .total_size = 512,
2597 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002598 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002599 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
hailfinger286829b2009-01-08 03:40:17 +00002600 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002601 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002602 .block_erasers =
2603 {
2604 {
2605 .eraseblocks = { {4 * 1024, 128} },
2606 .block_erase = spi_block_erase_20,
2607 }, {
2608 .eraseblocks = { {32 * 1024, 16} },
2609 .block_erase = spi_block_erase_52,
2610 }, {
2611 .eraseblocks = { {64 * 1024, 8} },
2612 .block_erase = spi_block_erase_d8,
2613 }, {
2614 .eraseblocks = { {512 * 1024, 1} },
2615 .block_erase = spi_block_erase_60,
2616 }, {
2617 .eraseblocks = { {512 * 1024, 1} },
2618 .block_erase = spi_block_erase_c7,
2619 }
2620 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10002621 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greenab57f8f2019-07-09 12:42:39 +10002622 .write = NULL, /* Incompatible Page write */
hailfinger286829b2009-01-08 03:40:17 +00002623 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002624 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002625 },
2626
hailfinger286829b2009-01-08 03:40:17 +00002627 {
2628 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00002629 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00002630 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00002631 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002632 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00002633 .total_size = 128,
2634 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002635 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002636 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00002637 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002638 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002639 .block_erasers =
2640 {
2641 {
2642 .eraseblocks = { {128 * 1024, 1} },
2643 .block_erase = erase_chip_block_jedec,
2644 }
2645 },
uweb3a82ef2009-05-16 21:39:19 +00002646 .write = write_jedec, /* FIXME */
2647 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002648 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00002649 },
2650
2651 {
2652 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002653 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00002654 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002655 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002656 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00002657 .total_size = 256,
2658 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002659 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10002660 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002661 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00002662 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00002663 .block_erasers =
2664 {
2665 {
2666 .eraseblocks = { {256 * 1024, 1} },
2667 .block_erase = erase_chip_block_jedec,
2668 }
2669 },
hailfinger286829b2009-01-08 03:40:17 +00002670 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002671 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002672 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002673 },
2674
hailfinger286829b2009-01-08 03:40:17 +00002675 {
2676 .vendor = "Atmel",
2677 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002678 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002679 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002680 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002681 .total_size = 512,
2682 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002683 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002684 .tested = TEST_UNTESTED,
2685 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002686 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002687 .block_erasers =
2688 {
2689 {
2690 .eraseblocks = { {512 * 1024, 1} },
2691 .block_erase = erase_chip_block_jedec,
2692 }
2693 },
hailfinger286829b2009-01-08 03:40:17 +00002694 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002695 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002696 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002697 },
2698
hailfinger286829b2009-01-08 03:40:17 +00002699 {
2700 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002701 .name = "AT29C512",
2702 .bustype = BUS_PARALLEL,
2703 .manufacture_id = ATMEL_ID,
2704 .model_id = ATMEL_AT29C512,
2705 .total_size = 64,
2706 .page_size = 128,
2707 .feature_bits = FEATURE_LONG_RESET,
2708 .tested = TEST_OK_PREW,
2709 .probe = probe_jedec,
2710 .probe_timing = 10000, /* 10mS, Enter=Exec */
2711 .block_erasers =
2712 {
2713 {
2714 .eraseblocks = { {64 * 1024, 1} },
2715 .block_erase = erase_chip_block_jedec,
2716 }
2717 },
2718 .write = write_jedec,
2719 .read = read_memmapped,
2720 .voltage = {4500, 5500},
2721 },
2722
2723 {
2724 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002725 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002726 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002727 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002728 .model_id = ATMEL_AT45CS1282,
Alan Greenab57f8f2019-07-09 12:42:39 +10002729 .total_size = 16896, /* No power of two sizes */
2730 .page_size = 1056, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002731 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2732 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2733 .feature_bits = FEATURE_OTP,
2734 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002735 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002736 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002737 .block_erasers =
2738 {
2739 {
2740 .eraseblocks = {
2741 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2742 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2743 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2744 },
2745 .block_erase = spi_erase_at45cs_sector,
2746 }
2747 },
Alan Green6cfd0182019-07-26 13:50:04 +10002748 .printlock = spi_prettyprint_status_register_plain,
Alan Greendad2dae2019-09-16 15:55:08 +10002749 .write = spi_write_at45db,
2750 .read = spi_read_at45db,
stefanct7e00e222011-06-03 07:26:31 +00002751 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10002752 .gran = write_gran_1056bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00002753 },
stepanaa1b6a22008-12-08 18:15:10 +00002754
hailfinger286829b2009-01-08 03:40:17 +00002755 {
2756 .vendor = "Atmel",
2757 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002758 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002759 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002760 .model_id = ATMEL_AT45DB011D,
Alan Greendad2dae2019-09-16 15:55:08 +10002761 .total_size = 128, /* or 132, determined from status register */
2762 .page_size = 256, /* or 264, determined from status register */
2763 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2764 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2765 .feature_bits = FEATURE_OTP,
2766 .tested = TEST_OK_PREW,
2767 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002768 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002769 .block_erasers =
2770 {
2771 {
2772 .eraseblocks = { {256, 512} },
2773 .block_erase = spi_erase_at45db_page,
2774 }, {
2775 .eraseblocks = { {8 * 256, 512/8} },
2776 .block_erase = spi_erase_at45db_block,
2777 }, {
2778 .eraseblocks = {
2779 {8 * 256, 1},
2780 {120 * 256, 1},
2781 {128 * 256, 3},
2782 },
2783 .block_erase = spi_erase_at45db_sector
2784 }, {
2785 .eraseblocks = { {128 * 1024, 1} },
2786 .block_erase = spi_erase_at45db_chip,
2787 }
2788 },
2789 .printlock = spi_prettyprint_status_register_at45db,
2790 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2791 /* granularity will be set by the probing function. */
2792 .write = spi_write_at45db,
2793 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002794 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002795 },
stepanaa1b6a22008-12-08 18:15:10 +00002796
hailfinger286829b2009-01-08 03:40:17 +00002797 {
2798 .vendor = "Atmel",
2799 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002800 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002801 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002802 .model_id = ATMEL_AT45DB021D,
Alan Greendad2dae2019-09-16 15:55:08 +10002803 .total_size = 256, /* or 264, determined from status register */
2804 .page_size = 256, /* or 264, determined from status register */
2805 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2806 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2807 .feature_bits = FEATURE_OTP,
2808 .tested = TEST_OK_PREW,
2809 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002810 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002811 .block_erasers =
2812 {
2813 {
2814 .eraseblocks = { {256, 1024} },
2815 .block_erase = spi_erase_at45db_page,
2816 }, {
2817 .eraseblocks = { {8 * 256, 1024/8} },
2818 .block_erase = spi_erase_at45db_block,
2819 }, {
2820 .eraseblocks = {
2821 {8 * 256, 1},
2822 {120 * 256, 1},
2823 {128 * 256, 7},
2824 },
2825 .block_erase = spi_erase_at45db_sector
2826 }, {
2827 .eraseblocks = { {256 * 1024, 1} },
2828 .block_erase = spi_erase_at45db_chip,
2829 }
2830 },
2831 .printlock = spi_prettyprint_status_register_at45db,
2832 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2833 /* granularity will be set by the probing function. */
2834 .write = spi_write_at45db,
2835 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002836 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002837 },
stepanaa1b6a22008-12-08 18:15:10 +00002838
hailfinger286829b2009-01-08 03:40:17 +00002839 {
2840 .vendor = "Atmel",
2841 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002842 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002843 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002844 .model_id = ATMEL_AT45DB041D,
Alan Greendad2dae2019-09-16 15:55:08 +10002845 .total_size = 512, /* or 528, determined from status register */
2846 .page_size = 256, /* or 264, determined from status register */
2847 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2848 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2849 .feature_bits = FEATURE_OTP,
2850 .tested = TEST_OK_PREW,
2851 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002852 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002853 .block_erasers =
2854 {
2855 {
2856 .eraseblocks = { {256, 2048} },
2857 .block_erase = spi_erase_at45db_page,
2858 }, {
2859 .eraseblocks = { {8 * 256, 2048/8} },
2860 .block_erase = spi_erase_at45db_block,
2861 }, {
2862 .eraseblocks = {
2863 {8 * 256, 1},
2864 {248 * 256, 1},
2865 {256 * 256, 7},
2866 },
2867 .block_erase = spi_erase_at45db_sector
2868 }, {
2869 .eraseblocks = { {512 * 1024, 1} },
2870 .block_erase = spi_erase_at45db_chip,
2871 }
2872 },
2873 .printlock = spi_prettyprint_status_register_at45db,
2874 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2875 /* granularity will be set by the probing function. */
2876 .write = spi_write_at45db,
2877 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Alan Green5dc48da2019-08-26 15:35:10 +10002878 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002879 },
stepanaa1b6a22008-12-08 18:15:10 +00002880
hailfinger286829b2009-01-08 03:40:17 +00002881 {
2882 .vendor = "Atmel",
2883 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002884 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002885 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002886 .model_id = ATMEL_AT45DB081D,
Alan Greendad2dae2019-09-16 15:55:08 +10002887 .total_size = 1024, /* or 1056, determined from status register */
2888 .page_size = 256, /* or 264, determined from status register */
2889 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2890 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2891 .feature_bits = FEATURE_OTP,
2892 .tested = TEST_OK_PREW,
2893 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002894 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002895 .block_erasers =
2896 {
2897 {
2898 .eraseblocks = { {256, 4096} },
2899 .block_erase = spi_erase_at45db_page,
2900 }, {
2901 .eraseblocks = { {8 * 256, 4096/8} },
2902 .block_erase = spi_erase_at45db_block,
2903 }, {
2904 .eraseblocks = {
2905 {8 * 256, 1},
2906 {248 * 256, 1},
2907 {256 * 256, 15},
2908 },
2909 .block_erase = spi_erase_at45db_sector
2910 }, {
2911 .eraseblocks = { {1024 * 1024, 1} },
2912 .block_erase = spi_erase_at45db_chip,
2913 }
2914 },
2915 .printlock = spi_prettyprint_status_register_at45db,
2916 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2917 /* granularity will be set by the probing function. */
2918 .write = spi_write_at45db,
2919 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002920 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002921 },
stepanaa1b6a22008-12-08 18:15:10 +00002922
hailfinger286829b2009-01-08 03:40:17 +00002923 {
2924 .vendor = "Atmel",
2925 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002926 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002927 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002928 .model_id = ATMEL_AT45DB161D,
Alan Greendad2dae2019-09-16 15:55:08 +10002929 .total_size = 2048, /* or 2112, determined from status register */
2930 .page_size = 512, /* or 528, determined from status register */
2931 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2932 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2933 .feature_bits = FEATURE_OTP,
2934 .tested = TEST_OK_PREW,
2935 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002936 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002937 .block_erasers =
2938 {
2939 {
2940 .eraseblocks = { {512, 4096} },
2941 .block_erase = spi_erase_at45db_page,
2942 }, {
2943 .eraseblocks = { {8 * 512, 4096/8} },
2944 .block_erase = spi_erase_at45db_block,
2945 }, {
2946 .eraseblocks = {
2947 {8 * 512, 1},
2948 {248 * 512, 1},
2949 {256 * 512, 15},
2950 },
2951 .block_erase = spi_erase_at45db_sector
2952 }, {
2953 .eraseblocks = { {2048 * 1024, 1} },
2954 .block_erase = spi_erase_at45db_chip,
2955 }
2956 },
2957 .printlock = spi_prettyprint_status_register_at45db,
2958 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2959 /* granularity will be set by the probing function. */
2960 .write = spi_write_at45db,
2961 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002962 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002963 },
stepanaa1b6a22008-12-08 18:15:10 +00002964
hailfinger286829b2009-01-08 03:40:17 +00002965 {
2966 .vendor = "Atmel",
2967 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002968 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002969 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002970 .model_id = ATMEL_AT45DB321C,
Alan Greenab57f8f2019-07-09 12:42:39 +10002971 .total_size = 4224, /* No power of two sizes */
2972 .page_size = 528, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002973 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2974 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2975 .feature_bits = FEATURE_OTP,
2976 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002977 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002978 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002979 .block_erasers =
2980 {
2981 {
2982 .eraseblocks = { {528, 8192} },
2983 .block_erase = spi_erase_at45db_page,
2984 }, {
2985 .eraseblocks = { {8 * 528, 8192/8} },
2986 .block_erase = spi_erase_at45db_block,
2987 }, /* Although the datasheets describes sectors (which can be write protected)
2988 * there seems to be no erase functions for them.
2989 {
2990 .eraseblocks = {
2991 {8 * 528, 1},
2992 {120 * 528, 1},
2993 {128 * 528, 63},
2994 },
2995 .block_erase = spi_erase_at45db_sector
2996 }, */ {
2997 .eraseblocks = { {4224 * 1024, 1} },
2998 .block_erase = spi_erase_at45db_chip,
2999 }
3000 },
3001 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
3002 .write = spi_write_at45db,
3003 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
stefanct7e00e222011-06-03 07:26:31 +00003004 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10003005 .gran = write_gran_528bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00003006 },
stepanaa1b6a22008-12-08 18:15:10 +00003007
hailfinger286829b2009-01-08 03:40:17 +00003008 {
3009 .vendor = "Atmel",
3010 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00003011 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00003012 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003013 .model_id = ATMEL_AT45DB321D,
Alan Greendad2dae2019-09-16 15:55:08 +10003014 .total_size = 4096, /* or 4224, determined from status register */
3015 .page_size = 512, /* or 528, determined from status register */
3016 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003017 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3018 .feature_bits = FEATURE_OTP,
Alan Greendad2dae2019-09-16 15:55:08 +10003019 .tested = TEST_OK_PREW,
3020 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00003021 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10003022 .block_erasers =
3023 {
3024 {
3025 .eraseblocks = { {512, 8192} },
3026 .block_erase = spi_erase_at45db_page,
3027 }, {
3028 .eraseblocks = { {8 * 512, 8192/8} },
3029 .block_erase = spi_erase_at45db_block,
3030 }, {
3031 .eraseblocks = {
3032 {8 * 512, 1},
3033 {120 * 512, 1},
3034 {128 * 512, 63},
3035 },
3036 .block_erase = spi_erase_at45db_sector
3037 }, {
3038 .eraseblocks = { {4096 * 1024, 1} },
3039 .block_erase = spi_erase_at45db_chip,
3040 }
3041 },
3042 .printlock = spi_prettyprint_status_register_at45db,
3043 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3044 /* granularity will be set by the probing function. */
3045 .write = spi_write_at45db,
3046 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3047 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00003048 },
stepanaa1b6a22008-12-08 18:15:10 +00003049
hailfinger286829b2009-01-08 03:40:17 +00003050 {
3051 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003052 .name = "AT45DB321E",
3053 .bustype = BUS_SPI,
3054 .manufacture_id = ATMEL_ID,
3055 .model_id = ATMEL_AT45DB321C,
3056 .total_size = 4096, /* or 4224, determined from status register */
3057 .page_size = 512, /* or 528, determined from status register */
3058 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3059 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3060 .feature_bits = FEATURE_OTP,
3061 .tested = TEST_UNTESTED,
3062 .probe = probe_spi_at45db,
3063 .probe_timing = TIMING_ZERO,
3064 .block_erasers =
3065 {
3066 {
3067 .eraseblocks = { {512, 8192} },
3068 .block_erase = spi_erase_at45db_page,
3069 }, {
3070 .eraseblocks = { {8 * 512, 8192/8} },
3071 .block_erase = spi_erase_at45db_block,
3072 }, {
3073 .eraseblocks = {
3074 {8 * 512, 1},
3075 {120 * 512, 1},
3076 {128 * 512, 63},
3077 },
3078 .block_erase = spi_erase_at45db_sector
3079 }, {
3080 .eraseblocks = { {4096 * 1024, 1} },
3081 .block_erase = spi_erase_at45db_chip,
3082 }
3083 },
3084 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
3085 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3086 /* granularity will be set by the probing function. */
3087 .write = spi_write_at45db,
3088 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3089 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
3090 },
3091
3092 {
3093 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00003094 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00003095 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00003096 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003097 .model_id = ATMEL_AT45DB642D,
Alan Greendad2dae2019-09-16 15:55:08 +10003098 .total_size = 8192, /* or 8448, determined from status register */
3099 .page_size = 1024, /* or 1056, determined from status register */
3100 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3101 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3102 .feature_bits = FEATURE_OTP,
3103 .tested = TEST_OK_PREW,
3104 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00003105 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10003106 .block_erasers =
3107 {
3108 {
3109 .eraseblocks = { {1024, 8192} },
3110 .block_erase = spi_erase_at45db_page,
3111 }, {
3112 .eraseblocks = { {8 * 1024, 8192/8} },
3113 .block_erase = spi_erase_at45db_block,
3114 }, {
3115 .eraseblocks = {
3116 {8 * 1024, 1},
3117 {248 * 1024, 1},
3118 {256 * 1024, 31},
3119 },
3120 .block_erase = spi_erase_at45db_sector
3121 }, {
3122 .eraseblocks = { {8192 * 1024, 1} },
3123 .block_erase = spi_erase_at45db_chip,
3124 }
3125 },
3126 .printlock = spi_prettyprint_status_register_at45db,
3127 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3128 /* granularity will be set by the probing function. */
3129 .write = spi_write_at45db,
3130 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003131 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00003132 },
stepanaa1b6a22008-12-08 18:15:10 +00003133
hailfinger286829b2009-01-08 03:40:17 +00003134 {
3135 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003136 .name = "AT49(H)F010",
3137 .bustype = BUS_PARALLEL,
3138 .manufacture_id = ATMEL_ID,
3139 .model_id = ATMEL_AT49F010,
3140 .total_size = 128,
3141 .page_size = 0, /* unused */
3142 .feature_bits = FEATURE_EITHER_RESET,
3143 .tested = TEST_OK_PREW,
3144 .probe = probe_jedec,
3145 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3146 .block_erasers =
3147 {
3148 {
3149 .eraseblocks = { {128 * 1024, 1} },
3150 .block_erase = erase_chip_block_jedec,
3151 }
3152 },
3153 .printlock = printlock_at49f,
3154 .write = write_jedec_1,
3155 .read = read_memmapped,
3156 .voltage = {4500, 5500},
3157 },
3158
3159 {
3160 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00003161 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00003162 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00003163 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003164 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00003165 .total_size = 64,
3166 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00003167 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00003168 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00003169 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003170 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003171 .block_erasers =
3172 {
3173 {
3174 .eraseblocks = { {64 * 1024, 1} },
3175 .block_erase = erase_chip_block_jedec,
3176 }
3177 },
snelsonc6855342010-01-28 23:55:12 +00003178 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00003179 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003180 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00003181 },
3182
3183 {
3184 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00003185 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00003186 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003187 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003188 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00003189 .total_size = 256,
3190 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003191 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00003192 .tested = TEST_UNTESTED,
3193 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003194 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003195 .block_erasers =
3196 {
3197 {
3198 .eraseblocks = {
3199 {16 * 1024, 1},
3200 {8 * 1024, 2},
3201 {96 * 1024, 1},
3202 {128 * 1024, 1},
3203 },
3204 .block_erase = erase_sector_jedec,
3205 }, {
3206 .eraseblocks = { {256 * 1024, 1} },
3207 .block_erase = erase_chip_block_jedec,
3208 }
3209 },
snelsonc6855342010-01-28 23:55:12 +00003210 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003211 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003212 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003213 },
3214
hailfinger286829b2009-01-08 03:40:17 +00003215 {
3216 .vendor = "Atmel",
3217 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003218 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003219 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003220 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00003221 .total_size = 256,
3222 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003223 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003224 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00003225 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003226 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003227 .block_erasers =
3228 {
3229 {
3230 .eraseblocks = {
3231 {128 * 1024, 1},
3232 {96 * 1024, 1},
3233 {8 * 1024, 2},
3234 {16 * 1024, 1},
3235 },
3236 .block_erase = erase_sector_jedec,
3237 }, {
3238 .eraseblocks = { {256 * 1024, 1} },
3239 .block_erase = erase_chip_block_jedec,
3240 }
3241 },
snelsonc6855342010-01-28 23:55:12 +00003242 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003243 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003244 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003245 },
3246
hailfinger867df6b2010-07-22 11:44:38 +00003247 {
uwe598c14d2011-09-08 19:55:18 +00003248 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10003249 .name = "AT49F020",
3250 .bustype = BUS_PARALLEL,
3251 .manufacture_id = ATMEL_ID,
3252 .model_id = ATMEL_AT49F020,
3253 .total_size = 256,
Alan Greenebbee922019-09-02 11:36:59 +10003254 .page_size = 0, /* unused */
Alan Greend76dc1f2019-06-26 15:38:19 +10003255 .feature_bits = FEATURE_EITHER_RESET,
3256 .tested = TEST_OK_PRE,
3257 .probe = probe_jedec,
3258 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3259 .block_erasers =
3260 {
3261 {
3262 .eraseblocks = { {256 * 1024, 1} },
3263 .block_erase = erase_chip_block_jedec,
3264 }
Alan Greenebbee922019-09-02 11:36:59 +10003265 /* Chip features an optional permanent write protection
3266 * of the first 8 kB. The erase function is the same as
3267 * above, but 00000H to 01FFFH will not be erased.
3268 * FIXME: add another eraser when partial erasers are
3269 * supported.
3270 */
Alan Greend76dc1f2019-06-26 15:38:19 +10003271 },
Alan Greenebbee922019-09-02 11:36:59 +10003272 .printlock = printlock_at49f,
Alan Greend76dc1f2019-06-26 15:38:19 +10003273 .write = write_jedec_1,
3274 .read = read_memmapped,
3275 .voltage = {4500, 5500},
3276 },
3277
3278 {
3279 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003280 .name = "AT49F040",
3281 .bustype = BUS_PARALLEL,
3282 .manufacture_id = ATMEL_ID,
3283 .model_id = ATMEL_AT49F040,
3284 .total_size = 512,
3285 .page_size = 0, /* unused */
3286 .feature_bits = FEATURE_EITHER_RESET,
3287 .tested = TEST_UNTESTED,
3288 .probe = probe_jedec,
3289 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3290 .block_erasers =
3291 {
3292 {
3293 .eraseblocks = { {512 * 1024, 1} },
3294 .block_erase = erase_chip_block_jedec,
3295 }
3296 /* Chip features an optional permanent write protection
3297 * of the first 16 kB. The erase function is the same as
3298 * above, but 00000H to 03FFFH will not be erased.
3299 * FIXME: add another eraser when partial erasers are
3300 * supported.
3301 */
3302 },
3303 .printlock = printlock_at49f,
3304 .write = write_jedec_1,
3305 .read = read_memmapped,
3306 .voltage = {4500, 5500},
3307 },
3308
3309 {
3310 .vendor = "Atmel",
3311 .name = "AT49F080",
3312 .bustype = BUS_PARALLEL,
3313 .manufacture_id = ATMEL_ID,
3314 .model_id = ATMEL_AT49F080,
3315 .total_size = 1024,
3316 .page_size = 0, /* unused */
3317 .feature_bits = FEATURE_EITHER_RESET,
3318 .tested = TEST_UNTESTED,
3319 .probe = probe_jedec,
3320 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3321 .block_erasers =
3322 {
3323 {
3324 .eraseblocks = { {1024 * 1024, 1} },
3325 .block_erase = erase_chip_block_jedec,
3326 }
3327 /* Chip features an optional permanent write protection
3328 * of the first 16 kB. The erase function is the same as
3329 * above, but 00000H to 03FFFH will not be erased.
3330 * FIXME: add another eraser when partial erasers are
3331 * supported.
3332 */
3333 },
3334 .printlock = printlock_at49f,
3335 .write = write_jedec_1,
3336 .read = read_memmapped,
3337 .voltage = {4500, 5500},
3338 },
3339
3340 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003341 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3342 .vendor = "Atmel",
3343 .name = "AT49F080T",
3344 .bustype = BUS_PARALLEL,
3345 .manufacture_id = ATMEL_ID,
3346 .model_id = ATMEL_AT49F080T,
3347 .total_size = 1024,
3348 .page_size = 0, /* unused */
3349 .feature_bits = FEATURE_EITHER_RESET,
3350 .tested = TEST_UNTESTED,
3351 .probe = probe_jedec,
3352 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3353 .block_erasers =
3354 {
3355 {
3356 .eraseblocks = { {1024 * 1024, 1} },
3357 .block_erase = erase_chip_block_jedec,
3358 }
3359 /* Chip features an optional permanent write protection
3360 * of the first 16 kB. The erase function is the same as
3361 * above, but FC000H to FFFFFH will not be erased.
3362 * FIXME: add another eraser when partial erasers are
3363 * supported.
3364 */
3365 },
3366 .printlock = printlock_at49f,
3367 .write = write_jedec_1,
3368 .read = read_memmapped,
3369 .voltage = {4500, 5500},
3370 },
3371
3372 {
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003373 .vendor = "Atmel",
uwe598c14d2011-09-08 19:55:18 +00003374 .name = "AT49LH002",
3375 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3376 .manufacture_id = ATMEL_ID,
3377 .model_id = ATMEL_AT49LH002,
3378 .total_size = 256,
3379 .page_size = 0, /* unused */
Nikolai Artemievdc39c032021-01-20 15:30:50 +11003380 .feature_bits = FEATURE_REGISTERMAP,
uwe598c14d2011-09-08 19:55:18 +00003381 .tested = TEST_UNTESTED,
Nikolai Artemievdc39c032021-01-20 15:30:50 +11003382 .probe = probe_82802ab,
Alan Green52ad0822019-09-16 16:01:09 +10003383 .probe_timing = TIMING_ZERO,
uwe598c14d2011-09-08 19:55:18 +00003384 .block_erasers =
3385 {
3386 {
3387 .eraseblocks = {
3388 {64 * 1024, 3},
3389 {32 * 1024, 1},
3390 {8 * 1024, 2},
3391 {16 * 1024, 1},
3392 },
Alan Green52ad0822019-09-16 16:01:09 +10003393 .block_erase = NULL, /* TODO: Implement. */
uwe598c14d2011-09-08 19:55:18 +00003394 }, {
3395 .eraseblocks = {
3396 {64 * 1024, 4},
3397 },
Alan Green52ad0822019-09-16 16:01:09 +10003398 .block_erase = erase_block_82802ab,
uwe598c14d2011-09-08 19:55:18 +00003399 },
3400 },
Alan Green52ad0822019-09-16 16:01:09 +10003401 .printlock = printlock_regspace2_block_eraser_0,
3402 .unlock = unlock_regspace2_block_eraser_0,
uwe598c14d2011-09-08 19:55:18 +00003403 .write = write_82802ab,
3404 .read = read_memmapped,
3405 .voltage = {3000, 3600},
3406 },
3407
3408 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003409 .vendor = "Atmel",
3410 .name = "AT49LH004",
3411 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3412 .manufacture_id = ATMEL_ID,
3413 .model_id = ATMEL_AT49LH004,
3414 .total_size = 512,
3415 .page_size = 0, /* unused */
3416 .feature_bits = FEATURE_REGISTERMAP,
3417 .tested = TEST_UNTESTED,
3418 .probe = probe_82802ab,
3419 .probe_timing = TIMING_ZERO,
3420 .block_erasers =
3421 {
3422 {
3423 .eraseblocks = {
3424 {64 * 1024, 7},
3425 {32 * 1024, 1},
3426 {8 * 1024, 2},
3427 {16 * 1024, 1},
3428 },
3429 .block_erase = erase_block_82802ab,
3430 }, {
3431 .eraseblocks = {
3432 {64 * 1024, 8},
3433 },
3434 .block_erase = NULL, /* TODO: Implement. */
3435 },
3436 },
3437 .printlock = printlock_regspace2_block_eraser_0,
3438 .unlock = unlock_regspace2_block_eraser_0,
3439 .write = write_82802ab,
3440 .read = read_memmapped,
3441 .voltage = {3000, 3600},
3442 },
3443
3444 {
3445 .vendor = "Atmel",
3446 .name = "AT49LH00B4",
3447 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3448 .manufacture_id = ATMEL_ID,
3449 .model_id = ATMEL_AT49LH00B4,
3450 .total_size = 512,
3451 .page_size = 0, /* unused */
3452 .feature_bits = FEATURE_REGISTERMAP,
3453 .tested = TEST_UNTESTED,
3454 .probe = probe_82802ab,
3455 .probe_timing = TIMING_ZERO,
3456 .block_erasers =
3457 {
3458 {
3459 .eraseblocks = {
3460 {8 * 1024, 2},
3461 {16 * 1024, 1},
3462 {32 * 1024, 1},
3463 {64 * 1024, 7},
3464 },
3465 .block_erase = NULL, /* TODO: Implement. */
3466 }, {
3467 .eraseblocks = {
3468 {64 * 1024, 8},
3469 },
3470 .block_erase = erase_block_82802ab,
3471 },
3472 },
3473 .printlock = printlock_regspace2_block_eraser_0,
3474 .unlock = unlock_regspace2_block_eraser_0,
3475 .write = write_82802ab,
3476 .read = read_memmapped,
3477 .voltage = {3000, 3600},
3478 },
3479
3480 {
Angel Pons5eaf1d22021-04-20 21:39:11 +02003481 .vendor = "Boya/BoHong Microelectronics",
Christian Kudera9d598732021-04-20 22:50:01 +02003482 .name = "B.25D16A",
3483 .bustype = BUS_SPI,
3484 .manufacture_id = BOYA_BOHONG_ID,
3485 .model_id = BOYA_BOHONG_B_25D16A,
3486 .total_size = 2048,
3487 .page_size = 256,
3488 .feature_bits = FEATURE_WRSR_WREN,
3489 .tested = TEST_OK_PR,
3490 .probe = probe_spi_rdid,
3491 .probe_timing = TIMING_ZERO,
3492 .block_erasers =
3493 {
3494 {
3495 .eraseblocks = { {4 * 1024, 512} },
3496 .block_erase = spi_block_erase_20,
3497 }, {
3498 .eraseblocks = { {32 * 1024, 64} },
3499 .block_erase = spi_block_erase_52,
3500 }, {
3501 .eraseblocks = { {64 * 1024, 32} },
3502 .block_erase = spi_block_erase_d8,
3503 }, {
3504 .eraseblocks = { {2 * 1024 * 1024, 1} },
3505 .block_erase = spi_block_erase_60,
3506 }, {
3507 .eraseblocks = { {2 * 1024 * 1024, 1} },
3508 .block_erase = spi_block_erase_c7,
3509 }
3510 },
3511 .printlock = spi_prettyprint_status_register_bp2_srwd,
3512 .unlock = spi_disable_blockprotect_bp2_srwd,
3513 .write = spi_chip_write_256,
3514 .read = spi_chip_read,
3515 .voltage = {2700, 3600},
3516 },
3517
3518 {
3519 .vendor = "Boya/BoHong Microelectronics",
Angel Pons5eaf1d22021-04-20 21:39:11 +02003520 .name = "B.25Q128AS",
Jack Olseneab45942020-08-08 21:12:13 -05003521 .bustype = BUS_SPI,
Angel Pons5eaf1d22021-04-20 21:39:11 +02003522 .manufacture_id = BOYA_BOHONG_ID,
3523 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olseneab45942020-08-08 21:12:13 -05003524 .total_size = 16384,
3525 .page_size = 256,
3526 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
3527 .tested = TEST_OK_PREW,
3528 .probe = probe_spi_rdid,
3529 .probe_timing = TIMING_ZERO,
3530 .block_erasers =
3531 {
3532 {
3533 .eraseblocks = { {4 * 1024, 4096} },
3534 .block_erase = spi_block_erase_20,
3535 }, {
3536 .eraseblocks = { {32 * 1024, 512} },
3537 .block_erase = spi_block_erase_52,
3538 }, {
3539 .eraseblocks = { {64 * 1024, 256} },
3540 .block_erase = spi_block_erase_d8,
3541 }, {
3542 .eraseblocks = { {16 * 1024 * 1024, 1} },
3543 .block_erase = spi_block_erase_60,
3544 }, {
3545 .eraseblocks = { {16 * 1024 * 1024, 1} },
3546 .block_erase = spi_block_erase_c7,
3547 }
3548 },
3549 .printlock = spi_prettyprint_status_register_plain,
3550 .unlock = spi_disable_blockprotect_at25fs040,
3551 .write = spi_chip_write_256,
3552 .read = spi_chip_read,
3553 .voltage = {2700, 3600},
3554 },
3555
3556 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003557 .vendor = "Bright",
3558 .name = "BM29F040",
3559 .bustype = BUS_PARALLEL,
3560 .manufacture_id = BRIGHT_ID,
3561 .model_id = BRIGHT_BM29F040,
3562 .total_size = 512,
3563 .page_size = 64 * 1024,
3564 .feature_bits = FEATURE_EITHER_RESET,
3565 .tested = TEST_OK_PR,
3566 .probe = probe_jedec,
3567 .probe_timing = TIMING_ZERO,
3568 .block_erasers =
3569 {
3570 {
3571 .eraseblocks = { {64 * 1024, 8} },
3572 .block_erase = erase_sector_jedec,
3573 }, {
3574 .eraseblocks = { {512 * 1024, 1} },
3575 .block_erase = erase_chip_block_jedec,
3576 },
3577 },
3578 .write = write_jedec_1,
3579 .read = read_memmapped,
3580 .voltage = {4500, 5500},
3581 },
3582
3583 {
uwe97b20792011-09-13 22:05:44 +00003584 .vendor = "Catalyst",
3585 .name = "CAT28F512",
3586 .bustype = BUS_PARALLEL,
3587 .manufacture_id = CATALYST_ID,
3588 .model_id = CATALYST_CAT28F512,
3589 .total_size = 64,
3590 .page_size = 0, /* unused */
3591 .feature_bits = 0,
Alan Greenf5424a22019-07-26 14:32:32 +10003592 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
uwe97b20792011-09-13 22:05:44 +00003593 .probe = probe_jedec, /* FIXME! */
3594 .probe_timing = TIMING_ZERO,
3595 .block_erasers =
3596 {
3597 {
3598 .eraseblocks = { {64 * 1024, 1} },
3599 .block_erase = NULL, /* TODO */
3600 },
3601 },
3602 .write = NULL, /* TODO */
3603 .read = read_memmapped,
3604 .voltage = {4500, 5500},
3605 },
3606
3607 {
Alan Green58393332019-07-31 16:35:44 +10003608 .vendor = "ENE",
3609 .name = "KB9012 (EDI)",
3610 .bustype = BUS_SPI,
3611 .total_size = 128,
3612 .page_size = 128,
Alan Greendbeec2b2019-09-16 14:36:52 +10003613 .feature_bits = FEATURE_ERASED_ZERO,
Alan Green58393332019-07-31 16:35:44 +10003614 .tested = TEST_OK_PREW,
3615 .spi_cmd_set = SPI_EDI,
3616 .probe = edi_probe_kb9012,
3617 .probe_timing = TIMING_ZERO,
3618 .block_erasers =
3619 {
3620 {
3621 .eraseblocks = { {128, 1024} },
3622 .block_erase = edi_chip_block_erase,
3623 },
3624 },
3625 .write = edi_chip_write,
3626 .read = edi_chip_read,
3627 .voltage = {2700, 3600},
Alan Green956eb9c2019-09-16 14:29:45 +10003628 .gran = write_gran_128bytes,
Alan Green58393332019-07-31 16:35:44 +10003629 },
3630
3631 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003632 .vendor = "ESI",
3633 .name = "ES25P16",
3634 .bustype = BUS_SPI,
3635 .manufacture_id = EXCEL_ID_NOPREFIX,
3636 .model_id = EXCEL_ES25P16,
3637 .total_size = 2 * 1024,
3638 .page_size = 256,
3639 /* 256-byte parameter page separate from memory array:
3640 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3641 .feature_bits = FEATURE_WRSR_WREN,
3642 .tested = TEST_UNTESTED,
3643 .probe = probe_spi_rdid,
3644 .probe_timing = TIMING_ZERO,
3645 .block_erasers =
3646 {
3647 {
3648 .eraseblocks = { {64 * 1024, 32} },
3649 .block_erase = spi_block_erase_d8,
3650 }, {
3651 .eraseblocks = { {2 * 1024 * 1024, 1} },
3652 .block_erase = spi_block_erase_c7,
3653 }
3654 },
3655 .printlock = spi_prettyprint_status_register_bp2_srwd,
3656 .unlock = spi_disable_blockprotect_bp2_srwd,
3657 .write = spi_chip_write_256,
3658 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3659 .voltage = {2700, 3600},
3660 },
3661
3662 {
3663 .vendor = "ESI",
3664 .name = "ES25P40",
3665 .bustype = BUS_SPI,
3666 .manufacture_id = EXCEL_ID_NOPREFIX,
3667 .model_id = EXCEL_ES25P40,
3668 .total_size = 512,
3669 .page_size = 256,
3670 /* 256-byte parameter page separate from memory array:
3671 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3672 .feature_bits = FEATURE_WRSR_WREN,
3673 .tested = TEST_UNTESTED,
3674 .probe = probe_spi_rdid,
3675 .probe_timing = TIMING_ZERO,
3676 .block_erasers =
3677 {
3678 {
3679 .eraseblocks = { {64 * 1024, 8} },
3680 .block_erase = spi_block_erase_d8,
3681 }, {
3682 .eraseblocks = { {512 * 1024, 1} },
3683 .block_erase = spi_block_erase_c7,
3684 }
3685 },
3686 .printlock = spi_prettyprint_status_register_bp2_srwd,
3687 .unlock = spi_disable_blockprotect_bp2_srwd,
3688 .write = spi_chip_write_256,
3689 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3690 .voltage = {2700, 3600},
3691 },
3692
3693 {
3694 .vendor = "ESI",
3695 .name = "ES25P80",
3696 .bustype = BUS_SPI,
3697 .manufacture_id = EXCEL_ID_NOPREFIX,
3698 .model_id = EXCEL_ES25P80,
3699 .total_size = 1024,
3700 .page_size = 256,
3701 /* 256-byte parameter page separate from memory array:
3702 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3703 .feature_bits = FEATURE_WRSR_WREN,
3704 .tested = TEST_UNTESTED,
3705 .probe = probe_spi_rdid,
3706 .probe_timing = TIMING_ZERO,
3707 .block_erasers =
3708 {
3709 {
3710 .eraseblocks = { {64 * 1024, 16} },
3711 .block_erase = spi_block_erase_d8,
3712 }, {
3713 .eraseblocks = { {1024 * 1024, 1} },
3714 .block_erase = spi_block_erase_c7,
3715 }
3716 },
3717 .printlock = spi_prettyprint_status_register_bp2_srwd,
3718 .unlock = spi_disable_blockprotect_bp2_srwd,
3719 .write = spi_chip_write_256,
3720 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3721 .voltage = {2700, 3600},
3722 },
3723
3724 {
Alan Green58393332019-07-31 16:35:44 +10003725 .vendor = "ESMT",
mkarcherf6986732010-06-19 22:06:35 +00003726 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00003727 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01003728 .manufacture_id = ESMT_ID,
3729 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00003730 .total_size = 1024,
3731 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003732 .feature_bits = FEATURE_WRSR_EITHER,
Alan Greena3c9bbe2019-09-16 14:51:07 +10003733 .tested = TEST_OK_PREW,
mkarcherf6986732010-06-19 22:06:35 +00003734 .probe = probe_spi_rdid,
3735 .probe_timing = TIMING_ZERO,
3736 .block_erasers =
3737 {
3738 {
3739 .eraseblocks = { {4 * 1024, 256} },
3740 .block_erase = spi_block_erase_20,
3741 }, {
3742 .eraseblocks = { {64 * 1024, 16} },
3743 .block_erase = spi_block_erase_d8,
3744 }, {
3745 .eraseblocks = { {1024 * 1024, 1} },
3746 .block_erase = spi_block_erase_60,
3747 }, {
3748 .eraseblocks = { {1024 * 1024, 1} },
3749 .block_erase = spi_block_erase_c7,
3750 }
3751 },
Alan Greena3c9bbe2019-09-16 14:51:07 +10003752 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003753 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00003754 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00003755 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003756 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00003757 },
3758
3759 {
Edward O'Callaghana9c81002019-02-24 15:54:40 +11003760 .vendor = "ESMT",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003761 .name = "F25L32PA",
3762 .bustype = BUS_SPI,
3763 .manufacture_id = ESMT_ID,
3764 .model_id = ESMT_F25L32PA,
3765 .total_size = 4096,
3766 .page_size = 256,
3767 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3768 .tested = TEST_UNTESTED,
3769 .probe = probe_spi_rdid,
3770 .probe_timing = TIMING_ZERO,
3771 .block_erasers =
3772 {
3773 {
3774 .eraseblocks = { {4 * 1024, 1024} },
3775 .block_erase = spi_block_erase_20,
3776 }, {
3777 .eraseblocks = { {64 * 1024, 64} },
3778 .block_erase = spi_block_erase_d8,
3779 }, {
3780 .eraseblocks = { {4 * 1024 * 1024, 1} },
3781 .block_erase = spi_block_erase_60,
3782 }, {
3783 .eraseblocks = { {4 * 1024 * 1024, 1} },
3784 .block_erase = spi_block_erase_c7,
3785 }
3786 },
3787 .printlock = spi_prettyprint_status_register_bp2_bpl,
3788 .unlock = spi_disable_blockprotect,
3789 .write = spi_chip_write_256,
3790 .read = spi_chip_read,
3791 .voltage = {2700, 3600},
3792 },
3793
3794 {
3795 .vendor = "ESMT",
Alan Greend76dc1f2019-06-26 15:38:19 +10003796 .name = "F49B002UA",
3797 .bustype = BUS_PARALLEL,
3798 .manufacture_id = ESMT_ID,
3799 .model_id = ESMT_F49B002UA,
3800 .total_size = 256,
3801 .page_size = 4096,
3802 .feature_bits = FEATURE_EITHER_RESET,
3803 .tested = TEST_UNTESTED,
3804 .probe = probe_jedec,
3805 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3806 .block_erasers =
3807 {
3808 {
3809 .eraseblocks = {
3810 {128 * 1024, 1},
3811 {96 * 1024, 1},
3812 {8 * 1024, 2},
3813 {16 * 1024, 1},
3814 },
3815 .block_erase = erase_sector_jedec,
3816 }, {
3817 .eraseblocks = { {256 * 1024, 1} },
3818 .block_erase = erase_chip_block_jedec,
3819 }
3820 },
3821 .write = write_jedec_1,
3822 .read = read_memmapped,
3823 .voltage = {4500, 5500},
3824 },
3825
3826 {
hailfingerab07cbd2009-06-05 20:53:07 +00003827 .vendor = "Eon",
3828 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00003829 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003830 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003831 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00003832 .total_size = 64,
3833 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003834 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003835 .tested = TEST_UNTESTED,
3836 .probe = probe_spi_rdid,
3837 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003838 .block_erasers =
3839 {
3840 {
3841 .eraseblocks = {
3842 {4 * 1024, 2},
3843 {8 * 1024, 1},
3844 {16 * 1024, 1},
3845 {32 * 1024, 1},
3846 },
3847 .block_erase = spi_block_erase_d8,
3848 }, {
3849 .eraseblocks = { {64 * 1024, 1} },
3850 .block_erase = spi_block_erase_c7,
3851 }
3852 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003853 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003854 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003855 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003856 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003857 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003858 },
3859
3860 {
3861 .vendor = "Eon",
3862 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00003863 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003864 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003865 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00003866 .total_size = 64,
3867 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003868 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00003869 .tested = TEST_UNTESTED,
3870 .probe = probe_spi_rdid,
3871 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003872 .block_erasers =
3873 {
3874 {
3875 .eraseblocks = {
3876 {32 * 1024, 1},
3877 {16 * 1024, 1},
3878 {8 * 1024, 1},
3879 {4 * 1024, 2},
3880 },
3881 .block_erase = spi_block_erase_d8,
3882 }, {
3883 .eraseblocks = { {64 * 1024, 1} },
3884 .block_erase = spi_block_erase_c7,
3885 }
3886 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003887 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003888 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003889 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003890 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003891 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003892 },
3893
3894 {
3895 .vendor = "Eon",
3896 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00003897 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003898 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003899 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00003900 .total_size = 128,
3901 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003902 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003903 .tested = TEST_UNTESTED,
3904 .probe = probe_spi_rdid,
3905 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003906 .block_erasers =
3907 {
3908 {
3909 .eraseblocks = {
3910 {4 * 1024, 2},
3911 {8 * 1024, 1},
3912 {16 * 1024, 1},
3913 {32 * 1024, 3},
3914 },
3915 .block_erase = spi_block_erase_d8,
3916 }, {
3917 .eraseblocks = { {128 * 1024, 1} },
3918 .block_erase = spi_block_erase_c7,
3919 }
3920 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003921 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003922 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003923 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003924 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003925 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003926 },
3927
3928 {
3929 .vendor = "Eon",
3930 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00003931 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003932 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003933 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00003934 .total_size = 128,
3935 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003936 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10003937 .tested = TEST_OK_PREW,
snelson2d471072010-01-09 05:30:14 +00003938 .probe = probe_spi_rdid,
3939 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003940 .block_erasers =
3941 {
3942 {
3943 .eraseblocks = {
3944 {32 * 1024, 3},
3945 {16 * 1024, 1},
3946 {8 * 1024, 1},
3947 {4 * 1024, 2},
3948 },
3949 .block_erase = spi_block_erase_d8,
3950 }, {
3951 .eraseblocks = { {128 * 1024, 1} },
3952 .block_erase = spi_block_erase_c7,
3953 }
3954 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003955 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003956 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003957 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003958 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003959 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003960 },
3961
3962 {
3963 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003964 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00003965 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003966 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003967 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00003968 .total_size = 2048,
3969 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003970 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003971 .tested = TEST_UNTESTED,
3972 .probe = probe_spi_rdid,
3973 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003974 .block_erasers =
3975 {
3976 {
3977 .eraseblocks = {
3978 {4 * 1024, 2},
3979 {8 * 1024, 1},
3980 {16 * 1024, 1},
3981 {32 * 1024, 1},
3982 {64 * 1024, 31},
3983 },
3984 .block_erase = spi_block_erase_d8,
3985 }, {
3986 .eraseblocks = { {2 * 1024 * 1024, 1} },
3987 .block_erase = spi_block_erase_c7,
3988 }
3989 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003990 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003991 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003992 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10003993 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003994 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003995 },
3996
3997 {
3998 .vendor = "Eon",
3999 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00004000 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00004001 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004002 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00004003 .total_size = 2048,
4004 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004005 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00004006 .tested = TEST_UNTESTED,
4007 .probe = probe_spi_rdid,
4008 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004009 .block_erasers =
4010 {
4011 {
4012 .eraseblocks = {
4013 {64 * 1024, 31},
4014 {32 * 1024, 1},
4015 {16 * 1024, 1},
4016 {8 * 1024, 1},
4017 {4 * 1024, 2},
4018 },
4019 .block_erase = spi_block_erase_d8,
4020 }, {
4021 .eraseblocks = { {2 * 1024 * 1024, 1} },
4022 .block_erase = spi_block_erase_c7,
4023 }
4024 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004025 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004026 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004027 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004028 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004029 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004030 },
4031
4032 {
4033 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004034 .name = "EN25B20",
4035 .bustype = BUS_SPI,
4036 .manufacture_id = EON_ID_NOPREFIX,
4037 .model_id = EON_EN25B20,
4038 .total_size = 256,
4039 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004040 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004041 .tested = TEST_UNTESTED,
4042 .probe = probe_spi_rdid,
4043 .probe_timing = TIMING_ZERO,
4044 .block_erasers =
4045 {
4046 {
4047 .eraseblocks = {
4048 {4 * 1024, 2},
4049 {8 * 1024, 1},
4050 {16 * 1024, 1},
4051 {32 * 1024, 1},
4052 {64 * 1024, 3}
4053 },
4054 .block_erase = spi_block_erase_d8,
4055 }, {
4056 .eraseblocks = { {256 * 1024, 1} },
4057 .block_erase = spi_block_erase_c7,
4058 }
4059 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004060 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004061 .unlock = spi_disable_blockprotect,
4062 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004063 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004064 .voltage = {2700, 3600},
4065 },
4066
4067 {
4068 .vendor = "Eon",
4069 .name = "EN25B20T",
4070 .bustype = BUS_SPI,
4071 .manufacture_id = EON_ID_NOPREFIX,
4072 .model_id = EON_EN25B20,
4073 .total_size = 256,
4074 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004075 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004076 .tested = TEST_UNTESTED,
4077 .probe = probe_spi_rdid,
4078 .probe_timing = TIMING_ZERO,
4079 .block_erasers =
4080 {
4081 {
4082 .eraseblocks = {
4083 {64 * 1024, 3},
4084 {32 * 1024, 1},
4085 {16 * 1024, 1},
4086 {8 * 1024, 1},
4087 {4 * 1024, 2},
4088 },
4089 .block_erase = spi_block_erase_d8,
4090 }, {
4091 .eraseblocks = { {256 * 1024, 1} },
4092 .block_erase = spi_block_erase_c7,
4093 }
4094 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004095 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004096 .unlock = spi_disable_blockprotect,
4097 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004098 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004099 .voltage = {2700, 3600},
4100 },
4101
4102 {
4103 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004104 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00004105 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004106 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004107 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00004108 .total_size = 4096,
4109 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004110 /* OTP: 512B total; enter 0x3A */
Alan Green378747b2019-09-09 16:38:43 +10004111 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00004112 .tested = TEST_UNTESTED,
4113 .probe = probe_spi_rdid,
4114 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004115 .block_erasers =
4116 {
4117 {
4118 .eraseblocks = {
4119 {4 * 1024, 2},
4120 {8 * 1024, 1},
4121 {16 * 1024, 1},
4122 {32 * 1024, 1},
4123 {64 * 1024, 63},
4124 },
4125 .block_erase = spi_block_erase_d8,
4126 }, {
4127 .eraseblocks = { {4 * 1024 * 1024, 1} },
4128 .block_erase = spi_block_erase_c7,
4129 }
4130 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004131 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004132 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00004133 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004134 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004135 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00004136 },
4137
4138 {
4139 .vendor = "Eon",
4140 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00004141 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00004142 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004143 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00004144 .total_size = 4096,
4145 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004146 /* OTP: 512B total; enter 0x3A */
Alan Green378747b2019-09-09 16:38:43 +10004147 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00004148 .tested = TEST_UNTESTED,
4149 .probe = probe_spi_rdid,
4150 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004151 .block_erasers =
4152 {
4153 {
4154 .eraseblocks = {
4155 {64 * 1024, 63},
4156 {32 * 1024, 1},
4157 {16 * 1024, 1},
4158 {8 * 1024, 1},
4159 {4 * 1024, 2},
4160 },
4161 .block_erase = spi_block_erase_d8,
4162 }, {
4163 .eraseblocks = { {4 * 1024 * 1024, 1} },
4164 .block_erase = spi_block_erase_c7,
4165 }
4166 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004167 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004168 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004169 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004170 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004171 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004172 },
4173
4174 {
4175 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004176 .name = "EN25B40",
4177 .bustype = BUS_SPI,
4178 .manufacture_id = EON_ID_NOPREFIX,
4179 .model_id = EON_EN25B40,
4180 .total_size = 512,
4181 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004182 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004183 .tested = TEST_UNTESTED,
4184 .probe = probe_spi_rdid,
4185 .probe_timing = TIMING_ZERO,
4186 .block_erasers =
4187 {
4188 {
4189 .eraseblocks = {
4190 {4 * 1024, 2},
4191 {8 * 1024, 1},
4192 {16 * 1024, 1},
4193 {32 * 1024, 1},
4194 {64 * 1024, 7}
4195 },
4196 .block_erase = spi_block_erase_d8,
4197 }, {
4198 .eraseblocks = { {512 * 1024, 1} },
4199 .block_erase = spi_block_erase_c7,
4200 }
4201 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004202 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004203 .unlock = spi_disable_blockprotect,
4204 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004205 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004206 .voltage = {2700, 3600},
4207 },
4208
4209 {
4210 .vendor = "Eon",
4211 .name = "EN25B40T",
4212 .bustype = BUS_SPI,
4213 .manufacture_id = EON_ID_NOPREFIX,
4214 .model_id = EON_EN25B40,
4215 .total_size = 512,
4216 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004217 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004218 .tested = TEST_UNTESTED,
4219 .probe = probe_spi_rdid,
4220 .probe_timing = TIMING_ZERO,
4221 .block_erasers =
4222 {
4223 {
4224 .eraseblocks = {
4225 {64 * 1024, 7},
4226 {32 * 1024, 1},
4227 {16 * 1024, 1},
4228 {8 * 1024, 1},
4229 {4 * 1024, 2},
4230 },
4231 .block_erase = spi_block_erase_d8,
4232 }, {
4233 .eraseblocks = { {512 * 1024, 1} },
4234 .block_erase = spi_block_erase_c7,
4235 }
4236 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004237 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004238 .unlock = spi_disable_blockprotect,
4239 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004240 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004241 .voltage = {2700, 3600},
4242 },
4243
4244 {
4245 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004246 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00004247 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004248 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004249 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00004250 .total_size = 8192,
4251 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004252 /* OTP: 512B total; enter 0x3A */
Alan Green378747b2019-09-09 16:38:43 +10004253 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00004254 .tested = TEST_UNTESTED,
4255 .probe = probe_spi_rdid,
4256 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004257 .block_erasers =
4258 {
4259 {
4260 .eraseblocks = {
4261 {4 * 1024, 2},
4262 {8 * 1024, 1},
4263 {16 * 1024, 1},
4264 {32 * 1024, 1},
4265 {64 * 1024, 127},
4266 },
4267 .block_erase = spi_block_erase_d8,
4268 }, {
4269 .eraseblocks = { {8 * 1024 * 1024, 1} },
4270 .block_erase = spi_block_erase_c7,
4271 }
4272 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004273 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004274 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00004275 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004276 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004277 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00004278 },
4279
4280 {
4281 .vendor = "Eon",
4282 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00004283 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00004284 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004285 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00004286 .total_size = 8192,
4287 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004288 /* OTP: 512B total; enter 0x3A */
Alan Green378747b2019-09-09 16:38:43 +10004289 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00004290 .tested = TEST_UNTESTED,
4291 .probe = probe_spi_rdid,
4292 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004293 .block_erasers =
4294 {
4295 {
4296 .eraseblocks = {
4297 {64 * 1024, 127},
4298 {32 * 1024, 1},
4299 {16 * 1024, 1},
4300 {8 * 1024, 1},
4301 {4 * 1024, 2},
4302 },
4303 .block_erase = spi_block_erase_d8,
4304 }, {
4305 .eraseblocks = { {8 * 1024 * 1024, 1} },
4306 .block_erase = spi_block_erase_c7,
4307 }
4308 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004309 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004310 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004311 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004312 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00004313 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004314 },
4315
4316 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004317 .vendor = "Eon",
4318 .name = "EN25B80",
4319 .bustype = BUS_SPI,
4320 .manufacture_id = EON_ID_NOPREFIX,
4321 .model_id = EON_EN25B80,
4322 .total_size = 1024,
4323 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004324 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004325 .tested = TEST_UNTESTED,
4326 .probe = probe_spi_rdid,
4327 .probe_timing = TIMING_ZERO,
4328 .block_erasers =
4329 {
4330 {
4331 .eraseblocks = {
4332 {4 * 1024, 2},
4333 {8 * 1024, 1},
4334 {16 * 1024, 1},
4335 {32 * 1024, 1},
4336 {64 * 1024, 15}
4337 },
4338 .block_erase = spi_block_erase_d8,
4339 }, {
4340 .eraseblocks = { {1024 * 1024, 1} },
4341 .block_erase = spi_block_erase_c7,
4342 }
4343 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004344 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004345 .unlock = spi_disable_blockprotect,
4346 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004347 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004348 .voltage = {2700, 3600},
4349 },
4350
4351 {
4352 .vendor = "Eon",
4353 .name = "EN25B80T",
4354 .bustype = BUS_SPI,
4355 .manufacture_id = EON_ID_NOPREFIX,
4356 .model_id = EON_EN25B80,
4357 .total_size = 1024,
4358 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004359 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004360 .tested = TEST_UNTESTED,
4361 .probe = probe_spi_rdid,
4362 .probe_timing = TIMING_ZERO,
4363 .block_erasers =
4364 {
4365 {
4366 .eraseblocks = {
4367 {64 * 1024, 15},
4368 {32 * 1024, 1},
4369 {16 * 1024, 1},
4370 {8 * 1024, 1},
4371 {4 * 1024, 2},
4372 },
4373 .block_erase = spi_block_erase_d8,
4374 }, {
4375 .eraseblocks = { {1024 * 1024, 1} },
4376 .block_erase = spi_block_erase_c7,
4377 }
4378 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004379 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004380 .unlock = spi_disable_blockprotect,
4381 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004382 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10004383 .voltage = {2700, 3600},
4384 },
4385
4386 {
hailfinger77c5d932009-06-15 12:10:57 +00004387 .vendor = "Eon",
4388 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00004389 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004390 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004391 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00004392 .total_size = 64,
4393 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004394 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004395 .tested = TEST_OK_PREW,
hailfinger77c5d932009-06-15 12:10:57 +00004396 .probe = probe_spi_rdid,
4397 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004398 .block_erasers =
4399 {
4400 {
4401 .eraseblocks = { {4 * 1024, 16} },
4402 .block_erase = spi_block_erase_20,
4403 }, {
4404 .eraseblocks = { {32 * 1024, 2} },
4405 .block_erase = spi_block_erase_d8,
4406 }, {
4407 .eraseblocks = { {32 * 1024, 2} },
4408 .block_erase = spi_block_erase_52,
4409 }, {
4410 .eraseblocks = { {64 * 1024, 1} },
4411 .block_erase = spi_block_erase_60,
4412 }, {
4413 .eraseblocks = { {64 * 1024, 1} },
4414 .block_erase = spi_block_erase_c7,
4415 }
4416 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004417 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004418 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004419 .write = spi_chip_write_256,
4420 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004421 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004422 },
4423
4424 {
4425 .vendor = "Eon",
4426 .name = "EN25F10",
hailfingere1e41ea2011-07-27 07:13:06 +00004427 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004428 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004429 .model_id = EON_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00004430 .total_size = 128,
4431 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004432 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00004433 .tested = TEST_UNTESTED,
4434 .probe = probe_spi_rdid,
4435 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004436 .block_erasers =
4437 {
4438 {
4439 .eraseblocks = { {4 * 1024, 32} },
4440 .block_erase = spi_block_erase_20,
4441 }, {
4442 .eraseblocks = { {32 * 1024, 4} },
4443 .block_erase = spi_block_erase_d8,
4444 }, {
4445 .eraseblocks = { {32 * 1024, 4} },
4446 .block_erase = spi_block_erase_52,
4447 }, {
4448 .eraseblocks = { {128 * 1024, 1} },
4449 .block_erase = spi_block_erase_60,
4450 }, {
4451 .eraseblocks = { {128 * 1024, 1} },
4452 .block_erase = spi_block_erase_c7,
4453 }
4454 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004455 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004456 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004457 .write = spi_chip_write_256,
4458 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004459 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004460 },
4461
4462 {
4463 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004464 .name = "EN25F16",
4465 .bustype = BUS_SPI,
4466 .manufacture_id = EON_ID_NOPREFIX,
4467 .model_id = EON_EN25F16,
4468 .total_size = 2048,
4469 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004470 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004471 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10004472 .probe = probe_spi_rdid,
4473 .probe_timing = TIMING_ZERO,
4474 .block_erasers =
4475 {
4476 {
4477 .eraseblocks = { {4 * 1024, 512} },
4478 .block_erase = spi_block_erase_20,
4479 }, {
4480 .eraseblocks = { {64 * 1024, 32} },
4481 .block_erase = spi_block_erase_d8,
4482 }, {
4483 .eraseblocks = { {2 * 1024 * 1024, 1} },
4484 .block_erase = spi_block_erase_60,
4485 }, {
4486 .eraseblocks = { {2 * 1024 * 1024, 1} },
4487 .block_erase = spi_block_erase_c7,
4488 }
4489 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004490 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004491 .unlock = spi_disable_blockprotect,
4492 .write = spi_chip_write_256,
4493 .read = spi_chip_read,
4494 .voltage = {2700, 3600},
4495 },
4496
4497 {
4498 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00004499 .name = "EN25F20",
hailfingere1e41ea2011-07-27 07:13:06 +00004500 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004501 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004502 .model_id = EON_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00004503 .total_size = 256,
4504 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004505 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00004506 .tested = TEST_UNTESTED,
4507 .probe = probe_spi_rdid,
4508 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004509 .block_erasers =
4510 {
4511 {
4512 .eraseblocks = { {4 * 1024, 64} },
4513 .block_erase = spi_block_erase_20,
4514 }, {
4515 .eraseblocks = { {64 * 1024, 4} },
4516 .block_erase = spi_block_erase_d8,
4517 }, {
4518 .eraseblocks = { {64 * 1024, 4} },
4519 .block_erase = spi_block_erase_52,
4520 }, {
4521 .eraseblocks = { {256 * 1024, 1} },
4522 .block_erase = spi_block_erase_60,
4523 }, {
4524 .eraseblocks = { {256 * 1024, 1} },
4525 .block_erase = spi_block_erase_c7,
4526 }
4527 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004528 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004529 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004530 .write = spi_chip_write_256,
4531 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004532 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004533 },
4534
4535 {
4536 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004537 .name = "EN25F32",
4538 .bustype = BUS_SPI,
4539 .manufacture_id = EON_ID_NOPREFIX,
4540 .model_id = EON_EN25F32,
4541 .total_size = 4096,
4542 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004543 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004544 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10004545 .probe = probe_spi_rdid,
4546 .probe_timing = TIMING_ZERO,
4547 .block_erasers =
4548 {
4549 {
4550 .eraseblocks = { {4 * 1024, 1024} },
4551 .block_erase = spi_block_erase_20,
4552 }, {
4553 .eraseblocks = { {64 * 1024, 64} },
4554 .block_erase = spi_block_erase_d8,
4555 }, {
4556 .eraseblocks = { {4 * 1024 * 1024, 1} },
4557 .block_erase = spi_block_erase_60,
4558 }, {
4559 .eraseblocks = { {4 * 1024 * 1024, 1} },
4560 .block_erase = spi_block_erase_c7,
4561 }
4562 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004563 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +10004564 .unlock = spi_disable_blockprotect,
4565 .write = spi_chip_write_256,
4566 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004567 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10004568 },
4569
4570 {
4571 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004572 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00004573 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004574 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004575 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00004576 .total_size = 512,
4577 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004578 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004579 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00004580 .probe = probe_spi_rdid,
4581 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00004582 .block_erasers =
4583 {
4584 {
snelson2d471072010-01-09 05:30:14 +00004585 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00004586 .block_erase = spi_block_erase_20,
4587 }, {
snelson2d471072010-01-09 05:30:14 +00004588 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00004589 .block_erase = spi_block_erase_d8,
4590 }, {
snelson2d471072010-01-09 05:30:14 +00004591 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00004592 .block_erase = spi_block_erase_60,
4593 }, {
snelson2d471072010-01-09 05:30:14 +00004594 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00004595 .block_erase = spi_block_erase_c7,
4596 },
4597 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004598 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004599 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004600 .write = spi_chip_write_256,
4601 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004602 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004603 },
4604
4605 {
4606 .vendor = "Eon",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10004607 .name = "EN25F64",
4608 .bustype = BUS_SPI,
4609 .manufacture_id = EON_ID_NOPREFIX,
4610 .model_id = EON_EN25F64,
4611 .total_size = 8192,
4612 .page_size = 256,
4613 .feature_bits = FEATURE_WRSR_WREN,
4614 .tested = TEST_OK_PREW,
4615 .probe = probe_spi_rdid,
4616 .probe_timing = TIMING_ZERO,
4617 .block_erasers =
4618 {
4619 {
4620 .eraseblocks = { {4 * 1024, 2048} },
4621 .block_erase = spi_block_erase_20,
4622 }, {
4623 .eraseblocks = { {64 * 1024, 128} },
4624 .block_erase = spi_block_erase_d8,
4625 }, {
4626 .eraseblocks = { {8 * 1024 * 1024, 1} },
4627 .block_erase = spi_block_erase_60,
4628 }, {
4629 .eraseblocks = { {8 * 1024 * 1024, 1} },
4630 .block_erase = spi_block_erase_c7,
4631 }
4632 },
4633 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4634 .unlock = spi_disable_blockprotect,
4635 .write = spi_chip_write_256,
4636 .read = spi_chip_read,
4637 .voltage = {2700, 3600},
4638 },
4639
4640 {
4641 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004642 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00004643 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004644 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004645 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00004646 .total_size = 1024,
4647 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004648 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004649 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00004650 .probe = probe_spi_rdid,
4651 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004652 .block_erasers =
4653 {
4654 {
4655 .eraseblocks = { {4 * 1024, 256} },
4656 .block_erase = spi_block_erase_20,
4657 }, {
4658 .eraseblocks = { {64 * 1024, 16} },
4659 .block_erase = spi_block_erase_d8,
4660 }, {
4661 .eraseblocks = { {1024 * 1024, 1} },
4662 .block_erase = spi_block_erase_60,
4663 }, {
4664 .eraseblocks = { {1024 * 1024, 1} },
4665 .block_erase = spi_block_erase_c7,
4666 }
4667 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004668 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00004669 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004670 .write = spi_chip_write_256,
4671 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004672 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004673 },
4674
4675 {
4676 .vendor = "Eon",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10004677 .name = "EN25P05",
4678 .bustype = BUS_SPI,
4679 .manufacture_id = EON_ID_NOPREFIX,
4680 .model_id = EON_EN25B05,
4681 .total_size = 64,
4682 .page_size = 256,
4683 .feature_bits = FEATURE_WRSR_WREN,
4684 .tested = TEST_UNTESTED,
4685 .probe = probe_spi_rdid,
4686 .probe_timing = TIMING_ZERO,
4687 .block_erasers =
4688 {
4689 {
4690 .eraseblocks = {
4691 {32 * 1024, 2} },
4692 .block_erase = spi_block_erase_d8,
4693 }, {
4694 .eraseblocks = { {64 * 1024, 1} },
4695 .block_erase = spi_block_erase_c7,
4696 }
4697 },
4698 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4699 .unlock = spi_disable_blockprotect,
4700 .write = spi_chip_write_256,
4701 .read = spi_chip_read, /* Fast read (0x0B) supported */
4702 .voltage = {2700, 3600},
4703 },
4704
4705 {
4706 .vendor = "Eon",
4707 .name = "EN25P10",
4708 .bustype = BUS_SPI,
4709 .manufacture_id = EON_ID_NOPREFIX,
4710 .model_id = EON_EN25B10,
4711 .total_size = 128,
4712 .page_size = 256,
4713 .feature_bits = FEATURE_WRSR_WREN,
4714 .tested = TEST_UNTESTED,
4715 .probe = probe_spi_rdid,
4716 .probe_timing = TIMING_ZERO,
4717 .block_erasers =
4718 {
4719 {
4720 .eraseblocks = { {32 * 1024, 4} },
4721 .block_erase = spi_block_erase_d8,
4722 }, {
4723 .eraseblocks = { {128 * 1024, 1} },
4724 .block_erase = spi_block_erase_c7,
4725 }
4726 },
4727 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4728 .unlock = spi_disable_blockprotect,
4729 .write = spi_chip_write_256,
4730 .read = spi_chip_read, /* Fast read (0x0B) supported */
4731 .voltage = {2700, 3600},
4732 },
4733
4734 {
4735 .vendor = "Eon",
Nikolai Artemiev12898322020-08-31 17:33:18 +10004736 .name = "EN25P16",
4737 .bustype = BUS_SPI,
4738 .manufacture_id = EON_ID_NOPREFIX,
4739 .model_id = EON_EN25B16,
4740 .total_size = 2048,
4741 .page_size = 256,
4742 .feature_bits = FEATURE_WRSR_WREN,
4743 .tested = TEST_UNTESTED,
4744 .probe = probe_spi_rdid,
4745 .probe_timing = TIMING_ZERO,
4746 .block_erasers =
4747 {
4748 {
4749 .eraseblocks = { {64 * 1024, 32} },
4750 .block_erase = spi_block_erase_d8,
4751 }, {
4752 .eraseblocks = { {2 * 1024 * 1024, 1} },
4753 .block_erase = spi_block_erase_c7,
4754 }
4755 },
4756 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4757 .unlock = spi_disable_blockprotect,
4758 .write = spi_chip_write_256,
4759 .read = spi_chip_read, /* Fast read (0x0B) supported */
4760 .voltage = {2700, 3600},
4761 },
4762
4763 {
4764 .vendor = "Eon",
4765 .name = "EN25P20",
4766 .bustype = BUS_SPI,
4767 .manufacture_id = EON_ID_NOPREFIX,
4768 .model_id = EON_EN25B20,
4769 .total_size = 256,
4770 .page_size = 256,
4771 .feature_bits = FEATURE_WRSR_WREN,
4772 .tested = TEST_UNTESTED,
4773 .probe = probe_spi_rdid,
4774 .probe_timing = TIMING_ZERO,
4775 .block_erasers =
4776 {
4777 {
4778 .eraseblocks = { {64 * 1024, 4} },
4779 .block_erase = spi_block_erase_d8,
4780 }, {
4781 .eraseblocks = { {256 * 1024, 1} },
4782 .block_erase = spi_block_erase_c7,
4783 }
4784 },
4785 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4786 .unlock = spi_disable_blockprotect,
4787 .write = spi_chip_write_256,
4788 .read = spi_chip_read, /* Fast read (0x0B) supported */
4789 .voltage = {2700, 3600},
4790 },
4791
4792 {
4793 .vendor = "Eon",
4794 .name = "EN25P32", /* Uniform version of EN25B32 */
4795 .bustype = BUS_SPI,
4796 .manufacture_id = EON_ID_NOPREFIX,
4797 .model_id = EON_EN25B32,
4798 .total_size = 4096,
4799 .page_size = 256,
4800 /* OTP: 512B total; enter 0x3A */
4801 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4802 .tested = TEST_UNTESTED,
4803 .probe = probe_spi_rdid,
4804 .probe_timing = TIMING_ZERO,
4805 .block_erasers =
4806 {
4807 {
4808 .eraseblocks = { {64 * 1024, 64} },
4809 .block_erase = spi_block_erase_d8,
4810 }, {
4811 .eraseblocks = { {4 * 1024 * 1024, 1} },
4812 .block_erase = spi_block_erase_c7,
4813 }
4814 },
4815 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4816 .unlock = spi_disable_blockprotect,
4817 .write = spi_chip_write_256,
4818 .read = spi_chip_read, /* Fast read (0x0B) supported */
4819 .voltage = {2700, 3600},
4820 },
4821
4822 {
4823 .vendor = "Eon",
4824 .name = "EN25P40",
4825 .bustype = BUS_SPI,
4826 .manufacture_id = EON_ID_NOPREFIX,
4827 .model_id = EON_EN25B40,
4828 .total_size = 512,
4829 .page_size = 256,
4830 .feature_bits = FEATURE_WRSR_WREN,
4831 .tested = TEST_UNTESTED,
4832 .probe = probe_spi_rdid,
4833 .probe_timing = TIMING_ZERO,
4834 .block_erasers =
4835 {
4836 {
4837 .eraseblocks = { {64 * 1024, 8} },
4838 .block_erase = spi_block_erase_d8,
4839 }, {
4840 .eraseblocks = { {512 * 1024, 1} },
4841 .block_erase = spi_block_erase_c7,
4842 }
4843 },
4844 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4845 .unlock = spi_disable_blockprotect,
4846 .write = spi_chip_write_256,
4847 .read = spi_chip_read, /* Fast read (0x0B) supported */
4848 .voltage = {2700, 3600},
4849 },
4850
4851 {
4852 .vendor = "Eon",
4853 .name = "EN25P64",
4854 .bustype = BUS_SPI,
4855 .manufacture_id = EON_ID_NOPREFIX,
4856 .model_id = EON_EN25B64,
4857 .total_size = 8192,
4858 .page_size = 256,
4859 /* OTP: 512B total; enter 0x3A */
4860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4861 .tested = TEST_UNTESTED,
4862 .probe = probe_spi_rdid,
4863 .probe_timing = TIMING_ZERO,
4864 .block_erasers =
4865 {
4866 {
4867 .eraseblocks = { {64 * 1024, 128} },
4868 .block_erase = spi_block_erase_d8,
4869 }, {
4870 .eraseblocks = { {8 * 1024 * 1024, 1} },
4871 .block_erase = spi_block_erase_c7,
4872 }
4873 },
4874 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4875 .unlock = spi_disable_blockprotect,
4876 .write = spi_chip_write_256,
4877 .read = spi_chip_read, /* Fast read (0x0B) supported */
4878 .voltage = {2700, 3600},
4879 },
4880
4881 {
4882 .vendor = "Eon",
4883 .name = "EN25P80",
4884 .bustype = BUS_SPI,
4885 .manufacture_id = EON_ID_NOPREFIX,
4886 .model_id = EON_EN25B80,
4887 .total_size = 1024,
4888 .page_size = 256,
4889 .feature_bits = FEATURE_WRSR_WREN,
4890 .tested = TEST_UNTESTED,
4891 .probe = probe_spi_rdid,
4892 .probe_timing = TIMING_ZERO,
4893 .block_erasers =
4894 {
4895 {
4896 .eraseblocks = { {64 * 1024, 16} },
4897 .block_erase = spi_block_erase_d8,
4898 }, {
4899 .eraseblocks = { {1024 * 1024, 1} },
4900 .block_erase = spi_block_erase_c7,
4901 }
4902 },
4903 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4904 .unlock = spi_disable_blockprotect,
4905 .write = spi_chip_write_256,
4906 .read = spi_chip_read, /* Fast read (0x0B) supported */
4907 .voltage = {2700, 3600},
4908 },
4909
4910 {
4911 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004912 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00004913 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004914 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10004915 .model_id = EON_EN25Q128,
4916 .total_size = 16384,
hailfinger77c5d932009-06-15 12:10:57 +00004917 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004918 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004919 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greene3e4fb82019-09-09 16:28:33 +10004920 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07004921 .probe = probe_spi_rdid,
4922 .probe_timing = TIMING_ZERO,
4923 .block_erasers =
4924 {
4925 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004926 .eraseblocks = { {4 * 1024, 4096} },
David Hendrickse185bf22011-05-24 15:34:18 -07004927 .block_erase = spi_block_erase_20,
4928 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004929 .eraseblocks = { {64 * 1024, 256} },
David Hendrickse185bf22011-05-24 15:34:18 -07004930 .block_erase = spi_block_erase_d8,
4931 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004932 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004933 .block_erase = spi_block_erase_60,
4934 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004935 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004936 .block_erase = spi_block_erase_c7,
4937 }
4938 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10004939 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendrickse185bf22011-05-24 15:34:18 -07004940 .unlock = spi_disable_blockprotect,
4941 .write = spi_chip_write_256,
4942 .read = spi_chip_read,
David Hendrickse185bf22011-05-24 15:34:18 -07004943 },
4944
4945 {
Nikolai Artemiev12898322020-08-31 17:33:18 +10004946 /* Note: EN25D16 is an evil twin which shares the model ID
4947 but has different write protection capabilities */
4948 .vendor = "Eon",
4949 .name = "EN25Q16",
4950 .bustype = BUS_SPI,
4951 .manufacture_id = EON_ID_NOPREFIX,
4952 .model_id = EON_EN25Q16,
4953 .total_size = 2048,
4954 .page_size = 256,
4955 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4956 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4957 .tested = TEST_UNTESTED,
4958 .probe = probe_spi_rdid,
4959 .probe_timing = TIMING_ZERO,
4960 .block_erasers =
4961 {
4962 {
4963 .eraseblocks = { {4 * 1024, 512} },
4964 .block_erase = spi_block_erase_20,
4965 }, {
4966 .eraseblocks = { {64 * 1024, 32} },
4967 .block_erase = spi_block_erase_d8,
4968 }, {
4969 /* not supported by Q16 version */
4970 .eraseblocks = { {64 * 1024, 32} },
4971 .block_erase = spi_block_erase_52,
4972 }, {
4973 .eraseblocks = { {2 * 1024 * 1024, 1} },
4974 .block_erase = spi_block_erase_60,
4975 }, {
4976 .eraseblocks = { {2 * 1024 * 1024, 1} },
4977 .block_erase = spi_block_erase_c7,
4978 }
4979 },
4980 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4981 .unlock = spi_disable_blockprotect,
4982 .write = spi_chip_write_256,
4983 .read = spi_chip_read,
4984 .voltage = {2700, 3600},
4985 },
4986
4987 {
David Hendrickse185bf22011-05-24 15:34:18 -07004988 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004989 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00004990 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07004991 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10004992 .model_id = EON_EN25Q32,
4993 .total_size = 4096,
David Hendrickse185bf22011-05-24 15:34:18 -07004994 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004995 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004996 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10004997 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07004998 .probe = probe_spi_rdid,
4999 .probe_timing = TIMING_ZERO,
5000 .block_erasers =
5001 {
5002 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005003 .eraseblocks = { {4 * 1024, 1024} },
David Hendrickse185bf22011-05-24 15:34:18 -07005004 .block_erase = spi_block_erase_20,
5005 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005006 .eraseblocks = { {64 * 1024, 64} },
David Hendrickse185bf22011-05-24 15:34:18 -07005007 .block_erase = spi_block_erase_d8,
5008 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005009 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07005010 .block_erase = spi_block_erase_60,
5011 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005012 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07005013 .block_erase = spi_block_erase_c7,
5014 }
5015 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10005016 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendrickse185bf22011-05-24 15:34:18 -07005017 .unlock = spi_disable_blockprotect,
5018 .write = spi_chip_write_256,
5019 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10005020 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00005021 },
5022
5023 {
snelson2b18d0f2010-03-05 08:44:11 +00005024 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00005025 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00005026 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00005027 .manufacture_id = EON_ID_NOPREFIX,
5028 .model_id = EON_EN25Q40,
5029 .total_size = 512,
5030 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005031 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005032 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00005033 .tested = TEST_UNTESTED,
5034 .probe = probe_spi_rdid,
5035 .probe_timing = TIMING_ZERO,
5036 .block_erasers =
5037 {
5038 {
5039 .eraseblocks = { {4 * 1024, 128} },
5040 .block_erase = spi_block_erase_20,
5041 }, {
5042 .eraseblocks = { {64 * 1024, 8} },
5043 .block_erase = spi_block_erase_d8,
5044 }, {
5045 .eraseblocks = { {512 * 1024, 1} },
5046 .block_erase = spi_block_erase_60,
5047 }, {
5048 .eraseblocks = { {512 * 1024, 1} },
5049 .block_erase = spi_block_erase_c7,
5050 }
5051 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10005052 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
stefanct5d10cff2011-07-24 22:21:57 +00005053 .unlock = spi_disable_blockprotect,
5054 .write = spi_chip_write_256,
5055 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005056 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00005057 },
5058
5059 {
5060 .vendor = "Eon",
5061 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00005062 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00005063 .manufacture_id = EON_ID_NOPREFIX,
5064 .model_id = EON_EN25Q64,
5065 .total_size = 8192,
5066 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005067 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10005069 .tested = TEST_OK_PREW,
stefanct5d10cff2011-07-24 22:21:57 +00005070 .probe = probe_spi_rdid,
5071 .probe_timing = TIMING_ZERO,
5072 .block_erasers =
5073 {
5074 {
5075 .eraseblocks = { {4 * 1024, 2048} },
5076 .block_erase = spi_block_erase_20,
5077 }, {
5078 .eraseblocks = { {64 * 1024, 128} },
5079 .block_erase = spi_block_erase_d8,
5080 }, {
5081 .eraseblocks = { {8 * 1024 * 1024, 1} },
5082 .block_erase = spi_block_erase_60,
5083 }, {
5084 .eraseblocks = { {8 * 1024 * 1024, 1} },
5085 .block_erase = spi_block_erase_c7,
5086 }
5087 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10005088 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
stefanct5d10cff2011-07-24 22:21:57 +00005089 .unlock = spi_disable_blockprotect,
5090 .write = spi_chip_write_256,
5091 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005092 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10005093 },
5094
5095 {
5096 .vendor = "Eon",
5097 .name = "EN25Q80(A)",
5098 .bustype = BUS_SPI,
5099 .manufacture_id = EON_ID_NOPREFIX,
5100 .model_id = EON_EN25Q80,
5101 .total_size = 1024,
5102 .page_size = 256,
5103 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00005105 .tested = TEST_UNTESTED,
5106 .probe = probe_spi_rdid,
5107 .probe_timing = TIMING_ZERO,
5108 .block_erasers =
5109 {
5110 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005111 .eraseblocks = { {4 * 1024, 256} },
stefanct5d10cff2011-07-24 22:21:57 +00005112 .block_erase = spi_block_erase_20,
5113 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005114 .eraseblocks = { {64 * 1024, 16} },
stefanct5d10cff2011-07-24 22:21:57 +00005115 .block_erase = spi_block_erase_d8,
5116 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005117 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00005118 .block_erase = spi_block_erase_60,
5119 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005120 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00005121 .block_erase = spi_block_erase_c7,
5122 }
5123 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10005124 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
stefanct5d10cff2011-07-24 22:21:57 +00005125 .unlock = spi_disable_blockprotect,
5126 .write = spi_chip_write_256,
5127 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10005128 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00005129 },
5130
5131 {
5132 .vendor = "Eon",
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005133 .name = "EN25QH128",
5134 .bustype = BUS_SPI,
5135 .manufacture_id = EON_ID_NOPREFIX,
5136 .model_id = EON_EN25QH128,
5137 .total_size = 16384,
5138 .page_size = 256,
5139 /* supports SFDP */
5140 /* OTP: 512B total; enter 0x3A */
5141 /* QPI enable 0x38, disable 0xFF */
5142 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Tim Chen045e05e2020-07-06 14:59:21 +08005143 .tested = TEST_OK_PREW,
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005144 .probe = probe_spi_rdid,
5145 .probe_timing = TIMING_ZERO,
5146 .block_erasers =
5147 {
5148 {
5149 .eraseblocks = { {4 * 1024, 4096} },
5150 .block_erase = spi_block_erase_20,
5151 }, {
5152 .eraseblocks = { {64 * 1024, 256} },
5153 .block_erase = spi_block_erase_d8,
5154 }, {
5155 .eraseblocks = { { 16384 * 1024, 1} },
5156 .block_erase = spi_block_erase_60,
5157 }, {
5158 .eraseblocks = { { 16384 * 1024, 1} },
5159 .block_erase = spi_block_erase_c7,
5160 }
5161 },
5162 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5163 .unlock = spi_disable_blockprotect_bp3_srwd,
5164 .write = spi_chip_write_256,
5165 .read = spi_chip_read,
5166 .voltage = {2700, 3600},
5167 },
5168
5169 {
5170 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00005171 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00005172 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00005173 .manufacture_id = EON_ID_NOPREFIX,
5174 .model_id = EON_EN25QH16,
5175 .total_size = 2048,
5176 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005177 /* supports SFDP */
5178 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005179 /* QPI enable 0x38, disable 0xFF */
5180 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5181 .tested = TEST_OK_PREW,
stefanct5d10cff2011-07-24 22:21:57 +00005182 .probe = probe_spi_rdid,
5183 .probe_timing = TIMING_ZERO,
5184 .block_erasers =
5185 {
5186 {
5187 .eraseblocks = { {4 * 1024, 512} },
5188 .block_erase = spi_block_erase_20,
5189 }, {
5190 .eraseblocks = { {64 * 1024, 32} },
5191 .block_erase = spi_block_erase_d8,
5192 }, {
5193 .eraseblocks = { {1024 * 2048, 1} },
5194 .block_erase = spi_block_erase_60,
5195 }, {
5196 .eraseblocks = { {1024 * 2048, 1} },
5197 .block_erase = spi_block_erase_c7,
5198 }
5199 },
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005200 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5201 .unlock = spi_disable_blockprotect_bp3_srwd,
5202 .write = spi_chip_write_256,
5203 .read = spi_chip_read,
5204 .voltage = {2700, 3600},
5205 },
5206
5207 {
5208 .vendor = "Eon",
5209 .name = "EN25QH32",
5210 .bustype = BUS_SPI,
5211 .manufacture_id = EON_ID_NOPREFIX,
5212 .model_id = EON_EN25QH32,
5213 .total_size = 4096,
5214 .page_size = 256,
5215 /* supports SFDP */
5216 /* OTP: 512B total; enter 0x3A */
5217 /* QPI enable 0x38, disable 0xFF */
5218 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5219 .tested = TEST_OK_PREW,
5220 .probe = probe_spi_rdid,
5221 .probe_timing = TIMING_ZERO,
5222 .block_erasers =
5223 {
5224 {
5225 .eraseblocks = { {4 * 1024, 1024} },
5226 .block_erase = spi_block_erase_20,
5227 }, {
5228 .eraseblocks = { {64 * 1024, 64} },
5229 .block_erase = spi_block_erase_d8,
5230 }, {
5231 .eraseblocks = { {1024 * 4096, 1} },
5232 .block_erase = spi_block_erase_60,
5233 }, {
5234 .eraseblocks = { {1024 * 4096, 1} },
5235 .block_erase = spi_block_erase_c7,
5236 }
5237 },
5238 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5239 .unlock = spi_disable_blockprotect_bp3_srwd,
5240 .write = spi_chip_write_256,
5241 .read = spi_chip_read,
5242 .voltage = {2700, 3600},
5243 },
5244
5245 {
5246 .vendor = "Eon",
5247 .name = "EN25QH64",
5248 .bustype = BUS_SPI,
5249 .manufacture_id = EON_ID_NOPREFIX,
5250 .model_id = EON_EN25QH64,
5251 .total_size = 8192,
5252 .page_size = 256,
5253 /* supports SFDP */
5254 /* OTP: 512B total; enter 0x3A */
5255 /* QPI enable 0x38, disable 0xFF */
5256 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5257 .tested = TEST_OK_PREW,
5258 .probe = probe_spi_rdid,
5259 .probe_timing = TIMING_ZERO,
5260 .block_erasers =
5261 {
5262 {
5263 .eraseblocks = { {4 * 1024, 2048} },
5264 .block_erase = spi_block_erase_20,
5265 }, {
5266 .eraseblocks = { {64 * 1024, 128} },
5267 .block_erase = spi_block_erase_d8,
5268 }, {
5269 .eraseblocks = { { 8192 * 1024, 1} },
5270 .block_erase = spi_block_erase_60,
5271 }, {
5272 .eraseblocks = { { 8192 * 1024, 1} },
5273 .block_erase = spi_block_erase_c7,
5274 }
5275 },
5276 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5277 .unlock = spi_disable_blockprotect_bp3_srwd,
stefanct5d10cff2011-07-24 22:21:57 +00005278 .write = spi_chip_write_256,
5279 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005280 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00005281 },
Alan Greena7cfa332019-06-24 15:48:14 +10005282
Marc Jonesb2f90022014-04-29 17:37:23 -06005283 {
5284 .vendor = "Eon",
Nikolai Artemiev12898322020-08-31 17:33:18 +10005285 .name = "EN25S10",
5286 .bustype = BUS_SPI,
5287 .manufacture_id = EON_ID_NOPREFIX,
5288 .model_id = EON_EN25S10,
5289 .total_size = 128,
5290 .page_size = 256,
5291 /* OTP: 256B total; enter 0x3A */
5292 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5293 .tested = TEST_UNTESTED,
5294 .probe = probe_spi_rdid,
5295 .probe_timing = TIMING_ZERO,
5296 .block_erasers =
5297 {
5298 {
5299 .eraseblocks = { {4 * 1024, 32} },
5300 .block_erase = spi_block_erase_20,
5301 }, {
5302 .eraseblocks = { {32 * 1024, 4} },
5303 .block_erase = spi_block_erase_52,
5304 }, {
5305 .eraseblocks = { {128 * 1024, 1} },
5306 .block_erase = spi_block_erase_60,
5307 }, {
5308 .eraseblocks = { {128 * 1024, 1} },
5309 .block_erase = spi_block_erase_c7,
5310 }
5311 },
5312 .printlock = spi_prettyprint_status_register_bp2_srwd,
5313 .unlock = spi_disable_blockprotect,
5314 .write = spi_chip_write_256,
5315 .read = spi_chip_read,
5316 .voltage = {1650, 1950},
5317 },
5318
5319 {
5320 .vendor = "Eon",
5321 .name = "EN25S16",
5322 .bustype = BUS_SPI,
5323 .manufacture_id = EON_ID_NOPREFIX,
5324 .model_id = EON_EN25S16,
5325 .total_size = 2048,
5326 .page_size = 256,
5327 /* OTP: 512B total; enter 0x3A */
5328 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5329 .tested = TEST_UNTESTED,
5330 .probe = probe_spi_rdid,
5331 .probe_timing = TIMING_ZERO,
5332 .block_erasers =
5333 {
5334 {
5335 .eraseblocks = { {4 * 1024, 512} },
5336 .block_erase = spi_block_erase_20,
5337 }, {
5338 .eraseblocks = { {64 * 1024, 32} },
5339 .block_erase = spi_block_erase_52,
5340 }, {
5341 .eraseblocks = { {32 * 1024, 64} },
5342 .block_erase = spi_block_erase_d8,
5343 }, {
5344 .eraseblocks = { {2048 * 1024, 1} },
5345 .block_erase = spi_block_erase_60,
5346 }, {
5347 .eraseblocks = { {2048 * 1024, 1} },
5348 .block_erase = spi_block_erase_c7,
5349 }
5350 },
5351 .printlock = spi_prettyprint_status_register_en25s_wp,
5352 .unlock = spi_disable_blockprotect_bp3_srwd,
5353 .write = spi_chip_write_256,
5354 .read = spi_chip_read,
5355 .voltage = {1650, 1950},
5356 },
5357
5358 {
5359 .vendor = "Eon",
5360 .name = "EN25S20",
5361 .bustype = BUS_SPI,
5362 .manufacture_id = EON_ID_NOPREFIX,
5363 .model_id = EON_EN25S20,
5364 .total_size = 256,
5365 .page_size = 256,
5366 /* OTP: 256B total; enter 0x3A */
5367 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5368 .tested = TEST_UNTESTED,
5369 .probe = probe_spi_rdid,
5370 .probe_timing = TIMING_ZERO,
5371 .block_erasers =
5372 {
5373 {
5374 .eraseblocks = { {4 * 1024, 64} },
5375 .block_erase = spi_block_erase_20,
5376 }, {
5377 .eraseblocks = { {64 * 1024, 4} },
5378 .block_erase = spi_block_erase_d8,
5379 }, {
5380 .eraseblocks = { {256 * 1024, 1} },
5381 .block_erase = spi_block_erase_60,
5382 }, {
5383 .eraseblocks = { {256 * 1024, 1} },
5384 .block_erase = spi_block_erase_c7,
5385 }
5386 },
5387 .printlock = spi_prettyprint_status_register_bp2_srwd,
5388 .unlock = spi_disable_blockprotect,
5389 .write = spi_chip_write_256,
5390 .read = spi_chip_read,
5391 .voltage = {1650, 1950},
5392 },
5393
5394 {
5395 .vendor = "Eon",
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005396 .name = "EN25S32",
5397 .bustype = BUS_SPI,
5398 .manufacture_id = EON_ID_NOPREFIX,
5399 .model_id = EON_EN25S32,
5400 .total_size = 4096,
5401 .page_size = 256,
5402 /* OTP: 512B total; enter 0x3A */
5403 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5404 .tested = TEST_UNTESTED,
5405 .probe = probe_spi_rdid,
5406 .probe_timing = TIMING_ZERO,
5407 .block_erasers =
5408 {
5409 {
5410 .eraseblocks = { {4 * 1024, 1024} },
5411 .block_erase = spi_block_erase_20,
5412 }, {
5413 .eraseblocks = { {32 * 1024, 128} },
5414 .block_erase = spi_block_erase_52,
5415 }, {
5416 .eraseblocks = { {64 * 1024, 64} },
5417 .block_erase = spi_block_erase_d8,
5418 }, {
5419 .eraseblocks = { {4096 * 1024, 1} },
5420 .block_erase = spi_block_erase_60,
5421 }, {
5422 .eraseblocks = { {4096 * 1024, 1} },
5423 .block_erase = spi_block_erase_c7,
5424 }
5425 },
5426 .printlock = spi_prettyprint_status_register_en25s_wp,
5427 .unlock = spi_disable_blockprotect_bp3_srwd,
5428 .write = spi_chip_write_256,
5429 .read = spi_chip_read,
5430 .voltage = {1650, 1950},
5431 },
5432
5433 {
5434 .vendor = "Eon",
5435 .name = "EN25S40",
5436 .bustype = BUS_SPI,
5437 .manufacture_id = EON_ID_NOPREFIX,
5438 .model_id = EON_EN25S40,
5439 .total_size = 512,
5440 .page_size = 256,
5441 /* OTP: 256B total; enter 0x3A */
5442 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5443 .tested = TEST_OK_PREW,
5444 .probe = probe_spi_rdid,
5445 .probe_timing = TIMING_ZERO,
5446 .block_erasers =
5447 {
5448 {
5449 .eraseblocks = { {4 * 1024, 128} },
5450 .block_erase = spi_block_erase_20,
5451 }, {
5452 .eraseblocks = { {64 * 1024, 8} },
5453 .block_erase = spi_block_erase_d8,
5454 }, {
5455 .eraseblocks = { {512 * 1024, 1} },
5456 .block_erase = spi_block_erase_60,
5457 }, {
5458 .eraseblocks = { {512 * 1024, 1} },
5459 .block_erase = spi_block_erase_c7,
5460 }
5461 },
5462 .printlock = spi_prettyprint_status_register_bp2_srwd,
5463 .unlock = spi_disable_blockprotect,
5464 .write = spi_chip_write_256,
5465 .read = spi_chip_read,
5466 .voltage = {1650, 1950},
5467 },
5468
5469 {
5470 .vendor = "Eon",
Marc Jonesb2f90022014-04-29 17:37:23 -06005471 .name = "EN25S64",
5472 .bustype = BUS_SPI,
5473 .manufacture_id = EON_ID_NOPREFIX,
5474 .model_id = EON_EN25S64,
5475 .total_size = 8192,
5476 .page_size = 256,
Marc Jonesb2f90022014-04-29 17:37:23 -06005477 /* OTP: 512B total; enter 0x3A */
Nikolai Artemieva9634d92020-09-30 12:12:06 +10005478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +10005479 .tested = TEST_OK_PREW,
Marc Jonesb2f90022014-04-29 17:37:23 -06005480 .probe = probe_spi_rdid,
5481 .probe_timing = TIMING_ZERO,
Alan Greena7cfa332019-06-24 15:48:14 +10005482 .block_erasers =
5483 {
Marc Jonesb2f90022014-04-29 17:37:23 -06005484 {
5485 .eraseblocks = { {4 * 1024, 2048} },
5486 .block_erase = spi_block_erase_20,
5487 }, {
5488 .eraseblocks = { {64 * 1024, 128} },
5489 .block_erase = spi_block_erase_d8,
5490 }, {
5491 .eraseblocks = { {8192 * 1024, 1} },
5492 .block_erase = spi_block_erase_60,
5493 }, {
5494 .eraseblocks = { {8192 * 1024, 1} },
5495 .block_erase = spi_block_erase_c7,
5496 }
5497 },
Nikolai Artemieva9634d92020-09-30 12:12:06 +10005498 .printlock = spi_prettyprint_status_register_en25s_wp,
Nikolai Artemiev7c253912021-03-02 10:33:01 +11005499 .unlock = spi_disable_blockprotect_bp3_srwd,
Marc Jonesb2f90022014-04-29 17:37:23 -06005500 .write = spi_chip_write_256,
5501 .read = spi_chip_read,
5502 .voltage = {1650, 1950},
5503 },
stefanct5d10cff2011-07-24 22:21:57 +00005504
5505 {
5506 .vendor = "Eon",
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005507 .name = "EN25S80",
5508 .bustype = BUS_SPI,
5509 .manufacture_id = EON_ID_NOPREFIX,
5510 .model_id = EON_EN25S80,
5511 .total_size = 1024,
5512 .page_size = 256,
5513 /* OTP: 256B total; enter 0x3A */
5514 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5515 .tested = TEST_UNTESTED,
5516 .probe = probe_spi_rdid,
5517 .probe_timing = TIMING_ZERO,
5518 .block_erasers =
5519 {
5520 {
5521 .eraseblocks = { {4 * 1024, 256} },
5522 .block_erase = spi_block_erase_20,
5523 }, {
5524 .eraseblocks = { {64 * 1024, 16} },
5525 .block_erase = spi_block_erase_d8,
5526 }, {
5527 .eraseblocks = { {1024 * 1024, 1} },
5528 .block_erase = spi_block_erase_60,
5529 }, {
5530 .eraseblocks = { {1024 * 1024, 1} },
5531 .block_erase = spi_block_erase_c7,
5532 }
5533 },
5534 .printlock = spi_prettyprint_status_register_bp2_srwd,
5535 .unlock = spi_disable_blockprotect,
5536 .write = spi_chip_write_256,
5537 .read = spi_chip_read,
5538 .voltage = {1650, 1950},
5539 },
5540
5541 {
5542 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00005543 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005544 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005545 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005546 .model_id = EON_EN29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005547 .total_size = 256,
5548 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00005549 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005550 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005551 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005552 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005553 .block_erasers =
5554 {
5555 {
Simon Glass8dc82732013-07-16 10:13:51 -06005556 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005557 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00005558 {8 * 1024, 2},
5559 {32 * 1024, 1},
5560 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00005561 },
5562 .block_erase = erase_sector_jedec,
5563 }, {
5564 .eraseblocks = { {256 * 1024, 1} },
5565 .block_erase = erase_chip_block_jedec,
5566 },
5567 },
hailfingerfff99532009-11-27 17:49:42 +00005568 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005569 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005570 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005571 },
5572
hailfinger286829b2009-01-08 03:40:17 +00005573 {
hailfinger61958912010-07-28 22:20:20 +00005574 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00005575 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005576 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005577 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005578 .model_id = EON_EN29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005579 .total_size = 256,
5580 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00005581 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10005582 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005583 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005584 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005585 .block_erasers =
5586 {
5587 {
Simon Glass8dc82732013-07-16 10:13:51 -06005588 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005589 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00005590 {32 * 1024, 1},
5591 {8 * 1024, 2},
5592 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00005593 },
5594 .block_erase = erase_sector_jedec,
5595 }, {
5596 .eraseblocks = { {256 * 1024, 1} },
5597 .block_erase = erase_chip_block_jedec,
5598 },
5599 },
hailfingerfff99532009-11-27 17:49:42 +00005600 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005601 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005602 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005603 },
5604
hailfinger286829b2009-01-08 03:40:17 +00005605 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005606 .vendor = "Eon",
5607 .name = "EN29F010",
5608 .bustype = BUS_PARALLEL,
5609 .manufacture_id = EON_ID,
5610 .model_id = EON_EN29F010,
5611 .total_size = 128,
5612 .page_size = 128,
5613 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5614 .tested = TEST_OK_PRE,
5615 .probe = probe_jedec,
5616 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5617 .block_erasers =
5618 {
5619 {
5620 .eraseblocks = { {16 * 1024, 8} },
5621 .block_erase = erase_sector_jedec,
5622 },
5623 {
5624 .eraseblocks = { {128 * 1024, 1} },
5625 .block_erase = erase_chip_block_jedec,
5626 },
5627 },
5628 .write = write_jedec_1,
5629 .read = read_memmapped,
5630 .voltage = {4500, 5500},
5631 },
5632
5633 {
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005634 .vendor = "Eon",
5635 .name = "EN29GL064(A)B",
5636 .bustype = BUS_PARALLEL,
5637 .manufacture_id = EON_ID,
5638 .model_id = EON_EN29GL064B,
5639 .total_size = 8192,
5640 .page_size = 128 * 1024, /* actual page size is 16 */
5641 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5642 .tested = TEST_UNTESTED,
5643 .probe = probe_jedec_29gl,
5644 .probe_timing = TIMING_ZERO,
5645 .block_erasers =
5646 {
5647 {
5648 .eraseblocks = {
5649 {8 * 1024, 8},
5650 {64 * 1024, 127},
5651 },
5652 .block_erase = erase_sector_jedec,
5653 }, {
5654 .eraseblocks = { {8 * 1024 * 1024, 1} },
5655 .block_erase = erase_chip_block_jedec,
5656 },
5657 },
5658 .write = write_jedec_1,
5659 .read = read_memmapped,
5660 .voltage = {2700, 3600},
5661 },
5662
5663 {
5664 .vendor = "Eon",
5665 .name = "EN29GL064(A)T",
5666 .bustype = BUS_PARALLEL,
5667 .manufacture_id = EON_ID,
5668 .model_id = EON_EN29GL064T,
5669 .total_size = 8192,
5670 .page_size = 128 * 1024, /* actual page size is 16 */
5671 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5672 .tested = TEST_UNTESTED,
5673 .probe = probe_jedec_29gl,
5674 .probe_timing = TIMING_ZERO,
5675 .block_erasers =
5676 {
5677 {
5678 .eraseblocks = {
5679 {64 * 1024, 127},
5680 {8 * 1024, 8},
5681 },
5682 .block_erase = erase_sector_jedec,
5683 }, {
5684 .eraseblocks = { {8 * 1024 * 1024, 1} },
5685 .block_erase = erase_chip_block_jedec,
5686 },
5687 },
5688 .write = write_jedec_1,
5689 .read = read_memmapped,
5690 .voltage = {2700, 3600},
5691 },
5692
5693 {
5694 .vendor = "Eon",
5695 .name = "EN29GL064H/L",
5696 .bustype = BUS_PARALLEL,
5697 .manufacture_id = EON_ID,
5698 .model_id = EON_EN29GL064HL,
5699 .total_size = 8192,
5700 .page_size = 128 * 1024, /* actual page size is 16 */
5701 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5702 .tested = TEST_UNTESTED,
5703 .probe = probe_jedec_29gl,
5704 .probe_timing = TIMING_ZERO,
5705 .block_erasers =
5706 {
5707 {
5708 .eraseblocks = { {64 * 1024, 128} },
5709 .block_erase = erase_sector_jedec,
5710 }, {
5711 .eraseblocks = { {8 * 1024 * 1024, 1} },
5712 .block_erase = erase_chip_block_jedec,
5713 },
5714 },
5715 .write = write_jedec_1,
5716 .read = read_memmapped,
5717 .voltage = {2700, 3600},
5718 },
5719
5720 {
5721 .vendor = "Eon",
5722 .name = "EN29GL128",
5723 .bustype = BUS_PARALLEL,
5724 .manufacture_id = EON_ID,
5725 .model_id = EON_EN29GL128HL,
5726 .total_size = 16384,
5727 .page_size = 128 * 1024, /* actual page size is 16 */
5728 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5729 .tested = TEST_UNTESTED,
5730 .probe = probe_jedec_29gl,
5731 .probe_timing = TIMING_ZERO,
5732 .block_erasers =
5733 {
5734 {
5735 .eraseblocks = { {128 * 1024, 128} },
5736 .block_erase = erase_sector_jedec,
5737 }, {
5738 .eraseblocks = { {16 * 1024 * 1024, 1} },
5739 .block_erase = erase_chip_block_jedec,
5740 },
5741 },
5742 .write = write_jedec_1,
5743 .read = read_memmapped,
5744 .voltage = {2700, 3600},
5745 },
5746
5747 {
5748 .vendor = "Eon",
5749 .name = "EN29LV040(A)",
5750 .bustype = BUS_PARALLEL,
5751 .manufacture_id = EON_ID,
5752 .model_id = EON_EN29LV040,
5753 .total_size = 512,
5754 .page_size = 4 * 1024,
5755 .tested = TEST_OK_PREW,
5756 .probe = probe_jedec,
5757 .probe_timing = TIMING_ZERO,
5758 .block_erasers =
5759 {
5760 {
5761 .eraseblocks = { {64 * 1024, 8} },
5762 .block_erase = erase_sector_jedec,
5763 },
5764 {
5765 .eraseblocks = { {512 * 1024, 1} },
5766 .block_erase = erase_chip_block_jedec,
5767 },
5768 },
5769 .write = write_jedec_1,
5770 .read = read_memmapped,
5771 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5772 },
5773
5774 {
5775 .vendor = "Eon",
5776 .name = "EN29LV640B",
5777 .bustype = BUS_PARALLEL,
5778 .manufacture_id = EON_ID,
5779 .model_id = EON_EN29LV640B,
5780 .total_size = 8192,
5781 .page_size = 8192,
5782 .feature_bits = FEATURE_ADDR_SHIFTED,
5783 .tested = TEST_OK_PREW,
5784 .probe = probe_en29lv640b,
5785 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5786 .block_erasers =
5787 {
5788 {
5789 .eraseblocks = {
5790 {8 * 1024, 8},
5791 {64 * 1024, 127},
5792 },
5793 .block_erase = erase_block_jedec,
5794 }, {
5795 .eraseblocks = { {8 * 1024 * 1024, 1} },
5796 .block_erase = erase_chip_block_jedec,
5797 },
5798 },
5799 .write = write_en29lv640b,
5800 .read = read_memmapped,
5801 .voltage = {2700, 3600},
5802 },
5803
5804 {
Jakob Peterssonf9ecaad2019-02-18 01:55:43 +01005805 .vendor = "Fudan",
5806 .name = "FM25F005",
5807 .bustype = BUS_SPI,
5808 .manufacture_id = FUDAN_ID_NOPREFIX,
5809 .model_id = FUDAN_FM25F005,
5810 .total_size = 64,
5811 .page_size = 256,
5812 /* OTP: 256B total; enter 0x3A */
5813 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5814 .tested = TEST_UNTESTED,
5815 .probe = probe_spi_rdid,
5816 .probe_timing = TIMING_ZERO,
5817 .block_erasers = {
5818 {
5819 .eraseblocks = { {4 * 1024, 16} },
5820 .block_erase = spi_block_erase_20,
5821 }, {
5822 .eraseblocks = { {32 * 1024, 2} },
5823 .block_erase = spi_block_erase_52,
5824 }, {
5825 .eraseblocks = { {64 * 1024, 1} },
5826 .block_erase = spi_block_erase_d8,
5827 }, {
5828 .eraseblocks = { {64 * 1024, 1} },
5829 .block_erase = spi_block_erase_60,
5830 }, {
5831 .eraseblocks = { {64 * 1024, 1} },
5832 .block_erase = spi_block_erase_c7,
5833 }
5834 },
5835 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5836 .unlock = spi_disable_blockprotect_bp2_srwd,
5837 .write = spi_chip_write_256,
5838 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5839 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5840 },
5841
5842 {
5843 .vendor = "Fudan",
5844 .name = "FM25F01",
5845 .bustype = BUS_SPI,
5846 .manufacture_id = FUDAN_ID_NOPREFIX,
5847 .model_id = FUDAN_FM25F01,
5848 .total_size = 128,
5849 .page_size = 256,
5850 /* OTP: 256B total; enter 0x3A */
5851 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5852 .tested = TEST_UNTESTED,
5853 .probe = probe_spi_rdid,
5854 .probe_timing = TIMING_ZERO,
5855 .block_erasers = {
5856 {
5857 .eraseblocks = { {4 * 1024, 32} },
5858 .block_erase = spi_block_erase_20,
5859 }, {
5860 .eraseblocks = { {32 * 1024, 4} },
5861 .block_erase = spi_block_erase_52,
5862 }, {
5863 .eraseblocks = { {64 * 1024, 2} },
5864 .block_erase = spi_block_erase_d8,
5865 }, {
5866 .eraseblocks = { {128 * 1024, 1} },
5867 .block_erase = spi_block_erase_60,
5868 }, {
5869 .eraseblocks = { {128 * 1024, 1} },
5870 .block_erase = spi_block_erase_c7,
5871 }
5872 },
5873 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5874 .unlock = spi_disable_blockprotect_bp2_srwd,
5875 .write = spi_chip_write_256,
5876 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5877 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5878 },
5879
5880 {
5881 .vendor = "Fudan",
5882 .name = "FM25F02(A)",
5883 .bustype = BUS_SPI,
5884 .manufacture_id = FUDAN_ID_NOPREFIX,
5885 .model_id = FUDAN_FM25F02,
5886 .total_size = 256,
5887 .page_size = 256,
5888 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
5889 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5890 .tested = TEST_UNTESTED,
5891 .probe = probe_spi_rdid,
5892 .probe_timing = TIMING_ZERO,
5893 .block_erasers = {
5894 {
5895 .eraseblocks = { {4 * 1024, 64} },
5896 .block_erase = spi_block_erase_20,
5897 }, {
5898 .eraseblocks = { {32 * 1024, 8} },
5899 .block_erase = spi_block_erase_52,
5900 }, {
5901 .eraseblocks = { {64 * 1024, 4} },
5902 .block_erase = spi_block_erase_d8,
5903 }, {
5904 .eraseblocks = { {1024 * 256, 1} },
5905 .block_erase = spi_block_erase_60,
5906 }, {
5907 .eraseblocks = { {1024 * 256, 1} },
5908 .block_erase = spi_block_erase_c7,
5909 },
5910 },
5911 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5912 .unlock = spi_disable_blockprotect_bp2_srwd,
5913 .write = spi_chip_write_256,
5914 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5915 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
5916 },
5917
5918 {
5919 .vendor = "Fudan",
5920 .name = "FM25F04(A)",
5921 .bustype = BUS_SPI,
5922 .manufacture_id = FUDAN_ID_NOPREFIX,
5923 .model_id = FUDAN_FM25F04,
5924 .total_size = 512,
5925 .page_size = 256,
5926 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
5927 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5928 .tested = TEST_UNTESTED,
5929 .probe = probe_spi_rdid,
5930 .probe_timing = TIMING_ZERO,
5931 .block_erasers = {
5932 {
5933 .eraseblocks = { {4 * 1024, 128} },
5934 .block_erase = spi_block_erase_20,
5935 }, {
5936 .eraseblocks = { {32 * 1024, 16} },
5937 .block_erase = spi_block_erase_52,
5938 }, {
5939 .eraseblocks = { {64 * 1024, 8} },
5940 .block_erase = spi_block_erase_d8,
5941 }, {
5942 .eraseblocks = { {1024 * 512, 1} },
5943 .block_erase = spi_block_erase_60,
5944 }, {
5945 .eraseblocks = { {1024 * 512, 1} },
5946 .block_erase = spi_block_erase_c7,
5947 },
5948 },
5949 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
5950 .unlock = spi_disable_blockprotect_bp2_srwd,
5951 .write = spi_chip_write_256,
5952 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
5953 .voltage = {2700, 3600},
5954 },
5955
5956 {
5957 .vendor = "Fudan",
5958 .name = "FM25Q08",
5959 .bustype = BUS_SPI,
5960 .manufacture_id = FUDAN_ID_NOPREFIX,
5961 .model_id = FUDAN_FM25Q08,
5962 .total_size = 1024,
5963 .page_size = 256,
5964 /* supports SFDP */
5965 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
5966 /* QPI enable 0x38, disable 0xFF */
5967 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5968 .tested = TEST_UNTESTED,
5969 .probe = probe_spi_rdid,
5970 .probe_timing = TIMING_ZERO,
5971 .block_erasers = {
5972 {
5973 .eraseblocks = { {4 * 1024, 256} },
5974 .block_erase = spi_block_erase_20,
5975 }, {
5976 .eraseblocks = { {32 * 1024, 32} },
5977 .block_erase = spi_block_erase_52,
5978 }, {
5979 .eraseblocks = { {64 * 1024, 16} },
5980 .block_erase = spi_block_erase_d8,
5981 }, {
5982 .eraseblocks = { {1024 * 1024, 1} },
5983 .block_erase = spi_block_erase_60,
5984 }, {
5985 .eraseblocks = { {1024 * 1024, 1} },
5986 .block_erase = spi_block_erase_c7,
5987 },
5988 },
5989 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
5990 .unlock = spi_disable_blockprotect_bp2_srwd,
5991 .write = spi_chip_write_256,
5992 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
5993 .voltage = {2700, 3600},
5994 },
5995
5996 {
5997 .vendor = "Fudan",
5998 .name = "FM25Q16",
5999 .bustype = BUS_SPI,
6000 .manufacture_id = FUDAN_ID_NOPREFIX,
6001 .model_id = FUDAN_FM25Q16,
6002 .total_size = 2048,
6003 .page_size = 256,
6004 /* supports SFDP */
6005 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6006 /* QPI enable 0x38, disable 0xFF */
6007 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6008 .tested = TEST_UNTESTED,
6009 .probe = probe_spi_rdid,
6010 .probe_timing = TIMING_ZERO,
6011 .block_erasers = {
6012 {
6013 .eraseblocks = { {4 * 1024, 512} },
6014 .block_erase = spi_block_erase_20,
6015 }, {
6016 .eraseblocks = { {32 * 1024, 64} },
6017 .block_erase = spi_block_erase_52,
6018 }, {
6019 .eraseblocks = { {64 * 1024, 32} },
6020 .block_erase = spi_block_erase_d8,
6021 }, {
6022 .eraseblocks = { {2 * 1024 * 1024, 1} },
6023 .block_erase = spi_block_erase_60,
6024 }, {
6025 .eraseblocks = { {2 * 1024 * 1024, 1} },
6026 .block_erase = spi_block_erase_c7,
6027 }
6028 },
6029 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6030 .unlock = spi_disable_blockprotect_bp2_srwd,
6031 .write = spi_chip_write_256,
6032 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6033 .voltage = {2700, 3600},
6034 },
6035
6036 {
6037 .vendor = "Fudan",
6038 .name = "FM25Q32",
6039 .bustype = BUS_SPI,
6040 .manufacture_id = FUDAN_ID_NOPREFIX,
6041 .model_id = FUDAN_FM25Q32,
6042 .total_size = 4096,
6043 .page_size = 256,
6044 /* supports SFDP */
6045 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
6046 /* QPI enable 0x38, disable 0xFF */
6047 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6048 .tested = TEST_UNTESTED,
6049 .probe = probe_spi_rdid,
6050 .probe_timing = TIMING_ZERO,
6051 .block_erasers = {
6052 {
6053 .eraseblocks = { {4 * 1024, 1024} },
6054 .block_erase = spi_block_erase_20,
6055 }, {
6056 .eraseblocks = { {32 * 1024, 128} },
6057 .block_erase = spi_block_erase_52,
6058 }, {
6059 .eraseblocks = { {64 * 1024, 64} },
6060 .block_erase = spi_block_erase_d8,
6061 }, {
6062 .eraseblocks = { {4 * 1024 * 1024, 1} },
6063 .block_erase = spi_block_erase_60,
6064 }, {
6065 .eraseblocks = { {4 * 1024 * 1024, 1} },
6066 .block_erase = spi_block_erase_c7,
6067 },
6068 },
6069 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6070 .unlock = spi_disable_blockprotect_bp2_srwd,
6071 .write = spi_chip_write_256,
6072 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6073 .voltage = {2700, 3600},
6074 },
6075
6076 {
hailfinger286829b2009-01-08 03:40:17 +00006077 .vendor = "Fujitsu",
6078 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00006079 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006080 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006081 .model_id = FUJITSU_MBM29F004BC,
hailfinger286829b2009-01-08 03:40:17 +00006082 .total_size = 512,
6083 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006084 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00006085 .tested = TEST_UNTESTED,
6086 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006087 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00006088 .block_erasers =
6089 {
6090 {
Simon Glass8dc82732013-07-16 10:13:51 -06006091 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00006092 {16 * 1024, 1},
6093 {8 * 1024, 2},
6094 {32 * 1024, 1},
6095 {64 * 1024, 7},
6096 },
snelsonc6855342010-01-28 23:55:12 +00006097 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006098 }, {
6099 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006100 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006101 },
6102 },
hailfinger286829b2009-01-08 03:40:17 +00006103 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00006104 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006105 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006106 },
6107
hailfinger286829b2009-01-08 03:40:17 +00006108 {
6109 .vendor = "Fujitsu",
6110 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00006111 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006112 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006113 .model_id = FUJITSU_MBM29F004TC,
hailfinger286829b2009-01-08 03:40:17 +00006114 .total_size = 512,
6115 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00006116 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00006117 .tested = TEST_UNTESTED,
6118 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00006119 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00006120 .block_erasers =
6121 {
6122 {
Simon Glass8dc82732013-07-16 10:13:51 -06006123 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00006124 {64 * 1024, 7},
6125 {32 * 1024, 1},
6126 {8 * 1024, 2},
6127 {16 * 1024, 1},
6128 },
snelsonc6855342010-01-28 23:55:12 +00006129 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006130 }, {
6131 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00006132 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006133 },
6134 },
hailfinger286829b2009-01-08 03:40:17 +00006135 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00006136 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00006137 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00006138 },
6139
hailfinger286829b2009-01-08 03:40:17 +00006140 {
snelsonc6855342010-01-28 23:55:12 +00006141 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00006142 .vendor = "Fujitsu",
6143 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00006144 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00006145 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006146 .model_id = FUJITSU_MBM29F400BC,
hailfinger286829b2009-01-08 03:40:17 +00006147 .total_size = 512,
6148 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10006149 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00006150 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10006151 .probe = probe_jedec,
6152 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
snelson1c03aa12009-12-23 17:05:59 +00006153 .block_erasers =
6154 {
6155 {
Simon Glass8dc82732013-07-16 10:13:51 -06006156 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00006157 {16 * 1024, 1},
6158 {8 * 1024, 2},
6159 {32 * 1024, 1},
6160 {64 * 1024, 7},
6161 },
Alan Green607cc632019-09-16 16:09:32 +10006162 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006163 }, {
6164 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10006165 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00006166 },
6167 },
Alan Green607cc632019-09-16 16:09:32 +10006168 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00006169 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00006170 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00006171 },
6172
hailfinger286829b2009-01-08 03:40:17 +00006173 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006174 .vendor = "Fujitsu",
6175 .name = "MBM29F400TC",
6176 .bustype = BUS_PARALLEL,
6177 .manufacture_id = FUJITSU_ID,
6178 .model_id = FUJITSU_MBM29F400TC,
6179 .total_size = 512,
6180 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10006181 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006182 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10006183 .probe = probe_jedec,
6184 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006185 .block_erasers =
6186 {
6187 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006188 .eraseblocks = {
6189 {64 * 1024, 7},
6190 {32 * 1024, 1},
6191 {8 * 1024, 2},
6192 {16 * 1024, 1},
6193 },
Alan Green607cc632019-09-16 16:09:32 +10006194 .block_erase = erase_sector_jedec,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006195 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006196 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10006197 .block_erase = erase_chip_block_jedec,
Alan Greend76dc1f2019-06-26 15:38:19 +10006198 },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006199 },
Alan Green607cc632019-09-16 16:09:32 +10006200 .write = write_jedec_1,
Alan Greend76dc1f2019-06-26 15:38:19 +10006201 .read = read_memmapped,
6202 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006203 },
6204
6205 {
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10006206 .vendor = "Fujitsu",
6207 .name = "MBM29LV160BE",
6208 .bustype = BUS_PARALLEL,
6209 .manufacture_id = FUJITSU_ID,
6210 .model_id = FUJITSU_MBM29LV160BE,
6211 .total_size = 2 * 1024,
6212 .page_size = 0,
6213 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6214 .tested = TEST_UNTESTED,
6215 .probe = probe_jedec,
6216 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
6217 .block_erasers =
6218 {
6219 {
6220 .eraseblocks = {
6221 {16 * 1024, 1},
6222 {8 * 1024, 2},
6223 {32 * 1024, 1},
6224 {64 * 1024, 31},
6225 },
6226 .block_erase = erase_block_jedec,
6227 }, {
6228 .eraseblocks = { {2048 * 1024, 1} },
6229 .block_erase = erase_chip_block_jedec,
6230 },
6231 },
6232 .write = write_jedec_1, /* Supports a fast mode too */
6233 .read = read_memmapped,
6234 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
6235 },
6236
6237 {
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006238 .vendor = "Fujitsu",
6239 .name = "MBM29LV160TE",
6240 .bustype = BUS_PARALLEL,
6241 .manufacture_id = FUJITSU_ID,
6242 .model_id = FUJITSU_MBM29LV160TE,
6243 .total_size = 2 * 1024,
6244 .page_size = 0,
6245 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6246 .tested = TEST_UNTESTED,
6247 .probe = probe_jedec,
6248 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
6249 .block_erasers =
6250 {
6251 {
6252 .eraseblocks = {
6253 {64 * 1024, 31},
6254 {32 * 1024, 1},
6255 {8 * 1024, 2},
6256 {16 * 1024, 1},
6257 },
6258 .block_erase = erase_block_jedec,
6259 }, {
6260 .eraseblocks = { {2048 * 1024, 1} },
6261 .block_erase = erase_chip_block_jedec,
6262 },
6263 },
6264 .write = write_jedec_1, /* Supports a fast mode too */
6265 .read = read_memmapped,
6266 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
6267 },
6268
6269 {
6270 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10006271 .name = "GD25LQ128C/GD25LQ128D",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006272 .bustype = BUS_SPI,
6273 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006274 .model_id = GIGADEVICE_GD25LQ128CD,
6275 .total_size = 16384,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006276 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006277 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan7f47d092020-01-13 23:44:15 +11006278 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006279 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006280 .probe = probe_spi_rdid,
6281 .probe_timing = TIMING_ZERO,
6282 .block_erasers =
6283 {
6284 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006285 .eraseblocks = { {4 * 1024, 4096} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006286 .block_erase = spi_block_erase_20,
6287 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006288 .eraseblocks = { {32 * 1024, 512} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006289 .block_erase = spi_block_erase_52,
6290 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006291 .eraseblocks = { {64 * 1024, 256} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006292 .block_erase = spi_block_erase_d8,
6293 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006294 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006295 .block_erase = spi_block_erase_60,
6296 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006297 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006298 .block_erase = spi_block_erase_c7,
6299 }
6300 },
Edward O'Callaghan7f47d092020-01-13 23:44:15 +11006301 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006302 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006303 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006304 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green5dc48da2019-08-26 15:35:10 +10006305 .voltage = {1695, 1950},
Alan Greend76dc1f2019-06-26 15:38:19 +10006306 },
6307
6308 {
6309 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006310 .name = "GD25LQ16",
6311 .bustype = BUS_SPI,
6312 .manufacture_id = GIGADEVICE_ID,
6313 .model_id = GIGADEVICE_GD25LQ16,
6314 .total_size = 2048,
6315 .page_size = 256,
6316 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6317 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6318 .tested = TEST_UNTESTED,
6319 .probe = probe_spi_rdid,
6320 .probe_timing = TIMING_ZERO,
6321 .block_erasers =
6322 {
6323 {
6324 .eraseblocks = { {4 * 1024, 512} },
6325 .block_erase = spi_block_erase_20,
6326 }, {
6327 .eraseblocks = { {32 * 1024, 64} },
6328 .block_erase = spi_block_erase_52,
6329 }, {
6330 .eraseblocks = { {64 * 1024, 32} },
6331 .block_erase = spi_block_erase_d8,
6332 }, {
6333 .eraseblocks = { {2 * 1024 * 1024, 1} },
6334 .block_erase = spi_block_erase_60,
6335 }, {
6336 .eraseblocks = { {2 * 1024 * 1024, 1} },
6337 .block_erase = spi_block_erase_c7,
6338 }
6339 },
6340 .printlock = spi_prettyprint_status_register_bp4_srwd,
6341 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6342 .write = spi_chip_write_256,
6343 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6344 .voltage = {1695, 1950},
6345 },
6346
6347 {
6348 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10006349 .name = "GD25LQ32",
6350 .bustype = BUS_SPI,
6351 .manufacture_id = GIGADEVICE_ID,
6352 .model_id = GIGADEVICE_GD25LQ32,
6353 .total_size = 4096,
6354 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006355 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Alan Green6b94e402019-09-16 16:30:59 +10006356 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006357 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006358 .probe = probe_spi_rdid,
6359 .probe_timing = TIMING_ZERO,
6360 .block_erasers =
6361 {
6362 {
6363 .eraseblocks = { {4 * 1024, 1024} },
6364 .block_erase = spi_block_erase_20,
6365 }, {
6366 .eraseblocks = { {32 * 1024, 128} },
6367 .block_erase = spi_block_erase_52,
6368 }, {
6369 .eraseblocks = { {64 * 1024, 64} },
6370 .block_erase = spi_block_erase_d8,
6371 }, {
6372 .eraseblocks = { {4 * 1024 * 1024, 1} },
6373 .block_erase = spi_block_erase_60,
6374 }, {
6375 .eraseblocks = { {4 * 1024 * 1024, 1} },
6376 .block_erase = spi_block_erase_c7,
6377 }
6378 },
Alan Green6b94e402019-09-16 16:30:59 +10006379 .printlock = spi_prettyprint_status_register_bp4_srwd,
6380 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006381 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006382 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green5dc48da2019-08-26 15:35:10 +10006383 .voltage = {1695, 1950},
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006384 },
6385
6386 {
6387 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07006388 .name = "GD25LQ40",
6389 .bustype = BUS_SPI,
6390 .manufacture_id = GIGADEVICE_ID,
6391 .model_id = GIGADEVICE_GD25LQ40,
6392 .total_size = 512,
6393 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006394 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6395 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Schneider59543cd2016-04-27 02:11:00 -07006396 .tested = TEST_UNTESTED,
6397 .probe = probe_spi_rdid,
6398 .probe_timing = TIMING_ZERO,
6399 .block_erasers =
6400 {
6401 {
6402 .eraseblocks = { {4 * 1024, 128} },
6403 .block_erase = spi_block_erase_20,
6404 }, {
6405 .eraseblocks = { {32 * 1024, 16} },
6406 .block_erase = spi_block_erase_52,
6407 }, {
6408 .eraseblocks = { {64 * 1024, 8} },
6409 .block_erase = spi_block_erase_d8,
6410 }, {
6411 .eraseblocks = { {512 * 1024, 1} },
6412 .block_erase = spi_block_erase_60,
6413 }, {
6414 .eraseblocks = { {512 * 1024, 1} },
6415 .block_erase = spi_block_erase_c7,
6416 }
6417 },
Nikolai Artemieva31a3c82021-01-20 15:47:33 +11006418 .printlock = spi_prettyprint_status_register_bp4_srwd,
6419 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
David Schneider59543cd2016-04-27 02:11:00 -07006420 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006421 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green5dc48da2019-08-26 15:35:10 +10006422 .voltage = {1695, 1950},
David Schneider59543cd2016-04-27 02:11:00 -07006423 },
6424
6425 {
6426 .vendor = "GigaDevice",
Alan Green78d8f702019-08-06 16:46:42 +10006427 .name = "GD25LQ64(B)",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006428 .bustype = BUS_SPI,
6429 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006430 .model_id = GIGADEVICE_GD25LQ64,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006431 .total_size = 8192,
6432 .page_size = 256,
Alan Green78d8f702019-08-06 16:46:42 +10006433 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006434 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006435 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006436 .probe = probe_spi_rdid,
6437 .probe_timing = TIMING_ZERO,
6438 .block_erasers =
6439 {
6440 {
6441 .eraseblocks = { {4 * 1024, 2048} },
6442 .block_erase = spi_block_erase_20,
6443 }, {
6444 .eraseblocks = { {32 * 1024, 256} },
6445 .block_erase = spi_block_erase_52,
6446 }, {
6447 .eraseblocks = { {64 * 1024, 128} },
6448 .block_erase = spi_block_erase_d8,
6449 }, {
6450 .eraseblocks = { {8 * 1024 * 1024, 1} },
6451 .block_erase = spi_block_erase_60,
6452 }, {
6453 .eraseblocks = { {8 * 1024 * 1024, 1} },
6454 .block_erase = spi_block_erase_c7,
6455 }
6456 },
Alan Green78d8f702019-08-06 16:46:42 +10006457 .printlock = spi_prettyprint_status_register_bp4_srwd,
6458 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006459 .write = spi_chip_write_256,
Alan Green78d8f702019-08-06 16:46:42 +10006460 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6461 .voltage = {1695, 1950},
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006462 },
6463
6464 {
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006465 .vendor = "GigaDevice",
6466 .name = "GD25LQ80",
6467 .bustype = BUS_SPI,
6468 .manufacture_id = GIGADEVICE_ID,
6469 .model_id = GIGADEVICE_GD25LQ80,
6470 .total_size = 1024,
6471 .page_size = 256,
6472 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6473 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6474 .tested = TEST_UNTESTED,
6475 .probe = probe_spi_rdid,
6476 .probe_timing = TIMING_ZERO,
6477 .block_erasers =
6478 {
6479 {
6480 .eraseblocks = { {4 * 1024, 256} },
6481 .block_erase = spi_block_erase_20,
6482 }, {
6483 .eraseblocks = { {32 * 1024, 32} },
6484 .block_erase = spi_block_erase_52,
6485 }, {
6486 .eraseblocks = { {64 * 1024, 16} },
6487 .block_erase = spi_block_erase_d8,
6488 }, {
6489 .eraseblocks = { {1 * 1024 * 1024, 1} },
6490 .block_erase = spi_block_erase_60,
6491 }, {
6492 .eraseblocks = { {1 * 1024 * 1024, 1} },
6493 .block_erase = spi_block_erase_c7,
6494 }
6495 },
6496 .printlock = spi_prettyprint_status_register_bp4_srwd,
6497 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6498 .write = spi_chip_write_256,
6499 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6500 .voltage = {1695, 1950},
6501 },
6502
6503 {
6504 .vendor = "GigaDevice",
6505 .name = "GD25Q10",
6506 .bustype = BUS_SPI,
6507 .manufacture_id = GIGADEVICE_ID,
6508 .model_id = GIGADEVICE_GD25Q10,
6509 .total_size = 128,
6510 .page_size = 256,
6511 .feature_bits = FEATURE_WRSR_WREN,
6512 .tested = TEST_UNTESTED,
6513 .probe = probe_spi_rdid,
6514 .probe_timing = TIMING_ZERO,
6515 .block_erasers =
6516 {
6517 {
6518 .eraseblocks = { {4 * 1024, 32} },
6519 .block_erase = spi_block_erase_20,
6520 }, {
6521 .eraseblocks = { {32 * 1024, 4} },
6522 .block_erase = spi_block_erase_52,
6523 }, {
6524 .eraseblocks = { {64 * 1024, 2} },
6525 .block_erase = spi_block_erase_d8,
6526 }, {
6527 .eraseblocks = { {128 * 1024, 1} },
6528 .block_erase = spi_block_erase_60,
6529 }, {
6530 .eraseblocks = { {128 * 1024, 1} },
6531 .block_erase = spi_block_erase_c7,
6532 }
6533 },
6534 .printlock = spi_prettyprint_status_register_bp4_srwd,
6535 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6536 .write = spi_chip_write_256,
6537 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6538 .voltage = {2700, 3600},
6539 },
6540
6541 {
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006542 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06006543 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006544 .bustype = BUS_SPI,
6545 .manufacture_id = GIGADEVICE_ID,
6546 .model_id = GIGADEVICE_GD25Q128,
6547 .total_size = 16384,
6548 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006549 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6550 /* QPI: enable 0x38, disable 0xFF */
6551 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +10006552 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006553 .probe = probe_spi_rdid,
6554 .probe_timing = TIMING_ZERO,
6555 .block_erasers =
6556 {
6557 {
6558 .eraseblocks = { {4 * 1024, 4096} },
6559 .block_erase = spi_block_erase_20,
6560 }, {
6561 .eraseblocks = { {32 * 1024, 512} },
6562 .block_erase = spi_block_erase_52,
6563 }, {
6564 .eraseblocks = { {64 * 1024, 256} },
6565 .block_erase = spi_block_erase_d8,
6566 }, {
6567 .eraseblocks = { {16 * 1024 * 1024, 1} },
6568 .block_erase = spi_block_erase_60,
6569 }, {
6570 .eraseblocks = { {16 * 1024 * 1024, 1} },
6571 .block_erase = spi_block_erase_c7,
6572 }
6573 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006574 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
Alan Green6b94e402019-09-16 16:30:59 +10006575 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolai Artemiev860d4912021-02-16 15:12:53 +11006576 .unlock = spi_disable_blockprotect_bp4_srwd,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006577 .write = spi_chip_write_256,
Edward O'Callaghan44301822020-09-19 12:12:12 +10006578 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green5dc48da2019-08-26 15:35:10 +10006579 .voltage = {2700, 3600},
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006580 },
6581
6582 {
Duncan Laurie0c383552019-03-16 12:35:16 -07006583 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006584 .name = "GD25Q16(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006585 .bustype = BUS_SPI,
6586 .manufacture_id = GIGADEVICE_ID,
6587 .model_id = GIGADEVICE_GD25Q16,
6588 .total_size = 2048,
6589 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006590 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006591 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green6b94e402019-09-16 16:30:59 +10006592 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006593 .probe = probe_spi_rdid,
6594 .probe_timing = TIMING_ZERO,
6595 .block_erasers =
6596 {
6597 {
6598 .eraseblocks = { {4 * 1024, 512} },
6599 .block_erase = spi_block_erase_20,
6600 }, {
6601 .eraseblocks = { {32 * 1024, 64} },
6602 .block_erase = spi_block_erase_52,
6603 }, {
6604 .eraseblocks = { {64 * 1024, 32} },
6605 .block_erase = spi_block_erase_d8,
6606 }, {
6607 .eraseblocks = { {2 * 1024 * 1024, 1} },
6608 .block_erase = spi_block_erase_60,
6609 }, {
6610 .eraseblocks = { {2 * 1024 * 1024, 1} },
6611 .block_erase = spi_block_erase_c7,
6612 }
6613 },
Alan Green6b94e402019-09-16 16:30:59 +10006614 .printlock = spi_prettyprint_status_register_bp4_srwd,
6615 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006616 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006617 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10006618 .voltage = {2700, 3600},
6619 },
6620
6621 {
6622 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006623 .name = "GD25Q20(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006624 .bustype = BUS_SPI,
6625 .manufacture_id = GIGADEVICE_ID,
6626 .model_id = GIGADEVICE_GD25Q20,
6627 .total_size = 256,
6628 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006629 .feature_bits = FEATURE_WRSR_WREN,
Alan Green6b94e402019-09-16 16:30:59 +10006630 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006631 .probe = probe_spi_rdid,
6632 .probe_timing = TIMING_ZERO,
6633 .block_erasers =
6634 {
6635 {
6636 .eraseblocks = { {4 * 1024, 64} },
6637 .block_erase = spi_block_erase_20,
6638 }, {
6639 .eraseblocks = { {32 * 1024, 8} },
6640 .block_erase = spi_block_erase_52,
6641 }, {
6642 .eraseblocks = { {64 * 1024, 4} },
6643 .block_erase = spi_block_erase_d8,
6644 }, {
6645 .eraseblocks = { {256 * 1024, 1} },
6646 .block_erase = spi_block_erase_60,
6647 }, {
6648 .eraseblocks = { {256 * 1024, 1} },
6649 .block_erase = spi_block_erase_c7,
6650 }
6651 },
Alan Green6b94e402019-09-16 16:30:59 +10006652 .printlock = spi_prettyprint_status_register_bp4_srwd,
6653 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006654 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006655 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10006656 .voltage = {2700, 3600},
6657 },
6658
6659 {
6660 .vendor = "GigaDevice",
Duncan Laurie0c383552019-03-16 12:35:16 -07006661 .name = "GD25Q256D",
6662 .bustype = BUS_SPI,
6663 .manufacture_id = GIGADEVICE_ID,
6664 .model_id = GIGADEVICE_GD25Q256D,
6665 .total_size = 32768,
6666 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006667 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +10006668 .tested = TEST_OK_PREW,
Duncan Laurie0c383552019-03-16 12:35:16 -07006669 .probe = probe_spi_rdid,
6670 .probe_timing = TIMING_ZERO,
6671 .block_erasers =
6672 {
6673 {
6674 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006675 .block_erase = spi_block_erase_21,
6676 }, {
6677 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006678 .block_erase = spi_block_erase_20,
Duncan Laurie0c383552019-03-16 12:35:16 -07006679 }, {
6680 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006681 .block_erase = spi_block_erase_5c,
6682 }, {
6683 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006684 .block_erase = spi_block_erase_52,
Duncan Laurie0c383552019-03-16 12:35:16 -07006685 }, {
6686 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006687 .block_erase = spi_block_erase_dc,
6688 }, {
6689 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006690 .block_erase = spi_block_erase_d8,
Duncan Laurie0c383552019-03-16 12:35:16 -07006691 }, {
6692 .eraseblocks = { {32 * 1024 * 1024, 1} },
6693 .block_erase = spi_block_erase_60,
6694 }, {
6695 .eraseblocks = { {32 * 1024 * 1024, 1} },
6696 .block_erase = spi_block_erase_c7,
6697 }
6698 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10006699 .printlock = spi_prettyprint_status_register_bp3_srwd,
Duncan Laurie0c383552019-03-16 12:35:16 -07006700 .unlock = spi_disable_blockprotect,
6701 .write = spi_chip_write_256,
6702 .read = spi_chip_read,
6703 .voltage = {2700, 3600},
Duncan Laurie0c383552019-03-16 12:35:16 -07006704 },
6705
6706 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07006707 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006708 .name = "GD25Q32(B)",
Bryan Freed9a0051f2012-05-22 16:06:09 -07006709 .bustype = BUS_SPI,
6710 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006711 .model_id = GIGADEVICE_GD25Q32,
Bryan Freed9a0051f2012-05-22 16:06:09 -07006712 .total_size = 4096,
6713 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006714 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006715 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006716 .tested = TEST_OK_PREW,
Bryan Freed9a0051f2012-05-22 16:06:09 -07006717 .probe = probe_spi_rdid,
6718 .probe_timing = TIMING_ZERO,
6719 .block_erasers =
6720 {
6721 {
6722 .eraseblocks = { {4 * 1024, 1024} },
6723 .block_erase = spi_block_erase_20,
6724 }, {
6725 .eraseblocks = { {32 * 1024, 128} },
6726 .block_erase = spi_block_erase_52,
6727 }, {
6728 .eraseblocks = { {64 * 1024, 64} },
6729 .block_erase = spi_block_erase_d8,
6730 }, {
6731 .eraseblocks = { {4 * 1024 * 1024, 1} },
6732 .block_erase = spi_block_erase_60,
6733 }, {
6734 .eraseblocks = { {4 * 1024 * 1024, 1} },
6735 .block_erase = spi_block_erase_c7,
6736 }
6737 },
Alan Green6b94e402019-09-16 16:30:59 +10006738 .printlock = spi_prettyprint_status_register_bp4_srwd,
6739 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Bryan Freed9a0051f2012-05-22 16:06:09 -07006740 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006741 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10006742 .voltage = {2700, 3600},
Bryan Freed9a0051f2012-05-22 16:06:09 -07006743 },
6744
6745 {
Alan Green753a38e2019-06-07 14:44:32 +10006746 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006747 .name = "GD25Q40(B)",
Alan Green753a38e2019-06-07 14:44:32 +10006748 .bustype = BUS_SPI,
6749 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006750 .model_id = GIGADEVICE_GD25Q40,
6751 .total_size = 512,
6752 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006753 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10006754 .tested = TEST_UNTESTED,
6755 .probe = probe_spi_rdid,
6756 .probe_timing = TIMING_ZERO,
6757 .block_erasers =
6758 {
6759 {
6760 .eraseblocks = { {4 * 1024, 128} },
6761 .block_erase = spi_block_erase_20,
6762 }, {
6763 .eraseblocks = { {32 * 1024, 16} },
6764 .block_erase = spi_block_erase_52,
6765 }, {
6766 .eraseblocks = { {64 * 1024, 8} },
6767 .block_erase = spi_block_erase_d8,
6768 }, {
6769 .eraseblocks = { {512 * 1024, 1} },
6770 .block_erase = spi_block_erase_60,
6771 }, {
6772 .eraseblocks = { {512 * 1024, 1} },
6773 .block_erase = spi_block_erase_c7,
6774 }
6775 },
Alan Green6b94e402019-09-16 16:30:59 +10006776 .printlock = spi_prettyprint_status_register_bp4_srwd,
6777 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006778 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006779 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10006780 .voltage = {2700, 3600},
6781 },
6782
6783 {
6784 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006785 .name = "GD25Q512",
6786 .bustype = BUS_SPI,
6787 .manufacture_id = GIGADEVICE_ID,
6788 .model_id = GIGADEVICE_GD25Q512,
6789 .total_size = 64,
6790 .page_size = 256,
6791 .feature_bits = FEATURE_WRSR_WREN,
6792 .tested = TEST_OK_PREW,
6793 .probe = probe_spi_rdid,
6794 .probe_timing = TIMING_ZERO,
6795 .block_erasers =
6796 {
6797 {
6798 .eraseblocks = { {4 * 1024, 16} },
6799 .block_erase = spi_block_erase_20,
6800 }, {
6801 .eraseblocks = { {32 * 1024, 2} },
6802 .block_erase = spi_block_erase_52,
6803 }, {
6804 .eraseblocks = { {64 * 1024, 1} },
6805 .block_erase = spi_block_erase_60,
6806 }, {
6807 .eraseblocks = { {64 * 1024, 1} },
6808 .block_erase = spi_block_erase_c7,
6809 }
6810 },
6811 .printlock = spi_prettyprint_status_register_bp4_srwd,
6812 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6813 .write = spi_chip_write_256,
6814 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6815 .voltage = {2700, 3600},
6816 },
6817
6818 {
6819 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006820 .name = "GD25Q64(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006821 .bustype = BUS_SPI,
6822 .manufacture_id = GIGADEVICE_ID,
6823 .model_id = GIGADEVICE_GD25Q64,
Alan Green753a38e2019-06-07 14:44:32 +10006824 .total_size = 8192,
6825 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006826 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006827 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006828 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10006829 .probe = probe_spi_rdid,
6830 .probe_timing = TIMING_ZERO,
6831 .block_erasers =
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006832 {
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006833 {
Alan Green753a38e2019-06-07 14:44:32 +10006834 .eraseblocks = { {4 * 1024, 2048} },
6835 .block_erase = spi_block_erase_20,
6836 }, {
6837 .eraseblocks = { {32 * 1024, 256} },
6838 .block_erase = spi_block_erase_52,
6839 }, {
6840 .eraseblocks = { {64 * 1024, 128} },
6841 .block_erase = spi_block_erase_d8,
6842 }, {
6843 .eraseblocks = { {8 * 1024 * 1024, 1} },
6844 .block_erase = spi_block_erase_60,
6845 }, {
6846 .eraseblocks = { {8 * 1024 * 1024, 1} },
6847 .block_erase = spi_block_erase_c7,
6848 }
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006849 },
Alan Green6b94e402019-09-16 16:30:59 +10006850 .printlock = spi_prettyprint_status_register_bp4_srwd,
6851 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Green753a38e2019-06-07 14:44:32 +10006852 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006853 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green5dc48da2019-08-26 15:35:10 +10006854 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +10006855 },
6856
6857 {
6858 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006859 .name = "GD25Q80(B)",
Alan Green753a38e2019-06-07 14:44:32 +10006860 .bustype = BUS_SPI,
6861 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006862 .model_id = GIGADEVICE_GD25Q80,
6863 .total_size = 1024,
Alan Green753a38e2019-06-07 14:44:32 +10006864 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10006865 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006866 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006867 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10006868 .probe = probe_spi_rdid,
6869 .probe_timing = TIMING_ZERO,
6870 .block_erasers =
6871 {
6872 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006873 .eraseblocks = { {4 * 1024, 256} },
Alan Green753a38e2019-06-07 14:44:32 +10006874 .block_erase = spi_block_erase_20,
6875 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006876 .eraseblocks = { {32 * 1024, 32} },
Alan Green753a38e2019-06-07 14:44:32 +10006877 .block_erase = spi_block_erase_52,
6878 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006879 .eraseblocks = { {64 * 1024, 16} },
Alan Green753a38e2019-06-07 14:44:32 +10006880 .block_erase = spi_block_erase_d8,
6881 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006882 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10006883 .block_erase = spi_block_erase_60,
6884 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006885 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10006886 .block_erase = spi_block_erase_c7,
6887 }
6888 },
Alan Green6b94e402019-09-16 16:30:59 +10006889 .printlock = spi_prettyprint_status_register_bp4_srwd,
6890 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Green753a38e2019-06-07 14:44:32 +10006891 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10006892 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10006893 .voltage = {2700, 3600},
hailfingerc6950ad2010-06-21 16:12:22 +00006894 },
6895
6896 {
Dino Lic228b322020-03-26 14:26:54 +08006897 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006898 .name = "GD25T80",
6899 .bustype = BUS_SPI,
6900 .manufacture_id = GIGADEVICE_ID,
6901 .model_id = GIGADEVICE_GD25T80,
6902 .total_size = 1024,
6903 .page_size = 256,
6904 /* OTP: 256B total; enter 0x3A */
6905 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6906 .tested = TEST_UNTESTED,
6907 .probe = probe_spi_rdid,
6908 .probe_timing = TIMING_ZERO,
6909 .block_erasers =
6910 {
6911 {
6912 .eraseblocks = { {4 * 1024, 256} },
6913 .block_erase = spi_block_erase_20,
6914 }, {
6915 .eraseblocks = { {64 * 1024, 16} },
6916 .block_erase = spi_block_erase_52,
6917 }, {
6918 .eraseblocks = { {64 * 1024, 16} },
6919 .block_erase = spi_block_erase_d8,
6920 }, {
6921 .eraseblocks = { {1024 * 1024, 1} },
6922 .block_erase = spi_block_erase_60,
6923 }, {
6924 .eraseblocks = { {1024 * 1024, 1} },
6925 .block_erase = spi_block_erase_c7,
6926 }
6927 },
6928 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
6929 .unlock = spi_disable_blockprotect,
6930 .write = spi_chip_write_256,
6931 .read = spi_chip_read,
6932 .voltage = {2700, 3600},
6933 },
6934
6935 {
6936 .vendor = "GigaDevice",
6937 .name = "GD25VQ16C",
6938 .bustype = BUS_SPI,
6939 .manufacture_id = GIGADEVICE_ID,
6940 .model_id = GIGADEVICE_GD25VQ16C,
6941 .total_size = 2 * 1024,
6942 .page_size = 256,
6943 /* Supports SFDP */
6944 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6945 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6946 .tested = TEST_UNTESTED,
6947 .probe = probe_spi_rdid,
6948 .probe_timing = TIMING_ZERO,
6949 .block_erasers =
6950 {
6951 {
6952 .eraseblocks = { { 4 * 1024, 512} },
6953 .block_erase = spi_block_erase_20,
6954 }, {
6955 .eraseblocks = { { 32 * 1024, 64} },
6956 .block_erase = spi_block_erase_52,
6957 }, {
6958 .eraseblocks = { { 64 * 1024, 32} },
6959 .block_erase = spi_block_erase_d8,
6960 }, {
6961 .eraseblocks = { {2 * 1024 * 1024, 1} },
6962 .block_erase = spi_block_erase_60,
6963 }, {
6964 .eraseblocks = { {2 * 1024 * 1024, 1} },
6965 .block_erase = spi_block_erase_c7,
6966 }
6967 },
6968 .printlock = spi_prettyprint_status_register_bp4_srwd,
6969 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6970 .write = spi_chip_write_256,
6971 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6972 .voltage = {2300, 3600},
6973 },
6974
6975 {
6976 .vendor = "GigaDevice",
6977 .name = "GD25VQ21B",
6978 .bustype = BUS_SPI,
6979 .manufacture_id = GIGADEVICE_ID,
6980 .model_id = GIGADEVICE_GD25VQ21B,
6981 .total_size = 256,
6982 .page_size = 256,
6983 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6984 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6985 .tested = TEST_UNTESTED,
6986 .probe = probe_spi_rdid,
6987 .probe_timing = TIMING_ZERO,
6988 .block_erasers =
6989 {
6990 {
6991 .eraseblocks = { { 4 * 1024, 64} },
6992 .block_erase = spi_block_erase_20,
6993 }, {
6994 .eraseblocks = { { 32 * 1024, 8} },
6995 .block_erase = spi_block_erase_52,
6996 }, {
6997 .eraseblocks = { { 64 * 1024, 4} },
6998 .block_erase = spi_block_erase_d8,
6999 }, {
7000 .eraseblocks = { {256 * 1024, 1} },
7001 .block_erase = spi_block_erase_60,
7002 }, {
7003 .eraseblocks = { {256 * 1024, 1} },
7004 .block_erase = spi_block_erase_c7,
7005 }
7006 },
7007 .printlock = spi_prettyprint_status_register_bp4_srwd,
7008 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7009 .write = spi_chip_write_256,
7010 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7011 .voltage = {2300, 3600},
7012 },
7013
7014 {
7015 .vendor = "GigaDevice",
7016 .name = "GD25VQ40C",
7017 .bustype = BUS_SPI,
7018 .manufacture_id = GIGADEVICE_ID,
7019 .model_id = GIGADEVICE_GD25VQ41B,
7020 .total_size = 512,
7021 .page_size = 256,
7022 /* Supports SFDP */
7023 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7024 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7025 .tested = TEST_UNTESTED,
7026 .probe = probe_spi_rdid,
7027 .probe_timing = TIMING_ZERO,
7028 .block_erasers =
7029 {
7030 {
7031 .eraseblocks = { { 4 * 1024, 128} },
7032 .block_erase = spi_block_erase_20,
7033 }, {
7034 .eraseblocks = { { 32 * 1024, 16} },
7035 .block_erase = spi_block_erase_52,
7036 }, {
7037 .eraseblocks = { { 64 * 1024, 8} },
7038 .block_erase = spi_block_erase_d8,
7039 }, {
7040 .eraseblocks = { {512 * 1024, 1} },
7041 .block_erase = spi_block_erase_60,
7042 }, {
7043 .eraseblocks = { {512 * 1024, 1} },
7044 .block_erase = spi_block_erase_c7,
7045 }
7046 },
7047 .printlock = spi_prettyprint_status_register_bp4_srwd,
7048 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7049 .write = spi_chip_write_256,
7050 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7051 .voltage = {2300, 3600},
7052 },
7053
7054 {
7055 .vendor = "GigaDevice",
Nikolai Artemiev7744f962020-08-31 17:41:20 +10007056 .name = "GD25VQ41B",
7057 .bustype = BUS_SPI,
7058 .manufacture_id = GIGADEVICE_ID,
7059 .model_id = GIGADEVICE_GD25VQ41B,
7060 .total_size = 512,
7061 .page_size = 256,
7062 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
7063 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7064 .tested = TEST_OK_PREW,
7065 .probe = probe_spi_rdid,
7066 .probe_timing = TIMING_ZERO,
7067 .block_erasers =
7068 {
7069 {
7070 .eraseblocks = { { 4 * 1024, 128} },
7071 .block_erase = spi_block_erase_20,
7072 }, {
7073 .eraseblocks = { { 32 * 1024, 16} },
7074 .block_erase = spi_block_erase_52,
7075 }, {
7076 .eraseblocks = { { 64 * 1024, 8} },
7077 .block_erase = spi_block_erase_d8,
7078 }, {
7079 .eraseblocks = { {512 * 1024, 1} },
7080 .block_erase = spi_block_erase_60,
7081 }, {
7082 .eraseblocks = { {512 * 1024, 1} },
7083 .block_erase = spi_block_erase_c7,
7084 }
7085 },
7086 .printlock = spi_prettyprint_status_register_bp4_srwd,
7087 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7088 .write = spi_chip_write_256,
7089 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7090 .voltage = {2300, 3600},
7091 },
7092
7093 {
7094 .vendor = "GigaDevice",
7095 .name = "GD25VQ80C",
7096 .bustype = BUS_SPI,
7097 .manufacture_id = GIGADEVICE_ID,
7098 .model_id = GIGADEVICE_GD25VQ80C,
7099 .total_size = 1024,
7100 .page_size = 256,
7101 /* Supports SFDP */
7102 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
7103 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7104 .tested = TEST_UNTESTED,
7105 .probe = probe_spi_rdid,
7106 .probe_timing = TIMING_ZERO,
7107 .block_erasers =
7108 {
7109 {
7110 .eraseblocks = { { 4 * 1024, 256} },
7111 .block_erase = spi_block_erase_20,
7112 }, {
7113 .eraseblocks = { { 32 * 1024, 32} },
7114 .block_erase = spi_block_erase_52,
7115 }, {
7116 .eraseblocks = { { 64 * 1024, 16} },
7117 .block_erase = spi_block_erase_d8,
7118 }, {
7119 .eraseblocks = { {1024 * 1024, 1} },
7120 .block_erase = spi_block_erase_60,
7121 }, {
7122 .eraseblocks = { {1024 * 1024, 1} },
7123 .block_erase = spi_block_erase_c7,
7124 }
7125 },
7126 .printlock = spi_prettyprint_status_register_bp4_srwd,
7127 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7128 .write = spi_chip_write_256,
7129 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
7130 .voltage = {2300, 3600},
7131 },
7132
7133 {
7134 .vendor = "GigaDevice",
Dino Lic228b322020-03-26 14:26:54 +08007135 .name = "GD25WQ80E",
7136 .bustype = BUS_SPI,
7137 .manufacture_id = GIGADEVICE_ID,
7138 .model_id = GIGADEVICE_GD25WQ80E,
7139 .total_size = 1024,
7140 .page_size = 256,
7141 .feature_bits = FEATURE_WRSR_WREN,
7142 .tested = TEST_OK_PREW,
7143 .probe = probe_spi_rdid,
7144 .probe_timing = TIMING_ZERO,
7145 .block_erasers =
7146 {
7147 {
7148 .eraseblocks = { {4 * 1024, 256} },
7149 .block_erase = spi_block_erase_20,
7150 }, {
7151 .eraseblocks = { {32 * 1024, 32} },
7152 .block_erase = spi_block_erase_52,
7153 }, {
7154 .eraseblocks = { {64 * 1024, 16} },
7155 .block_erase = spi_block_erase_d8,
7156 }, {
7157 .eraseblocks = { {1 * 1024 * 1024, 1} },
7158 .block_erase = spi_block_erase_60,
7159 }, {
7160 .eraseblocks = { {1 * 1024 * 1024, 1} },
7161 .block_erase = spi_block_erase_c7,
7162 }
7163 },
7164 .printlock = spi_prettyprint_status_register_bp4_srwd,
7165 .unlock = spi_disable_blockprotect_bp4_srwd,
7166 .write = spi_chip_write_256,
7167 .read = spi_chip_read,
7168 .voltage = {1650, 3600},
7169 },
7170
7171 {
hailfingerc6950ad2010-06-21 16:12:22 +00007172 .vendor = "Hyundai",
7173 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00007174 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00007175 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00007176 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00007177 .total_size = 256,
7178 .page_size = 256 * 1024,
7179 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
7180 .tested = TEST_UNTESTED,
7181 .probe = probe_jedec,
7182 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7183 .block_erasers =
7184 {
7185 {
7186 .eraseblocks = {
7187 {16 * 1024, 1},
7188 {8 * 1024, 2},
7189 {32 * 1024, 1},
7190 {64 * 1024, 3},
7191 },
7192 .block_erase = erase_sector_jedec,
7193 }, {
7194 .eraseblocks = { {256 * 1024, 1} },
7195 .block_erase = erase_chip_block_jedec,
7196 },
7197 },
7198 .write = write_jedec_1,
7199 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00007200 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00007201 },
7202
7203 {
mhme8e87912010-09-16 00:51:51 +00007204 .vendor = "Hyundai",
Alan Greend76dc1f2019-06-26 15:38:19 +10007205 .name = "HY29F002T",
7206 .bustype = BUS_PARALLEL,
7207 .manufacture_id = HYUNDAI_ID,
7208 .model_id = HYUNDAI_HY29F002T,
7209 .total_size = 256,
7210 .page_size = 256 * 1024,
7211 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
7212 .tested = TEST_OK_PRE,
7213 .probe = probe_jedec,
7214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7215 .block_erasers =
7216 {
7217 {
7218 .eraseblocks = {
7219 {64 * 1024, 3},
7220 {32 * 1024, 1},
7221 {8 * 1024, 2},
7222 {16 * 1024, 1},
7223 },
7224 .block_erase = erase_sector_jedec,
7225 }, {
7226 .eraseblocks = { {256 * 1024, 1} },
7227 .block_erase = erase_chip_block_jedec,
7228 },
7229 },
7230 .write = write_jedec_1,
7231 .read = read_memmapped,
7232 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
7233 },
7234
7235 {
7236 .vendor = "Hyundai",
mhme8e87912010-09-16 00:51:51 +00007237 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00007238 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00007239 .manufacture_id = HYUNDAI_ID,
7240 .model_id = HYUNDAI_HY29F040A,
7241 .total_size = 512,
7242 .page_size = 64 * 1024,
7243 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7244 .tested = TEST_UNTESTED,
7245 .probe = probe_jedec,
7246 .probe_timing = TIMING_ZERO,
7247 .block_erasers =
7248 {
7249 {
7250 .eraseblocks = { {64 * 1024, 8} },
7251 .block_erase = erase_sector_jedec,
7252 }, {
7253 .eraseblocks = { {512 * 1024, 1} },
7254 .block_erase = erase_chip_block_jedec,
7255 },
7256 },
7257 .write = write_jedec_1,
7258 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00007259 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00007260 },
7261
7262 {
Nikolai Artemiev7744f962020-08-31 17:41:20 +10007263 .vendor = "ISSI",
7264 .name = "IS25LP064",
7265 .bustype = BUS_SPI,
7266 .manufacture_id = ISSI_ID_SPI,
7267 .model_id = ISSI_IS25LP064,
7268 .total_size = 8192,
7269 .page_size = 256,
7270 /* OTP: 1024B total; read 0x48; write 0x42 */
7271 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7272 .tested = TEST_UNTESTED,
7273 .probe = probe_spi_rdid,
7274 .probe_timing = TIMING_ZERO,
7275 .block_erasers =
7276 {
7277 {
7278 .eraseblocks = { {4 * 1024, 2048} },
7279 .block_erase = spi_block_erase_20,
7280 }, {
7281 .eraseblocks = { {4 * 1024, 2048} },
7282 .block_erase = spi_block_erase_d7,
7283 }, {
7284 .eraseblocks = { {32 * 1024, 256} },
7285 .block_erase = spi_block_erase_52,
7286 }, {
7287 .eraseblocks = { {64 * 1024, 128} },
7288 .block_erase = spi_block_erase_d8,
7289 }, {
7290 .eraseblocks = { {8 * 1024 * 1024, 1} },
7291 .block_erase = spi_block_erase_60,
7292 }, {
7293 .eraseblocks = { {8 * 1024 * 1024, 1} },
7294 .block_erase = spi_block_erase_c7,
7295 }
7296 },
7297 .unlock = spi_disable_blockprotect,
7298 .write = spi_chip_write_256,
7299 .read = spi_chip_read,
7300 .voltage = {2300, 3600},
7301 },
7302
7303 {
7304 .vendor = "ISSI",
7305 .name = "IS25LP128",
7306 .bustype = BUS_SPI,
7307 .manufacture_id = ISSI_ID_SPI,
7308 .model_id = ISSI_IS25LP128,
7309 .total_size = 16384,
7310 .page_size = 256,
7311 /* OTP: 1024B total; read 0x48; write 0x42 */
7312 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7313 .tested = TEST_OK_PREW,
7314 .probe = probe_spi_rdid,
7315 .probe_timing = TIMING_ZERO,
7316 .block_erasers =
7317 {
7318 {
7319 .eraseblocks = { {4 * 1024, 4096} },
7320 .block_erase = spi_block_erase_20,
7321 }, {
7322 .eraseblocks = { {4 * 1024, 4096} },
7323 .block_erase = spi_block_erase_d7,
7324 }, {
7325 .eraseblocks = { {32 * 1024, 512} },
7326 .block_erase = spi_block_erase_52,
7327 }, {
7328 .eraseblocks = { {64 * 1024, 256} },
7329 .block_erase = spi_block_erase_d8,
7330 }, {
7331 .eraseblocks = { {16 * 1024 * 1024, 1} },
7332 .block_erase = spi_block_erase_60,
7333 }, {
7334 .eraseblocks = { {16 * 1024 * 1024, 1} },
7335 .block_erase = spi_block_erase_c7,
7336 }
7337 },
7338 .unlock = spi_disable_blockprotect,
7339 .write = spi_chip_write_256,
7340 .read = spi_chip_read,
7341 .voltage = {2300, 3600},
7342 },
7343
7344 {
7345 .vendor = "ISSI",
7346 .name = "IS25LP256",
7347 .bustype = BUS_SPI,
7348 .manufacture_id = ISSI_ID_SPI,
7349 .model_id = ISSI_IS25LP256,
7350 .total_size = 32768,
7351 .page_size = 256,
7352 /* supports SFDP */
7353 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7354 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7355 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7356 .tested = TEST_OK_PREW,
7357 .probe = probe_spi_rdid,
7358 .probe_timing = TIMING_ZERO,
7359 .block_erasers =
7360 {
7361 {
7362 .eraseblocks = { {4 * 1024, 8192} },
7363 .block_erase = spi_block_erase_21,
7364 }, {
7365 .eraseblocks = { {4 * 1024, 8192} },
7366 .block_erase = spi_block_erase_20,
7367 /* could also use spi_block_erase_d7 */
7368 }, {
7369 .eraseblocks = { {32 * 1024, 1024} },
7370 .block_erase = spi_block_erase_5c,
7371 }, {
7372 .eraseblocks = { {32 * 1024, 1024} },
7373 .block_erase = spi_block_erase_52,
7374 }, {
7375 .eraseblocks = { {64 * 1024, 512} },
7376 .block_erase = spi_block_erase_dc,
7377 }, {
7378 .eraseblocks = { {64 * 1024, 512} },
7379 .block_erase = spi_block_erase_d8,
7380 }, {
7381 .eraseblocks = { {32 * 1024 * 1024, 1} },
7382 .block_erase = spi_block_erase_60,
7383 }, {
7384 .eraseblocks = { {32 * 1024 * 1024, 1} },
7385 .block_erase = spi_block_erase_c7,
7386 }
7387 },
7388 .unlock = spi_disable_blockprotect,
7389 .write = spi_chip_write_256,
7390 .read = spi_chip_read,
7391 .voltage = {2300, 3600},
7392 },
7393
7394 {
7395 .vendor = "ISSI",
7396 .name = "IS25WP032",
7397 .bustype = BUS_SPI,
7398 .manufacture_id = ISSI_ID_SPI,
7399 .model_id = ISSI_IS25WP032,
7400 .total_size = 4096,
7401 .page_size = 256,
7402 /* OTP: 1024B total; read 0x48; write 0x42 */
7403 /* QPI enable 0x35, disable 0xF5 */
7404 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7405 .tested = TEST_UNTESTED,
7406 .probe = probe_spi_rdid,
7407 .probe_timing = TIMING_ZERO,
7408 .block_erasers =
7409 {
7410 {
7411 .eraseblocks = { {4 * 1024, 1024} },
7412 .block_erase = spi_block_erase_20,
7413 }, {
7414 .eraseblocks = { {4 * 1024, 1024} },
7415 .block_erase = spi_block_erase_d7,
7416 }, {
7417 .eraseblocks = { {32 * 1024, 128} },
7418 .block_erase = spi_block_erase_52,
7419 }, {
7420 .eraseblocks = { {64 * 1024, 64} },
7421 .block_erase = spi_block_erase_d8,
7422 }, {
7423 .eraseblocks = { {4 * 1024 * 1024, 1} },
7424 .block_erase = spi_block_erase_60,
7425 }, {
7426 .eraseblocks = { {4 * 1024 * 1024, 1} },
7427 .block_erase = spi_block_erase_c7,
7428 }
7429 },
7430 .unlock = spi_disable_blockprotect,
7431 .write = spi_chip_write_256,
7432 .read = spi_chip_read,
7433 .voltage = {1650, 1950},
7434 },
7435
7436 {
7437 .vendor = "ISSI",
7438 .name = "IS25WP064",
7439 .bustype = BUS_SPI,
7440 .manufacture_id = ISSI_ID_SPI,
7441 .model_id = ISSI_IS25WP064,
7442 .total_size = 8192,
7443 .page_size = 256,
7444 /* OTP: 1024B total; read 0x48; write 0x42 */
7445 /* QPI enable 0x35, disable 0xF5 */
7446 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7447 .tested = TEST_OK_PREW,
7448 .probe = probe_spi_rdid,
7449 .probe_timing = TIMING_ZERO,
7450 .block_erasers =
7451 {
7452 {
7453 .eraseblocks = { {4 * 1024, 2048} },
7454 .block_erase = spi_block_erase_20,
7455 }, {
7456 .eraseblocks = { {4 * 1024, 2048} },
7457 .block_erase = spi_block_erase_d7,
7458 }, {
7459 .eraseblocks = { {32 * 1024, 256} },
7460 .block_erase = spi_block_erase_52,
7461 }, {
7462 .eraseblocks = { {64 * 1024, 128} },
7463 .block_erase = spi_block_erase_d8,
7464 }, {
7465 .eraseblocks = { {8 * 1024 * 1024, 1} },
7466 .block_erase = spi_block_erase_60,
7467 }, {
7468 .eraseblocks = { {8 * 1024 * 1024, 1} },
7469 .block_erase = spi_block_erase_c7,
7470 }
7471 },
7472 .unlock = spi_disable_blockprotect,
7473 .write = spi_chip_write_256,
7474 .read = spi_chip_read,
7475 .voltage = {1650, 1950},
7476 },
7477
7478 {
7479 .vendor = "ISSI",
7480 .name = "IS25WP128",
7481 .bustype = BUS_SPI,
7482 .manufacture_id = ISSI_ID_SPI,
7483 .model_id = ISSI_IS25WP128,
7484 .total_size = 16384,
7485 .page_size = 256,
7486 /* OTP: 1024B total; read 0x48; write 0x42 */
7487 /* QPI enable 0x35, disable 0xF5 */
7488 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7489 .tested = TEST_OK_PREW,
7490 .probe = probe_spi_rdid,
7491 .probe_timing = TIMING_ZERO,
7492 .block_erasers =
7493 {
7494 {
7495 .eraseblocks = { {4 * 1024, 4096} },
7496 .block_erase = spi_block_erase_20,
7497 }, {
7498 .eraseblocks = { {4 * 1024, 4096} },
7499 .block_erase = spi_block_erase_d7,
7500 }, {
7501 .eraseblocks = { {32 * 1024, 512} },
7502 .block_erase = spi_block_erase_52,
7503 }, {
7504 .eraseblocks = { {64 * 1024, 256} },
7505 .block_erase = spi_block_erase_d8,
7506 }, {
7507 .eraseblocks = { {16 * 1024 * 1024, 1} },
7508 .block_erase = spi_block_erase_60,
7509 }, {
7510 .eraseblocks = { {16 * 1024 * 1024, 1} },
7511 .block_erase = spi_block_erase_c7,
7512 }
7513 },
7514 .unlock = spi_disable_blockprotect,
7515 .write = spi_chip_write_256,
7516 .read = spi_chip_read,
7517 .voltage = {1650, 1950},
7518 },
7519
7520 {
7521 .vendor = "ISSI",
7522 .name = "IS25WP256",
7523 .bustype = BUS_SPI,
7524 .manufacture_id = ISSI_ID_SPI,
7525 .model_id = ISSI_IS25WP256,
7526 .total_size = 32768,
7527 .page_size = 256,
7528 /* supports SFDP */
7529 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7530 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7531 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7532 .tested = TEST_OK_PREW,
7533 .probe = probe_spi_rdid,
7534 .probe_timing = TIMING_ZERO,
7535 .block_erasers =
7536 {
7537 {
7538 .eraseblocks = { {4 * 1024, 8192} },
7539 .block_erase = spi_block_erase_21,
7540 }, {
7541 .eraseblocks = { {4 * 1024, 8192} },
7542 .block_erase = spi_block_erase_20,
7543 /* could also use spi_block_erase_d7 */
7544 }, {
7545 .eraseblocks = { {32 * 1024, 1024} },
7546 .block_erase = spi_block_erase_5c,
7547 }, {
7548 .eraseblocks = { {32 * 1024, 1024} },
7549 .block_erase = spi_block_erase_52,
7550 }, {
7551 .eraseblocks = { {64 * 1024, 512} },
7552 .block_erase = spi_block_erase_dc,
7553 }, {
7554 .eraseblocks = { {64 * 1024, 512} },
7555 .block_erase = spi_block_erase_d8,
7556 }, {
7557 .eraseblocks = { {32 * 1024 * 1024, 1} },
7558 .block_erase = spi_block_erase_60,
7559 }, {
7560 .eraseblocks = { {32 * 1024 * 1024, 1} },
7561 .block_erase = spi_block_erase_c7,
7562 }
7563 },
7564 .unlock = spi_disable_blockprotect,
7565 .write = spi_chip_write_256,
7566 .read = spi_chip_read,
7567 .voltage = {1650, 1950},
7568 },
7569
7570 {
7571 .vendor = "ISSI",
7572 .name = "IS29GL064B",
7573 .bustype = BUS_PARALLEL,
7574 .manufacture_id = ISSI_ID,
7575 .model_id = ISSI_PMC_IS29GL064B,
7576 .total_size = 8192,
7577 .page_size = 128 * 1024, /* actual page size is 16 */
7578 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7579 .tested = TEST_UNTESTED,
7580 .probe = probe_jedec_29gl,
7581 .probe_timing = TIMING_ZERO,
7582 .block_erasers =
7583 {
7584 {
7585 .eraseblocks = {
7586 {8 * 1024, 8},
7587 {64 * 1024, 127},
7588 },
7589 .block_erase = erase_sector_jedec,
7590 }, {
7591 .eraseblocks = { {8 * 1024 * 1024, 1} },
7592 .block_erase = erase_chip_block_jedec,
7593 },
7594 },
7595 .write = write_jedec_1,
7596 .read = read_memmapped,
7597 .voltage = {2700, 3600},
7598 },
7599
7600 {
Nikolai Artemievfbefd752020-08-31 17:41:56 +10007601 .vendor = "ISSI",
7602 .name = "IS29GL064H/L",
7603 .bustype = BUS_PARALLEL,
7604 .manufacture_id = ISSI_ID,
7605 .model_id = ISSI_PMC_IS29GL064HL,
7606 .total_size = 8192,
7607 .page_size = 128 * 1024, /* actual page size is 16 */
7608 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7609 .tested = TEST_UNTESTED,
7610 .probe = probe_jedec_29gl,
7611 .probe_timing = TIMING_ZERO,
7612 .block_erasers =
7613 {
7614 {
7615 .eraseblocks = { {64 * 1024, 128} },
7616 .block_erase = erase_sector_jedec,
7617 }, {
7618 .eraseblocks = { {8 * 1024 * 1024, 1} },
7619 .block_erase = erase_chip_block_jedec,
7620 },
7621 },
7622 .write = write_jedec_1,
7623 .read = read_memmapped,
7624 .voltage = {2700, 3600},
7625 },
7626
7627 {
7628 .vendor = "ISSI",
7629 .name = "IS29GL064T",
7630 .bustype = BUS_PARALLEL,
7631 .manufacture_id = ISSI_ID,
7632 .model_id = ISSI_PMC_IS29GL064T,
7633 .total_size = 8192,
7634 .page_size = 128 * 1024, /* actual page size is 16 */
7635 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7636 .tested = TEST_UNTESTED,
7637 .probe = probe_jedec_29gl,
7638 .probe_timing = TIMING_ZERO,
7639 .block_erasers =
7640 {
7641 {
7642 .eraseblocks = {
7643 {64 * 1024, 127},
7644 {8 * 1024, 8},
7645 },
7646 .block_erase = erase_sector_jedec,
7647 }, {
7648 .eraseblocks = { {8 * 1024 * 1024, 1} },
7649 .block_erase = erase_chip_block_jedec,
7650 },
7651 },
7652 .write = write_jedec_1,
7653 .read = read_memmapped,
7654 .voltage = {2700, 3600},
7655 },
7656
7657 {
7658 .vendor = "ISSI",
7659 .name = "IS29GL128H/L",
7660 .bustype = BUS_PARALLEL,
7661 .manufacture_id = ISSI_ID,
7662 .model_id = ISSI_PMC_IS29GL128HL,
7663 .total_size = 16384,
7664 .page_size = 128 * 1024, /* actual page size is 16 */
7665 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7666 .tested = TEST_UNTESTED,
7667 .probe = probe_jedec_29gl,
7668 .probe_timing = TIMING_ZERO,
7669 .block_erasers =
7670 {
7671 {
7672 .eraseblocks = { {128 * 1024, 128} },
7673 .block_erase = erase_sector_jedec,
7674 }, {
7675 .eraseblocks = { {16 * 1024 * 1024, 1} },
7676 .block_erase = erase_chip_block_jedec,
7677 },
7678 },
7679 .write = write_jedec_1,
7680 .read = read_memmapped,
7681 .voltage = {2700, 3600},
7682 },
7683
7684 {
7685 .vendor = "Intel",
7686 .name = "25F160S33B8",
7687 .bustype = BUS_SPI,
7688 .manufacture_id = INTEL_ID,
7689 .model_id = INTEL_25F160S33B8,
7690 .total_size = 2048,
7691 .page_size = 256,
7692 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7693 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7694 .tested = TEST_UNTESTED,
7695 .probe = probe_spi_rdid,
7696 .probe_timing = TIMING_ZERO,
7697 .block_erasers =
7698 {
7699 {
7700 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7701 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7702 * have no effect on the memory contents, but sets a flag in the SR.
7703 .eraseblocks = {
7704 {8 * 1024, 8},
7705 {64 * 1024, 31} // inaccessible
7706 },
7707 .block_erase = spi_block_erase_40,
7708 }, { */
7709 .eraseblocks = { {64 * 1024, 32} },
7710 .block_erase = spi_block_erase_d8,
7711 }, {
7712 .eraseblocks = { {2 * 1024 * 1024, 1} },
7713 .block_erase = spi_block_erase_c7,
7714 }
7715 },
7716 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7717 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7718 .write = spi_chip_write_256,
7719 .read = spi_chip_read, /* also fast read 0x0B */
7720 .voltage = {2700, 3600},
7721 },
7722
7723 {
7724 .vendor = "Intel",
7725 .name = "25F160S33T8",
7726 .bustype = BUS_SPI,
7727 .manufacture_id = INTEL_ID,
7728 .model_id = INTEL_25F160S33T8,
7729 .total_size = 2048,
7730 .page_size = 256,
7731 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7732 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7733 .tested = TEST_UNTESTED,
7734 .probe = probe_spi_rdid,
7735 .probe_timing = TIMING_ZERO,
7736 .block_erasers =
7737 {
7738 {
7739 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7740 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7741 * have no effect on the memory contents, but sets a flag in the SR.
7742 .eraseblocks = {
7743 {64 * 1024, 31}, // inaccessible
7744 {8 * 1024, 8}
7745 },
7746 .block_erase = spi_block_erase_40,
7747 }, { */
7748 .eraseblocks = { {64 * 1024, 32} },
7749 .block_erase = spi_block_erase_d8,
7750 }, {
7751 .eraseblocks = { {2 * 1024 * 1024, 1} },
7752 .block_erase = spi_block_erase_c7,
7753 }
7754 },
7755 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7756 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7757 .write = spi_chip_write_256,
7758 .read = spi_chip_read, /* also fast read 0x0B */
7759 .voltage = {2700, 3600},
7760 },
7761
7762 {
7763 .vendor = "Intel",
7764 .name = "25F320S33B8",
7765 .bustype = BUS_SPI,
7766 .manufacture_id = INTEL_ID,
7767 .model_id = INTEL_25F320S33B8,
7768 .total_size = 4096,
7769 .page_size = 256,
7770 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7771 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7772 .tested = TEST_UNTESTED,
7773 .probe = probe_spi_rdid,
7774 .probe_timing = TIMING_ZERO,
7775 .block_erasers =
7776 {
7777 {
7778 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7779 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7780 * have no effect on the memory contents, but sets a flag in the SR.
7781 .eraseblocks = {
7782 {8 * 1024, 8},
7783 {64 * 1024, 63} // inaccessible
7784 },
7785 .block_erase = spi_block_erase_40,
7786 }, { */
7787 .eraseblocks = { {64 * 1024, 64} },
7788 .block_erase = spi_block_erase_d8,
7789 }, {
7790 .eraseblocks = { {4 * 1024 * 1024, 1} },
7791 .block_erase = spi_block_erase_c7,
7792 }
7793 },
7794 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7795 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7796 .write = spi_chip_write_256,
7797 .read = spi_chip_read, /* also fast read 0x0B */
7798 .voltage = {2700, 3600},
7799 },
7800
7801 {
7802 .vendor = "Intel",
7803 .name = "25F320S33T8",
7804 .bustype = BUS_SPI,
7805 .manufacture_id = INTEL_ID,
7806 .model_id = INTEL_25F320S33T8,
7807 .total_size = 4096,
7808 .page_size = 256,
7809 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7810 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7811 .tested = TEST_UNTESTED,
7812 .probe = probe_spi_rdid,
7813 .probe_timing = TIMING_ZERO,
7814 .block_erasers =
7815 {
7816 {
7817 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7818 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7819 * have no effect on the memory contents, but sets a flag in the SR.
7820 .eraseblocks = {
7821 {64 * 1024, 63}, // inaccessible
7822 {8 * 1024, 8}
7823 },
7824 .block_erase = spi_block_erase_40,
7825 }, { */
7826 .eraseblocks = { {64 * 1024, 64} },
7827 .block_erase = spi_block_erase_d8,
7828 }, {
7829 .eraseblocks = { {4 * 1024 * 1024, 1} },
7830 .block_erase = spi_block_erase_c7,
7831 }
7832 },
7833 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7834 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7835 .write = spi_chip_write_256,
7836 .read = spi_chip_read, /* also fast read 0x0B */
7837 .voltage = {2700, 3600},
7838 },
7839
7840 {
7841 .vendor = "Intel",
7842 .name = "25F640S33B8",
7843 .bustype = BUS_SPI,
7844 .manufacture_id = INTEL_ID,
7845 .model_id = INTEL_25F640S33B8,
7846 .total_size = 8192,
7847 .page_size = 256,
7848 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7849 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAI0387c262020-08-08 16:04:34 +02007850 .tested = TEST_OK_PREW,
Nikolai Artemievfbefd752020-08-31 17:41:56 +10007851 .probe = probe_spi_rdid,
7852 .probe_timing = TIMING_ZERO,
7853 .block_erasers =
7854 {
7855 {
7856 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7857 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7858 * have no effect on the memory contents, but sets a flag in the SR.
7859 .eraseblocks = {
7860 {8 * 1024, 8},
7861 {64 * 1024, 127} // inaccessible
7862 },
7863 .block_erase = spi_block_erase_40,
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 },
7872 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7873 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7874 .write = spi_chip_write_256,
7875 .read = spi_chip_read, /* also fast read 0x0B */
7876 .voltage = {2700, 3600},
7877 },
7878
7879 {
7880 .vendor = "Intel",
7881 .name = "25F640S33T8",
7882 .bustype = BUS_SPI,
7883 .manufacture_id = INTEL_ID,
7884 .model_id = INTEL_25F640S33T8,
7885 .total_size = 8192,
7886 .page_size = 256,
7887 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7888 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7889 .tested = TEST_UNTESTED,
7890 .probe = probe_spi_rdid,
7891 .probe_timing = TIMING_ZERO,
7892 .block_erasers =
7893 {
7894 {
7895 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7896 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7897 * have no effect on the memory contents, but sets a flag in the SR.
7898 .eraseblocks = {
7899 {64 * 1024, 127}, // inaccessible
7900 {8 * 1024, 8}
7901 },
7902 .block_erase = spi_block_erase_40,
7903 }, { */
7904 .eraseblocks = { {64 * 1024, 128} },
7905 .block_erase = spi_block_erase_d8,
7906 }, {
7907 .eraseblocks = { {8 * 1024 * 1024, 1} },
7908 .block_erase = spi_block_erase_c7,
7909 }
7910 },
7911 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7912 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7913 .write = spi_chip_write_256,
7914 .read = spi_chip_read, /* also fast read 0x0B */
7915 .voltage = {2700, 3600},
7916 },
7917
7918 {
hailfinger286829b2009-01-08 03:40:17 +00007919 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007920 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00007921 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00007922 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007923 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00007924 .total_size = 128,
7925 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00007926 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00007927 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007928 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00007929 .block_erasers =
7930 {
7931 {
Simon Glass8dc82732013-07-16 10:13:51 -06007932 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00007933 {8 * 1024, 1},
7934 {4 * 1024, 2},
7935 {112 * 1024, 1},
7936 },
snelsonc0acbeb2010-03-19 18:47:06 +00007937 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007938 },
7939 },
snelsona013bf62010-03-22 04:39:31 +00007940 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00007941 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007942 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00007943 },
7944
7945 {
7946 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007947 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007948 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00007949 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007950 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00007951 .total_size = 128,
7952 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Alan Greenf5424a22019-07-26 14:32:32 +10007953 .tested = TEST_OK_PREW,
hailfingerd4d97b92009-05-29 12:55:31 +00007954 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007955 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00007956 .block_erasers =
7957 {
7958 {
stefanctd6efe1a2011-09-03 11:22:27 +00007959 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00007960 {112 * 1024, 1},
7961 {4 * 1024, 2},
7962 {8 * 1024, 1},
7963 },
snelsonc0acbeb2010-03-19 18:47:06 +00007964 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007965 },
7966 },
snelsona013bf62010-03-22 04:39:31 +00007967 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00007968 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007969 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00007970 },
7971
7972 {
7973 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007974 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007975 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00007976 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007977 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00007978 .total_size = 256,
7979 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00007980 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00007981 .probe = probe_82802ab,
7982 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7983 .block_erasers =
7984 {
7985 {
7986 .eraseblocks = {
7987 {128 * 1024, 1},
7988 {96 * 1024, 1},
7989 {8 * 1024, 2},
7990 {16 * 1024, 1},
7991 },
7992 .block_erase = erase_block_82802ab,
7993 },
7994 },
7995 .write = write_82802ab,
7996 .read = read_memmapped,
7997 },
7998
7999 {
8000 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00008001 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00008002 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00008003 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008004 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00008005 .total_size = 512,
8006 .page_size = 128 * 1024, /* maximal block size */
8007 .tested = TEST_UNTESTED,
8008 .probe = probe_82802ab,
8009 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8010 .block_erasers =
8011 {
8012 {
Simon Glass8dc82732013-07-16 10:13:51 -06008013 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00008014 {16 * 1024, 1},
8015 {8 * 1024, 2},
8016 {96 * 1024, 1},
8017 {128 * 1024, 3},
8018 },
8019 .block_erase = erase_block_82802ab,
8020 },
8021 },
8022 .write = write_82802ab,
8023 .read = read_memmapped,
8024 },
8025
8026 {
8027 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00008028 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00008029 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00008030 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008031 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00008032 .total_size = 512,
8033 .page_size = 128 * 1024, /* maximal block size */
8034 .tested = TEST_UNTESTED,
8035 .probe = probe_82802ab,
8036 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8037 .block_erasers =
8038 {
8039 {
Simon Glass8dc82732013-07-16 10:13:51 -06008040 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00008041 {128 * 1024, 3},
8042 {96 * 1024, 1},
8043 {8 * 1024, 2},
8044 {16 * 1024, 1},
8045 },
8046 .block_erase = erase_block_82802ab,
8047 },
8048 },
8049 .write = write_82802ab,
8050 .read = read_memmapped,
8051 },
8052
8053 {
8054 .vendor = "Intel",
Alan Greend76dc1f2019-06-26 15:38:19 +10008055 .name = "28F008S3/S5/SC",
8056 .bustype = BUS_PARALLEL,
8057 .manufacture_id = INTEL_ID,
8058 .model_id = INTEL_28F004S3,
8059 .total_size = 512,
8060 .page_size = 256,
8061 .tested = TEST_UNTESTED,
8062 .probe = probe_82802ab,
8063 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8064 .block_erasers =
8065 {
8066 {
8067 .eraseblocks = { {64 * 1024, 8} },
8068 .block_erase = erase_block_82802ab,
8069 },
8070 },
8071 .unlock = unlock_28f004s5,
8072 .write = write_82802ab,
8073 .read = read_memmapped,
8074 },
8075
8076 {
8077 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00008078 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00008079 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00008080 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008081 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00008082 .total_size = 512,
8083 .page_size = 128 * 1024, /* maximal block size */
8084 .feature_bits = FEATURE_ADDR_SHIFTED,
8085 .tested = TEST_UNTESTED,
8086 .probe = probe_82802ab,
8087 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8088 .block_erasers =
8089 {
8090 {
Simon Glass8dc82732013-07-16 10:13:51 -06008091 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00008092 {16 * 1024, 1},
8093 {8 * 1024, 2},
8094 {96 * 1024, 1},
8095 {128 * 1024, 3},
8096 },
8097 .block_erase = erase_block_82802ab,
8098 },
8099 },
8100 .write = write_82802ab,
8101 .read = read_memmapped,
8102 },
8103
8104 {
8105 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00008106 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00008107 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00008108 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008109 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00008110 .total_size = 512,
8111 .page_size = 128 * 1024, /* maximal block size */
8112 .feature_bits = FEATURE_ADDR_SHIFTED,
8113 .tested = TEST_UNTESTED,
8114 .probe = probe_82802ab,
8115 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8116 .block_erasers =
8117 {
8118 {
Simon Glass8dc82732013-07-16 10:13:51 -06008119 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00008120 {128 * 1024, 3},
8121 {96 * 1024, 1},
8122 {8 * 1024, 2},
8123 {16 * 1024, 1},
8124 },
8125 .block_erase = erase_block_82802ab,
8126 },
8127 },
8128 .write = write_82802ab,
8129 .read = read_memmapped,
8130 },
8131
8132 {
8133 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00008134 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00008135 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008136 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008137 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00008138 .total_size = 512,
8139 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008140 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00008141 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008142 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00008143 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00008144 .block_erasers =
8145 {
8146 {
8147 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00008148 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00008149 },
8150 },
Alan Greena59b2ae2019-09-02 17:26:10 +10008151 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00008152 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008153 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008154 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008155 },
8156
hailfinger286829b2009-01-08 03:40:17 +00008157 {
8158 .vendor = "Intel",
8159 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00008160 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00008161 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00008162 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00008163 .total_size = 1024,
8164 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00008165 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00008166 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00008167 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00008168 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00008169 .block_erasers =
8170 {
8171 {
8172 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00008173 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00008174 },
8175 },
Alan Greena59b2ae2019-09-02 17:26:10 +10008176 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00008177 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00008178 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00008179 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008180 },
8181
hailfinger286829b2009-01-08 03:40:17 +00008182 {
8183 .vendor = "Macronix",
Nikolai Artemievfbefd752020-08-31 17:41:56 +10008184 .name = "MX23L12854",
8185 .bustype = BUS_SPI,
8186 .manufacture_id = MACRONIX_ID,
8187 .model_id = MACRONIX_MX23L12854,
8188 .total_size = 16384,
8189 .page_size = 256,
8190 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8191 .probe = probe_spi_rdid,
8192 .probe_timing = TIMING_ZERO,
8193 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8194 .read = spi_chip_read, /* Fast read (0x0B) supported */
8195 .voltage = {3000, 3600},
8196 },
8197
8198 {
8199 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008200 .name = "MX23L1654",
8201 .bustype = BUS_SPI,
8202 .manufacture_id = MACRONIX_ID,
8203 .model_id = MACRONIX_MX23L1654,
8204 .total_size = 2048,
8205 .page_size = 256,
8206 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8207 .probe = probe_spi_rdid,
8208 .probe_timing = TIMING_ZERO,
8209 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8210 .read = spi_chip_read, /* Fast read (0x0B) supported */
8211 .voltage = {3000, 3600},
8212 },
8213
8214 {
8215 .vendor = "Macronix",
8216 .name = "MX23L3254",
8217 .bustype = BUS_SPI,
8218 .manufacture_id = MACRONIX_ID,
8219 .model_id = MACRONIX_MX23L3254,
8220 .total_size = 4096,
8221 .page_size = 256,
8222 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
8223 .probe = probe_spi_rdid,
8224 .probe_timing = TIMING_ZERO,
8225 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8226 .read = spi_chip_read, /* Fast read (0x0B) supported */
8227 .voltage = {3000, 3600},
8228 },
8229
8230 {
8231 .vendor = "Macronix",
8232 .name = "MX23L6454",
8233 .bustype = BUS_SPI,
8234 .manufacture_id = MACRONIX_ID,
8235 .model_id = MACRONIX_MX23L6454,
8236 .total_size = 8192,
8237 .page_size = 256,
8238 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
8239 .probe = probe_spi_rdid,
8240 .probe_timing = TIMING_ZERO,
8241 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8242 .read = spi_chip_read, /* Fast read (0x0B) supported */
8243 .voltage = {3000, 3600},
8244 },
8245
8246 {
8247 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08008248 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00008249 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008250 .manufacture_id = MACRONIX_ID,
8251 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00008252 .total_size = 128,
8253 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08008254 /* MX25L1006E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10008255 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008256 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008257 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008258 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00008259 .block_erasers =
8260 {
8261 {
8262 .eraseblocks = { {4 * 1024, 32} },
8263 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00008264 }, {
hailfinger7df21362009-09-05 02:30:58 +00008265 .eraseblocks = { {64 * 1024, 2} },
8266 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00008267 }, {
hailfinger7df21362009-09-05 02:30:58 +00008268 .eraseblocks = { {128 * 1024, 1} },
8269 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00008270 }, {
hailfinger7df21362009-09-05 02:30:58 +00008271 .eraseblocks = { {128 * 1024, 1} },
8272 .block_erase = spi_block_erase_c7,
8273 },
8274 },
Alan Greena514de82019-09-09 16:40:10 +10008275 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00008276 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008277 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08008278 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00008279 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008280 },
8281
hailfinger286829b2009-01-08 03:40:17 +00008282 {
8283 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008284 .name = "MX25L12805D",
hailfingere1e41ea2011-07-27 07:13:06 +00008285 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008286 .manufacture_id = MACRONIX_ID,
Nikolai Artemievb79e1232021-01-20 17:25:02 +11008287 .model_id = MACRONIX_MX25L12805D,
Alan Greend76dc1f2019-06-26 15:38:19 +10008288 .total_size = 16384,
hailfinger286829b2009-01-08 03:40:17 +00008289 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10008290 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8291 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Edward O'Callaghan34608d82020-10-01 21:43:48 +10008292 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008293 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008294 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00008295 .block_erasers =
8296 {
8297 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008298 .eraseblocks = { {4 * 1024, 4096} },
hailfinger91cf1032009-10-01 13:15:01 +00008299 .block_erase = spi_block_erase_20,
8300 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008301 .eraseblocks = { {64 * 1024, 256} },
hailfinger91cf1032009-10-01 13:15:01 +00008302 .block_erase = spi_block_erase_d8,
8303 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008304 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00008305 .block_erase = spi_block_erase_60,
8306 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008307 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00008308 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10008309 }
hailfinger91cf1032009-10-01 13:15:01 +00008310 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +10008311 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolai Artemieva31a3c82021-01-20 15:47:33 +11008312 .unlock = spi_disable_blockprotect_bp3_srwd,
hailfinger87c05482009-05-09 02:34:18 +00008313 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008314 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00008315 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008316 },
8317
hailfinger286829b2009-01-08 03:40:17 +00008318 {
8319 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008320 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8321 .bustype = BUS_SPI,
8322 .manufacture_id = MACRONIX_ID,
8323 .model_id = MACRONIX_MX25L12805D,
8324 .total_size = 16384,
8325 .page_size = 256,
8326 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8327 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8328 .tested = TEST_OK_PREW,
8329 .probe = probe_spi_rdid,
8330 .probe_timing = TIMING_ZERO,
8331 .block_erasers =
8332 {
8333 {
8334 .eraseblocks = { {4 * 1024, 4096} },
8335 .block_erase = spi_block_erase_20,
8336 }, {
8337 .eraseblocks = { {32 * 1024, 512} },
8338 .block_erase = spi_block_erase_52,
8339 }, {
8340 .eraseblocks = { {64 * 1024, 256} },
8341 .block_erase = spi_block_erase_d8,
8342 }, {
8343 .eraseblocks = { {16 * 1024 * 1024, 1} },
8344 .block_erase = spi_block_erase_60,
8345 }, {
8346 .eraseblocks = { {16 * 1024 * 1024, 1} },
8347 .block_erase = spi_block_erase_c7,
8348 }
8349 },
8350 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8351 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8352 .unlock = spi_disable_blockprotect_bp3_srwd,
8353 .write = spi_chip_write_256,
8354 .read = spi_chip_read, /* Fast read (0x0B) supported */
8355 .voltage = {2700, 3600},
8356 },
8357
8358 {
8359 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00008360 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00008361 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008362 .manufacture_id = MACRONIX_ID,
8363 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00008364 .total_size = 2048,
8365 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008366 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008367 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008368 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008369 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00008370 .block_erasers =
8371 {
8372 {
Nikolai Artemiev2292adb2021-02-16 16:33:58 +11008373 .eraseblocks = { {64 * 1024, 32} },
8374 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00008375 }, {
8376 .eraseblocks = { {64 * 1024, 32} },
8377 .block_erase = spi_block_erase_d8,
8378 }, {
8379 .eraseblocks = { {2 * 1024 * 1024, 1} },
8380 .block_erase = spi_block_erase_60,
8381 }, {
8382 .eraseblocks = { {2 * 1024 * 1024, 1} },
8383 .block_erase = spi_block_erase_c7,
8384 },
8385 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008386 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
hailfingerb9560ee2010-07-14 20:21:22 +00008387 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008388 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008389 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00008390 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008391 },
8392
hailfinger286829b2009-01-08 03:40:17 +00008393 {
8394 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008395 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
8396 .bustype = BUS_SPI,
8397 .manufacture_id = MACRONIX_ID,
8398 .model_id = MACRONIX_MX25L1605,
8399 .total_size = 2048,
8400 .page_size = 256,
8401 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
8402 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8403 .tested = TEST_OK_PREW,
8404 .probe = probe_spi_rdid,
8405 .probe_timing = TIMING_ZERO,
8406 .block_erasers =
8407 {
8408 {
8409 .eraseblocks = { {4 * 1024, 512} },
8410 .block_erase = spi_block_erase_20,
8411 }, {
8412 .eraseblocks = { {64 * 1024, 32} },
8413 .block_erase = spi_block_erase_52,
8414 }, {
8415 .eraseblocks = { {64 * 1024, 32} },
8416 .block_erase = spi_block_erase_d8,
8417 }, {
8418 .eraseblocks = { {2 * 1024 * 1024, 1} },
8419 .block_erase = spi_block_erase_60,
8420 }, {
8421 .eraseblocks = { {2 * 1024 * 1024, 1} },
8422 .block_erase = spi_block_erase_c7,
8423 },
8424 },
8425 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
8426 .unlock = spi_disable_blockprotect_bp3_srwd,
8427 .write = spi_chip_write_256,
8428 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
8429 .voltage = {2700, 3600},
8430 },
8431
8432 {
8433 .vendor = "Macronix",
8434 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
8435 .bustype = BUS_SPI,
8436 .manufacture_id = MACRONIX_ID,
8437 .model_id = MACRONIX_MX25L1605,
8438 .total_size = 2048,
8439 .page_size = 256,
8440 .feature_bits = FEATURE_WRSR_WREN,
8441 .tested = TEST_OK_PREW,
8442 .probe = probe_spi_rdid,
8443 .probe_timing = TIMING_ZERO,
8444 .block_erasers =
8445 {
8446 {
8447 .eraseblocks = { {4 * 1024, 512} },
8448 .block_erase = spi_block_erase_20,
8449 }, {
8450 .eraseblocks = { {64 * 1024, 32} },
8451 .block_erase = spi_block_erase_d8,
8452 }, {
8453 .eraseblocks = { {2 * 1024 * 1024, 1} },
8454 .block_erase = spi_block_erase_60,
8455 }, {
8456 .eraseblocks = { {2 * 1024 * 1024, 1} },
8457 .block_erase = spi_block_erase_c7,
8458 },
8459 },
8460 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
8461 .unlock = spi_disable_blockprotect_bp3_srwd,
8462 .write = spi_chip_write_256,
8463 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8464 .voltage = {2700, 3600},
8465 },
8466
8467 {
8468 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00008469 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00008470 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008471 .manufacture_id = MACRONIX_ID,
8472 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00008473 .total_size = 2048,
8474 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10008475 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8476 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Angel Pons61fdc842021-01-15 18:57:32 +01008477 .tested = TEST_OK_PREW,
hailfinger0a2fef02009-04-19 23:04:00 +00008478 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008479 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00008480 .block_erasers =
8481 {
8482 {
8483 .eraseblocks = { {4 * 1024, 512} },
8484 .block_erase = spi_block_erase_20,
8485 }, {
8486 .eraseblocks = { {64 * 1024, 32} },
8487 .block_erase = spi_block_erase_d8,
8488 }, {
8489 .eraseblocks = { {2 * 1024 * 1024, 1} },
8490 .block_erase = spi_block_erase_60,
8491 }, {
8492 .eraseblocks = { {2 * 1024 * 1024, 1} },
8493 .block_erase = spi_block_erase_c7,
8494 }
8495 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008496 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemieva31a3c82021-01-20 15:47:33 +11008497 .unlock = spi_disable_blockprotect_bp3_srwd,
hailfinger87c05482009-05-09 02:34:18 +00008498 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008499 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
stefanct7e00e222011-06-03 07:26:31 +00008500 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00008501 },
hailfingerf1255892009-04-20 22:54:13 +00008502
hailfinger0a2fef02009-04-19 23:04:00 +00008503 {
8504 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00008505 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00008506 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008507 .manufacture_id = MACRONIX_ID,
8508 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00008509 .total_size = 2048,
8510 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10008511 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8512 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
uwef926ca22010-09-13 19:59:28 +00008513 .tested = TEST_UNTESTED,
8514 .probe = probe_spi_rdid,
8515 .probe_timing = TIMING_ZERO,
8516 .block_erasers =
8517 {
8518 {
8519 .eraseblocks = { {4 * 1024, 512} },
8520 .block_erase = spi_block_erase_20,
8521 }, {
8522 .eraseblocks = { {64 * 1024, 32} },
8523 .block_erase = spi_block_erase_d8,
8524 }, {
8525 .eraseblocks = { {2 * 1024 * 1024, 1} },
8526 .block_erase = spi_block_erase_60,
8527 }, {
8528 .eraseblocks = { {2 * 1024 * 1024, 1} },
8529 .block_erase = spi_block_erase_c7,
8530 }
8531 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008532 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemieva31a3c82021-01-20 15:47:33 +11008533 .unlock = spi_disable_blockprotect_bp3_srwd,
uwef926ca22010-09-13 19:59:28 +00008534 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008535 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
stefanct66c8c1b2011-07-19 08:50:18 +00008536 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00008537 },
8538
8539 {
8540 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008541 .name = "MX25L2005(C)/MX25L2006E",
Alan Greend76dc1f2019-06-26 15:38:19 +10008542 .bustype = BUS_SPI,
8543 .manufacture_id = MACRONIX_ID,
8544 .model_id = MACRONIX_MX25L2005,
8545 .total_size = 256,
8546 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008547 .feature_bits = FEATURE_WRSR_WREN,
Edward O'Callaghan34608d82020-10-01 21:43:48 +10008548 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10008549 .probe = probe_spi_rdid,
8550 .probe_timing = TIMING_ZERO,
8551 .block_erasers =
8552 {
8553 {
8554 .eraseblocks = { {4 * 1024, 64} },
8555 .block_erase = spi_block_erase_20,
8556 }, {
8557 .eraseblocks = { {64 * 1024, 4} },
8558 .block_erase = spi_block_erase_52,
8559 }, {
8560 .eraseblocks = { {64 * 1024, 4} },
8561 .block_erase = spi_block_erase_d8,
8562 }, {
8563 .eraseblocks = { {256 * 1024, 1} },
8564 .block_erase = spi_block_erase_60,
8565 }, {
8566 .eraseblocks = { {256 * 1024, 1} },
8567 .block_erase = spi_block_erase_c7,
8568 },
8569 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008570 .printlock = spi_prettyprint_status_register_bp1_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10008571 .unlock = spi_disable_blockprotect,
8572 .write = spi_chip_write_256,
8573 .read = spi_chip_read, /* Fast read (0x0B) supported */
8574 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10008575 },
8576
8577 {
8578 .vendor = "Macronix",
8579 .name = "MX25L25635F/MX25L25645G",
8580 .bustype = BUS_SPI,
8581 .manufacture_id = MACRONIX_ID,
8582 .model_id = MACRONIX_MX25L25635F,
8583 .total_size = 32768,
8584 .page_size = 256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10008585 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nikolai Artemieved9365a2021-02-16 15:45:45 +11008586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Edward O'Callaghan34608d82020-10-01 21:43:48 +10008587 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10008588 .probe = probe_spi_rdid,
8589 .probe_timing = TIMING_ZERO,
8590 .block_erasers =
8591 {
8592 {
8593 .eraseblocks = { {4 * 1024, 8192} },
8594 .block_erase = spi_block_erase_21,
8595 }, {
Nikolai Artemievfbab7602021-02-16 16:50:38 +11008596 .eraseblocks = { {4 * 1024, 8192} },
8597 .block_erase = spi_block_erase_20,
8598 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008599 .eraseblocks = { {32 * 1024, 1024} },
8600 .block_erase = spi_block_erase_5c,
8601 }, {
Nikolai Artemievfbab7602021-02-16 16:50:38 +11008602 .eraseblocks = { {32 * 1024, 1024} },
8603 .block_erase = spi_block_erase_52,
8604 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008605 .eraseblocks = { {64 * 1024, 512} },
8606 .block_erase = spi_block_erase_dc,
8607 }, {
Nikolai Artemievfbab7602021-02-16 16:50:38 +11008608 .eraseblocks = { {64 * 1024, 512} },
8609 .block_erase = spi_block_erase_d8,
8610 }, {
8611 .eraseblocks = { {32 * 1024 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +10008612 .block_erase = spi_block_erase_60,
8613 }, {
Nikolai Artemievfbab7602021-02-16 16:50:38 +11008614 .eraseblocks = { {32 * 1024 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +10008615 .block_erase = spi_block_erase_c7,
Nikolai Artemievfbab7602021-02-16 16:50:38 +11008616 }
Alan Greend76dc1f2019-06-26 15:38:19 +10008617 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008618 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8619 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemiev2b4b2022021-02-16 15:48:30 +11008620 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10008621 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008622 .read = spi_chip_read, /* Fast read (0x0B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10008623 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10008624 },
8625
8626 {
8627 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008628 .name = "MX25L3205(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00008629 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008630 .manufacture_id = MACRONIX_ID,
8631 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00008632 .total_size = 4096,
8633 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008634 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008635 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008636 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008637 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00008638 .block_erasers =
8639 {
8640 {
Nikolai Artemiev5d3d8d72021-03-01 16:32:25 +11008641 .eraseblocks = { {64 * 1024, 64} },
snelson1c03aa12009-12-23 17:05:59 +00008642 .block_erase = spi_block_erase_20,
8643 }, {
Nikolai Artemiev5d3d8d72021-03-01 16:32:25 +11008644 .eraseblocks = { {64 * 1024, 64} },
snelson1c03aa12009-12-23 17:05:59 +00008645 .block_erase = spi_block_erase_d8,
8646 }, {
8647 .eraseblocks = { {4 * 1024 * 1024, 1} },
8648 .block_erase = spi_block_erase_60,
8649 }, {
8650 .eraseblocks = { {4 * 1024 * 1024, 1} },
8651 .block_erase = spi_block_erase_c7,
8652 },
8653 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008654 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
hailfingerb9560ee2010-07-14 20:21:22 +00008655 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008656 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10008657 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00008658 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008659 },
8660
hailfinger286829b2009-01-08 03:40:17 +00008661 {
8662 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008663 .name = "MX25L3205D/MX25L3208D",
8664 .bustype = BUS_SPI,
8665 .manufacture_id = MACRONIX_ID,
8666 .model_id = MACRONIX_MX25L3205,
8667 .total_size = 4096,
8668 .page_size = 256,
8669 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8670 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8671 .tested = TEST_OK_PREW,
8672 .probe = probe_spi_rdid,
8673 .probe_timing = TIMING_ZERO,
8674 .block_erasers =
8675 {
8676 {
8677 .eraseblocks = { {4 * 1024, 1024} },
8678 .block_erase = spi_block_erase_20,
8679 }, {
8680 .eraseblocks = { {64 * 1024, 64} },
8681 .block_erase = spi_block_erase_d8,
8682 }, {
8683 .eraseblocks = { {4 * 1024 * 1024, 1} },
8684 .block_erase = spi_block_erase_60,
8685 }, {
8686 .eraseblocks = { {4 * 1024 * 1024, 1} },
8687 .block_erase = spi_block_erase_c7,
8688 },
8689 },
8690 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8691 .unlock = spi_disable_blockprotect_bp3_srwd,
8692 .write = spi_chip_write_256,
8693 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8694 .voltage = {2700, 3600},
8695 },
8696
8697 {
8698 .vendor = "Macronix",
8699 .name = "MX25L3206E/MX25L3208E",
8700 .bustype = BUS_SPI,
8701 .manufacture_id = MACRONIX_ID,
8702 .model_id = MACRONIX_MX25L3205,
8703 .total_size = 4096,
8704 .page_size = 256,
8705 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8706 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8707 .tested = TEST_OK_PREW,
8708 .probe = probe_spi_rdid,
8709 .probe_timing = TIMING_ZERO,
8710 .block_erasers =
8711 {
8712 {
8713 .eraseblocks = { {4 * 1024, 1024} },
8714 .block_erase = spi_block_erase_20,
8715 }, {
8716 .eraseblocks = { {64 * 1024, 64} },
8717 .block_erase = spi_block_erase_d8,
8718 }, {
8719 .eraseblocks = { {64 * 1024, 64} },
8720 .block_erase = spi_block_erase_52,
8721 }, {
8722 .eraseblocks = { {4 * 1024 * 1024, 1} },
8723 .block_erase = spi_block_erase_60,
8724 }, {
8725 .eraseblocks = { {4 * 1024 * 1024, 1} },
8726 .block_erase = spi_block_erase_c7,
8727 },
8728 },
8729 .printlock = spi_prettyprint_status_register_bp3_srwd,
8730 .unlock = spi_disable_blockprotect_bp3_srwd,
8731 .write = spi_chip_write_256,
8732 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8733 .voltage = {2700, 3600},
8734 },
8735
8736 {
8737 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00008738 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00008739 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008740 .manufacture_id = MACRONIX_ID,
8741 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00008742 .total_size = 4096,
8743 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10008744 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
8745 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stuge38d77d22009-04-23 22:51:56 +00008746 .tested = TEST_UNTESTED,
8747 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008748 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00008749 .block_erasers =
8750 {
8751 {
8752 .eraseblocks = { {4 * 1024, 1024} },
8753 .block_erase = spi_block_erase_20,
8754 }, {
8755 .eraseblocks = { {64 * 1024, 64} },
8756 .block_erase = spi_block_erase_d8,
8757 }, {
8758 .eraseblocks = { {4 * 1024 * 1024, 1} },
8759 .block_erase = spi_block_erase_60,
8760 }, {
8761 .eraseblocks = { {4 * 1024 * 1024, 1} },
8762 .block_erase = spi_block_erase_c7,
8763 }
8764 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008765 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemieva31a3c82021-01-20 15:47:33 +11008766 .unlock = spi_disable_blockprotect_bp3_srwd,
hailfinger87c05482009-05-09 02:34:18 +00008767 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00008768 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008769 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00008770 },
8771
Vincent Palatin87e092a2013-02-28 15:46:14 -08008772 {
8773 .vendor = "Macronix",
Nico Huber250dd972021-04-21 13:04:29 +02008774 .name = "MX25L3233F/MX25L3273E",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008775 .bustype = BUS_SPI,
8776 .manufacture_id = MACRONIX_ID,
8777 .model_id = MACRONIX_MX25L3205,
8778 .total_size = 4096,
8779 .page_size = 256,
Nico Huber90cb9a62021-04-21 13:03:13 +02008780 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008781 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8782 .tested = TEST_OK_PREW,
8783 .probe = probe_spi_rdid,
8784 .probe_timing = TIMING_ZERO,
8785 .block_erasers =
8786 {
8787 {
8788 .eraseblocks = { {4 * 1024, 1024} },
8789 .block_erase = spi_block_erase_20,
8790 }, {
8791 .eraseblocks = { {32 * 1024, 128} },
8792 .block_erase = spi_block_erase_52,
8793 }, {
8794 .eraseblocks = { {64 * 1024, 64} },
8795 .block_erase = spi_block_erase_d8,
8796 }, {
8797 .eraseblocks = { {4 * 1024 * 1024, 1} },
8798 .block_erase = spi_block_erase_60,
8799 }, {
8800 .eraseblocks = { {4 * 1024 * 1024, 1} },
8801 .block_erase = spi_block_erase_c7,
8802 },
8803 },
8804 .printlock = spi_prettyprint_status_register_bp3_srwd,
8805 .unlock = spi_disable_blockprotect_bp3_srwd,
8806 .write = spi_chip_write_256,
8807 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
Nico Huber250dd972021-04-21 13:04:29 +02008808 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008809 },
8810
8811 {
8812 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008813 .name = "MX25L4005(A/C)/MX25L4006E",
Vincent Palatin87e092a2013-02-28 15:46:14 -08008814 .bustype = BUS_SPI,
8815 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10008816 .model_id = MACRONIX_MX25L4005,
8817 .total_size = 512,
Vincent Palatin87e092a2013-02-28 15:46:14 -08008818 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008819 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008820 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10008821 .probe = probe_spi_rdid,
8822 .probe_timing = TIMING_ZERO,
8823 .block_erasers =
8824 {
8825 {
8826 .eraseblocks = { {4 * 1024, 128} },
8827 .block_erase = spi_block_erase_20,
8828 }, {
8829 .eraseblocks = { {64 * 1024, 8} },
8830 .block_erase = spi_block_erase_52,
8831 }, {
8832 .eraseblocks = { {64 * 1024, 8} },
8833 .block_erase = spi_block_erase_d8,
8834 }, {
8835 .eraseblocks = { {512 * 1024, 1} },
8836 .block_erase = spi_block_erase_60,
8837 }, {
8838 .eraseblocks = { {512 * 1024, 1} },
8839 .block_erase = spi_block_erase_c7,
8840 },
8841 },
Alan Greena514de82019-09-09 16:40:10 +10008842 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10008843 .unlock = spi_disable_blockprotect,
8844 .write = spi_chip_write_256,
8845 .read = spi_chip_read, /* Fast read (0x0B) supported */
8846 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10008847 },
8848
8849 {
8850 .vendor = "Macronix",
8851 .name = "MX25L512(E)/MX25V512(C)",
8852 .bustype = BUS_SPI,
8853 .manufacture_id = MACRONIX_ID,
8854 .model_id = MACRONIX_MX25L512,
8855 .total_size = 64,
8856 .page_size = 256,
8857 /* MX25L512E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10008858 .feature_bits = FEATURE_WRSR_WREN,
Edward O'Callaghan34608d82020-10-01 21:43:48 +10008859 .tested = TEST_OK_PREW,
Vincent Palatin87e092a2013-02-28 15:46:14 -08008860 .probe = probe_spi_rdid,
8861 .probe_timing = TIMING_ZERO,
8862 .block_erasers =
8863 {
8864 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008865 .eraseblocks = { {4 * 1024, 16} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008866 .block_erase = spi_block_erase_20,
8867 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008868 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008869 .block_erase = spi_block_erase_52,
8870 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008871 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008872 .block_erase = spi_block_erase_d8,
8873 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008874 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008875 .block_erase = spi_block_erase_60,
8876 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008877 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008878 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10008879 },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008880 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10008881 .printlock = spi_prettyprint_status_register_bp1_srwd,
Vincent Palatin87e092a2013-02-28 15:46:14 -08008882 .unlock = spi_disable_blockprotect,
8883 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10008884 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
8885 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
Vincent Palatin87e092a2013-02-28 15:46:14 -08008886 },
8887
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008888 {
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008889 .vendor = "Macronix",
8890 .name = "MX25L5121E",
8891 .bustype = BUS_SPI,
8892 .manufacture_id = MACRONIX_ID,
8893 .model_id = MACRONIX_MX25L5121E,
8894 .total_size = 64,
8895 .page_size = 32,
8896 .feature_bits = FEATURE_WRSR_WREN,
8897 .tested = TEST_OK_PREW,
8898 .probe = probe_spi_rdid,
8899 .probe_timing = TIMING_ZERO,
8900 .block_erasers =
8901 {
8902 {
8903 .eraseblocks = { {4 * 1024, 16} },
8904 .block_erase = spi_block_erase_20,
8905 }, {
8906 .eraseblocks = { {64 * 1024, 1} },
8907 .block_erase = spi_block_erase_52,
8908 }, {
8909 .eraseblocks = { {64 * 1024, 1} },
8910 .block_erase = spi_block_erase_d8,
8911 }, {
8912 .eraseblocks = { {64 * 1024, 1} },
8913 .block_erase = spi_block_erase_60,
8914 }, {
8915 .eraseblocks = { {64 * 1024, 1} },
8916 .block_erase = spi_block_erase_c7,
8917 },
8918 },
8919 .printlock = spi_prettyprint_status_register_bp1_srwd,
8920 .unlock = spi_disable_blockprotect,
8921 .write = spi_chip_write_256,
8922 .read = spi_chip_read, /* Fast read (0x0B) supported */
8923 .voltage = {2700, 3600},
8924 },
8925
8926 {
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10008927 .vendor = "Macronix",
8928 .name = "MX25L6405",
8929 .bustype = BUS_SPI,
8930 .manufacture_id = MACRONIX_ID,
8931 .model_id = MACRONIX_MX25L6405,
8932 .total_size = 8192,
8933 .page_size = 256,
8934 /* Has an additional 512B EEPROM sector */
8935 .feature_bits = FEATURE_WRSR_WREN,
8936 .tested = TEST_OK_PREW,
8937 .probe = probe_spi_rdid,
8938 .probe_timing = TIMING_ZERO,
8939 .block_erasers =
8940 {
8941 {
8942 .eraseblocks = { {64 * 1024, 128} },
8943 .block_erase = spi_block_erase_20,
8944 }, {
8945 .eraseblocks = { {64 * 1024, 128} },
8946 .block_erase = spi_block_erase_d8,
8947 }, {
8948 .eraseblocks = { {8 * 1024 * 1024, 1} },
8949 .block_erase = spi_block_erase_60,
8950 }, {
8951 .eraseblocks = { {8 * 1024 * 1024, 1} },
8952 .block_erase = spi_block_erase_c7,
8953 }
8954 },
8955 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
8956 .unlock = spi_disable_blockprotect_bp3_srwd,
8957 .write = spi_chip_write_256,
8958 .read = spi_chip_read, /* Fast read (0x0B) supported */
8959 .voltage = {2700, 3600},
8960 },
8961
8962 {
8963 .vendor = "Macronix",
8964 .name = "MX25L6405D",
8965 .bustype = BUS_SPI,
8966 .manufacture_id = MACRONIX_ID,
8967 .model_id = MACRONIX_MX25L6405,
8968 .total_size = 8192,
8969 .page_size = 256,
8970 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8972 .tested = TEST_OK_PREW,
8973 .probe = probe_spi_rdid,
8974 .probe_timing = TIMING_ZERO,
8975 .block_erasers =
8976 {
8977 {
8978 .eraseblocks = { {4 * 1024, 2048} },
8979 .block_erase = spi_block_erase_20,
8980 }, {
8981 .eraseblocks = { {64 * 1024, 128} },
8982 .block_erase = spi_block_erase_d8,
8983 }, {
8984 .eraseblocks = { {8 * 1024 * 1024, 1} },
8985 .block_erase = spi_block_erase_60,
8986 }, {
8987 .eraseblocks = { {8 * 1024 * 1024, 1} },
8988 .block_erase = spi_block_erase_c7,
8989 }
8990 },
8991 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8992 .unlock = spi_disable_blockprotect_bp3_srwd,
8993 .write = spi_chip_write_256,
8994 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
8995 .voltage = {2700, 3600},
8996 },
8997
8998 {
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008999 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10009000 .name = "MX25L6406E/MX25L6408E",
hailfingere1e41ea2011-07-27 07:13:06 +00009001 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009002 .manufacture_id = MACRONIX_ID,
9003 .model_id = MACRONIX_MX25L6405,
9004 .total_size = 8192,
9005 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10009006 /* MX25L6406E supports SFDP */
9007 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
9008 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10009009 .tested = TEST_OK_PREW,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009010 .probe = probe_spi_rdid,
9011 .probe_timing = TIMING_ZERO,
9012 .block_erasers =
9013 {
9014 {
9015 .eraseblocks = { {4 * 1024, 2048} },
9016 .block_erase = spi_block_erase_20,
9017 }, {
9018 .eraseblocks = { {64 * 1024, 128} },
Nikolai Artemiev50ec3c52021-03-01 16:33:18 +11009019 .block_erase = spi_block_erase_52,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009020 }, {
9021 .eraseblocks = { {64 * 1024, 128} },
Nikolai Artemiev50ec3c52021-03-01 16:33:18 +11009022 .block_erase = spi_block_erase_d8,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009023 }, {
9024 .eraseblocks = { {8 * 1024 * 1024, 1} },
9025 .block_erase = spi_block_erase_60,
9026 }, {
9027 .eraseblocks = { {8 * 1024 * 1024, 1} },
9028 .block_erase = spi_block_erase_c7,
9029 }
9030 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10009031 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolai Artemiev50ec3c52021-03-01 16:33:18 +11009032 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009033 .write = spi_chip_write_256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009034 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
Nikolai Artemiev860d4912021-02-16 15:12:53 +11009035 .voltage = {2700, 3600},
David Hendricks1c9bc9c2011-07-20 15:25:44 -07009036 },
stepanaa1b6a22008-12-08 18:15:10 +00009037
hailfinger286829b2009-01-08 03:40:17 +00009038 {
9039 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009040 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
9041 .bustype = BUS_SPI,
9042 .manufacture_id = MACRONIX_ID,
9043 .model_id = MACRONIX_MX25L6405,
9044 .total_size = 8192,
9045 .page_size = 256,
9046 /* supports SFDP */
9047 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9048 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9049 .tested = TEST_OK_PREW,
9050 .probe = probe_spi_rdid,
9051 .probe_timing = TIMING_ZERO,
9052 .block_erasers =
9053 {
9054 {
9055 .eraseblocks = { {4 * 1024, 2048} },
9056 .block_erase = spi_block_erase_20,
9057 }, {
9058 .eraseblocks = { {32 * 1024, 256} },
9059 .block_erase = spi_block_erase_52,
9060 }, {
9061 .eraseblocks = { {64 * 1024, 128} },
9062 .block_erase = spi_block_erase_d8,
9063 }, {
9064 .eraseblocks = { {8 * 1024 * 1024, 1} },
9065 .block_erase = spi_block_erase_60,
9066 }, {
9067 .eraseblocks = { {8 * 1024 * 1024, 1} },
9068 .block_erase = spi_block_erase_c7,
9069 }
9070 },
9071 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9072 .unlock = spi_disable_blockprotect_bp3_srwd,
9073 .write = spi_chip_write_256,
9074 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9075 .voltage = {2700, 3600},
9076 },
9077
9078 {
9079 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08009080 .name = "MX25L6495F",
9081 .bustype = BUS_SPI,
9082 .manufacture_id = MACRONIX_ID,
9083 .model_id = MACRONIX_MX25L6495F,
9084 .total_size = 8192,
9085 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10009086 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Alan Green378747b2019-09-09 16:38:43 +10009087 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10009088 .tested = TEST_OK_PREW,
David Hendricksc3496092014-11-13 17:20:55 -08009089 .probe = probe_spi_rdid,
9090 .probe_timing = TIMING_ZERO,
9091 .block_erasers =
9092 {
9093 {
9094 .eraseblocks = { {4 * 1024, 2048} },
9095 .block_erase = spi_block_erase_20,
9096 }, {
9097 .eraseblocks = { {64 * 1024, 128} },
9098 .block_erase = spi_block_erase_d8,
9099 }, {
9100 .eraseblocks = { {32 * 1024, 256} },
9101 .block_erase = spi_block_erase_52,
9102 }, {
9103 .eraseblocks = { {8 * 1024 * 1024, 1} },
9104 .block_erase = spi_block_erase_60,
9105 }, {
9106 .eraseblocks = { {8 * 1024 * 1024, 1} },
9107 .block_erase = spi_block_erase_c7,
9108 }
9109 },
9110 .unlock = spi_disable_blockprotect,
9111 .write = spi_chip_write_256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009112 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
David Hendricksc3496092014-11-13 17:20:55 -08009113 .voltage = {2700, 3600},
David Hendricksc3496092014-11-13 17:20:55 -08009114 },
9115
9116 {
9117 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009118 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
9119 .bustype = BUS_SPI,
9120 .manufacture_id = MACRONIX_ID,
9121 .model_id = MACRONIX_MX25L8005,
9122 .total_size = 1024,
9123 .page_size = 256,
9124 /* MX25L8006E, MX25L8008E support SFDP */
9125 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
9126 .feature_bits = FEATURE_WRSR_WREN,
9127 .tested = TEST_OK_PREW,
9128 .probe = probe_spi_rdid,
9129 .probe_timing = TIMING_ZERO,
9130 .block_erasers =
9131 {
9132 {
9133 .eraseblocks = { {4 * 1024, 256} },
9134 .block_erase = spi_block_erase_20,
9135 }, {
9136 .eraseblocks = { {64 * 1024, 16} },
9137 .block_erase = spi_block_erase_52,
9138 }, {
9139 .eraseblocks = { {64 * 1024, 16} },
9140 .block_erase = spi_block_erase_d8,
9141 }, {
9142 .eraseblocks = { {1024 * 1024, 1} },
9143 .block_erase = spi_block_erase_60,
9144 }, {
9145 .eraseblocks = { {1024 * 1024, 1} },
9146 .block_erase = spi_block_erase_c7,
9147 },
9148 },
9149 .printlock = spi_prettyprint_status_register_bp2_srwd,
9150 .unlock = spi_disable_blockprotect,
9151 .write = spi_chip_write_256,
9152 .read = spi_chip_read, /* Fast read (0x0B) supported */
9153 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9154 },
9155
9156 {
9157 .vendor = "Macronix",
sibradzic924de632020-03-14 17:21:34 +09009158 .name = "MX25R3235F",
9159 .bustype = BUS_SPI,
9160 .manufacture_id = MACRONIX_ID,
9161 .model_id = MACRONIX_MX25R3235F,
9162 .total_size = 4096,
9163 .page_size = 256,
9164 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9165 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9166 .tested = TEST_OK_PREW,
9167 .probe = probe_spi_rdid,
9168 .probe_timing = TIMING_ZERO,
9169 .block_erasers =
9170 {
9171 {
9172 .eraseblocks = { {4 * 1024, 1024} },
9173 .block_erase = spi_block_erase_20,
9174 }, {
9175 .eraseblocks = { {64 * 1024, 64} },
9176 .block_erase = spi_block_erase_d8,
9177 }, {
9178 .eraseblocks = { {32 * 1024, 128} },
9179 .block_erase = spi_block_erase_52,
9180 }, {
9181 .eraseblocks = { {4 * 1024 * 1024, 1} },
9182 .block_erase = spi_block_erase_60,
9183 }, {
9184 .eraseblocks = { {4 * 1024 * 1024, 1} },
9185 .block_erase = spi_block_erase_c7,
9186 }
9187 },
9188 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit 6 is quad enable */
9189 .unlock = spi_disable_blockprotect_bp3_srwd,
9190 .write = spi_chip_write_256,
9191 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9192 .voltage = {1650, 3600},
9193 },
9194
9195 {
9196 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009197 .name = "MX25R6435F",
9198 .bustype = BUS_SPI,
9199 .manufacture_id = MACRONIX_ID,
9200 .model_id = MACRONIX_MX25R6435F,
9201 .total_size = 8192,
9202 .page_size = 256,
9203 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
9204 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9205 .tested = TEST_OK_PREW,
9206 .probe = probe_spi_rdid,
9207 .probe_timing = TIMING_ZERO,
9208 .block_erasers =
9209 {
9210 {
9211 .eraseblocks = { {4 * 1024, 2048} },
9212 .block_erase = spi_block_erase_20,
9213 }, {
9214 .eraseblocks = { {64 * 1024, 128} },
9215 .block_erase = spi_block_erase_d8,
9216 }, {
9217 .eraseblocks = { {32 * 1024, 256} },
9218 .block_erase = spi_block_erase_52,
9219 }, {
9220 .eraseblocks = { {8 * 1024 * 1024, 1} },
9221 .block_erase = spi_block_erase_60,
9222 }, {
9223 .eraseblocks = { {8 * 1024 * 1024, 1} },
9224 .block_erase = spi_block_erase_c7,
9225 }
9226 },
9227 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9228 .unlock = spi_disable_blockprotect_bp3_srwd,
9229 .write = spi_chip_write_256,
9230 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9231 .voltage = {1650, 3600},
9232 },
9233
9234 {
9235 .vendor = "Macronix",
Alex Lu831c6092017-11-02 23:19:34 -07009236 .name = "MX25U12835F",
9237 .bustype = BUS_SPI,
9238 .manufacture_id = MACRONIX_ID,
Alan Greendc0792e2019-07-01 15:01:34 +10009239 .model_id = MACRONIX_MX25U12835E,
Alex Lu831c6092017-11-02 23:19:34 -07009240 .total_size = 16384,
9241 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10009242 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +10009244 .tested = TEST_OK_PREW,
Alex Lu831c6092017-11-02 23:19:34 -07009245 .probe = probe_spi_rdid,
9246 .probe_timing = TIMING_ZERO,
9247 .block_erasers =
9248 {
9249 {
9250 .eraseblocks = { {4 * 1024, 4096} },
9251 .block_erase = spi_block_erase_20,
9252 }, {
9253 .eraseblocks = { {32 * 1024, 512} },
9254 .block_erase = spi_block_erase_52,
9255 }, {
9256 .eraseblocks = { {64 * 1024, 256} },
9257 .block_erase = spi_block_erase_d8,
9258 }, {
Nikolai Artemiev246c4452021-03-01 16:43:08 +11009259 .eraseblocks = { {16 * 1024 * 1024, 1} },
Alex Lu831c6092017-11-02 23:19:34 -07009260 .block_erase = spi_block_erase_60,
9261 }, {
Nikolai Artemiev246c4452021-03-01 16:43:08 +11009262 .eraseblocks = { {16 * 1024 * 1024, 1} },
Alex Lu831c6092017-11-02 23:19:34 -07009263 .block_erase = spi_block_erase_c7,
9264 }
9265 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10009266 /* TODO: security register */
9267 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemiev246c4452021-03-01 16:43:08 +11009268 .unlock = spi_disable_blockprotect_bp3_srwd,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10009269 .write = spi_chip_write_256, /* Multi I/O supported */
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009270 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alex Lu831c6092017-11-02 23:19:34 -07009271 .voltage = {1650, 2000},
Alex Lu831c6092017-11-02 23:19:34 -07009272 },
9273
Jongpil66a96492014-08-14 17:59:06 +09009274 {
9275 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009276 .name = "MX25U1635E",
9277 .bustype = BUS_SPI,
9278 .manufacture_id = MACRONIX_ID,
9279 .model_id = MACRONIX_MX25U1635E,
9280 .total_size = 2048,
9281 .page_size = 256,
9282 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9283 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9284 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9285 .tested = TEST_OK_PR,
9286 .probe = probe_spi_rdid,
9287 .probe_timing = TIMING_ZERO,
9288 .block_erasers =
9289 {
9290 {
9291 .eraseblocks = { {4 * 1024, 512} },
9292 .block_erase = spi_block_erase_20,
9293 }, {
9294 .eraseblocks = { {32 * 1024, 64} },
9295 .block_erase = spi_block_erase_52,
9296 }, {
9297 .eraseblocks = { {64 * 1024, 32} },
9298 .block_erase = spi_block_erase_d8,
9299 }, {
9300 .eraseblocks = { {2 * 1024 * 1024, 1} },
9301 .block_erase = spi_block_erase_60,
9302 }, {
9303 .eraseblocks = { {2 * 1024 * 1024, 1} },
9304 .block_erase = spi_block_erase_c7,
9305 }
9306 },
9307 /* TODO: security register */
9308 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9309 .unlock = spi_disable_blockprotect_bp3_srwd,
9310 .write = spi_chip_write_256,
9311 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9312 .voltage = {1650, 2000},
9313 },
9314
9315 {
9316 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07009317 .name = "MX25U25635F",
9318 .bustype = BUS_SPI,
9319 .manufacture_id = MACRONIX_ID,
9320 .model_id = MACRONIX_MX25U25635F,
Nikolai Artemieve8352562021-02-16 15:37:15 +11009321 .total_size = 32768,
David Hendricks419e32a2015-04-07 17:25:14 -07009322 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10009323 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9324 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
Alan Green1295b292019-07-30 13:38:04 +10009325 .tested = TEST_OK_PREW,
David Hendricks419e32a2015-04-07 17:25:14 -07009326 .probe = probe_spi_rdid,
9327 .probe_timing = TIMING_ZERO,
9328 .block_erasers =
9329 {
David Hendricks419e32a2015-04-07 17:25:14 -07009330 {
Nikolai Artemieve8352562021-02-16 15:37:15 +11009331 .eraseblocks = { {4 * 1024, 8192} },
9332 .block_erase = spi_block_erase_21,
9333 }, {
9334 .eraseblocks = { {4 * 1024, 8192} },
David Hendricks419e32a2015-04-07 17:25:14 -07009335 .block_erase = spi_block_erase_20,
9336 }, {
Nikolai Artemieve8352562021-02-16 15:37:15 +11009337 .eraseblocks = { {32 * 1024, 1024} },
9338 .block_erase = spi_block_erase_5c,
9339 }, {
9340 .eraseblocks = { {32 * 1024, 1024} },
David Hendricks419e32a2015-04-07 17:25:14 -07009341 .block_erase = spi_block_erase_52,
9342 }, {
Nikolai Artemieve8352562021-02-16 15:37:15 +11009343 .eraseblocks = { {64 * 1024, 512} },
9344 .block_erase = spi_block_erase_dc,
9345 }, {
9346 .eraseblocks = { {64 * 1024, 512} },
David Hendricks419e32a2015-04-07 17:25:14 -07009347 .block_erase = spi_block_erase_d8,
9348 }, {
Nikolai Artemieve8352562021-02-16 15:37:15 +11009349 .eraseblocks = { {32 * 1024 * 1024, 1} },
David Hendricks419e32a2015-04-07 17:25:14 -07009350 .block_erase = spi_block_erase_60,
9351 }, {
Nikolai Artemieve8352562021-02-16 15:37:15 +11009352 .eraseblocks = { {32 * 1024 * 1024, 1} },
David Hendricks419e32a2015-04-07 17:25:14 -07009353 .block_erase = spi_block_erase_c7,
9354 }
9355 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10009356 /* TODO: security register */
9357 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemieve8352562021-02-16 15:37:15 +11009358 .unlock = spi_disable_blockprotect_bp3_srwd,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +10009359 .write = spi_chip_write_256, /* Multi I/O supported */
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009360 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
David Hendricks419e32a2015-04-07 17:25:14 -07009361 .voltage = {1650, 2000},
David Hendricks419e32a2015-04-07 17:25:14 -07009362 },
9363
9364 {
9365 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10009366 .name = "MX25U3235E/F",
hailfingere1e41ea2011-07-27 07:13:06 +00009367 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00009368 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10009369 .model_id = MACRONIX_MX25U3235E,
9370 .total_size = 4096,
stuged8f34912009-04-21 01:47:16 +00009371 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10009372 /* F model supports SFDP */
9373 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9374 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9375 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Edward O'Callaghan34608d82020-10-01 21:43:48 +10009376 .tested = TEST_OK_PREW,
stuged8f34912009-04-21 01:47:16 +00009377 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00009378 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009379 .block_erasers =
9380 {
9381 {
Alan Greend76dc1f2019-06-26 15:38:19 +10009382 .eraseblocks = { {4 * 1024, 1024} },
snelson2d471072010-01-09 05:30:14 +00009383 .block_erase = spi_block_erase_20,
9384 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009385 .eraseblocks = { {32 * 1024, 128} },
9386 .block_erase = spi_block_erase_52,
9387 }, {
9388 .eraseblocks = { {64 * 1024, 64} },
snelson2d471072010-01-09 05:30:14 +00009389 .block_erase = spi_block_erase_d8,
9390 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009391 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00009392 .block_erase = spi_block_erase_60,
9393 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009394 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00009395 .block_erase = spi_block_erase_c7,
9396 }
9397 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10009398 /* TODO: security register */
9399 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemievdf0e1c92021-03-01 16:48:04 +11009400 .unlock = spi_disable_blockprotect_bp3_srwd,
hailfinger87c05482009-05-09 02:34:18 +00009401 .write = spi_chip_write_256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009402 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10009403 .voltage = {1650, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +10009404 },
9405
9406 {
9407 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009408 .name = "MX25U51245G",
9409 .bustype = BUS_SPI,
9410 .manufacture_id = MACRONIX_ID,
9411 .model_id = MACRONIX_MX25U51245G,
9412 .total_size = 65536,
9413 .page_size = 256,
9414 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
9415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
9416 .tested = TEST_OK_PREW,
9417 .probe = probe_spi_rdid,
9418 .probe_timing = TIMING_ZERO,
9419 .block_erasers =
9420 {
9421 {
9422 .eraseblocks = { {4 * 1024, 16384} },
9423 .block_erase = spi_block_erase_21,
9424 }, {
9425 .eraseblocks = { {4 * 1024, 16384} },
9426 .block_erase = spi_block_erase_20,
9427 }, {
9428 .eraseblocks = { {32 * 1024, 2048} },
9429 .block_erase = spi_block_erase_5c,
9430 }, {
9431 .eraseblocks = { {32 * 1024, 2048} },
9432 .block_erase = spi_block_erase_52,
9433 }, {
9434 .eraseblocks = { {64 * 1024, 1024} },
9435 .block_erase = spi_block_erase_dc,
9436 }, {
9437 .eraseblocks = { {64 * 1024, 1024} },
9438 .block_erase = spi_block_erase_d8,
9439 }, {
9440 .eraseblocks = { {64 * 1024 * 1024, 1} },
9441 .block_erase = spi_block_erase_60,
9442 }, {
9443 .eraseblocks = { {64 * 1024 * 1024, 1} },
9444 .block_erase = spi_block_erase_c7,
9445 }
9446 },
9447 /* TODO: security register */
9448 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9449 .unlock = spi_disable_blockprotect_bp3_srwd,
9450 .write = spi_chip_write_256, /* Multi I/O supported */
9451 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9452 .voltage = {1650, 2000},
9453 },
9454
9455 {
9456 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10009457 .name = "MX25U6435E/F",
9458 .bustype = BUS_SPI,
9459 .manufacture_id = MACRONIX_ID,
9460 .model_id = MACRONIX_MX25U6435E,
9461 .total_size = 8192,
9462 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +10009463 /* F model supports SFDP */
9464 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9465 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9466 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +10009467 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009468 .probe = probe_spi_rdid,
9469 .probe_timing = TIMING_ZERO,
9470 .block_erasers =
9471 {
9472 {
9473 .eraseblocks = { {4 * 1024, 2048} },
9474 .block_erase = spi_block_erase_20,
9475 }, {
9476 .eraseblocks = { {32 * 1024, 256} },
9477 .block_erase = spi_block_erase_52,
9478 }, {
9479 .eraseblocks = { {64 * 1024, 128} },
9480 .block_erase = spi_block_erase_d8,
9481 }, {
9482 .eraseblocks = { {8 * 1024 * 1024, 1} },
9483 .block_erase = spi_block_erase_60,
9484 }, {
9485 .eraseblocks = { {8 * 1024 * 1024, 1} },
9486 .block_erase = spi_block_erase_c7,
9487 }
9488 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +10009489 /* TODO: security register */
9490 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolai Artemiev24326222021-03-01 16:51:37 +11009491 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10009492 .write = spi_chip_write_256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +10009493 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +10009494 .voltage = {1650, 2000},
stuged8f34912009-04-21 01:47:16 +00009495 },
9496
9497 {
9498 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009499 .name = "MX25U8032E",
9500 .bustype = BUS_SPI,
9501 .manufacture_id = MACRONIX_ID,
9502 .model_id = MACRONIX_MX25U8032E,
9503 .total_size = 1024,
9504 .page_size = 256,
9505 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9506 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9507 .tested = TEST_OK_PREW,
9508 .probe = probe_spi_rdid,
9509 .probe_timing = TIMING_ZERO,
9510 .block_erasers =
9511 {
9512 {
9513 .eraseblocks = { {4 * 1024, 256} },
9514 .block_erase = spi_block_erase_20,
9515 }, {
9516 .eraseblocks = { {32 * 1024, 32} },
9517 .block_erase = spi_block_erase_52,
9518 }, {
9519 .eraseblocks = { {64 * 1024, 16} },
9520 .block_erase = spi_block_erase_d8,
9521 }, {
9522 .eraseblocks = { {1024 * 1024, 1} },
9523 .block_erase = spi_block_erase_60,
9524 }, {
9525 .eraseblocks = { {1024 * 1024, 1} },
9526 .block_erase = spi_block_erase_c7,
9527 }
9528 },
9529 /* TODO: security register */
9530 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9531 .unlock = spi_disable_blockprotect_bp3_srwd,
9532 .write = spi_chip_write_256,
9533 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9534 .voltage = {1650, 2000},
9535 },
9536
9537 {
9538 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00009539 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00009540 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009541 .manufacture_id = MACRONIX_ID,
9542 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00009543 .total_size = 128,
9544 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009545 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9546 .tested = TEST_UNTESTED,
9547 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009548 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009549 .block_erasers =
9550 {
9551 {
Simon Glass8dc82732013-07-16 10:13:51 -06009552 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00009553 {8 * 1024, 1},
9554 {4 * 1024, 2},
9555 {8 * 1024, 2},
9556 {32 * 1024, 1},
9557 {64 * 1024, 1},
9558 },
snelsonc6855342010-01-28 23:55:12 +00009559 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009560 }, {
9561 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009562 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009563 }
9564 },
hailfingerfff99532009-11-27 17:49:42 +00009565 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00009566 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009567 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00009568 },
9569
9570 {
9571 .vendor = "Macronix",
9572 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00009573 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009574 .manufacture_id = MACRONIX_ID,
9575 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00009576 .total_size = 128,
9577 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009578 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00009579 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00009580 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009581 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009582 .block_erasers =
9583 {
9584 {
Simon Glass8dc82732013-07-16 10:13:51 -06009585 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00009586 {64 * 1024, 1},
9587 {32 * 1024, 1},
9588 {8 * 1024, 2},
9589 {4 * 1024, 2},
9590 {8 * 1024, 1},
9591 },
snelsonc6855342010-01-28 23:55:12 +00009592 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009593 }, {
9594 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009595 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009596 }
9597 },
hailfingerfff99532009-11-27 17:49:42 +00009598 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00009599 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009600 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00009601 },
9602
9603 {
9604 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00009605 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00009606 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009607 .manufacture_id = MACRONIX_ID,
9608 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00009609 .total_size = 256,
9610 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009611 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009612 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009613 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009614 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00009615 .block_erasers =
9616 {
9617 {
9618 .eraseblocks = {
9619 {16 * 1024, 1},
9620 {8 * 1024, 2},
9621 {32 * 1024, 1},
9622 {64 * 1024, 3},
9623 },
snelsonc6855342010-01-28 23:55:12 +00009624 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009625 }, {
9626 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009627 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009628 },
9629 },
hailfingerfff99532009-11-27 17:49:42 +00009630 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009631 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009632 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009633 },
9634
hailfinger286829b2009-01-08 03:40:17 +00009635 {
9636 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00009637 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00009638 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009639 .manufacture_id = MACRONIX_ID,
9640 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00009641 .total_size = 256,
9642 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009643 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009644 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00009645 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009646 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00009647 .block_erasers =
9648 {
9649 {
9650 .eraseblocks = {
9651 {64 * 1024, 3},
9652 {32 * 1024, 1},
9653 {8 * 1024, 2},
9654 {16 * 1024, 1},
9655 },
snelsonc6855342010-01-28 23:55:12 +00009656 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009657 }, {
9658 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009659 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009660 },
9661 },
hailfingerfff99532009-11-27 17:49:42 +00009662 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009663 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009664 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009665 },
9666
hailfinger286829b2009-01-08 03:40:17 +00009667 {
9668 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009669 .name = "MX29F022(N)B",
9670 .bustype = BUS_PARALLEL,
9671 .manufacture_id = MACRONIX_ID,
9672 .model_id = MACRONIX_MX29F022B,
9673 .total_size = 256,
9674 .page_size = 0, /* unused */
9675 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9676 .tested = TEST_UNTESTED,
9677 .probe = probe_jedec,
9678 .probe_timing = TIMING_ZERO,
9679 .block_erasers =
9680 {
9681 {
9682 .eraseblocks = {
9683 {16 * 1024, 1},
9684 {8 * 1024, 2},
9685 {32 * 1024, 1},
9686 {64 * 1024, 3},
9687 },
9688 .block_erase = erase_sector_jedec,
9689 }, {
9690 .eraseblocks = { {256 * 1024, 1} },
9691 .block_erase = erase_chip_block_jedec,
9692 }
9693 },
9694 .write = write_jedec_1,
9695 .read = read_memmapped,
9696 .voltage = {4500, 5500},
9697 },
9698
9699 {
9700 .vendor = "Macronix",
9701 .name = "MX29F022(N)T",
9702 .bustype = BUS_PARALLEL,
9703 .manufacture_id = MACRONIX_ID,
9704 .model_id = MACRONIX_MX29F022T,
9705 .total_size = 256,
9706 .page_size = 0, /* unused */
9707 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9708 .tested = TEST_OK_PREW,
9709 .probe = probe_jedec,
9710 .probe_timing = TIMING_ZERO,
9711 .block_erasers =
9712 {
9713 {
9714 .eraseblocks = {
9715 {64 * 1024, 3},
9716 {32 * 1024, 1},
9717 {8 * 1024, 2},
9718 {16 * 1024, 1},
9719 },
9720 .block_erase = erase_sector_jedec,
9721 }, {
9722 .eraseblocks = { {256 * 1024, 1} },
9723 .block_erase = erase_chip_block_jedec,
9724 }
9725 },
9726 .write = write_jedec_1,
9727 .read = read_memmapped,
9728 .voltage = {4500, 5500},
9729 },
9730
9731 {
9732 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00009733 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00009734 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00009735 .manufacture_id = MACRONIX_ID,
9736 .model_id = MACRONIX_MX29F040,
9737 .total_size = 512,
9738 .page_size = 64 * 1024,
9739 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9740 .tested = TEST_UNTESTED,
9741 .probe = probe_jedec,
9742 .probe_timing = TIMING_ZERO,
9743 .block_erasers =
9744 {
9745 {
9746 .eraseblocks = { {64 * 1024, 8} },
9747 .block_erase = erase_sector_jedec,
9748 }, {
9749 .eraseblocks = { {512 * 1024, 1} },
9750 .block_erase = erase_chip_block_jedec,
9751 },
9752 },
9753 .write = write_jedec_1,
9754 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00009755 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00009756 },
9757
9758 {
9759 .vendor = "Macronix",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +10009760 .name = "MX29GL128F",
9761 .bustype = BUS_PARALLEL,
9762 .manufacture_id = MACRONIX_ID,
9763 .model_id = MACRONIX_MX29GL128F,
9764 .total_size = 16384,
9765 .page_size = 128 * 1024, /* actual page size is 16 */
9766 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9767 .tested = TEST_UNTESTED,
9768 .probe = probe_jedec_29gl,
9769 .probe_timing = TIMING_ZERO,
9770 .block_erasers =
9771 {
9772 {
9773 .eraseblocks = { {128 * 1024, 128} },
9774 .block_erase = erase_sector_jedec,
9775 }, {
9776 .eraseblocks = { {16 * 1024 * 1024, 1} },
9777 .block_erase = erase_chip_block_jedec,
9778 },
9779 },
9780 .write = write_jedec_1,
9781 .read = read_memmapped,
9782 .voltage = {2700, 3600},
9783 },
9784
9785 {
9786 .vendor = "Macronix",
9787 .name = "MX29GL320EB",
9788 .bustype = BUS_PARALLEL,
9789 .manufacture_id = MACRONIX_ID,
9790 .model_id = MACRONIX_MX29GL320EB,
9791 .total_size = 4096,
9792 .page_size = 128 * 1024, /* actual page size is 16 */
9793 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9794 .tested = TEST_UNTESTED,
9795 .probe = probe_jedec_29gl,
9796 .probe_timing = TIMING_ZERO,
9797 .block_erasers =
9798 {
9799 {
9800 .eraseblocks = {
9801 {8 * 1024, 8},
9802 {64 * 1024, 63},
9803 },
9804 .block_erase = erase_sector_jedec,
9805 }, {
9806 .eraseblocks = { {4 * 1024 * 1024, 1} },
9807 .block_erase = erase_chip_block_jedec,
9808 },
9809 },
9810 .write = write_jedec_1,
9811 .read = read_memmapped,
9812 .voltage = {2700, 3600},
9813 },
9814
9815 {
9816 .vendor = "Macronix",
9817 .name = "MX29GL320EH/L",
9818 .bustype = BUS_PARALLEL,
9819 .manufacture_id = MACRONIX_ID,
9820 .model_id = MACRONIX_MX29GL320EHL,
9821 .total_size = 4096,
9822 .page_size = 128 * 1024, /* actual page size is 16 */
9823 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9824 .tested = TEST_UNTESTED,
9825 .probe = probe_jedec_29gl,
9826 .probe_timing = TIMING_ZERO,
9827 .block_erasers =
9828 {
9829 {
9830 .eraseblocks = { {64 * 1024, 64} },
9831 .block_erase = erase_sector_jedec,
9832 }, {
9833 .eraseblocks = { {4 * 1024 * 1024, 1} },
9834 .block_erase = erase_chip_block_jedec,
9835 },
9836 },
9837 .write = write_jedec_1,
9838 .read = read_memmapped,
9839 .voltage = {2700, 3600},
9840 },
9841
9842 {
9843 .vendor = "Macronix",
9844 .name = "MX29GL320ET",
9845 .bustype = BUS_PARALLEL,
9846 .manufacture_id = MACRONIX_ID,
9847 .model_id = MACRONIX_MX29GL320ET,
9848 .total_size = 4096,
9849 .page_size = 128 * 1024, /* actual page size is 16 */
9850 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9851 .tested = TEST_UNTESTED,
9852 .probe = probe_jedec_29gl,
9853 .probe_timing = TIMING_ZERO,
9854 .block_erasers =
9855 {
9856 {
9857 .eraseblocks = {
9858 {64 * 1024, 63},
9859 {8 * 1024, 8},
9860 },
9861 .block_erase = erase_sector_jedec,
9862 }, {
9863 .eraseblocks = { {4 * 1024 * 1024, 1} },
9864 .block_erase = erase_chip_block_jedec,
9865 },
9866 },
9867 .write = write_jedec_1,
9868 .read = read_memmapped,
9869 .voltage = {2700, 3600},
9870 },
9871
9872 {
9873 .vendor = "Macronix",
9874 .name = "MX29GL640EB",
9875 .bustype = BUS_PARALLEL,
9876 .manufacture_id = MACRONIX_ID,
9877 .model_id = MACRONIX_MX29GL640EB,
9878 .total_size = 8192,
9879 .page_size = 128 * 1024, /* actual page size is 16 */
9880 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9881 .tested = TEST_UNTESTED,
9882 .probe = probe_jedec_29gl,
9883 .probe_timing = TIMING_ZERO,
9884 .block_erasers =
9885 {
9886 {
9887 .eraseblocks = {
9888 {8 * 1024, 8},
9889 {64 * 1024, 127},
9890 },
9891 .block_erase = erase_sector_jedec,
9892 }, {
9893 .eraseblocks = { {8 * 1024 * 1024, 1} },
9894 .block_erase = erase_chip_block_jedec,
9895 },
9896 },
9897 .write = write_jedec_1,
9898 .read = read_memmapped,
9899 .voltage = {2700, 3600},
9900 },
9901
9902 {
9903 .vendor = "Macronix",
9904 .name = "MX29GL640EH/L",
9905 .bustype = BUS_PARALLEL,
9906 .manufacture_id = MACRONIX_ID,
9907 .model_id = MACRONIX_MX29GL640EHL,
9908 .total_size = 8192,
9909 .page_size = 128 * 1024, /* actual page size is 16 */
9910 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9911 .tested = TEST_UNTESTED,
9912 .probe = probe_jedec_29gl,
9913 .probe_timing = TIMING_ZERO,
9914 .block_erasers =
9915 {
9916 {
9917 .eraseblocks = { {64 * 1024, 128} },
9918 .block_erase = erase_sector_jedec,
9919 }, {
9920 .eraseblocks = { {8 * 1024 * 1024, 1} },
9921 .block_erase = erase_chip_block_jedec,
9922 },
9923 },
9924 .write = write_jedec_1,
9925 .read = read_memmapped,
9926 .voltage = {2700, 3600},
9927 },
9928
9929 {
9930 .vendor = "Macronix",
9931 .name = "MX29GL640ET",
9932 .bustype = BUS_PARALLEL,
9933 .manufacture_id = MACRONIX_ID,
9934 .model_id = MACRONIX_MX29GL640ET,
9935 .total_size = 8192,
9936 .page_size = 128 * 1024, /* actual page size is 16 */
9937 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9938 .tested = TEST_UNTESTED,
9939 .probe = probe_jedec_29gl,
9940 .probe_timing = TIMING_ZERO,
9941 .block_erasers =
9942 {
9943 {
9944 .eraseblocks = {
9945 {64 * 1024, 127},
9946 {8 * 1024, 8},
9947 },
9948 .block_erase = erase_sector_jedec,
9949 }, {
9950 .eraseblocks = { {8 * 1024 * 1024, 1} },
9951 .block_erase = erase_chip_block_jedec,
9952 },
9953 },
9954 .write = write_jedec_1,
9955 .read = read_memmapped,
9956 .voltage = {2700, 3600},
9957 },
9958
9959 {
9960 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00009961 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00009962 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009963 .manufacture_id = MACRONIX_ID,
9964 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00009965 .total_size = 512,
9966 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009967 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9968 .tested = TEST_UNTESTED,
9969 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009970 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009971 .block_erasers =
9972 {
9973 {
Alan Green0d97b472019-07-26 10:33:25 +10009974 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +00009975 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009976 }, {
9977 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009978 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009979 },
9980 },
hailfingerfff99532009-11-27 17:49:42 +00009981 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009982 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009983 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00009984 },
9985
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +10009986 {
9987 .vendor = "Macronix",
9988 .name = "MX66L51235F/MX25L51245G",
9989 .bustype = BUS_SPI,
9990 .manufacture_id = MACRONIX_ID,
9991 .model_id = MACRONIX_MX66L51235F,
9992 .total_size = 65536,
9993 .page_size = 256,
9994 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9995 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
9996 .tested = TEST_OK_PREW,
9997 .probe = probe_spi_rdid,
9998 .probe_timing = TIMING_ZERO,
9999 .block_erasers =
10000 {
10001 {
10002 .eraseblocks = { {4 * 1024, 16384} },
10003 .block_erase = spi_block_erase_21,
10004 }, {
10005 .eraseblocks = { {4 * 1024, 16384} },
10006 .block_erase = spi_block_erase_20,
10007 }, {
10008 .eraseblocks = { {32 * 1024, 2048} },
10009 .block_erase = spi_block_erase_5c,
10010 }, {
10011 .eraseblocks = { {32 * 1024, 2048} },
10012 .block_erase = spi_block_erase_52,
10013 }, {
10014 .eraseblocks = { {64 * 1024, 1024} },
10015 .block_erase = spi_block_erase_dc,
10016 }, {
10017 .eraseblocks = { {64 * 1024, 1024} },
10018 .block_erase = spi_block_erase_d8,
10019 }, {
10020 .eraseblocks = { {64 * 1024 * 1024, 1} },
10021 .block_erase = spi_block_erase_60,
10022 }, {
10023 .eraseblocks = { {64 * 1024 * 1024, 1} },
10024 .block_erase = spi_block_erase_c7,
10025 }
10026 },
10027 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10028 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10029 .unlock = spi_disable_blockprotect_bp3_srwd,
10030 .write = spi_chip_write_256,
10031 .read = spi_chip_read, /* Fast read (0x0B) supported */
10032 .voltage = {2700, 3600},
10033 },
10034
Alan Green82e27422019-08-26 12:18:10 +100010035 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10036 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10037 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10038 * only is successful if RDID does not work.
10039 */
hailfinger286829b2009-01-08 03:40:17 +000010040 {
Alan Green82e27422019-08-26 12:18:10 +100010041 .vendor = "Micron/Numonyx/ST",
10042 .name = "M25P05",
10043 .bustype = BUS_SPI,
10044 .manufacture_id = 0, /* Not used. */
10045 .model_id = ST_M25P05_RES,
10046 .total_size = 64,
10047 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010048 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010049 .tested = TEST_UNTESTED,
10050 .probe = probe_spi_res1,
10051 .probe_timing = TIMING_ZERO,
10052 .block_erasers =
10053 {
10054 {
10055 .eraseblocks = { {32 * 1024, 2} },
10056 .block_erase = spi_block_erase_d8,
10057 }, {
10058 .eraseblocks = { {64 * 1024, 1} },
10059 .block_erase = spi_block_erase_c7,
10060 }
10061 },
Alan Green197c7432019-09-09 17:24:41 +100010062 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10063 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010064 .write = spi_chip_write_1, /* 128 */
10065 .read = spi_chip_read,
10066 .voltage = {2700, 3600},
10067 },
10068
10069 {
10070 .vendor = "Micron/Numonyx/ST",
10071 .name = "M25P05-A",
10072 .bustype = BUS_SPI,
10073 .manufacture_id = ST_ID,
10074 .model_id = ST_M25P05A,
10075 .total_size = 64,
10076 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010077 .feature_bits = FEATURE_WRSR_WREN,
10078 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010079 .probe = probe_spi_rdid,
10080 .probe_timing = TIMING_ZERO,
10081 .block_erasers =
10082 {
10083 {
10084 .eraseblocks = { {32 * 1024, 2} },
10085 .block_erase = spi_block_erase_d8,
10086 }, {
10087 .eraseblocks = { {64 * 1024, 1} },
10088 .block_erase = spi_block_erase_c7,
10089 }
10090 },
Alan Green197c7432019-09-09 17:24:41 +100010091 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10092 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010093 .write = spi_chip_write_256,
10094 .read = spi_chip_read,
10095 .voltage = {2700, 3600},
10096 },
10097
10098 /* The ST M25P10 has the same problem as the M25P05. */
10099 {
10100 .vendor = "Micron/Numonyx/ST",
10101 .name = "M25P10",
10102 .bustype = BUS_SPI,
10103 .manufacture_id = 0, /* Not used. */
10104 .model_id = ST_M25P10_RES,
10105 .total_size = 128,
10106 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010107 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010108 .tested = TEST_UNTESTED,
10109 .probe = probe_spi_res1,
10110 .probe_timing = TIMING_ZERO,
10111 .block_erasers =
10112 {
10113 {
10114 .eraseblocks = { {32 * 1024, 4} },
10115 .block_erase = spi_block_erase_d8,
10116 }, {
10117 .eraseblocks = { {128 * 1024, 1} },
10118 .block_erase = spi_block_erase_c7,
10119 }
10120 },
Alan Green197c7432019-09-09 17:24:41 +100010121 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10122 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010123 .write = spi_chip_write_1, /* 128 */
10124 .read = spi_chip_read,
10125 .voltage = {2700, 3600},
10126 },
10127
10128 {
10129 .vendor = "Micron/Numonyx/ST",
10130 .name = "M25P10-A",
10131 .bustype = BUS_SPI,
10132 .manufacture_id = ST_ID,
10133 .model_id = ST_M25P10A,
10134 .total_size = 128,
10135 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010136 .feature_bits = FEATURE_WRSR_WREN,
10137 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010138 .probe = probe_spi_rdid,
10139 .probe_timing = TIMING_ZERO,
10140 .block_erasers =
10141 {
10142 {
10143 .eraseblocks = { {32 * 1024, 4} },
10144 .block_erase = spi_block_erase_d8,
10145 }, {
10146 .eraseblocks = { {128 * 1024, 1} },
10147 .block_erase = spi_block_erase_c7,
10148 }
10149 },
Alan Green197c7432019-09-09 17:24:41 +100010150 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10151 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010152 .write = spi_chip_write_256,
10153 .read = spi_chip_read,
10154 .voltage = {2700, 3600},
10155 },
10156
10157 {
10158 .vendor = "Micron/Numonyx/ST",
10159 .name = "M25P128",
10160 .bustype = BUS_SPI,
10161 .manufacture_id = ST_ID,
10162 .model_id = ST_M25P128,
10163 .total_size = 16384,
10164 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010165 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010166 .tested = TEST_OK_PREW,
10167 .probe = probe_spi_rdid,
10168 .probe_timing = TIMING_ZERO,
10169 .block_erasers =
10170 {
10171 {
10172 .eraseblocks = { {256 * 1024, 64} },
10173 .block_erase = spi_block_erase_d8,
10174 }, {
10175 .eraseblocks = { {16 * 1024 * 1024, 1} },
10176 .block_erase = spi_block_erase_c7,
10177 }
10178 },
Alan Green197c7432019-09-09 17:24:41 +100010179 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10180 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010181 .write = spi_chip_write_256,
10182 .read = spi_chip_read,
10183 .voltage = {2700, 3600},
10184 },
10185
10186 {
10187 .vendor = "Micron/Numonyx/ST",
10188 .name = "M25P16",
10189 .bustype = BUS_SPI,
10190 .manufacture_id = ST_ID,
10191 .model_id = ST_M25P16,
10192 .total_size = 2048,
10193 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010194 .feature_bits = FEATURE_WRSR_WREN,
10195 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010196 .probe = probe_spi_rdid,
10197 .probe_timing = TIMING_ZERO,
10198 .block_erasers =
10199 {
10200 {
10201 .eraseblocks = { {64 * 1024, 32} },
10202 .block_erase = spi_block_erase_d8,
10203 }, {
10204 .eraseblocks = { {2 * 1024 * 1024, 1} },
10205 .block_erase = spi_block_erase_c7,
10206 }
10207 },
Alan Green197c7432019-09-09 17:24:41 +100010208 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10209 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010210 .write = spi_chip_write_256,
10211 .read = spi_chip_read,
10212 .voltage = {2700, 3600},
10213 },
10214
10215 {
10216 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10217 .name = "M25P20",
10218 .bustype = BUS_SPI,
10219 .manufacture_id = ST_ID,
10220 .model_id = ST_M25P20,
10221 .total_size = 256,
10222 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010223 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010224 .tested = TEST_UNTESTED,
10225 .probe = probe_spi_rdid,
10226 .probe_timing = TIMING_ZERO,
10227 .block_erasers =
10228 {
10229 {
10230 .eraseblocks = { {64 * 1024, 4} },
10231 .block_erase = spi_block_erase_d8,
10232 }, {
10233 .eraseblocks = { {256 * 1024, 1} },
10234 .block_erase = spi_block_erase_c7,
10235 }
10236 },
Alan Green197c7432019-09-09 17:24:41 +100010237 .printlock = spi_prettyprint_status_register_bp1_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010238 .unlock = spi_disable_blockprotect,
10239 .write = spi_chip_write_256,
10240 .read = spi_chip_read, /* Fast read (0x0B) supported */
10241 .voltage = {2700, 3600},
10242 },
10243
10244 {
10245 .vendor = "Micron/Numonyx/ST",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +100010246 .name = "M25P20-old",
10247 .bustype = BUS_SPI,
10248 .manufacture_id = 0, /* Not used. */
10249 .model_id = ST_M25P20_RES,
10250 .total_size = 256,
10251 .page_size = 256,
10252 .feature_bits = FEATURE_WRSR_WREN,
10253 .tested = TEST_OK_PREW,
10254 .probe = probe_spi_res1,
10255 .probe_timing = TIMING_ZERO,
10256 .block_erasers =
10257 {
10258 {
10259 .eraseblocks = { {64 * 1024, 4} },
10260 .block_erase = spi_block_erase_d8,
10261 }, {
10262 .eraseblocks = { {256 * 1024, 1} },
10263 .block_erase = spi_block_erase_c7,
10264 }
10265 },
10266 .printlock = spi_prettyprint_status_register_bp1_srwd,
10267 .unlock = spi_disable_blockprotect,
10268 .write = spi_chip_write_256,
10269 .read = spi_chip_read, /* Fast read (0x0B) supported */
10270 .voltage = {2700, 3600},
10271 },
10272
10273 {
10274 .vendor = "Micron/Numonyx/ST",
Alan Green82e27422019-08-26 12:18:10 +100010275 .name = "M25P32",
10276 .bustype = BUS_SPI,
10277 .manufacture_id = ST_ID,
10278 .model_id = ST_M25P32,
10279 .total_size = 4096,
10280 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010281 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010282 .tested = TEST_OK_PREW,
10283 .probe = probe_spi_rdid,
10284 .probe_timing = TIMING_ZERO,
10285 .block_erasers =
10286 {
10287 {
10288 .eraseblocks = { {64 * 1024, 64} },
10289 .block_erase = spi_block_erase_d8,
10290 }, {
10291 .eraseblocks = { {4 * 1024 * 1024, 1} },
10292 .block_erase = spi_block_erase_c7,
10293 }
10294 },
Alan Green197c7432019-09-09 17:24:41 +100010295 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10296 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010297 .write = spi_chip_write_256,
10298 .read = spi_chip_read,
10299 .voltage = {2700, 3600},
10300 },
10301
10302 {
10303 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10304 .name = "M25P40",
10305 .bustype = BUS_SPI,
10306 .manufacture_id = ST_ID,
10307 .model_id = ST_M25P40,
10308 .total_size = 512,
10309 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010310 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010311 .tested = TEST_OK_PREW,
10312 .probe = probe_spi_rdid,
10313 .probe_timing = TIMING_ZERO,
10314 .block_erasers =
10315 {
10316 {
10317 .eraseblocks = { {64 * 1024, 8} },
10318 .block_erase = spi_block_erase_d8,
10319 }, {
10320 .eraseblocks = { {512 * 1024, 1} },
10321 .block_erase = spi_block_erase_c7,
10322 }
10323 },
Alan Green197c7432019-09-09 17:24:41 +100010324 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10325 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010326 .write = spi_chip_write_256,
10327 .read = spi_chip_read,
10328 .voltage = {2700, 3600},
10329 },
10330
10331 {
10332 .vendor = "Micron/Numonyx/ST",
10333 .name = "M25P40-old",
10334 .bustype = BUS_SPI,
10335 .manufacture_id = 0, /* Not used. */
10336 .model_id = ST_M25P40_RES,
10337 .total_size = 512,
10338 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010339 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010340 .tested = TEST_UNTESTED,
10341 .probe = probe_spi_res1,
10342 .probe_timing = TIMING_ZERO,
10343 .block_erasers =
10344 {
10345 {
10346 .eraseblocks = { {64 * 1024, 8} },
10347 .block_erase = spi_block_erase_d8,
10348 }, {
10349 .eraseblocks = { {512 * 1024, 1} },
10350 .block_erase = spi_block_erase_c7,
10351 }
10352 },
Alan Green197c7432019-09-09 17:24:41 +100010353 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10354 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010355 .write = spi_chip_write_256,
10356 .read = spi_chip_read,
10357 },
10358
10359 {
10360 .vendor = "Micron/Numonyx/ST",
10361 .name = "M25P64",
10362 .bustype = BUS_SPI,
10363 .manufacture_id = ST_ID,
10364 .model_id = ST_M25P64,
10365 .total_size = 8192,
10366 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010367 .feature_bits = FEATURE_WRSR_WREN,
10368 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010369 .probe = probe_spi_rdid,
10370 .probe_timing = TIMING_ZERO,
10371 .block_erasers =
10372 {
10373 {
10374 .eraseblocks = { {64 * 1024, 128} },
10375 .block_erase = spi_block_erase_d8,
10376 }, {
10377 .eraseblocks = { {8 * 1024 * 1024, 1} },
10378 .block_erase = spi_block_erase_c7,
10379 }
10380 },
Alan Green197c7432019-09-09 17:24:41 +100010381 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10382 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010383 .write = spi_chip_write_256,
10384 .read = spi_chip_read,
10385 .voltage = {2700, 3600},
10386 },
10387
10388 {
10389 .vendor = "Micron/Numonyx/ST",
10390 .name = "M25P80",
10391 .bustype = BUS_SPI,
10392 .manufacture_id = ST_ID,
10393 .model_id = ST_M25P80,
10394 .total_size = 1024,
10395 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010396 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010397 .tested = TEST_OK_PREW,
10398 .probe = probe_spi_rdid,
10399 .probe_timing = TIMING_ZERO,
10400 .block_erasers =
10401 {
10402 {
10403 .eraseblocks = { {64 * 1024, 16} },
10404 .block_erase = spi_block_erase_d8,
10405 }, {
10406 .eraseblocks = { {1024 * 1024, 1} },
10407 .block_erase = spi_block_erase_c7,
10408 }
10409 },
Alan Green197c7432019-09-09 17:24:41 +100010410 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10411 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010412 .write = spi_chip_write_256,
10413 .read = spi_chip_read,
10414 .voltage = {2700, 3600},
10415 },
10416
10417 {
10418 .vendor = "Micron/Numonyx/ST",
10419 .name = "M25PE10",
10420 .bustype = BUS_SPI,
10421 .manufacture_id = ST_ID,
10422 .model_id = ST_M25PE10,
10423 .total_size = 128,
10424 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010425 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010426 .tested = TEST_UNTESTED,
10427 .probe = probe_spi_rdid,
10428 .probe_timing = TIMING_ZERO,
10429 .block_erasers =
10430 {
10431 {
10432 .eraseblocks = { {4 * 1024, 32} },
10433 .block_erase = spi_block_erase_20,
10434 }, {
10435 .eraseblocks = { {64 * 1024, 2} },
10436 .block_erase = spi_block_erase_d8,
10437 }, {
10438 .eraseblocks = { {128 * 1024, 1} },
10439 .block_erase = spi_block_erase_c7,
10440 }
10441 },
Alan Green197c7432019-09-09 17:24:41 +100010442 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010443 .unlock = spi_disable_blockprotect,
10444 .write = spi_chip_write_256,
10445 .read = spi_chip_read,
10446 .voltage = {2700, 3600},
10447 },
10448
10449 {
10450 .vendor = "Micron/Numonyx/ST",
10451 .name = "M25PE16",
10452 .bustype = BUS_SPI,
10453 .manufacture_id = ST_ID,
10454 .model_id = ST_M25PE16,
10455 .total_size = 2048,
10456 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010457 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010458 .tested = TEST_UNTESTED,
10459 .probe = probe_spi_rdid,
10460 .probe_timing = TIMING_ZERO,
10461 .block_erasers =
10462 {
10463 {
10464 .eraseblocks = { {4 * 1024, 512} },
10465 .block_erase = spi_block_erase_20,
10466 }, {
10467 .eraseblocks = { {64 * 1024, 32} },
10468 .block_erase = spi_block_erase_d8,
10469 }, {
10470 .eraseblocks = { {2 * 1024 * 1024, 1} },
10471 .block_erase = spi_block_erase_c7,
10472 }
10473 },
Alan Green197c7432019-09-09 17:24:41 +100010474 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010475 .unlock = spi_disable_blockprotect,
10476 .write = spi_chip_write_256,
10477 .read = spi_chip_read,
10478 .voltage = {2700, 3600},
10479 },
10480
10481 {
10482 .vendor = "Micron/Numonyx/ST",
10483 .name = "M25PE20",
10484 .bustype = BUS_SPI,
10485 .manufacture_id = ST_ID,
10486 .model_id = ST_M25PE20,
10487 .total_size = 256,
10488 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010489 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010490 .tested = TEST_UNTESTED,
10491 .probe = probe_spi_rdid,
10492 .probe_timing = TIMING_ZERO,
10493 .block_erasers =
10494 {
10495 {
10496 .eraseblocks = { {4 * 1024, 64} },
10497 .block_erase = spi_block_erase_20,
10498 }, {
10499 .eraseblocks = { {64 * 1024, 4} },
10500 .block_erase = spi_block_erase_d8,
10501 }, {
10502 .eraseblocks = { {256 * 1024, 1} },
10503 .block_erase = spi_block_erase_c7,
10504 }
10505 },
Alan Green197c7432019-09-09 17:24:41 +100010506 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010507 .unlock = spi_disable_blockprotect,
10508 .write = spi_chip_write_256,
10509 .read = spi_chip_read,
10510 .voltage = {2700, 3600},
10511 },
10512
10513 {
10514 .vendor = "Micron/Numonyx/ST",
10515 .name = "M25PE40",
10516 .bustype = BUS_SPI,
10517 .manufacture_id = ST_ID,
10518 .model_id = ST_M25PE40,
10519 .total_size = 512,
10520 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010521 .feature_bits = FEATURE_WRSR_WREN,
10522 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010523 .probe = probe_spi_rdid,
10524 .probe_timing = TIMING_ZERO,
10525 .block_erasers =
10526 {
10527 {
10528 .eraseblocks = { {4 * 1024, 128} },
10529 .block_erase = spi_block_erase_20,
10530 }, {
10531 .eraseblocks = { {64 * 1024, 8} },
10532 .block_erase = spi_block_erase_d8,
10533 }, {
10534 .eraseblocks = { {512 * 1024, 1} },
10535 .block_erase = spi_block_erase_c7,
10536 }
10537 },
Alan Green197c7432019-09-09 17:24:41 +100010538 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010539 .unlock = spi_disable_blockprotect,
10540 .write = spi_chip_write_256,
10541 .read = spi_chip_read,
10542 .voltage = {2700, 3600},
10543 },
10544
10545 {
10546 .vendor = "Micron/Numonyx/ST",
10547 .name = "M25PE80",
10548 .bustype = BUS_SPI,
10549 .manufacture_id = ST_ID,
10550 .model_id = ST_M25PE80,
10551 .total_size = 1024,
10552 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010553 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010554 .tested = TEST_OK_PREW,
10555 .probe = probe_spi_rdid,
10556 .probe_timing = TIMING_ZERO,
10557 .block_erasers =
10558 {
10559 {
10560 .eraseblocks = { {4 * 1024, 256} },
10561 .block_erase = spi_block_erase_20,
10562 }, {
10563 .eraseblocks = { {64 * 1024, 16} },
10564 .block_erase = spi_block_erase_d8,
10565 }, {
10566 .eraseblocks = { {1024 * 1024, 1} },
10567 .block_erase = spi_block_erase_c7,
10568 }
10569 },
Alan Green197c7432019-09-09 17:24:41 +100010570 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010571 .unlock = spi_disable_blockprotect,
10572 .write = spi_chip_write_256,
10573 .read = spi_chip_read,
10574 .voltage = {2700, 3600},
10575 },
10576
10577 {
10578 .vendor = "Micron/Numonyx/ST",
10579 .name = "M25PX16",
10580 .bustype = BUS_SPI,
10581 .manufacture_id = ST_ID,
10582 .model_id = ST_M25PX16,
10583 .total_size = 2048,
10584 .page_size = 256,
10585 /* OTP: 64B total; read 0x4B; write 0x42 */
Alan Green197c7432019-09-09 17:24:41 +100010586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +100010587 .tested = TEST_OK_PREW,
10588 .probe = probe_spi_rdid,
10589 .probe_timing = TIMING_ZERO,
10590 .block_erasers =
10591 {
10592 {
10593 .eraseblocks = { { 4 * 1024, 512 } },
10594 .block_erase = spi_block_erase_20,
10595 }, {
10596 .eraseblocks = { {64 * 1024, 32} },
10597 .block_erase = spi_block_erase_d8,
10598 }, {
10599 .eraseblocks = { {2 * 1024 * 1024, 1} },
10600 .block_erase = spi_block_erase_c7,
10601 }
10602 },
Alan Green197c7432019-09-09 17:24:41 +100010603 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10604 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010605 .write = spi_chip_write_256,
10606 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100010607 .voltage = {2300, 3600},
Alan Green82e27422019-08-26 12:18:10 +100010608 },
10609
10610 {
10611 .vendor = "Micron/Numonyx/ST",
10612 .name = "M25PX32",
10613 .bustype = BUS_SPI,
10614 .manufacture_id = ST_ID,
10615 .model_id = ST_M25PX32,
10616 .total_size = 4096,
10617 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010618 /* OTP: 64B total; read 0x4B; write 0x42 */
10619 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +100010620 .tested = TEST_OK_PRE,
10621 .probe = probe_spi_rdid,
10622 .probe_timing = TIMING_ZERO,
10623 .block_erasers =
10624 {
10625 {
10626 .eraseblocks = { { 4 * 1024, 1024 } },
10627 .block_erase = spi_block_erase_20,
10628 }, {
10629 .eraseblocks = { {64 * 1024, 64} },
10630 .block_erase = spi_block_erase_d8,
10631 }, {
10632 .eraseblocks = { {4 * 1024 * 1024, 1} },
10633 .block_erase = spi_block_erase_c7,
10634 }
10635 },
Alan Green197c7432019-09-09 17:24:41 +100010636 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10637 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010638 .write = spi_chip_write_256,
10639 .read = spi_chip_read,
10640 .voltage = {2700, 3600},
10641 },
10642
10643 {
10644 .vendor = "Micron/Numonyx/ST",
10645 .name = "M25PX64",
10646 .bustype = BUS_SPI,
10647 .manufacture_id = ST_ID,
10648 .model_id = ST_M25PX64,
10649 .total_size = 8192,
10650 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010651 /* OTP: 64B total; read 0x4B; write 0x42 */
10652 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10653 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010654 .probe = probe_spi_rdid,
10655 .probe_timing = TIMING_ZERO,
10656 .block_erasers =
10657 {
10658 {
10659 .eraseblocks = { { 4 * 1024, 2048 } },
10660 .block_erase = spi_block_erase_20,
10661 }, {
10662 .eraseblocks = { {64 * 1024, 128} },
10663 .block_erase = spi_block_erase_d8,
10664 }, {
10665 .eraseblocks = { {8 * 1024 * 1024, 1} },
10666 .block_erase = spi_block_erase_c7,
10667 }
10668 },
Alan Green197c7432019-09-09 17:24:41 +100010669 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10670 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010671 .write = spi_chip_write_256,
10672 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100010673 .voltage = {2700, 3600},
Alan Green82e27422019-08-26 12:18:10 +100010674 },
10675
10676 {
10677 .vendor = "Micron/Numonyx/ST",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +100010678 .name = "M25PX80",
10679 .bustype = BUS_SPI,
10680 .manufacture_id = ST_ID,
10681 .model_id = ST_M25PX80,
10682 .total_size = 1024,
10683 .page_size = 256,
10684 /* OTP: 64B total; read 0x4B, write 0x42 */
10685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10686 .tested = TEST_OK_PREW,
10687 .probe = probe_spi_rdid,
10688 .probe_timing = TIMING_ZERO,
10689 .block_erasers =
10690 {
10691 {
10692 .eraseblocks = { { 4 * 1024, 256 } },
10693 .block_erase = spi_block_erase_20,
10694 }, {
10695 .eraseblocks = { {64 * 1024, 16} },
10696 .block_erase = spi_block_erase_d8,
10697 }, {
10698 .eraseblocks = { {1024 * 1024, 1} },
10699 .block_erase = spi_block_erase_c7,
10700 }
10701 },
10702 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10703 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10704 .write = spi_chip_write_256,
10705 .read = spi_chip_read,
10706 .voltage = {2700, 3600},
10707 },
10708
10709 {
10710 .vendor = "Micron/Numonyx/ST",
Nikolai Artemieve51e5302020-08-31 17:46:48 +100010711 .name = "M45PE10",
10712 .bustype = BUS_SPI,
10713 .manufacture_id = ST_ID,
10714 .model_id = ST_M45PE10,
10715 .total_size = 128,
10716 .page_size = 256,
10717 .tested = TEST_UNTESTED,
10718 .probe = probe_spi_rdid,
10719 .probe_timing = TIMING_ZERO,
10720 .block_erasers =
10721 {
10722 {
10723 .eraseblocks = { {256, 512} },
10724 .block_erase = spi_block_erase_db,
10725 }, {
10726 .eraseblocks = { {64 * 1024, 2} },
10727 .block_erase = spi_block_erase_d8,
10728 }
10729 },
10730 .printlock = spi_prettyprint_status_register_default_welwip,
10731 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10732 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10733 .read = spi_chip_read, /* Fast read (0x0B) supported */
10734 .voltage = {2700, 3600},
10735 },
10736
10737 {
10738 .vendor = "Micron/Numonyx/ST",
10739 .name = "M45PE16",
10740 .bustype = BUS_SPI,
10741 .manufacture_id = ST_ID,
10742 .model_id = ST_M45PE16,
10743 .total_size = 2048,
10744 .page_size = 256,
10745 .tested = TEST_UNTESTED,
10746 .probe = probe_spi_rdid,
10747 .probe_timing = TIMING_ZERO,
10748 .block_erasers =
10749 {
10750 {
10751 .eraseblocks = { {256, 8192} },
10752 .block_erase = spi_block_erase_db,
10753 }, {
10754 .eraseblocks = { {64 * 1024, 32} },
10755 .block_erase = spi_block_erase_d8,
10756 }
10757 },
10758 .printlock = spi_prettyprint_status_register_default_welwip,
10759 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10760 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10761 .read = spi_chip_read, /* Fast read (0x0B) supported */
10762 .voltage = {2700, 3600},
10763 },
10764
10765 {
10766 .vendor = "Micron/Numonyx/ST",
10767 .name = "M45PE20",
10768 .bustype = BUS_SPI,
10769 .manufacture_id = ST_ID,
10770 .model_id = ST_M45PE20,
10771 .total_size = 256,
10772 .page_size = 256,
10773 .tested = TEST_UNTESTED,
10774 .probe = probe_spi_rdid,
10775 .probe_timing = TIMING_ZERO,
10776 .block_erasers =
10777 {
10778 {
10779 .eraseblocks = { {256, 1024} },
10780 .block_erase = spi_block_erase_db,
10781 }, {
10782 .eraseblocks = { {64 * 1024, 4} },
10783 .block_erase = spi_block_erase_d8,
10784 }
10785 },
10786 .printlock = spi_prettyprint_status_register_default_welwip,
10787 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10788 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10789 .read = spi_chip_read, /* Fast read (0x0B) supported */
10790 .voltage = {2700, 3600},
10791 },
10792
10793 {
10794 .vendor = "Micron/Numonyx/ST",
10795 .name = "M45PE40",
10796 .bustype = BUS_SPI,
10797 .manufacture_id = ST_ID,
10798 .model_id = ST_M45PE40,
10799 .total_size = 512,
10800 .page_size = 256,
10801 .tested = TEST_UNTESTED,
10802 .probe = probe_spi_rdid,
10803 .probe_timing = TIMING_ZERO,
10804 .block_erasers =
10805 {
10806 {
10807 .eraseblocks = { {256, 2048} },
10808 .block_erase = spi_block_erase_db,
10809 }, {
10810 .eraseblocks = { {64 * 1024, 8} },
10811 .block_erase = spi_block_erase_d8,
10812 }
10813 },
10814 .printlock = spi_prettyprint_status_register_default_welwip,
10815 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10816 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
10817 .read = spi_chip_read, /* Fast read (0x0B) supported */
10818 .voltage = {2700, 3600},
10819 },
10820
10821 {
10822 .vendor = "Micron/Numonyx/ST",
10823 .name = "M45PE80",
10824 .bustype = BUS_SPI,
10825 .manufacture_id = ST_ID,
10826 .model_id = ST_M45PE80,
10827 .total_size = 1024,
10828 .page_size = 256,
10829 .tested = TEST_UNTESTED,
10830 .probe = probe_spi_rdid,
10831 .probe_timing = TIMING_ZERO,
10832 .block_erasers =
10833 {
10834 {
10835 .eraseblocks = { {256, 4096} },
10836 .block_erase = spi_block_erase_db,
10837 }, {
10838 .eraseblocks = { {64 * 1024, 16} },
10839 .block_erase = spi_block_erase_d8,
10840 }
10841 },
10842 .printlock = spi_prettyprint_status_register_default_welwip,
10843 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10844 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10845 .read = spi_chip_read, /* Fast read (0x0B) supported */
10846 .voltage = {2700, 3600},
10847 },
10848
10849 {
10850 .vendor = "Micron/Numonyx/ST",
Nikolai Artemieve51e5302020-08-31 17:46:48 +100010851 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10852 .bustype = BUS_SPI,
10853 .manufacture_id = ST_ID,
10854 .model_id = ST_N25Q00A__1G,
10855 .total_size = 131072,
10856 .page_size = 256,
10857 /* supports SFDP */
10858 /* OTP: 64B total; read 0x4B, write 0x42 */
10859 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10860 .tested = TEST_UNTESTED,
10861 .probe = probe_spi_rdid,
10862 .probe_timing = TIMING_ZERO,
10863 .block_erasers =
10864 {
10865 {
10866 .eraseblocks = { {4 * 1024, 32768} },
10867 .block_erase = spi_block_erase_21,
10868 }, {
10869 .eraseblocks = { {4 * 1024, 32768} },
10870 .block_erase = spi_block_erase_20,
10871 }, {
10872 .eraseblocks = { {64 * 1024, 2048} },
10873 .block_erase = spi_block_erase_dc,
10874 }, {
10875 .eraseblocks = { {64 * 1024, 2048} },
10876 .block_erase = spi_block_erase_d8,
10877 }, {
10878 .eraseblocks = { {32768 * 1024, 4} },
10879 .block_erase = spi_block_erase_c4,
10880 }
10881 },
10882 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10883 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10884 .write = spi_chip_write_256, /* Multi I/O supported */
10885 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10886 .voltage = {1700, 2000},
10887 },
10888
10889 {
10890 .vendor = "Micron/Numonyx/ST",
10891 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
10892 .bustype = BUS_SPI,
10893 .manufacture_id = ST_ID,
10894 .model_id = ST_N25Q00A__3G,
10895 .total_size = 131072,
10896 .page_size = 256,
10897 /* supports SFDP */
10898 /* OTP: 64B total; read 0x4B, write 0x42 */
10899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10900 .tested = TEST_UNTESTED,
10901 .probe = probe_spi_rdid,
10902 .probe_timing = TIMING_ZERO,
10903 .block_erasers =
10904 {
10905 {
10906 .eraseblocks = { {4 * 1024, 32768} },
10907 .block_erase = spi_block_erase_21,
10908 }, {
10909 .eraseblocks = { {4 * 1024, 32768} },
10910 .block_erase = spi_block_erase_20,
10911 }, {
10912 .eraseblocks = { {64 * 1024, 2048} },
10913 .block_erase = spi_block_erase_dc,
10914 }, {
10915 .eraseblocks = { {64 * 1024, 2048} },
10916 .block_erase = spi_block_erase_d8,
10917 }, {
10918 .eraseblocks = { {32768 * 1024, 4} },
10919 .block_erase = spi_block_erase_c4,
10920 }
10921 },
10922 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10923 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10924 .write = spi_chip_write_256, /* Multi I/O supported */
10925 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10926 .voltage = {2700, 3600},
10927 },
10928
10929 {
10930 .vendor = "Micron/Numonyx/ST",
10931 .name = "N25Q016",
10932 .bustype = BUS_SPI,
10933 .manufacture_id = ST_ID,
10934 .model_id = ST_N25Q016__1E,
10935 .total_size = 2048,
10936 .page_size = 256,
10937 /* supports SFDP */
10938 /* OTP: 64B total; read 0x4B, write 0x42 */
10939 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10940 .tested = TEST_UNTESTED,
10941 .probe = probe_spi_rdid,
10942 .probe_timing = TIMING_ZERO,
10943 .block_erasers =
10944 {
10945 {
10946 .eraseblocks = { {4 * 1024, 512} },
10947 .block_erase = spi_block_erase_20,
10948 }, {
10949 .eraseblocks = { {32 * 1024, 64} },
10950 .block_erase = spi_block_erase_52,
10951 }, {
10952 .eraseblocks = { {64 * 1024, 32} },
10953 .block_erase = spi_block_erase_d8,
10954 }, {
10955 .eraseblocks = { {2 * 1024 * 1024, 1} },
10956 .block_erase = spi_block_erase_c7,
10957 }
10958 },
10959 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10960 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10961 .write = spi_chip_write_256, /* Multi I/O supported */
10962 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10963 .voltage = {1700, 2000},
10964 },
10965
10966 {
10967 .vendor = "Micron/Numonyx/ST",
10968 .name = "N25Q032..1E",
10969 .bustype = BUS_SPI,
10970 .manufacture_id = ST_ID,
10971 .model_id = ST_N25Q032__1E,
10972 .total_size = 4096,
10973 .page_size = 256,
10974 /* supports SFDP */
10975 /* OTP: 64B total; read 0x4B, write 0x42 */
10976 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10977 .tested = TEST_UNTESTED,
10978 .probe = probe_spi_rdid,
10979 .probe_timing = TIMING_ZERO,
10980 .block_erasers =
10981 {
10982 {
10983 .eraseblocks = { {4 * 1024, 1024} },
10984 .block_erase = spi_block_erase_20,
10985 }, {
10986 .eraseblocks = { {64 * 1024, 64} },
10987 .block_erase = spi_block_erase_d8,
10988 }, {
10989 .eraseblocks = { {4 * 1024 * 1024, 1} },
10990 .block_erase = spi_block_erase_c7,
10991 }
10992 },
10993 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10994 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10995 .write = spi_chip_write_256, /* Multi I/O supported */
10996 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10997 .voltage = {1700, 2000},
10998 },
10999
11000 {
11001 .vendor = "Micron/Numonyx/ST",
11002 .name = "N25Q032..3E",
11003 .bustype = BUS_SPI,
11004 .manufacture_id = ST_ID,
11005 .model_id = ST_N25Q032__3E,
11006 .total_size = 4096,
11007 .page_size = 256,
11008 /* supports SFDP */
11009 /* OTP: 64B total; read 0x4B, write 0x42 */
11010 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11011 .tested = TEST_OK_PREW,
11012 .probe = probe_spi_rdid,
11013 .probe_timing = TIMING_ZERO,
11014 .block_erasers =
11015 {
11016 {
11017 .eraseblocks = { {4 * 1024, 1024} },
11018 .block_erase = spi_block_erase_20,
11019 }, {
11020 .eraseblocks = { {64 * 1024, 64} },
11021 .block_erase = spi_block_erase_d8,
11022 }, {
11023 .eraseblocks = { {4 * 1024 * 1024, 1} },
11024 .block_erase = spi_block_erase_c7,
11025 }
11026 },
11027 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11028 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11029 .write = spi_chip_write_256, /* Multi I/O supported */
11030 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11031 .voltage = {2700, 3600},
11032 },
11033
11034 {
11035 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +100011036 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +100011037 .bustype = BUS_SPI,
11038 .manufacture_id = ST_ID,
11039 .model_id = ST_N25Q064__1E,
11040 .total_size = 8192,
11041 .page_size = 256,
11042 /* supports SFDP */
11043 /* OTP: 64B total; read 0x4B, write 0x42 */
11044 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11045 .tested = TEST_OK_PREW,
11046 .probe = probe_spi_rdid,
11047 .probe_timing = TIMING_ZERO,
11048 .block_erasers =
11049 {
11050 {
11051 .eraseblocks = { {4 * 1024, 2048 } },
11052 .block_erase = spi_block_erase_20,
11053 }, {
11054 .eraseblocks = { {64 * 1024, 128} },
11055 .block_erase = spi_block_erase_d8,
11056 }, {
11057 .eraseblocks = { {8 * 1024 * 1024, 1} },
11058 .block_erase = spi_block_erase_c7,
11059 }
11060 },
Alan Green197c7432019-09-09 17:24:41 +100011061 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11062 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11063 .write = spi_chip_write_256, /* Multi I/O supported */
11064 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green82e27422019-08-26 12:18:10 +100011065 .voltage = {1700, 2000},
Alan Green82e27422019-08-26 12:18:10 +100011066 },
11067
11068 {
11069 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +100011070 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +100011071 .bustype = BUS_SPI,
11072 .manufacture_id = ST_ID,
11073 .model_id = ST_N25Q064__3E,
11074 .total_size = 8192,
11075 .page_size = 256,
11076 /* supports SFDP */
11077 /* OTP: 64B total; read 0x4B, write 0x42 */
11078 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11079 .tested = TEST_OK_PREW,
11080 .probe = probe_spi_rdid,
11081 .probe_timing = TIMING_ZERO,
11082 .block_erasers =
11083 {
11084 {
11085 .eraseblocks = { {4 * 1024, 2048 } },
11086 .block_erase = spi_block_erase_20,
11087 }, {
11088 .eraseblocks = { {64 * 1024, 128} },
11089 .block_erase = spi_block_erase_d8,
11090 }, {
11091 .eraseblocks = { {8 * 1024 * 1024, 1} },
11092 .block_erase = spi_block_erase_c7,
11093 }
11094 },
Alan Green197c7432019-09-09 17:24:41 +100011095 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11096 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11097 .write = spi_chip_write_256, /* Multi I/O supported */
11098 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green82e27422019-08-26 12:18:10 +100011099 .voltage = {2700, 3600},
Alan Green82e27422019-08-26 12:18:10 +100011100 },
11101
11102 {
Nikolai Artemievcd7a5d02020-08-31 17:47:26 +100011103 .vendor = "Micron/Numonyx/ST",
11104 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11105 .bustype = BUS_SPI,
11106 .manufacture_id = ST_ID,
11107 .model_id = ST_N25Q128__1E,
11108 .total_size = 16384,
11109 .page_size = 256,
11110 /* supports SFDP */
11111 /* OTP: 64B total; read 0x4B, write 0x42 */
11112 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11113 .tested = TEST_OK_PREW,
11114 .probe = probe_spi_rdid,
11115 .probe_timing = TIMING_ZERO,
11116 .block_erasers =
11117 {
11118 {
11119 .eraseblocks = { {4 * 1024, 4096 } },
11120 .block_erase = spi_block_erase_20,
11121 }, {
11122 .eraseblocks = { {64 * 1024, 256} },
11123 .block_erase = spi_block_erase_d8,
11124 }, {
11125 .eraseblocks = { {16384 * 1024, 1} },
11126 .block_erase = spi_block_erase_c7,
11127 }
11128 },
11129 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11130 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11131 .write = spi_chip_write_256, /* Multi I/O supported */
11132 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11133 .voltage = {1700, 2000},
11134 },
11135
11136 {
11137 .vendor = "Micron/Numonyx/ST",
11138 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11139 .bustype = BUS_SPI,
11140 .manufacture_id = ST_ID,
11141 .model_id = ST_N25Q128__3E,
11142 .total_size = 16384,
11143 .page_size = 256,
11144 /* supports SFDP */
11145 /* OTP: 64B total; read 0x4B, write 0x42 */
11146 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11147 .tested = TEST_OK_PREW,
11148 .probe = probe_spi_rdid,
11149 .probe_timing = TIMING_ZERO,
11150 .block_erasers =
11151 {
11152 {
11153 .eraseblocks = { {4 * 1024, 4096 } },
11154 .block_erase = spi_block_erase_20,
11155 }, {
11156 .eraseblocks = { {64 * 1024, 256} },
11157 .block_erase = spi_block_erase_d8,
11158 }, {
11159 .eraseblocks = { {16384 * 1024, 1} },
11160 .block_erase = spi_block_erase_c7,
11161 }
11162 },
11163 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11164 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11165 .write = spi_chip_write_256, /* Multi I/O supported */
11166 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11167 .voltage = {2700, 3600},
11168 },
11169
11170 {
11171 .vendor = "Micron/Numonyx/ST",
11172 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11173 .bustype = BUS_SPI,
11174 .manufacture_id = ST_ID,
11175 .model_id = ST_N25Q256__1E,
11176 .total_size = 32768,
11177 .page_size = 256,
11178 /* supports SFDP */
11179 /* OTP: 64B total; read 0x4B, write 0x42 */
11180 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11181 .tested = TEST_UNTESTED,
11182 .probe = probe_spi_rdid,
11183 .probe_timing = TIMING_ZERO,
11184 .block_erasers =
11185 {
11186 {
11187 .eraseblocks = { {4 * 1024, 8192} },
11188 .block_erase = spi_block_erase_21,
11189 }, {
11190 .eraseblocks = { {4 * 1024, 8192} },
11191 .block_erase = spi_block_erase_20,
11192 }, {
11193 .eraseblocks = { {64 * 1024, 512} },
11194 .block_erase = spi_block_erase_dc,
11195 }, {
11196 .eraseblocks = { {64 * 1024, 512} },
11197 .block_erase = spi_block_erase_d8,
11198 }, {
11199 .eraseblocks = { {32768 * 1024, 1} },
11200 .block_erase = spi_block_erase_c7,
11201 }
11202 },
11203 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11204 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11205 .write = spi_chip_write_256, /* Multi I/O supported */
11206 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11207 .voltage = {1700, 2000},
11208 },
11209
11210 {
11211 .vendor = "Micron/Numonyx/ST",
11212 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11213 .bustype = BUS_SPI,
11214 .manufacture_id = ST_ID,
11215 .model_id = ST_N25Q256__3E,
11216 .total_size = 32768,
11217 .page_size = 256,
11218 /* supports SFDP */
11219 /* OTP: 64B total; read 0x4B, write 0x42 */
11220 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11221 .tested = TEST_UNTESTED,
11222 .probe = probe_spi_rdid,
11223 .probe_timing = TIMING_ZERO,
11224 .block_erasers =
11225 {
11226 {
11227 .eraseblocks = { {4 * 1024, 8192} },
11228 .block_erase = spi_block_erase_21,
11229 }, {
11230 .eraseblocks = { {4 * 1024, 8192} },
11231 .block_erase = spi_block_erase_20,
11232 }, {
11233 .eraseblocks = { {64 * 1024, 512} },
11234 .block_erase = spi_block_erase_dc,
11235 }, {
11236 .eraseblocks = { {64 * 1024, 512} },
11237 .block_erase = spi_block_erase_d8,
11238 }, {
11239 .eraseblocks = { {32768 * 1024, 1} },
11240 .block_erase = spi_block_erase_c7,
11241 }
11242 },
11243 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11244 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11245 .write = spi_chip_write_256, /* Multi I/O supported */
11246 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11247 .voltage = {2700, 3600},
11248 },
11249
11250 {
11251 .vendor = "Micron/Numonyx/ST",
11252 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
11253 .bustype = BUS_SPI,
11254 .manufacture_id = ST_ID,
11255 .model_id = ST_N25Q512__1G,
11256 .total_size = 65536,
11257 .page_size = 256,
11258 /* supports SFDP */
11259 /* OTP: 64B total; read 0x4B, write 0x42 */
11260 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11261 .tested = TEST_UNTESTED,
11262 .probe = probe_spi_rdid,
11263 .probe_timing = TIMING_ZERO,
11264 .block_erasers =
11265 {
11266 {
11267 .eraseblocks = { {4 * 1024, 16384} },
11268 .block_erase = spi_block_erase_21,
11269 }, {
11270 .eraseblocks = { {4 * 1024, 16384} },
11271 .block_erase = spi_block_erase_20,
11272 }, {
11273 .eraseblocks = { {64 * 1024, 1024} },
11274 .block_erase = spi_block_erase_dc,
11275 }, {
11276 .eraseblocks = { {64 * 1024, 1024} },
11277 .block_erase = spi_block_erase_d8,
11278 }, {
11279 .eraseblocks = { {32768 * 1024, 2} },
11280 .block_erase = spi_block_erase_c4,
11281 }
11282 },
11283 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11284 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11285 .write = spi_chip_write_256, /* Multi I/O supported */
11286 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11287 .voltage = {1700, 2000},
11288 },
11289
11290 {
11291 .vendor = "Micron/Numonyx/ST",
11292 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11293 .bustype = BUS_SPI,
11294 .manufacture_id = ST_ID,
11295 .model_id = ST_N25Q512__3G,
11296 .total_size = 65536,
11297 .page_size = 256,
11298 /* supports SFDP */
11299 /* OTP: 64B total; read 0x4B, write 0x42 */
11300 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11301 .tested = TEST_OK_PREW,
11302 .probe = probe_spi_rdid,
11303 .probe_timing = TIMING_ZERO,
11304 .block_erasers =
11305 {
11306 {
11307 .eraseblocks = { {4 * 1024, 16384} },
11308 .block_erase = spi_block_erase_21,
11309 }, {
11310 .eraseblocks = { {4 * 1024, 16384} },
11311 .block_erase = spi_block_erase_20,
11312 }, {
11313 .eraseblocks = { {64 * 1024, 1024} },
11314 .block_erase = spi_block_erase_dc,
11315 }, {
11316 .eraseblocks = { {64 * 1024, 1024} },
11317 .block_erase = spi_block_erase_d8,
11318 }, {
11319 .eraseblocks = { {32768 * 1024, 2} },
11320 .block_erase = spi_block_erase_c4,
11321 }
11322 },
11323 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11324 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11325 .write = spi_chip_write_256, /* Multi I/O supported */
11326 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11327 .voltage = {2700, 3600},
11328 },
11329
11330 {
11331 .vendor = "Micron",
11332 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11333 .bustype = BUS_SPI,
11334 .manufacture_id = ST_ID,
11335 .model_id = ST_N25Q00A__3G,
11336 .total_size = 131072,
11337 .page_size = 256,
11338 /* supports SFDP */
11339 /* OTP: 64B total; read 0x4B, write 0x42 */
11340 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11341 .tested = TEST_OK_PREW,
11342 .probe = probe_spi_rdid,
11343 .probe_timing = TIMING_ZERO,
11344 .block_erasers =
11345 {
11346 {
11347 .eraseblocks = { {4 * 1024, 32768} },
11348 .block_erase = spi_block_erase_21,
11349 }, {
11350 .eraseblocks = { {4 * 1024, 32768} },
11351 .block_erase = spi_block_erase_20,
11352 }, {
11353 .eraseblocks = { {32 * 1024, 4096} },
11354 .block_erase = spi_block_erase_5c,
11355 }, {
11356 .eraseblocks = { {32 * 1024, 4096} },
11357 .block_erase = spi_block_erase_52,
11358 }, {
11359 .eraseblocks = { {64 * 1024, 2048} },
11360 .block_erase = spi_block_erase_dc,
11361 }, {
11362 .eraseblocks = { {64 * 1024, 2048} },
11363 .block_erase = spi_block_erase_d8,
11364 }, {
11365 .eraseblocks = { {65536 * 1024, 2} },
11366 .block_erase = spi_block_erase_c4,
11367 }
11368 },
11369 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11370 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11371 .write = spi_chip_write_256, /* Multi I/O supported */
11372 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11373 .voltage = {2700, 3600},
11374 },
11375
11376 {
11377 .vendor = "Micron",
11378 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11379 .bustype = BUS_SPI,
11380 .manufacture_id = ST_ID,
11381 .model_id = ST_N25Q00A__1G,
11382 .total_size = 131072,
11383 .page_size = 256,
11384 /* supports SFDP */
11385 /* OTP: 64B total; read 0x4B, write 0x42 */
11386 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11387 .tested = TEST_UNTESTED,
11388 .probe = probe_spi_rdid,
11389 .probe_timing = TIMING_ZERO,
11390 .block_erasers =
11391 {
11392 {
11393 .eraseblocks = { {4 * 1024, 32768} },
11394 .block_erase = spi_block_erase_21,
11395 }, {
11396 .eraseblocks = { {4 * 1024, 32768} },
11397 .block_erase = spi_block_erase_20,
11398 }, {
11399 .eraseblocks = { {32 * 1024, 4096} },
11400 .block_erase = spi_block_erase_5c,
11401 }, {
11402 .eraseblocks = { {32 * 1024, 4096} },
11403 .block_erase = spi_block_erase_52,
11404 }, {
11405 .eraseblocks = { {64 * 1024, 2048} },
11406 .block_erase = spi_block_erase_dc,
11407 }, {
11408 .eraseblocks = { {64 * 1024, 2048} },
11409 .block_erase = spi_block_erase_d8,
11410 }, {
11411 .eraseblocks = { {65536 * 1024, 2} },
11412 .block_erase = spi_block_erase_c4,
11413 }
11414 },
11415 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11416 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11417 .write = spi_chip_write_256, /* Multi I/O supported */
11418 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11419 .voltage = {1700, 2000},
11420 },
11421
11422 {
11423 .vendor = "Micron",
11424 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11425 .bustype = BUS_SPI,
11426 .manufacture_id = ST_ID,
11427 .model_id = ST_MT25QL02G,
11428 .total_size = 262144,
11429 .page_size = 256,
11430 /* supports SFDP */
11431 /* OTP: 64B total; read 0x4B, write 0x42 */
11432 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11433 .tested = TEST_UNTESTED,
11434 .probe = probe_spi_rdid,
11435 .probe_timing = TIMING_ZERO,
11436 .block_erasers =
11437 {
11438 {
11439 .eraseblocks = { {4 * 1024, 65536} },
11440 .block_erase = spi_block_erase_21,
11441 }, {
11442 .eraseblocks = { {4 * 1024, 65536} },
11443 .block_erase = spi_block_erase_20,
11444 }, {
11445 .eraseblocks = { {32 * 1024, 8192} },
11446 .block_erase = spi_block_erase_5c,
11447 }, {
11448 .eraseblocks = { {32 * 1024, 8192} },
11449 .block_erase = spi_block_erase_52,
11450 }, {
11451 .eraseblocks = { {64 * 1024, 4096} },
11452 .block_erase = spi_block_erase_dc,
11453 }, {
11454 .eraseblocks = { {64 * 1024, 4096} },
11455 .block_erase = spi_block_erase_d8,
11456 }, {
11457 .eraseblocks = { {65536 * 1024, 4} },
11458 .block_erase = spi_block_erase_c4,
11459 }
11460 },
11461 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11462 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11463 .write = spi_chip_write_256, /* Multi I/O supported */
11464 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11465 .voltage = {2700, 3600},
11466 },
11467
11468 {
11469 .vendor = "Micron",
11470 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11471 .bustype = BUS_SPI,
11472 .manufacture_id = ST_ID,
11473 .model_id = ST_MT25QU02G,
11474 .total_size = 262144,
11475 .page_size = 256,
11476 /* supports SFDP */
11477 /* OTP: 64B total; read 0x4B, write 0x42 */
11478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11479 .tested = TEST_UNTESTED,
11480 .probe = probe_spi_rdid,
11481 .probe_timing = TIMING_ZERO,
11482 .block_erasers =
11483 {
11484 {
11485 .eraseblocks = { {4 * 1024, 65536} },
11486 .block_erase = spi_block_erase_21,
11487 }, {
11488 .eraseblocks = { {4 * 1024, 65536} },
11489 .block_erase = spi_block_erase_20,
11490 }, {
11491 .eraseblocks = { {32 * 1024, 8192} },
11492 .block_erase = spi_block_erase_5c,
11493 }, {
11494 .eraseblocks = { {32 * 1024, 8192} },
11495 .block_erase = spi_block_erase_52,
11496 }, {
11497 .eraseblocks = { {64 * 1024, 4096} },
11498 .block_erase = spi_block_erase_dc,
11499 }, {
11500 .eraseblocks = { {64 * 1024, 4096} },
11501 .block_erase = spi_block_erase_d8,
11502 }, {
11503 .eraseblocks = { {65536 * 1024, 4} },
11504 .block_erase = spi_block_erase_c4,
11505 }
11506 },
11507 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11508 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11509 .write = spi_chip_write_256, /* Multi I/O supported */
11510 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11511 .voltage = {1700, 2000},
11512 },
11513
11514 {
Nikolai Artemiev09a5eac2020-08-31 17:47:57 +100011515 .vendor = "Micron",
11516 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11517 .bustype = BUS_SPI,
11518 .manufacture_id = ST_ID,
11519 .model_id = ST_N25Q128__1E,
11520 .total_size = 16384,
11521 .page_size = 256,
11522 /* supports SFDP */
11523 /* OTP: 64B total; read 0x4B, write 0x42 */
11524 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11525 .tested = TEST_UNTESTED,
11526 .probe = probe_spi_rdid,
11527 .probe_timing = TIMING_ZERO,
11528 .block_erasers =
11529 {
11530 {
11531 .eraseblocks = { {4 * 1024, 4096} },
11532 .block_erase = spi_block_erase_20,
11533 }, {
11534 .eraseblocks = { {32 * 1024, 512} },
11535 .block_erase = spi_block_erase_52,
11536 }, {
11537 .eraseblocks = { {64 * 1024, 256} },
11538 .block_erase = spi_block_erase_d8,
11539 }, {
11540 .eraseblocks = { {16384 * 1024, 1} },
11541 .block_erase = spi_block_erase_c7,
11542 }, {
11543 .eraseblocks = { {16384 * 1024, 1} },
11544 .block_erase = spi_block_erase_60,
11545 }
11546 },
11547 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11548 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11549 .write = spi_chip_write_256, /* Multi I/O supported */
11550 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11551 .voltage = {1700, 2000},
11552 },
11553
11554 {
11555 .vendor = "Micron",
11556 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11557 .bustype = BUS_SPI,
11558 .manufacture_id = ST_ID,
11559 .model_id = ST_N25Q128__3E,
11560 .total_size = 16384,
11561 .page_size = 256,
11562 /* supports SFDP */
11563 /* OTP: 64B total; read 0x4B, write 0x42 */
11564 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11565 .tested = TEST_UNTESTED,
11566 .probe = probe_spi_rdid,
11567 .probe_timing = TIMING_ZERO,
11568 .block_erasers =
11569 {
11570 {
11571 .eraseblocks = { {4 * 1024, 4096} },
11572 .block_erase = spi_block_erase_20,
11573 }, {
11574 .eraseblocks = { {32 * 1024, 512} },
11575 .block_erase = spi_block_erase_52,
11576 }, {
11577 .eraseblocks = { {64 * 1024, 256} },
11578 .block_erase = spi_block_erase_d8,
11579 }, {
11580 .eraseblocks = { {16384 * 1024, 1} },
11581 .block_erase = spi_block_erase_c7,
11582 }, {
11583 .eraseblocks = { {16384 * 1024, 1} },
11584 .block_erase = spi_block_erase_60,
11585 }
11586 },
11587 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11588 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11589 .write = spi_chip_write_256, /* Multi I/O supported */
11590 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11591 .voltage = {2700, 3600},
11592 },
11593
11594 {
11595 .vendor = "Micron",
11596 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11597 .bustype = BUS_SPI,
11598 .manufacture_id = ST_ID,
11599 .model_id = ST_N25Q256__3E,
11600 .total_size = 32768,
11601 .page_size = 256,
11602 /* supports SFDP */
11603 /* OTP: 64B total; read 0x4B, write 0x42 */
11604 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11605 .tested = TEST_UNTESTED,
11606 .probe = probe_spi_rdid,
11607 .probe_timing = TIMING_ZERO,
11608 .block_erasers =
11609 {
11610 {
11611 .eraseblocks = { {4 * 1024, 8192} },
11612 .block_erase = spi_block_erase_21,
11613 }, {
11614 .eraseblocks = { {4 * 1024, 8192} },
11615 .block_erase = spi_block_erase_20,
11616 }, {
11617 .eraseblocks = { {32 * 1024, 1024} },
11618 .block_erase = spi_block_erase_5c,
11619 }, {
11620 .eraseblocks = { {32 * 1024, 1024} },
11621 .block_erase = spi_block_erase_52,
11622 }, {
11623 .eraseblocks = { {64 * 1024, 512} },
11624 .block_erase = spi_block_erase_dc,
11625 }, {
11626 .eraseblocks = { {64 * 1024, 512} },
11627 .block_erase = spi_block_erase_d8,
11628 }, {
11629 .eraseblocks = { {32768 * 1024, 1} },
11630 .block_erase = spi_block_erase_c7,
11631 }, {
11632 .eraseblocks = { {32768 * 1024, 1} },
11633 .block_erase = spi_block_erase_60,
11634 }
11635 },
11636 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11637 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11638 .write = spi_chip_write_256, /* Multi I/O supported */
11639 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11640 .voltage = {2700, 3600},
11641 },
11642
11643 {
11644 .vendor = "Micron",
11645 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11646 .bustype = BUS_SPI,
11647 .manufacture_id = ST_ID,
11648 .model_id = ST_N25Q256__1E,
11649 .total_size = 32768,
11650 .page_size = 256,
11651 /* supports SFDP */
11652 /* OTP: 64B total; read 0x4B, write 0x42 */
11653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11654 .tested = TEST_UNTESTED,
11655 .probe = probe_spi_rdid,
11656 .probe_timing = TIMING_ZERO,
11657 .block_erasers =
11658 {
11659 {
11660 .eraseblocks = { {4 * 1024, 8192} },
11661 .block_erase = spi_block_erase_21,
11662 }, {
11663 .eraseblocks = { {4 * 1024, 8192} },
11664 .block_erase = spi_block_erase_20,
11665 }, {
11666 .eraseblocks = { {32 * 1024, 1024} },
11667 .block_erase = spi_block_erase_5c,
11668 }, {
11669 .eraseblocks = { {32 * 1024, 1024} },
11670 .block_erase = spi_block_erase_52,
11671 }, {
11672 .eraseblocks = { {64 * 1024, 512} },
11673 .block_erase = spi_block_erase_dc,
11674 }, {
11675 .eraseblocks = { {64 * 1024, 512} },
11676 .block_erase = spi_block_erase_d8,
11677 }, {
11678 .eraseblocks = { {32768 * 1024, 1} },
11679 .block_erase = spi_block_erase_c7,
11680 }, {
11681 .eraseblocks = { {32768 * 1024, 1} },
11682 .block_erase = spi_block_erase_60,
11683 }
11684 },
11685 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11686 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11687 .write = spi_chip_write_256, /* Multi I/O supported */
11688 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11689 .voltage = {1700, 2000},
11690 },
11691
11692 {
11693 .vendor = "Micron",
11694 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11695 .bustype = BUS_SPI,
11696 .manufacture_id = ST_ID,
11697 .model_id = ST_N25Q512__3G,
11698 .total_size = 65536,
11699 .page_size = 256,
11700 /* supports SFDP */
11701 /* OTP: 64B total; read 0x4B, write 0x42 */
11702 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11703 .tested = TEST_OK_PREW,
11704 .probe = probe_spi_rdid,
11705 .probe_timing = TIMING_ZERO,
11706 .block_erasers =
11707 {
11708 {
11709 .eraseblocks = { {4 * 1024, 16384} },
11710 .block_erase = spi_block_erase_21,
11711 }, {
11712 .eraseblocks = { {4 * 1024, 16384} },
11713 .block_erase = spi_block_erase_20,
11714 }, {
11715 .eraseblocks = { {32 * 1024, 2048} },
11716 .block_erase = spi_block_erase_5c,
11717 }, {
11718 .eraseblocks = { {32 * 1024, 2048} },
11719 .block_erase = spi_block_erase_52,
11720 }, {
11721 .eraseblocks = { {64 * 1024, 1024} },
11722 .block_erase = spi_block_erase_dc,
11723 }, {
11724 .eraseblocks = { {64 * 1024, 1024} },
11725 .block_erase = spi_block_erase_d8,
11726 }, {
11727 .eraseblocks = { {65536 * 1024, 1} },
11728 .block_erase = spi_block_erase_c7,
11729 }, {
11730 .eraseblocks = { {65536 * 1024, 1} },
11731 .block_erase = spi_block_erase_60,
11732 }
11733 },
11734 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11735 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11736 .write = spi_chip_write_256, /* Multi I/O supported */
11737 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11738 .voltage = {2700, 3600},
11739 },
11740
11741 {
11742 .vendor = "Micron",
11743 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11744 .bustype = BUS_SPI,
11745 .manufacture_id = ST_ID,
11746 .model_id = ST_N25Q512__1G,
11747 .total_size = 65536,
11748 .page_size = 256,
11749 /* supports SFDP */
11750 /* OTP: 64B total; read 0x4B, write 0x42 */
11751 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11752 .tested = TEST_OK_PREW,
11753 .probe = probe_spi_rdid,
11754 .probe_timing = TIMING_ZERO,
11755 .block_erasers =
11756 {
11757 {
11758 .eraseblocks = { {4 * 1024, 16384} },
11759 .block_erase = spi_block_erase_21,
11760 }, {
11761 .eraseblocks = { {4 * 1024, 16384} },
11762 .block_erase = spi_block_erase_20,
11763 }, {
11764 .eraseblocks = { {32 * 1024, 2048} },
11765 .block_erase = spi_block_erase_5c,
11766 }, {
11767 .eraseblocks = { {32 * 1024, 2048} },
11768 .block_erase = spi_block_erase_52,
11769 }, {
11770 .eraseblocks = { {64 * 1024, 1024} },
11771 .block_erase = spi_block_erase_dc,
11772 }, {
11773 .eraseblocks = { {64 * 1024, 1024} },
11774 .block_erase = spi_block_erase_d8,
11775 }, {
11776 .eraseblocks = { {65536 * 1024, 1} },
11777 .block_erase = spi_block_erase_c7,
11778 }, {
11779 .eraseblocks = { {65536 * 1024, 1} },
11780 .block_erase = spi_block_erase_60,
11781 }
11782 },
11783 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11784 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11785 .write = spi_chip_write_256, /* Multi I/O supported */
11786 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11787 .voltage = {1700, 2000},
11788 },
11789
11790 {
hailfinger0ae231d2010-07-29 20:01:13 +000011791 .vendor = "MoselVitelic",
11792 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +000011793 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011794 .manufacture_id = SYNCMOS_MVC_ID,
11795 .model_id = MVC_V29C51000B,
11796 .total_size = 64,
11797 .page_size = 512,
11798 .feature_bits = FEATURE_EITHER_RESET,
11799 .tested = TEST_UNTESTED,
11800 .probe = probe_jedec,
11801 .probe_timing = TIMING_ZERO,
11802 .block_erasers =
11803 {
11804 {
11805 .eraseblocks = { {512, 128} },
11806 .block_erase = erase_sector_jedec,
11807 }, {
11808 .eraseblocks = { {64 * 1024, 1} },
11809 .block_erase = erase_chip_block_jedec,
11810 },
11811 },
11812 .write = write_jedec_1,
11813 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011814 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011815 },
11816
11817 {
11818 .vendor = "MoselVitelic",
11819 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +000011820 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011821 .manufacture_id = SYNCMOS_MVC_ID,
11822 .model_id = MVC_V29C51000T,
11823 .total_size = 64,
11824 .page_size = 512,
11825 .feature_bits = FEATURE_EITHER_RESET,
11826 .tested = TEST_UNTESTED,
11827 .probe = probe_jedec,
11828 .probe_timing = TIMING_ZERO,
11829 .block_erasers =
11830 {
11831 {
11832 .eraseblocks = { {512, 128} },
11833 .block_erase = erase_sector_jedec,
11834 }, {
11835 .eraseblocks = { {64 * 1024, 1} },
11836 .block_erase = erase_chip_block_jedec,
11837 },
11838 },
11839 .write = write_jedec_1,
11840 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011841 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011842 },
11843
11844 {
11845 .vendor = "MoselVitelic",
11846 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +000011847 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011848 .manufacture_id = SYNCMOS_MVC_ID,
11849 .model_id = MVC_V29C51400B,
11850 .total_size = 512,
11851 .page_size = 1024,
11852 .feature_bits = FEATURE_EITHER_RESET,
11853 .tested = TEST_UNTESTED,
11854 .probe = probe_jedec,
11855 .probe_timing = TIMING_ZERO,
11856 .block_erasers =
11857 {
11858 {
11859 .eraseblocks = { {1024, 512} },
11860 .block_erase = erase_sector_jedec,
11861 }, {
11862 .eraseblocks = { {512 * 1024, 1} },
11863 .block_erase = erase_chip_block_jedec,
11864 },
11865 },
11866 .write = write_jedec_1,
11867 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011868 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011869 },
11870
11871 {
11872 .vendor = "MoselVitelic",
11873 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +000011874 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011875 .manufacture_id = SYNCMOS_MVC_ID,
11876 .model_id = MVC_V29C51400T,
11877 .total_size = 512,
11878 .page_size = 1024,
11879 .feature_bits = FEATURE_EITHER_RESET,
11880 .tested = TEST_UNTESTED,
11881 .probe = probe_jedec,
11882 .probe_timing = TIMING_ZERO,
11883 .block_erasers =
11884 {
11885 {
11886 .eraseblocks = { {1024, 512} },
11887 .block_erase = erase_sector_jedec,
11888 }, {
11889 .eraseblocks = { {512 * 1024, 1} },
11890 .block_erase = erase_chip_block_jedec,
11891 },
11892 },
11893 .write = write_jedec_1,
11894 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011895 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011896 },
11897
11898 {
11899 .vendor = "MoselVitelic",
11900 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +000011901 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011902 .manufacture_id = SYNCMOS_MVC_ID,
11903 .model_id = MVC_V29LC51000,
11904 .total_size = 64,
11905 .page_size = 512,
11906 .feature_bits = FEATURE_EITHER_RESET,
11907 .tested = TEST_UNTESTED,
11908 .probe = probe_jedec,
11909 .probe_timing = TIMING_ZERO,
11910 .block_erasers =
11911 {
11912 {
11913 .eraseblocks = { {512, 128} },
11914 .block_erase = erase_sector_jedec,
11915 }, {
11916 .eraseblocks = { {64 * 1024, 1} },
11917 .block_erase = erase_chip_block_jedec,
11918 },
11919 },
11920 .write = write_jedec_1,
11921 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011922 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011923 },
11924
11925 {
11926 .vendor = "MoselVitelic",
11927 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +000011928 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011929 .manufacture_id = SYNCMOS_MVC_ID,
11930 .model_id = MVC_V29LC51001,
11931 .total_size = 128,
11932 .page_size = 512,
11933 .feature_bits = FEATURE_EITHER_RESET,
11934 .tested = TEST_UNTESTED,
11935 .probe = probe_jedec,
11936 .probe_timing = TIMING_ZERO,
11937 .block_erasers =
11938 {
11939 {
11940 .eraseblocks = { {512, 256} },
11941 .block_erase = erase_sector_jedec,
11942 }, {
11943 .eraseblocks = { {128 * 1024, 1} },
11944 .block_erase = erase_chip_block_jedec,
11945 },
11946 },
11947 .write = write_jedec_1,
11948 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011949 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011950 },
11951
11952 {
11953 .vendor = "MoselVitelic",
11954 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +000011955 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011956 .manufacture_id = SYNCMOS_MVC_ID,
11957 .model_id = MVC_V29LC51002,
11958 .total_size = 256,
11959 .page_size = 512,
11960 .feature_bits = FEATURE_EITHER_RESET,
11961 .tested = TEST_UNTESTED,
11962 .probe = probe_jedec,
11963 .probe_timing = TIMING_ZERO,
11964 .block_erasers =
11965 {
11966 {
11967 .eraseblocks = { {512, 512} },
11968 .block_erase = erase_sector_jedec,
11969 }, {
11970 .eraseblocks = { {256 * 1024, 1} },
11971 .block_erase = erase_chip_block_jedec,
11972 },
11973 },
11974 .write = write_jedec_1,
11975 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011976 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011977 },
11978
11979 {
Nikolai Artemiev09a5eac2020-08-31 17:47:57 +100011980 .vendor = "Nantronics",
11981 .name = "N25S10",
11982 .bustype = BUS_SPI,
11983 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11984 .model_id = NANTRONICS_N25S10,
11985 .total_size = 128,
11986 .page_size = 256,
11987 .feature_bits = FEATURE_WRSR_WREN,
11988 .tested = TEST_UNTESTED,
11989 .probe = probe_spi_rdid,
11990 .probe_timing = TIMING_ZERO,
11991 .block_erasers =
11992 {
11993 {
11994 .eraseblocks = { {4 * 1024, 32} },
11995 .block_erase = spi_block_erase_20,
11996 }, {
11997 .eraseblocks = { {4 * 1024, 32} },
11998 .block_erase = spi_block_erase_d7,
11999 }, {
12000 .eraseblocks = { {32 * 1024, 4} },
12001 .block_erase = spi_block_erase_52,
12002 }, {
12003 .eraseblocks = { {64 * 1024, 2} },
12004 .block_erase = spi_block_erase_d8,
12005 }, {
12006 .eraseblocks = { {128 * 1024, 1} },
12007 .block_erase = spi_block_erase_60,
12008 }, {
12009 .eraseblocks = { {128 * 1024, 1} },
12010 .block_erase = spi_block_erase_c7,
12011 }
12012 },
12013 .printlock = spi_prettyprint_status_register_bp3_srwd,
12014 .unlock = spi_disable_blockprotect_bp3_srwd,
12015 .write = spi_chip_write_256,
12016 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12017 .voltage = {2700, 3600},
12018 },
12019
12020 {
12021 .vendor = "Nantronics",
12022 .name = "N25S16",
12023 .bustype = BUS_SPI,
12024 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12025 .model_id = NANTRONICS_N25S16,
12026 .total_size = 2048,
12027 .page_size = 256,
12028 .feature_bits = FEATURE_WRSR_WREN,
12029 .tested = TEST_UNTESTED,
12030 .probe = probe_spi_rdid,
12031 .probe_timing = TIMING_ZERO,
12032 .block_erasers =
12033 {
12034 {
12035 .eraseblocks = { {4 * 1024, 512} },
12036 .block_erase = spi_block_erase_20,
12037 }, {
12038 .eraseblocks = { {64 * 1024, 32} },
12039 .block_erase = spi_block_erase_d8,
12040 }, {
12041 .eraseblocks = { {2048 * 1024, 1} },
12042 .block_erase = spi_block_erase_60,
12043 }, {
12044 .eraseblocks = { {2048 * 1024, 1} },
12045 .block_erase = spi_block_erase_c7,
12046 }
12047 },
12048 .printlock = spi_prettyprint_status_register_bp3_srwd,
12049 .unlock = spi_disable_blockprotect_bp3_srwd,
12050 .write = spi_chip_write_256,
12051 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12052 .voltage = {2700, 3600},
12053 },
12054
12055 {
12056 .vendor = "Nantronics",
12057 .name = "N25S20",
12058 .bustype = BUS_SPI,
12059 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12060 .model_id = NANTRONICS_N25S20,
12061 .total_size = 256,
12062 .page_size = 256,
12063 .feature_bits = FEATURE_WRSR_WREN,
12064 .tested = TEST_UNTESTED,
12065 .probe = probe_spi_rdid,
12066 .probe_timing = TIMING_ZERO,
12067 .block_erasers =
12068 {
12069 {
12070 .eraseblocks = { {4 * 1024, 64} },
12071 .block_erase = spi_block_erase_20,
12072 }, {
12073 .eraseblocks = { {4 * 1024, 64} },
12074 .block_erase = spi_block_erase_d7,
12075 }, {
12076 .eraseblocks = { {32 * 1024, 8} },
12077 .block_erase = spi_block_erase_52,
12078 }, {
12079 .eraseblocks = { {64 * 1024, 4} },
12080 .block_erase = spi_block_erase_d8,
12081 }, {
12082 .eraseblocks = { {256 * 1024, 1} },
12083 .block_erase = spi_block_erase_60,
12084 }, {
12085 .eraseblocks = { {256 * 1024, 1} },
12086 .block_erase = spi_block_erase_c7,
12087 }
12088 },
12089 .printlock = spi_prettyprint_status_register_bp3_srwd,
12090 .unlock = spi_disable_blockprotect_bp3_srwd,
12091 .write = spi_chip_write_256,
12092 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12093 .voltage = {2700, 3600},
12094 },
12095
12096 {
12097 .vendor = "Nantronics",
12098 .name = "N25S40",
12099 .bustype = BUS_SPI,
12100 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12101 .model_id = NANTRONICS_N25S40,
12102 .total_size = 512,
12103 .page_size = 256,
12104 .feature_bits = FEATURE_WRSR_WREN,
12105 .tested = TEST_UNTESTED,
12106 .probe = probe_spi_rdid,
12107 .probe_timing = TIMING_ZERO,
12108 .block_erasers =
12109 {
12110 {
12111 .eraseblocks = { {4 * 1024, 128} },
12112 .block_erase = spi_block_erase_20,
12113 }, {
12114 .eraseblocks = { {4 * 1024, 128} },
12115 .block_erase = spi_block_erase_d7,
12116 }, {
12117 .eraseblocks = { {32 * 1024, 16} },
12118 .block_erase = spi_block_erase_52,
12119 }, {
12120 .eraseblocks = { {64 * 1024, 8} },
12121 .block_erase = spi_block_erase_d8,
12122 }, {
12123 .eraseblocks = { {512 * 1024, 1} },
12124 .block_erase = spi_block_erase_60,
12125 }, {
12126 .eraseblocks = { {512 * 1024, 1} },
12127 .block_erase = spi_block_erase_c7,
12128 }
12129 },
12130 .printlock = spi_prettyprint_status_register_bp3_srwd,
12131 .unlock = spi_disable_blockprotect_bp3_srwd,
12132 .write = spi_chip_write_256,
12133 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12134 .voltage = {2700, 3600},
12135 },
12136
12137 {
Nikolai Artemiev74f90f82020-08-31 17:48:27 +100012138 .vendor = "Nantronics",
12139 .name = "N25S80",
12140 .bustype = BUS_SPI,
12141 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12142 .model_id = NANTRONICS_N25S80,
12143 .total_size = 1024,
12144 .page_size = 256,
12145 .feature_bits = FEATURE_WRSR_WREN,
12146 .tested = TEST_UNTESTED,
12147 .probe = probe_spi_rdid,
12148 .probe_timing = TIMING_ZERO,
12149 .block_erasers =
12150 {
12151 {
12152 .eraseblocks = { {4 * 1024, 256} },
12153 .block_erase = spi_block_erase_20,
12154 }, {
12155 .eraseblocks = { {32 * 1024, 32} },
12156 .block_erase = spi_block_erase_52,
12157 }, {
12158 .eraseblocks = { {64 * 1024, 16} },
12159 .block_erase = spi_block_erase_d8,
12160 }, {
12161 .eraseblocks = { {1024 * 1024, 1} },
12162 .block_erase = spi_block_erase_60,
12163 }, {
12164 .eraseblocks = { {1024 * 1024, 1} },
12165 .block_erase = spi_block_erase_c7,
12166 }
12167 },
12168 .printlock = spi_prettyprint_status_register_bp3_srwd,
12169 .unlock = spi_disable_blockprotect_bp3_srwd,
12170 .write = spi_chip_write_256,
12171 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12172 .voltage = {2700, 3600},
12173 },
12174
12175 {
12176 .vendor = "PMC",
12177 .name = "Pm25LD010(C)",
12178 .bustype = BUS_SPI,
12179 .manufacture_id = PMC_ID,
12180 .model_id = PMC_PM25LD010,
12181 .total_size = 128,
12182 .page_size = 256,
12183 .feature_bits = FEATURE_WRSR_WREN,
12184 .tested = TEST_OK_PREW,
12185 .probe = probe_spi_rdid,
12186 .probe_timing = TIMING_ZERO,
12187 .block_erasers =
12188 {
12189 {
12190 .eraseblocks = { {4 * 1024, 32} },
12191 .block_erase = spi_block_erase_20,
12192 }, {
12193 .eraseblocks = { {4 * 1024, 32} },
12194 .block_erase = spi_block_erase_d7,
12195 }, {
12196 .eraseblocks = { {32 * 1024, 4} },
12197 .block_erase = spi_block_erase_d8,
12198 }, {
12199 .eraseblocks = { {128 * 1024, 1} },
12200 .block_erase = spi_block_erase_60,
12201 }, {
12202 .eraseblocks = { {128 * 1024, 1} },
12203 .block_erase = spi_block_erase_c7,
12204 }
12205 },
12206 .printlock = spi_prettyprint_status_register_bp2_srwd,
12207 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12208 .write = spi_chip_write_256,
12209 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12210 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
12211 },
12212
12213 {
12214 .vendor = "PMC",
12215 .name = "Pm25LD020(C)",
12216 .bustype = BUS_SPI,
12217 .manufacture_id = PMC_ID,
12218 .model_id = PMC_PM25LD020,
12219 .total_size = 256,
12220 .page_size = 256,
12221 .feature_bits = FEATURE_WRSR_WREN,
12222 .tested = TEST_OK_PREW,
12223 .probe = probe_spi_rdid,
12224 .probe_timing = TIMING_ZERO,
12225 .block_erasers =
12226 {
12227 {
12228 .eraseblocks = { {4 * 1024, 64} },
12229 .block_erase = spi_block_erase_20,
12230 }, {
12231 .eraseblocks = { {4 * 1024, 64} },
12232 .block_erase = spi_block_erase_d7,
12233 }, {
12234 .eraseblocks = { {64 * 1024, 4} },
12235 .block_erase = spi_block_erase_d8,
12236 }, {
12237 .eraseblocks = { {256 * 1024, 1} },
12238 .block_erase = spi_block_erase_60,
12239 }, {
12240 .eraseblocks = { {256 * 1024, 1} },
12241 .block_erase = spi_block_erase_c7,
12242 }
12243 },
12244 .printlock = spi_prettyprint_status_register_bp2_srwd,
12245 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12246 .write = spi_chip_write_256,
12247 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12248 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
12249 },
12250
12251 {
12252 .vendor = "PMC",
12253 .name = "Pm25LD040(C)",
12254 .bustype = BUS_SPI,
12255 .manufacture_id = PMC_ID,
12256 .model_id = PMC_PM25LV040,
12257 .total_size = 512,
12258 .page_size = 256,
12259 .feature_bits = FEATURE_WRSR_WREN,
12260 .tested = TEST_OK_PREW,
12261 .probe = probe_spi_rdid,
12262 .probe_timing = TIMING_ZERO,
12263 .block_erasers =
12264 {
12265 {
12266 .eraseblocks = { {4 * 1024, 128} },
12267 .block_erase = spi_block_erase_20,
12268 }, {
12269 .eraseblocks = { {4 * 1024, 128} },
12270 .block_erase = spi_block_erase_d7,
12271 }, {
12272 .eraseblocks = { {64 * 1024, 8} },
12273 .block_erase = spi_block_erase_d8,
12274 }, {
12275 .eraseblocks = { {512 * 1024, 1} },
12276 .block_erase = spi_block_erase_60,
12277 }, {
12278 .eraseblocks = { {512 * 1024, 1} },
12279 .block_erase = spi_block_erase_c7,
12280 }
12281 },
12282 .printlock = spi_prettyprint_status_register_bp2_srwd,
12283 .unlock = spi_disable_blockprotect,
12284 .write = spi_chip_write_256,
12285 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12286 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
12287 },
12288
12289 {
12290 .vendor = "PMC",
12291 .name = "Pm25LD256C",
12292 .bustype = BUS_SPI,
12293 .manufacture_id = PMC_ID,
12294 .model_id = PMC_PM25LD256C,
12295 .total_size = 32,
12296 .page_size = 256,
12297 .feature_bits = FEATURE_WRSR_WREN,
12298 .tested = TEST_UNTESTED,
12299 .probe = probe_spi_rdid,
12300 .probe_timing = TIMING_ZERO,
12301 .block_erasers =
12302 {
12303 {
12304 .eraseblocks = { {4 * 1024, 8} },
12305 .block_erase = spi_block_erase_20,
12306 }, {
12307 .eraseblocks = { {4 * 1024, 8} },
12308 .block_erase = spi_block_erase_d7,
12309 }, {
12310 .eraseblocks = { {32 * 1024, 1} },
12311 .block_erase = spi_block_erase_d8,
12312 }, {
12313 .eraseblocks = { {32 * 1024, 1} },
12314 .block_erase = spi_block_erase_60,
12315 }, {
12316 .eraseblocks = { {32 * 1024, 1} },
12317 .block_erase = spi_block_erase_c7,
12318 }
12319 },
12320 .printlock = spi_prettyprint_status_register_bp2_srwd,
12321 .unlock = spi_disable_blockprotect,
12322 .write = spi_chip_write_256,
12323 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12324 .voltage = {2700, 3600},
12325 },
12326
12327 {
12328 .vendor = "PMC",
12329 .name = "Pm25LD512(C)",
12330 .bustype = BUS_SPI,
12331 .manufacture_id = PMC_ID,
12332 .model_id = PMC_PM25LD512,
12333 .total_size = 64,
12334 .page_size = 256,
12335 .feature_bits = FEATURE_WRSR_WREN,
12336 .tested = TEST_OK_PREW,
12337 .probe = probe_spi_rdid,
12338 .probe_timing = TIMING_ZERO,
12339 .block_erasers =
12340 {
12341 {
12342 .eraseblocks = { {4 * 1024, 16} },
12343 .block_erase = spi_block_erase_20,
12344 }, {
12345 .eraseblocks = { {4 * 1024, 16} },
12346 .block_erase = spi_block_erase_d7,
12347 }, {
12348 .eraseblocks = { {32 * 1024, 2} },
12349 .block_erase = spi_block_erase_d8,
12350 }, {
12351 .eraseblocks = { {64 * 1024, 1} },
12352 .block_erase = spi_block_erase_60,
12353 }, {
12354 .eraseblocks = { {64 * 1024, 1} },
12355 .block_erase = spi_block_erase_c7,
12356 }
12357 },
12358 .printlock = spi_prettyprint_status_register_bp2_srwd,
12359 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12360 .write = spi_chip_write_256,
12361 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12362 .voltage = {2300, 3600},
12363 },
12364
12365 {
12366 .vendor = "PMC",
12367 .name = "Pm25LQ016",
12368 .bustype = BUS_SPI,
12369 .manufacture_id = PMC_ID,
12370 .model_id = PMC_PM25LQ016,
12371 .total_size = 2048,
12372 .page_size = 256,
12373 /* OTP: 256B total; read 0x4B, write 0xB1 */
12374 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12375 .tested = TEST_UNTESTED,
12376 .probe = probe_spi_rdid,
12377 .probe_timing = TIMING_ZERO,
12378 .block_erasers =
12379 {
12380 {
12381 .eraseblocks = { {4 * 1024, 512} },
12382 .block_erase = spi_block_erase_20,
12383 }, {
12384 .eraseblocks = { {4 * 1024, 512} },
12385 .block_erase = spi_block_erase_d7,
12386 }, {
12387 .eraseblocks = { {64 * 1024, 32} },
12388 .block_erase = spi_block_erase_d8,
12389 }, {
12390 .eraseblocks = { {2048 * 1024, 1} },
12391 .block_erase = spi_block_erase_60,
12392 }, {
12393 .eraseblocks = { {2048 * 1024, 1} },
12394 .block_erase = spi_block_erase_c7,
12395 }
12396 },
12397 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12398 .unlock = spi_disable_blockprotect_bp3_srwd,
12399 .write = spi_chip_write_256,
12400 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12401 .voltage = {2300, 3600},
12402 },
12403
12404 {
12405 .vendor = "PMC",
12406 .name = "Pm25LQ020",
12407 .bustype = BUS_SPI,
12408 .manufacture_id = PMC_ID,
12409 .model_id = PMC_PM25LQ020,
12410 .total_size = 256,
12411 .page_size = 256,
12412 /* OTP: 256B total; read 0x4B, write 0xB1 */
12413 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12414 .tested = TEST_UNTESTED,
12415 .probe = probe_spi_rdid,
12416 .probe_timing = TIMING_ZERO,
12417 .block_erasers =
12418 {
12419 {
12420 .eraseblocks = { {4 * 1024, 64} },
12421 .block_erase = spi_block_erase_20,
12422 }, {
12423 .eraseblocks = { {4 * 1024, 64} },
12424 .block_erase = spi_block_erase_d7,
12425 }, {
12426 .eraseblocks = { {64 * 1024, 4} },
12427 .block_erase = spi_block_erase_d8,
12428 }, {
12429 .eraseblocks = { {256 * 1024, 1} },
12430 .block_erase = spi_block_erase_60,
12431 }, {
12432 .eraseblocks = { {256 * 1024, 1} },
12433 .block_erase = spi_block_erase_c7,
12434 }
12435 },
12436 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12437 .unlock = spi_disable_blockprotect_bp3_srwd,
12438 .write = spi_chip_write_256,
12439 .read = spi_chip_read,
12440 .voltage = {2300, 3600},
12441 },
12442
12443 {
12444 .vendor = "PMC",
12445 .name = "Pm25LQ032C",
12446 .bustype = BUS_SPI,
12447 .manufacture_id = PMC_ID,
12448 .model_id = PMC_PM25LQ032C,
12449 .total_size = 4096,
12450 .page_size = 256,
12451 /* OTP: 64B total; read 0x4B, write 0xB1 */
12452 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12453 .tested = TEST_OK_PREW,
12454 .probe = probe_spi_rdid,
12455 .probe_timing = TIMING_ZERO,
12456 .block_erasers =
12457 {
12458 {
12459 .eraseblocks = { {4 * 1024, 1024} },
12460 .block_erase = spi_block_erase_20,
12461 }, {
12462 .eraseblocks = { {4 * 1024, 1024} },
12463 .block_erase = spi_block_erase_d7,
12464 }, {
12465 .eraseblocks = { {64 * 1024, 64} },
12466 .block_erase = spi_block_erase_d8,
12467 }, {
12468 .eraseblocks = { {4096 * 1024, 1} },
12469 .block_erase = spi_block_erase_60,
12470 }, {
12471 .eraseblocks = { {4096 * 1024, 1} },
12472 .block_erase = spi_block_erase_c7,
12473 }
12474 },
12475 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12476 .unlock = spi_disable_blockprotect_bp3_srwd,
12477 .write = spi_chip_write_256,
12478 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12479 .voltage = {2700, 3600},
12480 },
12481
12482 {
12483 .vendor = "PMC",
12484 .name = "Pm25LQ040",
12485 .bustype = BUS_SPI,
12486 .manufacture_id = PMC_ID,
12487 .model_id = PMC_PM25LQ040,
12488 .total_size = 512,
12489 .page_size = 256,
12490 /* OTP: 256B total; read 0x4B, write 0xB1 */
12491 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12492 .tested = TEST_UNTESTED,
12493 .probe = probe_spi_rdid,
12494 .probe_timing = TIMING_ZERO,
12495 .block_erasers =
12496 {
12497 {
12498 .eraseblocks = { {4 * 1024, 128} },
12499 .block_erase = spi_block_erase_20,
12500 }, {
12501 .eraseblocks = { {4 * 1024, 128} },
12502 .block_erase = spi_block_erase_d7,
12503 }, {
12504 .eraseblocks = { {64 * 1024, 8} },
12505 .block_erase = spi_block_erase_d8,
12506 }, {
12507 .eraseblocks = { {512 * 1024, 1} },
12508 .block_erase = spi_block_erase_60,
12509 }, {
12510 .eraseblocks = { {512 * 1024, 1} },
12511 .block_erase = spi_block_erase_c7,
12512 }
12513 },
12514 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12515 .unlock = spi_disable_blockprotect_bp3_srwd,
12516 .write = spi_chip_write_256,
12517 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12518 .voltage = {2300, 3600},
12519 },
12520
12521 {
hailfinger286829b2009-01-08 03:40:17 +000012522 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012523 .name = "Pm25LQ080",
12524 .bustype = BUS_SPI,
12525 .manufacture_id = PMC_ID,
12526 .model_id = PMC_PM25LQ080,
12527 .total_size = 1024,
12528 .page_size = 256,
12529 /* OTP: 64B total; read 0x4B, write 0xB1 */
12530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12531 .tested = TEST_UNTESTED,
12532 .probe = probe_spi_rdid,
12533 .probe_timing = TIMING_ZERO,
12534 .block_erasers =
12535 {
12536 {
12537 .eraseblocks = { {4 * 1024, 256} },
12538 .block_erase = spi_block_erase_20,
12539 }, {
12540 .eraseblocks = { {4 * 1024, 256} },
12541 .block_erase = spi_block_erase_d7,
12542 }, {
12543 .eraseblocks = { {64 * 1024, 16} },
12544 .block_erase = spi_block_erase_d8,
12545 }, {
12546 .eraseblocks = { {1024 * 1024, 1} },
12547 .block_erase = spi_block_erase_60,
12548 }, {
12549 .eraseblocks = { {1024 * 1024, 1} },
12550 .block_erase = spi_block_erase_c7,
12551 }
12552 },
12553 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12554 .unlock = spi_disable_blockprotect_bp3_srwd,
12555 .write = spi_chip_write_256,
12556 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12557 .voltage = {2300, 3600},
12558 },
12559
12560 {
12561 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012562 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +000012563 .bustype = BUS_SPI,
Nikolai Artemiev77235eb2021-01-28 16:34:37 +110012564 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012565 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +000012566 .total_size = 128,
12567 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012568 .feature_bits = FEATURE_WRSR_WREN,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110012569 .tested = TEST_OK_PREW,
Nikolai Artemievf9329a02021-01-20 17:21:31 +110012570 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
hailfingere3095d92009-06-05 13:46:17 +000012571 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012572 .block_erasers =
12573 {
12574 {
12575 .eraseblocks = { {4 * 1024, 32} },
12576 .block_erase = spi_block_erase_d7,
12577 }, {
12578 .eraseblocks = { {32 * 1024, 4} },
12579 .block_erase = spi_block_erase_d8,
12580 }, {
12581 .eraseblocks = { {128 * 1024, 1} },
12582 .block_erase = spi_block_erase_c7,
12583 }
12584 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100012585 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012586 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012587 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100012588 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +000012589 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012590 },
12591
hailfinger286829b2009-01-08 03:40:17 +000012592 {
12593 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012594 .name = "Pm25LV010A",
12595 .bustype = BUS_SPI,
12596 .manufacture_id = PMC_ID,
12597 .model_id = PMC_PM25LV010,
12598 .total_size = 128,
12599 .page_size = 256,
12600 .feature_bits = FEATURE_WRSR_WREN,
12601 .tested = TEST_OK_PREW,
12602 .probe = probe_spi_rdid,
12603 .probe_timing = TIMING_ZERO,
12604 .block_erasers =
12605 {
12606 {
12607 .eraseblocks = { {4 * 1024, 32} },
12608 .block_erase = spi_block_erase_d7,
12609 }, {
12610 .eraseblocks = { {32 * 1024, 4} },
12611 .block_erase = spi_block_erase_d8,
12612 }, {
12613 .eraseblocks = { {128 * 1024, 1} },
12614 .block_erase = spi_block_erase_c7,
12615 }
12616 },
12617 .printlock = spi_prettyprint_status_register_bp1_srwd,
12618 .unlock = spi_disable_blockprotect,
12619 .write = spi_chip_write_256,
12620 .read = spi_chip_read, /* Fast read (0x0B) supported */
12621 .voltage = {2700, 3600},
12622 },
12623
12624 {
12625 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012626 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +000012627 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012628 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012629 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +000012630 .total_size = 2048,
12631 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012632 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012633 .tested = TEST_UNTESTED,
12634 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012635 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012636 .block_erasers =
12637 {
12638 {
12639 .eraseblocks = { {4 * 1024, 512} },
12640 .block_erase = spi_block_erase_d7,
12641 }, {
12642 .eraseblocks = { {4 * 1024, 512} },
12643 .block_erase = spi_block_erase_20,
12644 }, {
12645 .eraseblocks = { {64 * 1024, 32} },
12646 .block_erase = spi_block_erase_d8,
12647 }, {
12648 .eraseblocks = { {2 * 1024 * 1024, 1} },
12649 .block_erase = spi_block_erase_60,
12650 }, {
12651 .eraseblocks = { {2 * 1024 * 1024, 1} },
12652 .block_erase = spi_block_erase_c7,
12653 }
12654 },
Alan Greena514de82019-09-09 16:40:10 +100012655 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012656 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012657 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100012658 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +000012659 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012660 },
12661
hailfinger286829b2009-01-08 03:40:17 +000012662 {
12663 .vendor = "PMC",
12664 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +000012665 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012666 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012667 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +000012668 .total_size = 256,
12669 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012670 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012671 .tested = TEST_UNTESTED,
12672 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012673 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012674 .block_erasers =
12675 {
12676 {
12677 .eraseblocks = { {4 * 1024, 64} },
12678 .block_erase = spi_block_erase_d7,
12679 }, {
12680 .eraseblocks = { {64 * 1024, 4} },
12681 .block_erase = spi_block_erase_d8,
12682 }, {
12683 .eraseblocks = { {256 * 1024, 1} },
12684 .block_erase = spi_block_erase_c7,
12685 }
12686 },
Alan Greena514de82019-09-09 16:40:10 +100012687 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012688 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012689 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012690 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000012691 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012692 },
12693
hailfinger286829b2009-01-08 03:40:17 +000012694 {
12695 .vendor = "PMC",
12696 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +000012697 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012698 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012699 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +000012700 .total_size = 512,
12701 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012702 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100012703 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000012704 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012705 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012706 .block_erasers =
12707 {
12708 {
12709 .eraseblocks = { {4 * 1024, 128} },
12710 .block_erase = spi_block_erase_d7,
12711 }, {
12712 .eraseblocks = { {64 * 1024, 8} },
12713 .block_erase = spi_block_erase_d8,
12714 }, {
12715 .eraseblocks = { {512 * 1024, 1} },
12716 .block_erase = spi_block_erase_c7,
12717 }
12718 },
Alan Greena514de82019-09-09 16:40:10 +100012719 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012720 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012721 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100012722 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +000012723 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012724 },
12725
hailfinger286829b2009-01-08 03:40:17 +000012726 {
12727 .vendor = "PMC",
12728 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +000012729 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012730 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012731 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +000012732 .total_size = 1024,
12733 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012734 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012735 .tested = TEST_UNTESTED,
12736 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012737 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012738 .block_erasers =
12739 {
12740 {
12741 .eraseblocks = { {4 * 1024, 256} },
12742 .block_erase = spi_block_erase_d7,
12743 }, {
12744 .eraseblocks = { {4 * 1024, 256} },
12745 .block_erase = spi_block_erase_20,
12746 }, {
12747 .eraseblocks = { {64 * 1024, 16} },
12748 .block_erase = spi_block_erase_d8,
12749 }, {
12750 .eraseblocks = { {1024 * 1024, 1} },
12751 .block_erase = spi_block_erase_60,
12752 }, {
12753 .eraseblocks = { {1024 * 1024, 1} },
12754 .block_erase = spi_block_erase_c7,
12755 }
12756 },
Alan Greena514de82019-09-09 16:40:10 +100012757 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012758 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012759 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100012760 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +000012761 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012762 },
12763
hailfinger286829b2009-01-08 03:40:17 +000012764 {
12765 .vendor = "PMC",
Alan Greenb40ec892019-08-26 11:43:40 +100012766 .name = "Pm25LV512(A)",
hailfingere1e41ea2011-07-27 07:13:06 +000012767 .bustype = BUS_SPI,
Nikolai Artemiev77235eb2021-01-28 16:34:37 +110012768 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012769 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +000012770 .total_size = 64,
12771 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100012772 .feature_bits = FEATURE_WRSR_WREN,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110012773 .tested = TEST_OK_PREW,
Nikolai Artemievf9329a02021-01-20 17:21:31 +110012774 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
hailfingere3095d92009-06-05 13:46:17 +000012775 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012776 .block_erasers =
12777 {
12778 {
12779 .eraseblocks = { {4 * 1024, 16} },
12780 .block_erase = spi_block_erase_d7,
12781 }, {
12782 .eraseblocks = { {32 * 1024, 2} },
12783 .block_erase = spi_block_erase_d8,
12784 }, {
12785 .eraseblocks = { {64 * 1024, 1} },
12786 .block_erase = spi_block_erase_c7,
12787 }
12788 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100012789 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012790 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012791 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100012792 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +000012793 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012794 },
12795
hailfinger286829b2009-01-08 03:40:17 +000012796 {
12797 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +000012798 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +000012799 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +000012800 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012801 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +000012802 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +000012803 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +000012804 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +000012805 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000012806 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060012807 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +000012808 .block_erasers =
12809 {
12810 {
12811 .eraseblocks = {
12812 {16 * 1024, 1},
12813 {8 * 1024, 2},
12814 {96 * 1024, 1},
12815 {128 * 1024, 1},
12816 },
snelsonc6855342010-01-28 23:55:12 +000012817 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000012818 }, {
12819 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +000012820 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000012821 },
12822 },
snelsonc6855342010-01-28 23:55:12 +000012823 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +000012824 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012825 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +000012826 },
12827
12828 {
12829 .vendor = "PMC",
Alan Greend76dc1f2019-06-26 15:38:19 +100012830 .name = "Pm29F002T",
12831 .bustype = BUS_PARALLEL,
12832 .manufacture_id = PMC_ID_NOPREFIX,
12833 .model_id = PMC_PM29F002T,
12834 .total_size = 256,
12835 .page_size = 8 * 1024,
12836 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12837 .tested = TEST_OK_PREW,
12838 .probe = probe_jedec,
12839 .probe_timing = TIMING_FIXME,
12840 .block_erasers =
12841 {
12842 {
12843 .eraseblocks = {
12844 {128 * 1024, 1},
12845 {96 * 1024, 1},
12846 {8 * 1024, 2},
12847 {16 * 1024, 1},
12848 },
12849 .block_erase = erase_sector_jedec,
12850 }, {
12851 .eraseblocks = { {256 * 1024, 1} },
12852 .block_erase = erase_chip_block_jedec,
12853 },
12854 },
12855 .write = write_jedec_1,
12856 .read = read_memmapped,
12857 .voltage = {4500, 5500},
12858 },
12859
12860 {
12861 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +000012862 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +000012863 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +000012864 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012865 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +000012866 .total_size = 128,
12867 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000012868 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000012869 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +000012870 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000012871 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +000012872 .block_erasers =
12873 {
12874 {
12875 .eraseblocks = { {4 * 1024, 32} },
12876 .block_erase = erase_sector_jedec,
12877 }, {
12878 .eraseblocks = { {64 * 1024, 2} },
12879 .block_erase = erase_block_jedec,
12880 }, {
12881 .eraseblocks = { {128 * 1024, 1} },
12882 .block_erase = erase_chip_block_jedec,
12883 }
12884 },
snelsonc6855342010-01-28 23:55:12 +000012885 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +000012886 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012887 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +000012888 },
12889
12890 {
12891 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +000012892 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +000012893 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +000012894 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012895 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +000012896 .total_size = 256,
12897 .page_size = 4096,
12898 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12899 .tested = TEST_UNTESTED,
12900 .probe = probe_jedec,
12901 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +100012902 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +000012903 {
12904 {
12905 .eraseblocks = { {4 * 1024, 64} },
12906 .block_erase = erase_sector_jedec,
12907 }, {
12908 .eraseblocks = { {64 * 1024, 4} },
12909 .block_erase = erase_block_jedec,
12910 }, {
12911 .eraseblocks = { {256 * 1024, 1} },
12912 .block_erase = erase_chip_block_jedec,
12913 }
12914 },
12915 .write = write_jedec_1,
12916 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012917 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +000012918 },
12919
12920 {
12921 .vendor = "PMC",
12922 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +000012923 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +000012924 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012925 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +000012926 .total_size = 512,
12927 .page_size = 4096,
12928 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000012929 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +000012930 .probe = probe_jedec,
12931 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +100012932 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +000012933 {
12934 {
12935 .eraseblocks = { {4 * 1024, 128} },
12936 .block_erase = erase_sector_jedec,
12937 }, {
12938 .eraseblocks = { {64 * 1024, 8} },
12939 .block_erase = erase_block_jedec,
12940 }, {
12941 .eraseblocks = { {512 * 1024, 1} },
12942 .block_erase = erase_chip_block_jedec,
12943 }
12944 },
12945 .write = write_jedec_1,
12946 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012947 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +000012948 },
Simon Glass8dc82732013-07-16 10:13:51 -060012949
hailfingerd444cc72010-03-27 23:25:14 +000012950 {
12951 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012952 .name = "Pm39LV512",
12953 .bustype = BUS_PARALLEL,
12954 .manufacture_id = PMC_ID_NOPREFIX,
12955 .model_id = PMC_PM39LV512,
12956 .total_size = 64,
12957 .page_size = 4096,
12958 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12959 .tested = TEST_OK_PREW,
12960 .probe = probe_jedec,
12961 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12962 .block_erasers =
12963 {
12964 {
12965 .eraseblocks = { {4 * 1024, 16} },
12966 .block_erase = erase_sector_jedec,
12967 }, {
12968 .eraseblocks = { {64 * 1024, 1} },
12969 .block_erase = erase_block_jedec,
12970 }, {
12971 .eraseblocks = { {64 * 1024, 1} },
12972 .block_erase = erase_chip_block_jedec,
12973 }
12974 },
12975 .write = write_jedec_1,
12976 .read = read_memmapped,
12977 .voltage = {2700, 3600},
12978 },
12979
12980 {
12981 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012982 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +000012983 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000012984 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012985 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +000012986 .total_size = 256,
12987 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000012988 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +100012989 .tested = TEST_OK_PR,
hailfingerafac00e2010-01-09 02:24:17 +000012990 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000012991 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +000012992 .block_erasers =
12993 {
12994 {
12995 .eraseblocks = { {4 * 1024, 64} },
12996 .block_erase = erase_sector_jedec,
12997 }, {
12998 .eraseblocks = { {16 * 1024, 16} },
12999 .block_erase = erase_block_jedec,
13000 }, {
13001 .eraseblocks = { {256 * 1024, 1} },
13002 .block_erase = erase_chip_block_jedec,
13003 }
13004 },
Alan Green90539742019-09-02 17:06:30 +100013005 .unlock = unlock_regspace2_uniform_32k,
snelson59c83d22010-02-27 18:01:15 +000013006 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000013007 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013008 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013009 },
13010
hailfinger286829b2009-01-08 03:40:17 +000013011 {
13012 .vendor = "PMC",
13013 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +000013014 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000013015 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000013016 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +000013017 .total_size = 512,
13018 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000013019 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +100013020 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +000013021 .probe = probe_jedec,
Nikolai Artemievdc39c032021-01-20 15:30:50 +110013022 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000013023 .block_erasers =
13024 {
13025 {
13026 .eraseblocks = { {4 * 1024, 128} },
13027 .block_erase = erase_sector_jedec,
13028 }, {
13029 .eraseblocks = { {64 * 1024, 8} },
13030 .block_erase = erase_block_jedec,
13031 }, {
13032 .eraseblocks = { {512 * 1024, 1} },
13033 .block_erase = erase_chip_block_jedec,
13034 }
13035 },
Alan Green90539742019-09-02 17:06:30 +100013036 .unlock = unlock_regspace2_uniform_64k,
snelson59c83d22010-02-27 18:01:15 +000013037 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000013038 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013039 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013040 },
13041
hailfinger286829b2009-01-08 03:40:17 +000013042 {
hailfinger286829b2009-01-08 03:40:17 +000013043 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013044 .name = "SST25LF020A",
13045 .bustype = BUS_SPI,
13046 .manufacture_id = SST_ID,
13047 .model_id = SST_SST25VF020_REMS,
13048 .total_size = 256,
13049 .page_size = 256,
13050 .feature_bits = FEATURE_WRSR_EWSR,
13051 .tested = TEST_OK_PREW,
13052 .probe = probe_spi_rems,
13053 .probe_timing = TIMING_ZERO,
13054 .block_erasers =
13055 {
13056 {
13057 .eraseblocks = { {4 * 1024, 64} },
13058 .block_erase = spi_block_erase_20,
13059 }, {
13060 .eraseblocks = { {32 * 1024, 8} },
13061 .block_erase = spi_block_erase_52,
13062 }, {
13063 .eraseblocks = { {256 * 1024, 1} },
13064 .block_erase = spi_block_erase_60,
13065 },
13066 },
13067 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13068 .unlock = spi_disable_blockprotect,
13069 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13070 .read = spi_chip_read, /* Fast read (0x0B) supported */
13071 .voltage = {2700, 3600},
13072 },
13073
13074 {
13075 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +000013076 .name = "SST25LF040A",
13077 .bustype = BUS_SPI,
13078 .manufacture_id = SST_ID,
13079 .model_id = SST_SST25VF040_REMS,
13080 .total_size = 512,
13081 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013082 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013083 .tested = TEST_OK_PREW,
stefanct753c1a52011-08-17 09:50:11 +000013084 .probe = probe_spi_res2,
13085 .probe_timing = TIMING_ZERO,
13086 .block_erasers =
13087 {
13088 {
13089 .eraseblocks = { {4 * 1024, 128} },
13090 .block_erase = spi_block_erase_20,
13091 }, {
13092 .eraseblocks = { {32 * 1024, 16} },
13093 .block_erase = spi_block_erase_52,
13094 }, {
13095 .eraseblocks = { {512 * 1024, 1} },
13096 .block_erase = spi_block_erase_60,
13097 },
13098 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100013099 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
stefanct753c1a52011-08-17 09:50:11 +000013100 .unlock = spi_disable_blockprotect,
13101 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13102 .read = spi_chip_read,
13103 .voltage = {3000, 3600},
13104 },
13105
13106 {
13107 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013108 .name = "SST25LF080(A)",
13109 .bustype = BUS_SPI,
13110 .manufacture_id = SST_ID,
13111 .model_id = SST_SST25VF080_REMS,
13112 .total_size = 1024,
13113 .page_size = 256,
13114 .feature_bits = FEATURE_WRSR_EITHER,
13115 .tested = TEST_UNTESTED,
13116 .probe = probe_spi_res2,
13117 .probe_timing = TIMING_ZERO,
13118 .block_erasers =
13119 {
13120 {
13121 .eraseblocks = { {4 * 1024, 256} },
13122 .block_erase = spi_block_erase_20,
13123 }, {
13124 .eraseblocks = { {32 * 1024, 32} },
13125 .block_erase = spi_block_erase_52,
13126 }, {
13127 .eraseblocks = { {1024 * 1024, 1} },
13128 .block_erase = spi_block_erase_60,
13129 },
13130 },
13131 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
13132 .unlock = spi_disable_blockprotect,
13133 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13134 .read = spi_chip_read,
13135 .voltage = {3000, 3600},
13136 },
13137
13138 {
13139 .vendor = "SST",
Alan Greenb40ec892019-08-26 11:43:40 +100013140 .name = "SST25VF010(A)",
hailfingere1e41ea2011-07-27 07:13:06 +000013141 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -080013142 .manufacture_id = SST_ID,
13143 .model_id = SST_SST25VF010_REMS,
13144 .total_size = 128,
13145 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100013146 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013147 .tested = TEST_OK_PREW,
David Hendricks668f29d2011-01-27 18:51:45 -080013148 .probe = probe_spi_rems,
13149 .probe_timing = TIMING_ZERO,
13150 .block_erasers =
13151 {
13152 {
13153 .eraseblocks = { {4 * 1024, 32} },
13154 .block_erase = spi_block_erase_20,
13155 }, {
13156 .eraseblocks = { {32 * 1024, 4} },
13157 .block_erase = spi_block_erase_52,
13158 }, {
Nikolai Artemievac724552021-01-28 16:13:25 +110013159 .eraseblocks = { {32 * 1024, 4} },
13160 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
13161 }, {
David Hendricks668f29d2011-01-27 18:51:45 -080013162 .eraseblocks = { {128 * 1024, 1} },
13163 .block_erase = spi_block_erase_60,
Nikolai Artemievac724552021-01-28 16:13:25 +110013164 }, {
13165 .eraseblocks = { {128 * 1024, 1} },
13166 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
David Hendricks668f29d2011-01-27 18:51:45 -080013167 },
13168 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013169 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
David Hendricks668f29d2011-01-27 18:51:45 -080013170 .unlock = spi_disable_blockprotect,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100013171 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13172 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Alan Green5dc48da2019-08-26 15:35:10 +100013173 .voltage = {2700, 3600},
David Hendricks668f29d2011-01-27 18:51:45 -080013174 },
13175
13176 {
hailfingerfb1f31f2010-12-03 14:48:11 +000013177 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013178 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +000013179 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013180 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013181 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +000013182 .total_size = 2048,
13183 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013184 .feature_bits = FEATURE_WRSR_EITHER,
Alan Green1295b292019-07-30 13:38:04 +100013185 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013186 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013187 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013188 .block_erasers =
13189 {
13190 {
13191 .eraseblocks = { {4 * 1024, 512} },
13192 .block_erase = spi_block_erase_20,
13193 }, {
13194 .eraseblocks = { {32 * 1024, 64} },
13195 .block_erase = spi_block_erase_52,
13196 }, {
13197 .eraseblocks = { {64 * 1024, 32} },
13198 .block_erase = spi_block_erase_d8,
13199 }, {
13200 .eraseblocks = { {2 * 1024 * 1024, 1} },
13201 .block_erase = spi_block_erase_60,
13202 }, {
13203 .eraseblocks = { {2 * 1024 * 1024, 1} },
13204 .block_erase = spi_block_erase_c7,
13205 },
13206 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013207 .printlock = spi_prettyprint_status_register_sst25vf016,
hailfingerb9560ee2010-07-14 20:21:22 +000013208 .unlock = spi_disable_blockprotect,
Nikolai Artemievc0ad4bd2021-01-20 17:31:26 +110013209 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +000013210 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013211 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013212 },
13213
hailfinger286829b2009-01-08 03:40:17 +000013214 {
13215 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013216 .name = "SST25VF020",
13217 .bustype = BUS_SPI,
13218 .manufacture_id = SST_ID,
13219 .model_id = SST_SST25VF020_REMS,
13220 .total_size = 256,
13221 .page_size = 256,
13222 .feature_bits = FEATURE_WRSR_EWSR,
13223 .tested = TEST_UNTESTED,
13224 .probe = probe_spi_rems,
13225 .probe_timing = TIMING_ZERO,
13226 .block_erasers =
13227 {
13228 {
13229 .eraseblocks = { {4 * 1024, 64} },
13230 .block_erase = spi_block_erase_20,
13231 }, {
13232 .eraseblocks = { {32 * 1024, 8} },
13233 .block_erase = spi_block_erase_52,
13234 }, {
13235 .eraseblocks = { {256 * 1024, 1} },
13236 .block_erase = spi_block_erase_60,
13237 },
13238 },
13239 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13240 .unlock = spi_disable_blockprotect,
13241 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13242 .read = spi_chip_read, /* only */
13243 .voltage = {2700, 3600},
13244 },
13245
13246 {
13247 .vendor = "SST",
13248 .name = "SST25VF020B",
13249 .bustype = BUS_SPI,
13250 .manufacture_id = SST_ID,
13251 .model_id = SST_SST25VF020B,
13252 .total_size = 256,
13253 .page_size = 256,
13254 .feature_bits = FEATURE_WRSR_EWSR,
13255 .tested = TEST_OK_PREW,
13256 .probe = probe_spi_rdid,
13257 .probe_timing = TIMING_ZERO,
13258 .block_erasers =
13259 {
13260 {
13261 .eraseblocks = { {4 * 1024, 64} },
13262 .block_erase = spi_block_erase_20,
13263 }, {
13264 .eraseblocks = { {32 * 1024, 8} },
13265 .block_erase = spi_block_erase_52,
13266 }, {
13267 .eraseblocks = { {64 * 1024, 4} },
13268 .block_erase = spi_block_erase_d8,
13269 }, {
13270 .eraseblocks = { {256 * 1024, 1} },
13271 .block_erase = spi_block_erase_60,
13272 }, {
13273 .eraseblocks = { {256 * 1024, 1} },
13274 .block_erase = spi_block_erase_c7,
13275 },
13276 },
13277 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13278 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13279 .write = spi_aai_write, /* AAI supported (0xAD) */
13280 .read = spi_chip_read, /* Fast read (0x0B) supported */
13281 .voltage = {2700, 3600},
13282 },
13283
13284 {
13285 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013286 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +000013287 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013288 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013289 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +000013290 .total_size = 4096,
13291 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013292 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013293 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013294 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013295 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013296 .block_erasers =
13297 {
13298 {
13299 .eraseblocks = { {4 * 1024, 1024} },
13300 .block_erase = spi_block_erase_20,
13301 }, {
13302 .eraseblocks = { {32 * 1024, 128} },
13303 .block_erase = spi_block_erase_52,
13304 }, {
13305 .eraseblocks = { {64 * 1024, 64} },
13306 .block_erase = spi_block_erase_d8,
13307 }, {
13308 .eraseblocks = { {4 * 1024 * 1024, 1} },
13309 .block_erase = spi_block_erase_60,
13310 }, {
13311 .eraseblocks = { {4 * 1024 * 1024, 1} },
13312 .block_erase = spi_block_erase_c7,
13313 },
13314 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100013315 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
hailfingerb9560ee2010-07-14 20:21:22 +000013316 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +000013317 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +000013318 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013319 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +000013320 },
13321
13322 {
13323 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +000013324 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +000013325 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +000013326 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013327 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +000013328 .total_size = 512,
13329 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013330 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013331 .tested = TEST_OK_PR,
hailfinger3aa0df12009-12-23 12:16:47 +000013332 .probe = probe_spi_rems,
13333 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013334 .block_erasers =
13335 {
13336 {
13337 .eraseblocks = { {4 * 1024, 128} },
13338 .block_erase = spi_block_erase_20,
13339 }, {
13340 .eraseblocks = { {32 * 1024, 16} },
13341 .block_erase = spi_block_erase_52,
13342 }, {
13343 .eraseblocks = { {512 * 1024, 1} },
13344 .block_erase = spi_block_erase_60,
13345 },
13346 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013347 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
hailfingerb9560ee2010-07-14 20:21:22 +000013348 .unlock = spi_disable_blockprotect,
Nikolai Artemievc0ad4bd2021-01-20 17:31:26 +110013349 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +000013350 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000013351 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013352 },
13353
hailfinger286829b2009-01-08 03:40:17 +000013354 {
13355 .vendor = "SST",
13356 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +000013357 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013358 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013359 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +000013360 .total_size = 512,
13361 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013362 .feature_bits = FEATURE_WRSR_EWSR,
Edward O'Callaghan34608d82020-10-01 21:43:48 +100013363 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013364 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013365 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013366 .block_erasers =
13367 {
13368 {
13369 .eraseblocks = { {4 * 1024, 128} },
13370 .block_erase = spi_block_erase_20,
13371 }, {
13372 .eraseblocks = { {32 * 1024, 16} },
13373 .block_erase = spi_block_erase_52,
13374 }, {
13375 .eraseblocks = { {64 * 1024, 8} },
13376 .block_erase = spi_block_erase_d8,
13377 }, {
13378 .eraseblocks = { {512 * 1024, 1} },
13379 .block_erase = spi_block_erase_60,
13380 }, {
13381 .eraseblocks = { {512 * 1024, 1} },
13382 .block_erase = spi_block_erase_c7,
13383 },
13384 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013385 .printlock = spi_prettyprint_status_register_sst25vf040b,
hailfingerb9560ee2010-07-14 20:21:22 +000013386 .unlock = spi_disable_blockprotect,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100013387 .write = spi_aai_write, /* AAI supported (0xAD) */
13388 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +000013389 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +000013390 },
13391
13392 {
13393 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +000013394 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +000013395 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +000013396 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013397 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +000013398 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +000013399 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013400 .feature_bits = FEATURE_WRSR_EWSR,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110013401 .tested = TEST_OK_PREW,
stuge712ce862009-01-26 03:37:40 +000013402 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +000013403 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013404 .block_erasers =
13405 {
13406 {
13407 .eraseblocks = { {4 * 1024, 128} },
13408 .block_erase = spi_block_erase_20,
13409 }, {
13410 .eraseblocks = { {32 * 1024, 16} },
13411 .block_erase = spi_block_erase_52,
13412 }, {
13413 .eraseblocks = { {64 * 1024, 8} },
13414 .block_erase = spi_block_erase_d8,
13415 }, {
13416 .eraseblocks = { {512 * 1024, 1} },
13417 .block_erase = spi_block_erase_60,
13418 }, {
13419 .eraseblocks = { {512 * 1024, 1} },
13420 .block_erase = spi_block_erase_c7,
13421 },
13422 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013423 .printlock = spi_prettyprint_status_register_sst25vf040b,
hailfingerb9560ee2010-07-14 20:21:22 +000013424 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013425 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +000013426 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000013427 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +000013428 },
13429
13430 {
13431 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100013432 .name = "SST25VF064C",
13433 .bustype = BUS_SPI,
13434 .manufacture_id = SST_ID,
13435 .model_id = SST_SST25VF064C,
13436 .total_size = 8192,
13437 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013438 .feature_bits = FEATURE_WRSR_EWSR,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110013439 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100013440 .probe = probe_spi_rdid,
13441 .probe_timing = TIMING_ZERO,
13442 .block_erasers =
13443 {
13444 {
13445 .eraseblocks = { {4 * 1024, 2048} },
13446 .block_erase = spi_block_erase_20,
13447 }, {
13448 .eraseblocks = { {32 * 1024, 256} },
13449 .block_erase = spi_block_erase_52,
13450 }, {
13451 .eraseblocks = { {64 * 1024, 128} },
13452 .block_erase = spi_block_erase_d8,
13453 }, {
13454 .eraseblocks = { {8 * 1024 * 1024, 1} },
13455 .block_erase = spi_block_erase_60,
13456 }, {
13457 .eraseblocks = { {8 * 1024 * 1024, 1} },
13458 .block_erase = spi_block_erase_c7,
13459 },
13460 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013461 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Alan Greend76dc1f2019-06-26 15:38:19 +100013462 .unlock = spi_disable_blockprotect,
13463 .write = spi_chip_write_256,
13464 .read = spi_chip_read,
13465 .voltage = {2700, 3600},
13466 },
13467
13468 {
13469 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013470 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +000013471 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013472 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013473 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +000013474 .total_size = 1024,
13475 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013476 .feature_bits = FEATURE_WRSR_EWSR,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110013477 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013478 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013479 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013480 .block_erasers =
13481 {
13482 {
13483 .eraseblocks = { {4 * 1024, 256} },
13484 .block_erase = spi_block_erase_20,
13485 }, {
13486 .eraseblocks = { {32 * 1024, 32} },
13487 .block_erase = spi_block_erase_52,
13488 }, {
13489 .eraseblocks = { {64 * 1024, 16} },
13490 .block_erase = spi_block_erase_d8,
13491 }, {
13492 .eraseblocks = { {1024 * 1024, 1} },
13493 .block_erase = spi_block_erase_60,
13494 }, {
13495 .eraseblocks = { {1024 * 1024, 1} },
13496 .block_erase = spi_block_erase_c7,
13497 },
13498 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100013499 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
hailfingerb9560ee2010-07-14 20:21:22 +000013500 .unlock = spi_disable_blockprotect,
Nikolai Artemievc0ad4bd2021-01-20 17:31:26 +110013501 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +000013502 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013503 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013504 },
13505
hailfinger286829b2009-01-08 03:40:17 +000013506 {
13507 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013508 .name = "SST25VF512(A)",
13509 .bustype = BUS_SPI,
13510 .manufacture_id = SST_ID,
13511 .model_id = SST_SST25VF512_REMS,
13512 .total_size = 64,
13513 .page_size = 256,
13514 .feature_bits = FEATURE_WRSR_EWSR,
13515 .tested = TEST_OK_PREW,
13516 .probe = probe_spi_rems,
13517 .probe_timing = TIMING_ZERO,
13518 .block_erasers =
13519 {
13520 {
13521 .eraseblocks = { {4 * 1024, 16} },
13522 .block_erase = spi_block_erase_20,
13523 }, {
13524 .eraseblocks = { {32 * 1024, 2} },
13525 .block_erase = spi_block_erase_52,
13526 }, {
13527 .eraseblocks = { {32 * 1024, 2} },
13528 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
13529 }, {
13530 .eraseblocks = { {64 * 1024, 1} },
13531 .block_erase = spi_block_erase_60,
13532 }, {
13533 .eraseblocks = { {64 * 1024, 1} },
13534 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
13535 },
13536 },
13537 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13538 .unlock = spi_disable_blockprotect,
13539 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13540 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
13541 .voltage = {2700, 3600},
13542 },
13543
13544 {
13545 .vendor = "SST",
13546 .name = "SST25WF010",
13547 .bustype = BUS_SPI,
13548 .manufacture_id = SST_ID,
13549 .model_id = SST_SST25WF010,
13550 .total_size = 128,
13551 .page_size = 256,
13552 .feature_bits = FEATURE_WRSR_EITHER,
13553 .tested = TEST_UNTESTED,
13554 .probe = probe_spi_rdid,
13555 .probe_timing = TIMING_ZERO,
13556 .block_erasers =
13557 {
13558 {
13559 .eraseblocks = { {4 * 1024, 32} },
13560 .block_erase = spi_block_erase_20,
13561 }, {
13562 .eraseblocks = { {32 * 1024, 4} },
13563 .block_erase = spi_block_erase_52,
13564 }, {
13565 .eraseblocks = { {1024 * 128, 1} },
13566 .block_erase = spi_block_erase_60,
13567 }, {
13568 .eraseblocks = { {1024 * 128, 1} },
13569 .block_erase = spi_block_erase_c7,
13570 },
13571 },
13572 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13573 .unlock = spi_disable_blockprotect_bp2_srwd,
13574 .write = spi_aai_write,
13575 .read = spi_chip_read, /* Fast read (0x0B) supported */
13576 .voltage = {1650, 1950},
13577 },
13578
13579 {
13580 .vendor = "SST",
13581 .name = "SST25WF020",
13582 .bustype = BUS_SPI,
13583 .manufacture_id = SST_ID,
13584 .model_id = SST_SST25WF020,
13585 .total_size = 256,
13586 .page_size = 256,
13587 .feature_bits = FEATURE_WRSR_EITHER,
13588 .tested = TEST_UNTESTED,
13589 .probe = probe_spi_rdid,
13590 .probe_timing = TIMING_ZERO,
13591 .block_erasers =
13592 {
13593 {
13594 .eraseblocks = { {4 * 1024, 64} },
13595 .block_erase = spi_block_erase_20,
13596 }, {
13597 .eraseblocks = { {32 * 1024, 8} },
13598 .block_erase = spi_block_erase_52,
13599 }, {
13600 .eraseblocks = { {64 * 1024, 4} },
13601 .block_erase = spi_block_erase_d8,
13602 }, {
13603 .eraseblocks = { {1024 * 256, 1} },
13604 .block_erase = spi_block_erase_60,
13605 }, {
13606 .eraseblocks = { {1024 * 256, 1} },
13607 .block_erase = spi_block_erase_c7,
13608 },
13609 },
13610 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13611 .unlock = spi_disable_blockprotect_bp2_srwd,
13612 .write = spi_aai_write,
13613 .read = spi_chip_read, /* Fast read (0x0B) supported */
13614 .voltage = {1650, 1950},
13615 },
13616
13617 {
13618 .vendor = "SST",
Nikolai Artemievfe595da2020-08-31 17:49:27 +100013619 .name = "SST25WF020A",
13620 .bustype = BUS_SPI,
13621 .manufacture_id = SANYO_ID, /* See flashchips.h */
13622 .model_id = SST_SST25WF020A,
13623 .total_size = 256,
13624 .page_size = 256,
13625 .feature_bits = FEATURE_WRSR_WREN,
13626 .tested = TEST_UNTESTED,
13627 .probe = probe_spi_rdid,
13628 .probe_timing = TIMING_ZERO,
13629 .block_erasers =
13630 {
13631 {
13632 .eraseblocks = { {4 * 1024, 64} },
13633 .block_erase = spi_block_erase_20,
13634 }, {
13635 .eraseblocks = { {64 * 1024, 4} },
13636 .block_erase = spi_block_erase_d8,
13637 }, {
13638 .eraseblocks = { {256 * 1024, 1} },
13639 .block_erase = spi_block_erase_60,
13640 }, {
13641 .eraseblocks = { {256 * 1024, 1} },
13642 .block_erase = spi_block_erase_c7,
13643 },
13644 },
13645 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13646 .unlock = spi_disable_blockprotect_bp2_srwd,
13647 .write = spi_chip_write_256,
13648 .read = spi_chip_read, /* Fast read (0x0B) supported */
13649 .voltage = {1650, 1950},
13650 },
13651
13652 {
13653 .vendor = "SST",
13654 .name = "SST25WF040",
13655 .bustype = BUS_SPI,
13656 .manufacture_id = SST_ID,
13657 .model_id = SST_SST25WF040,
13658 .total_size = 512,
13659 .page_size = 256,
13660 .feature_bits = FEATURE_WRSR_EITHER,
13661 .tested = TEST_UNTESTED,
13662 .probe = probe_spi_rdid,
13663 .probe_timing = TIMING_ZERO,
13664 .block_erasers =
13665 {
13666 {
13667 .eraseblocks = { {4 * 1024, 128} },
13668 .block_erase = spi_block_erase_20,
13669 }, {
13670 .eraseblocks = { {32 * 1024, 16} },
13671 .block_erase = spi_block_erase_52,
13672 }, {
13673 .eraseblocks = { {64 * 1024, 8} },
13674 .block_erase = spi_block_erase_d8,
13675 }, {
13676 .eraseblocks = { {1024 * 512, 1} },
13677 .block_erase = spi_block_erase_60,
13678 }, {
13679 .eraseblocks = { {1024 * 512, 1} },
13680 .block_erase = spi_block_erase_c7,
13681 },
13682 },
13683 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13684 .unlock = spi_disable_blockprotect_bp2_srwd,
13685 .write = spi_aai_write,
13686 .read = spi_chip_read, /* Fast read (0x0B) supported */
13687 .voltage = {1650, 1950},
13688 },
13689
13690 {
13691 .vendor = "SST",
13692 .name = "SST25WF040B",
13693 .bustype = BUS_SPI,
13694 .manufacture_id = SANYO_ID, /* See flashchips.h */
13695 .model_id = SST_SST25WF040B,
13696 .total_size = 512,
13697 .page_size = 256,
13698 .feature_bits = FEATURE_WRSR_WREN,
13699 .tested = TEST_UNTESTED,
13700 .probe = probe_spi_rdid,
13701 .probe_timing = TIMING_ZERO,
13702 .block_erasers =
13703 {
13704 {
13705 .eraseblocks = { {4 * 1024, 128} },
13706 .block_erase = spi_block_erase_20,
13707 }, {
13708 .eraseblocks = { {64 * 1024, 8} },
13709 .block_erase = spi_block_erase_d8,
13710 }, {
13711 .eraseblocks = { {512 * 1024, 1} },
13712 .block_erase = spi_block_erase_60,
13713 }, {
13714 .eraseblocks = { {512 * 1024, 1} },
13715 .block_erase = spi_block_erase_c7,
13716 },
13717 },
13718 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13719 .unlock = spi_disable_blockprotect_bp2_srwd,
13720 .write = spi_chip_write_256,
13721 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13722 .voltage = {1650, 1950},
13723 },
13724
13725 {
13726 .vendor = "SST",
13727 .name = "SST25WF080",
13728 .bustype = BUS_SPI,
13729 .manufacture_id = SST_ID,
13730 .model_id = SST_SST25WF080,
13731 .total_size = 1024,
13732 .page_size = 256,
13733 .feature_bits = FEATURE_WRSR_EITHER,
13734 .tested = TEST_OK_PREW,
13735 .probe = probe_spi_rdid,
13736 .probe_timing = TIMING_ZERO,
13737 .block_erasers =
13738 {
13739 {
13740 .eraseblocks = { {4 * 1024, 256} },
13741 .block_erase = spi_block_erase_20,
13742 }, {
13743 .eraseblocks = { {32 * 1024, 32} },
13744 .block_erase = spi_block_erase_52,
13745 }, {
13746 .eraseblocks = { {64 * 1024, 16} },
13747 .block_erase = spi_block_erase_d8,
13748 }, {
13749 .eraseblocks = { {1024 * 1024, 1} },
13750 .block_erase = spi_block_erase_60,
13751 }, {
13752 .eraseblocks = { {1024 * 1024, 1} },
13753 .block_erase = spi_block_erase_c7,
13754 },
13755 },
13756 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13757 .unlock = spi_disable_blockprotect_bp3_srwd,
13758 .write = spi_aai_write,
13759 .read = spi_chip_read, /* Fast read (0x0B) supported */
13760 .voltage = {1650, 1950},
13761 },
13762
13763 {
13764 .vendor = "SST",
13765 .name = "SST25WF080B",
13766 .bustype = BUS_SPI,
13767 .manufacture_id = SANYO_ID, /* See flashchips.h */
13768 .model_id = SST_SST25WF080B,
13769 .total_size = 1024,
13770 .page_size = 256,
13771 .feature_bits = FEATURE_WRSR_WREN,
13772 .tested = TEST_OK_PREW,
13773 .probe = probe_spi_rdid,
13774 .probe_timing = TIMING_ZERO,
13775 .block_erasers =
13776 {
13777 {
13778 .eraseblocks = { {4 * 1024, 256} },
13779 .block_erase = spi_block_erase_20,
13780 }, {
13781 .eraseblocks = { {64 * 1024, 16} },
13782 .block_erase = spi_block_erase_d8,
13783 }, {
13784 .eraseblocks = { {1024 * 1024, 1} },
13785 .block_erase = spi_block_erase_60,
13786 }, {
13787 .eraseblocks = { {1024 * 1024, 1} },
13788 .block_erase = spi_block_erase_c7,
13789 },
13790 },
13791 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13792 .unlock = spi_disable_blockprotect_bp2_srwd,
13793 .write = spi_chip_write_256,
13794 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13795 .voltage = {1650, 1950},
13796 },
13797
13798 {
13799 .vendor = "SST",
13800 .name = "SST25WF512",
13801 .bustype = BUS_SPI,
13802 .manufacture_id = SST_ID,
13803 .model_id = SST_SST25WF512,
13804 .total_size = 64,
13805 .page_size = 256,
13806 .feature_bits = FEATURE_WRSR_EITHER,
13807 .tested = TEST_UNTESTED,
13808 .probe = probe_spi_rdid,
13809 .probe_timing = TIMING_ZERO,
13810 .block_erasers =
13811 {
13812 {
13813 .eraseblocks = { {4 * 1024, 16} },
13814 .block_erase = spi_block_erase_20,
13815 }, {
13816 .eraseblocks = { {32 * 1024, 2} },
13817 .block_erase = spi_block_erase_52,
13818 }, {
13819 .eraseblocks = { {1024 * 64, 1} },
13820 .block_erase = spi_block_erase_60,
13821 }, {
13822 .eraseblocks = { {1024 * 64, 1} },
13823 .block_erase = spi_block_erase_c7,
13824 },
13825 },
13826 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13827 .unlock = spi_disable_blockprotect_bp2_srwd,
13828 .write = spi_aai_write,
13829 .read = spi_chip_read, /* Fast read (0x0B) supported */
13830 .voltage = {1650, 1950},
13831 },
13832
13833 {
13834 .vendor = "SST",
13835 .name = "SST26VF016B(A)",
13836 .bustype = BUS_SPI,
13837 .manufacture_id = SST_ID,
13838 .model_id = SST_SST26VF016B,
13839 .total_size = 2048,
13840 .page_size = 256,
13841 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13842 .tested = TEST_OK_PREW,
13843 .probe = probe_spi_rdid,
13844 .probe_timing = TIMING_ZERO,
13845 .block_erasers =
13846 {
13847 {
13848 .eraseblocks = { {4 * 1024, 512} },
13849 .block_erase = spi_block_erase_20,
13850 }, {
13851 .eraseblocks = {
13852 {8 * 1024, 4},
13853 {32 * 1024, 1},
13854 {64 * 1024, 30},
13855 {32 * 1024, 1},
13856 {8 * 1024, 4},
13857 },
13858 .block_erase = spi_block_erase_d8,
13859 }, {
13860 .eraseblocks = { {2 * 1024 * 1024, 1} },
13861 .block_erase = spi_block_erase_c7,
13862 },
13863 },
13864 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13865 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13866 .write = spi_chip_write_256, /* Multi I/O supported */
13867 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13868 .voltage = {2700, 3600},
13869 },
13870
13871 {
13872 .vendor = "SST",
13873 .name = "SST26VF032B(A)",
13874 .bustype = BUS_SPI,
13875 .manufacture_id = SST_ID,
13876 .model_id = SST_SST26VF032B,
13877 .total_size = 4096,
13878 .page_size = 256,
13879 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13880 .tested = TEST_UNTESTED,
13881 .probe = probe_spi_rdid,
13882 .probe_timing = TIMING_ZERO,
13883 .block_erasers =
13884 {
13885 {
13886 .eraseblocks = { {4 * 1024, 1024} },
13887 .block_erase = spi_block_erase_20,
13888 }, {
13889 .eraseblocks = {
13890 {8 * 1024, 4},
13891 {32 * 1024, 1},
13892 {64 * 1024, 62},
13893 {32 * 1024, 1},
13894 {8 * 1024, 4},
13895 },
13896 .block_erase = spi_block_erase_d8,
13897 }, {
13898 .eraseblocks = { {4 * 1024 * 1024, 1} },
13899 .block_erase = spi_block_erase_c7,
13900 },
13901 },
13902 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13903 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13904 .write = spi_chip_write_256, /* Multi I/O supported */
13905 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13906 .voltage = {2700, 3600},
13907 },
13908
13909 {
13910 .vendor = "SST",
13911 .name = "SST26VF064B(A)",
13912 .bustype = BUS_SPI,
13913 .manufacture_id = SST_ID,
13914 .model_id = SST_SST26VF064B,
13915 .total_size = 8192,
13916 .page_size = 256,
13917 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13918 .tested = TEST_OK_PREW,
13919 .probe = probe_spi_rdid,
13920 .probe_timing = TIMING_ZERO,
13921 .block_erasers =
13922 {
13923 {
13924 .eraseblocks = { {4 * 1024, 2048} },
13925 .block_erase = spi_block_erase_20,
13926 }, {
13927 .eraseblocks = {
13928 {8 * 1024, 4},
13929 {32 * 1024, 1},
13930 {64 * 1024, 126},
13931 {32 * 1024, 1},
13932 {8 * 1024, 4},
13933 },
13934 .block_erase = spi_block_erase_d8,
13935 }, {
13936 .eraseblocks = { {8 * 1024 * 1024, 1} },
13937 .block_erase = spi_block_erase_c7,
13938 },
13939 },
13940 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13941 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13942 .write = spi_chip_write_256, /* Multi I/O supported */
13943 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13944 .voltage = {2700, 3600},
13945 },
13946
13947 {
13948 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013949 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +000013950 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013951 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013952 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +000013953 .total_size = 512,
13954 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000013955 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +000013956 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000013957 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000013958 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +000013959 .block_erasers =
13960 {
13961 {
13962 .eraseblocks = { {128, 4096} },
13963 .block_erase = erase_sector_28sf040,
13964 }, {
13965 .eraseblocks = { {512 * 1024, 1} },
13966 .block_erase = erase_chip_28sf040,
13967 }
13968 },
hailfinger86bf3b52010-10-13 21:49:30 +000013969 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +000013970 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +000013971 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013972 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013973 },
13974
hailfinger286829b2009-01-08 03:40:17 +000013975 {
13976 .vendor = "SST",
13977 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +000013978 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013979 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013980 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +000013981 .total_size = 128,
13982 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000013983 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000013984 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000013985 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060013986 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000013987 .block_erasers =
13988 {
13989 {
13990 .eraseblocks = { {128 * 1024, 1} },
13991 .block_erase = erase_chip_block_jedec,
13992 }
13993 },
hailfinger286829b2009-01-08 03:40:17 +000013994 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000013995 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013996 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013997 },
13998
hailfinger286829b2009-01-08 03:40:17 +000013999 {
14000 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000014001 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +000014002 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014003 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014004 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +000014005 .total_size = 256,
14006 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000014007 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000014008 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000014009 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014010 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000014011 .block_erasers =
14012 {
14013 {
14014 .eraseblocks = { {256 * 1024, 1} },
14015 .block_erase = erase_chip_block_jedec,
14016 }
14017 },
hailfinger286829b2009-01-08 03:40:17 +000014018 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000014019 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014020 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014021 },
14022
hailfinger286829b2009-01-08 03:40:17 +000014023 {
14024 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100014025 .name = "SST29LE010",
14026 .bustype = BUS_PARALLEL,
14027 .manufacture_id = SST_ID,
14028 .model_id = SST_SST29LE010,
14029 .total_size = 128,
14030 .page_size = 128,
14031 .feature_bits = FEATURE_LONG_RESET,
14032 .tested = TEST_UNTESTED,
14033 .probe = probe_jedec,
14034 .probe_timing = 10,
14035 .block_erasers =
14036 {
14037 {
14038 .eraseblocks = { {128 * 1024, 1} },
14039 .block_erase = erase_chip_block_jedec,
14040 }
14041 },
14042 .write = write_jedec,
14043 .read = read_memmapped,
14044 .voltage = {3000, 3600},
14045 },
14046
14047 {
14048 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000014049 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +000014050 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014051 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014052 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +000014053 .total_size = 256,
14054 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000014055 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000014056 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000014057 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060014058 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000014059 .block_erasers =
14060 {
14061 {
14062 .eraseblocks = { {256 * 1024, 1} },
14063 .block_erase = erase_chip_block_jedec,
14064 }
14065 },
hailfinger286829b2009-01-08 03:40:17 +000014066 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000014067 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014068 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014069 },
14070
hailfinger286829b2009-01-08 03:40:17 +000014071 {
14072 .vendor = "SST",
14073 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +000014074 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014075 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014076 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +000014077 .total_size = 128,
14078 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014079 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +000014080 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014081 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +000014082 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014083 .block_erasers =
14084 {
14085 {
14086 .eraseblocks = { {4 * 1024, 32} },
14087 .block_erase = erase_sector_jedec,
14088 }, {
14089 .eraseblocks = { {128 * 1024, 1} },
14090 .block_erase = erase_chip_block_jedec,
14091 }
14092 },
snelsonc6855342010-01-28 23:55:12 +000014093 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014094 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014095 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014096 },
14097
hailfinger286829b2009-01-08 03:40:17 +000014098 {
14099 .vendor = "SST",
14100 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +000014101 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014102 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014103 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +000014104 .total_size = 256,
14105 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014106 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014107 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014108 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014109 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014110 .block_erasers =
14111 {
14112 {
14113 .eraseblocks = { {4 * 1024, 64} },
14114 .block_erase = erase_sector_jedec,
14115 }, {
14116 .eraseblocks = { {256 * 1024, 1} },
14117 .block_erase = erase_chip_block_jedec,
14118 }
14119 },
snelsonc6855342010-01-28 23:55:12 +000014120 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014121 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014122 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014123 },
14124
hailfinger286829b2009-01-08 03:40:17 +000014125 {
14126 .vendor = "SST",
14127 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +000014128 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014129 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014130 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +000014131 .total_size = 512,
14132 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014133 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +000014134 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014135 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014136 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014137 .block_erasers =
14138 {
14139 {
14140 .eraseblocks = { {4 * 1024, 128} },
14141 .block_erase = erase_sector_jedec,
14142 }, {
14143 .eraseblocks = { {512 * 1024, 1} },
14144 .block_erase = erase_chip_block_jedec,
14145 }
14146 },
snelsonc6855342010-01-28 23:55:12 +000014147 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014148 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014149 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014150 },
14151
hailfinger286829b2009-01-08 03:40:17 +000014152 {
14153 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100014154 .name = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +000014155 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014156 .manufacture_id = SST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +100014157 .model_id = SST_SST39SF512,
hailfinger286829b2009-01-08 03:40:17 +000014158 .total_size = 64,
14159 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014160 .feature_bits = FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100014161 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014162 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014163 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014164 .block_erasers =
14165 {
14166 {
14167 .eraseblocks = { {4 * 1024, 16} },
14168 .block_erase = erase_sector_jedec,
14169 }, {
14170 .eraseblocks = { {64 * 1024, 1} },
14171 .block_erase = erase_chip_block_jedec,
14172 }
14173 },
snelsonc6855342010-01-28 23:55:12 +000014174 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014175 .read = read_memmapped,
Alan Greend76dc1f2019-06-26 15:38:19 +100014176 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014177 },
14178
hailfinger286829b2009-01-08 03:40:17 +000014179 {
14180 .vendor = "SST",
14181 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +000014182 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014183 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014184 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +000014185 .total_size = 128,
14186 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014187 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014188 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014189 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014190 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014191 .block_erasers =
14192 {
14193 {
14194 .eraseblocks = { {4 * 1024, 32} },
14195 .block_erase = erase_sector_jedec,
14196 }, {
14197 .eraseblocks = { {128 * 1024, 1} },
14198 .block_erase = erase_chip_block_jedec,
14199 }
14200 },
snelsonc6855342010-01-28 23:55:12 +000014201 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014202 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014203 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014204 },
14205
hailfinger286829b2009-01-08 03:40:17 +000014206 {
14207 .vendor = "SST",
14208 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +000014209 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014210 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014211 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +000014212 .total_size = 256,
14213 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014214 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014215 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014216 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014217 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014218 .block_erasers =
14219 {
14220 {
14221 .eraseblocks = { {4 * 1024, 64} },
14222 .block_erase = erase_sector_jedec,
14223 }, {
14224 .eraseblocks = { {256 * 1024, 1} },
14225 .block_erase = erase_chip_block_jedec,
14226 }
14227 },
snelsonc6855342010-01-28 23:55:12 +000014228 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014229 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014230 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014231 },
14232
hailfinger286829b2009-01-08 03:40:17 +000014233 {
14234 .vendor = "SST",
14235 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +000014236 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014237 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014238 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +000014239 .total_size = 512,
14240 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014241 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014242 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014243 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014244 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014245 .block_erasers =
14246 {
14247 {
14248 .eraseblocks = { {4 * 1024, 128} },
14249 .block_erase = erase_sector_jedec,
14250 }, {
14251 .eraseblocks = { {512 * 1024, 1} },
14252 .block_erase = erase_chip_block_jedec,
14253 }
14254 },
snelsonc6855342010-01-28 23:55:12 +000014255 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014256 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014257 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +000014258 },
stepanaa1b6a22008-12-08 18:15:10 +000014259
hailfinger286829b2009-01-08 03:40:17 +000014260 {
14261 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +000014262 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +000014263 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +000014264 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014265 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +000014266 .total_size = 1024,
14267 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014268 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +000014269 .tested = TEST_UNTESTED,
14270 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014271 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014272 .block_erasers =
14273 {
14274 {
14275 .eraseblocks = { {4 * 1024, 256} },
14276 .block_erase = erase_sector_jedec,
14277 }, {
14278 .eraseblocks = { {64 * 1024, 16} },
14279 .block_erase = erase_block_jedec,
14280 }, {
14281 .eraseblocks = { {1024 * 1024, 1} },
14282 .block_erase = erase_chip_block_jedec,
14283 }
14284 },
snelsonc6855342010-01-28 23:55:12 +000014285 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014286 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014287 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +000014288 },
14289
14290 {
14291 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100014292 .name = "SST39VF512",
14293 .bustype = BUS_PARALLEL,
14294 .manufacture_id = SST_ID,
14295 .model_id = SST_SST39VF512,
14296 .total_size = 64,
14297 .page_size = 4096,
14298 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014299 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100014300 .probe = probe_jedec,
14301 .probe_timing = 1, /* 150 ns */
14302 .block_erasers =
14303 {
14304 {
14305 .eraseblocks = { {4 * 1024, 16} },
14306 .block_erase = erase_sector_jedec,
14307 }, {
14308 .eraseblocks = { {64 * 1024, 1} },
14309 .block_erase = erase_chip_block_jedec,
14310 }
14311 },
14312 .write = write_jedec_1,
14313 .read = read_memmapped,
14314 .voltage = {2700, 3600},
14315 },
14316
14317 {
14318 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000014319 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014320 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014321 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014322 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +000014323 .total_size = 256,
14324 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014325 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014326 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014327 .probe = probe_jedec,
14328 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014329 .block_erasers =
14330 {
14331 {
14332 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +000014333 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014334 }, {
14335 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +000014336 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014337 }, {
14338 .eraseblocks = { {256 * 1024, 1} },
14339 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14340 }
14341 },
hailfingerb8e4e212010-03-15 03:48:42 +000014342 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014343 .unlock = unlock_sst_fwhub,
14344 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014345 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014346 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014347 },
14348
hailfinger286829b2009-01-08 03:40:17 +000014349 {
14350 .vendor = "SST",
14351 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014352 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014353 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014354 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +000014355 .total_size = 384,
14356 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014357 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014358 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014359 .probe = probe_jedec,
14360 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014361 .block_erasers =
14362 {
14363 {
14364 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +000014365 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014366 }, {
14367 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +000014368 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014369 }, {
14370 .eraseblocks = { {384 * 1024, 1} },
14371 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14372 }
14373 },
hailfingerb8e4e212010-03-15 03:48:42 +000014374 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014375 .unlock = unlock_sst_fwhub,
14376 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014377 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014378 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014379 },
14380
hailfinger286829b2009-01-08 03:40:17 +000014381 {
hailfinger80f48682009-09-23 22:01:33 +000014382 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14383 * and is only honored for 64k block erase, but not 4k sector erase.
14384 */
hailfinger286829b2009-01-08 03:40:17 +000014385 .vendor = "SST",
14386 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014387 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014388 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014389 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +000014390 .total_size = 512,
14391 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014392 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014393 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014394 .probe = probe_jedec,
14395 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +000014396 .block_erasers =
14397 {
14398 {
14399 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +000014400 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +000014401 }, {
14402 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +000014403 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +000014404 }, {
14405 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +000014406 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +000014407 },
14408 },
hailfingerb8e4e212010-03-15 03:48:42 +000014409 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014410 .unlock = unlock_sst_fwhub,
14411 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014412 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014413 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014414 },
14415
hailfinger286829b2009-01-08 03:40:17 +000014416 {
14417 .vendor = "SST",
14418 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +000014419 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014420 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014421 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +000014422 .total_size = 512,
14423 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014424 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014425 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000014426 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014427 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014428 .block_erasers =
14429 {
14430 {
14431 .eraseblocks = { {4 * 1024, 128} },
14432 .block_erase = erase_sector_49lfxxxc,
14433 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014434 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014435 {64 * 1024, 7},
14436 {32 * 1024, 1},
14437 {8 * 1024, 2},
14438 {16 * 1024, 1},
14439 },
snelson3a69e422010-03-23 17:10:28 +000014440 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014441 }
14442 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100014443 .printlock = printlock_regspace2_block_eraser_1,
Edward O'Callaghana8dfefb2020-11-27 16:12:30 +110014444 .unlock = unlock_regspace2_block_eraser_1,
hailfinger86bf3b52010-10-13 21:49:30 +000014445 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014446 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014447 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014448 },
14449
hailfinger286829b2009-01-08 03:40:17 +000014450 {
14451 .vendor = "SST",
14452 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +000014453 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014454 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014455 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +000014456 .total_size = 1024,
14457 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014458 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000014459 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014460 .probe = probe_jedec,
14461 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014462 .block_erasers =
14463 {
14464 {
14465 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +000014466 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014467 }, {
14468 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +000014469 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014470 }, {
14471 .eraseblocks = { {1024 * 1024, 1} },
14472 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14473 }
14474 },
hailfingerb8e4e212010-03-15 03:48:42 +000014475 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014476 .unlock = unlock_sst_fwhub,
14477 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014478 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014479 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014480 },
14481
hailfinger286829b2009-01-08 03:40:17 +000014482 {
14483 .vendor = "SST",
14484 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +000014485 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014486 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014487 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +000014488 .total_size = 1024,
14489 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014490 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014491 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000014492 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014493 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014494 .block_erasers =
14495 {
14496 {
14497 .eraseblocks = { {4 * 1024, 256} },
14498 .block_erase = erase_sector_49lfxxxc,
14499 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014500 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014501 {64 * 1024, 15},
14502 {32 * 1024, 1},
14503 {8 * 1024, 2},
14504 {16 * 1024, 1},
14505 },
snelson3a69e422010-03-23 17:10:28 +000014506 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014507 }
14508 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100014509 .printlock = printlock_regspace2_block_eraser_1,
Edward O'Callaghana8dfefb2020-11-27 16:12:30 +110014510 .unlock = unlock_regspace2_block_eraser_1,
hailfinger86bf3b52010-10-13 21:49:30 +000014511 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014512 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014513 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014514 },
14515
hailfinger286829b2009-01-08 03:40:17 +000014516 {
14517 .vendor = "SST",
14518 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +000014519 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014520 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014521 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +000014522 .total_size = 2048,
14523 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014524 .feature_bits = FEATURE_REGISTERMAP,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110014525 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014526 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014527 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014528 .block_erasers =
14529 {
14530 {
14531 .eraseblocks = { {4 * 1024, 512} },
14532 .block_erase = erase_sector_49lfxxxc,
14533 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014534 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014535 {64 * 1024, 31},
14536 {32 * 1024, 1},
14537 {8 * 1024, 2},
14538 {16 * 1024, 1},
14539 },
snelson3a69e422010-03-23 17:10:28 +000014540 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014541 }
14542 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100014543 .printlock = printlock_regspace2_block_eraser_1,
Edward O'Callaghana8dfefb2020-11-27 16:12:30 +110014544 .unlock = unlock_regspace2_block_eraser_1,
hailfinger86bf3b52010-10-13 21:49:30 +000014545 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014546 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014547 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014548 },
14549
hailfinger286829b2009-01-08 03:40:17 +000014550 {
14551 .vendor = "SST",
14552 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +000014553 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014554 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014555 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +000014556 .total_size = 256,
14557 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014558 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014559 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014560 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014561 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014562 .block_erasers =
14563 {
14564 {
14565 .eraseblocks = { {4 * 1024, 64} },
14566 .block_erase = erase_sector_jedec,
14567 }, {
14568 .eraseblocks = { {16 * 1024, 16} },
14569 .block_erase = erase_block_jedec,
14570 }, {
14571 .eraseblocks = { {256 * 1024, 1} },
14572 .block_erase = NULL,
14573 }
14574 },
snelsonc6855342010-01-28 23:55:12 +000014575 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014576 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014577 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +000014578 },
14579
hailfinger286829b2009-01-08 03:40:17 +000014580 {
14581 .vendor = "SST",
14582 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +000014583 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014584 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014585 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +000014586 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +000014587 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014588 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000014589 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000014590 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014591 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014592 .block_erasers =
14593 {
14594 {
14595 .eraseblocks = { {4 * 1024, 64} },
14596 .block_erase = erase_sector_jedec,
14597 }, {
14598 .eraseblocks = { {16 * 1024, 16} },
14599 .block_erase = erase_block_jedec,
14600 }, {
14601 .eraseblocks = { {256 * 1024, 1} },
14602 .block_erase = NULL,
14603 }
14604 },
snelsonc6855342010-01-28 23:55:12 +000014605 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014606 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014607 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014608 },
14609
hailfinger286829b2009-01-08 03:40:17 +000014610 {
14611 .vendor = "SST",
14612 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +000014613 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014614 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014615 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +000014616 .total_size = 512,
14617 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014618 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014619 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014620 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014621 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014622 .block_erasers =
14623 {
14624 {
14625 .eraseblocks = { {4 * 1024, 128} },
14626 .block_erase = erase_sector_jedec,
14627 }, {
14628 .eraseblocks = { {64 * 1024, 8} },
14629 .block_erase = erase_block_jedec,
14630 }, {
14631 .eraseblocks = { {512 * 1024, 1} },
14632 .block_erase = NULL,
14633 }
14634 },
snelsonc6855342010-01-28 23:55:12 +000014635 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014636 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014637 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014638 },
14639
hailfinger286829b2009-01-08 03:40:17 +000014640 {
14641 .vendor = "SST",
14642 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014643 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014644 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014645 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +000014646 .total_size = 512,
14647 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +000014648 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +000014649 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +000014650 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +000014651 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +000014652 .block_erasers =
14653 {
14654 {
14655 .eraseblocks = { {4 * 1024, 128} },
14656 .block_erase = erase_sector_jedec,
14657 }, {
14658 .eraseblocks = { {64 * 1024, 8} },
14659 .block_erase = erase_block_jedec,
14660 }, {
14661 .eraseblocks = { {512 * 1024, 1} },
14662 .block_erase = NULL,
14663 }
14664 },
Alan Greena59b2ae2019-09-02 17:26:10 +100014665 .unlock = unlock_regspace2_uniform_64k,
snelsonc6855342010-01-28 23:55:12 +000014666 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014667 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014668 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014669 },
14670
hailfinger286829b2009-01-08 03:40:17 +000014671 {
14672 .vendor = "SST",
14673 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +000014674 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014675 .manufacture_id = SST_ID,
Alan Greena7cfa332019-06-24 15:48:14 +100014676 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +000014677 .total_size = 1024,
14678 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014679 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014680 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014681 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060014682 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +000014683 .block_erasers =
14684 {
14685 {
14686 .eraseblocks = { {4 * 1024, 256} },
14687 .block_erase = erase_sector_jedec,
14688 }, {
14689 .eraseblocks = { {64 * 1024, 16} },
14690 .block_erase = erase_block_jedec,
14691 }, {
14692 .eraseblocks = { {1024 * 1024, 1} },
14693 .block_erase = NULL,
14694 }
14695 },
snelsonc6855342010-01-28 23:55:12 +000014696 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014697 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014698 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014699 },
14700
hailfinger286829b2009-01-08 03:40:17 +000014701 {
14702 .vendor = "SST",
14703 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +000014704 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014705 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014706 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +000014707 .total_size = 2048,
14708 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014709 .feature_bits = FEATURE_REGISTERMAP,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110014710 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +000014711 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014712 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014713 .block_erasers =
14714 {
14715 {
14716 .eraseblocks = { {4 * 1024, 512} },
14717 .block_erase = erase_sector_49lfxxxc,
14718 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014719 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014720 {64 * 1024, 31},
14721 {32 * 1024, 1},
14722 {8 * 1024, 2},
14723 {16 * 1024, 1},
14724 },
snelson3a69e422010-03-23 17:10:28 +000014725 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014726 }
14727 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100014728 .printlock = printlock_regspace2_block_eraser_1,
Edward O'Callaghana8dfefb2020-11-27 16:12:30 +110014729 .unlock = unlock_regspace2_block_eraser_1,
hailfinger86bf3b52010-10-13 21:49:30 +000014730 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014731 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014732 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014733 },
14734
Alan Greend76dc1f2019-06-26 15:38:19 +100014735 {
14736 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000014737 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +000014738 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014739 .manufacture_id = ST_ID,
14740 .model_id = ST_M29F002B,
14741 .total_size = 256,
14742 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014743 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014744 .tested = TEST_UNTESTED,
14745 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014746 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014747 .block_erasers =
14748 {
14749 {
14750 .eraseblocks = {
14751 {16 * 1024, 1},
14752 {8 * 1024, 2},
14753 {32 * 1024, 1},
14754 {64 * 1024, 3},
14755 },
14756 .block_erase = erase_sector_jedec,
14757 }, {
14758 .eraseblocks = { {256 * 1024, 1} },
14759 .block_erase = erase_chip_block_jedec,
14760 }
14761 },
snelsonc6855342010-01-28 23:55:12 +000014762 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014763 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000014764 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000014765 },
14766
hailfinger286829b2009-01-08 03:40:17 +000014767 {
14768 .vendor = "ST",
14769 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +000014770 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014771 .manufacture_id = ST_ID,
14772 .model_id = ST_M29F002T,
14773 .total_size = 256,
14774 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014775 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014776 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014777 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014778 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014779 .block_erasers =
14780 {
14781 {
14782 .eraseblocks = {
14783 {64 * 1024, 3},
14784 {32 * 1024, 1},
14785 {8 * 1024, 2},
14786 {16 * 1024, 1},
14787 },
14788 .block_erase = erase_sector_jedec,
14789 }, {
14790 .eraseblocks = { {256 * 1024, 1} },
14791 .block_erase = erase_chip_block_jedec,
14792 }
14793 },
snelsonc6855342010-01-28 23:55:12 +000014794 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014795 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000014796 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000014797 },
14798
hailfinger286829b2009-01-08 03:40:17 +000014799 {
14800 .vendor = "ST",
14801 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014802 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014803 .manufacture_id = ST_ID,
14804 .model_id = ST_M29F040B,
14805 .total_size = 512,
14806 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014807 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14808 .tested = TEST_UNTESTED,
14809 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +000014810 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +000014811 .block_erasers =
14812 {
14813 {
Alan Green0d97b472019-07-26 10:33:25 +100014814 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +000014815 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +000014816 }, {
14817 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +000014818 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +000014819 }
14820 },
snelsonc6855342010-01-28 23:55:12 +000014821 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014822 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014823 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014824 },
14825
hailfinger286829b2009-01-08 03:40:17 +000014826 {
snelsonc6855342010-01-28 23:55:12 +000014827 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +000014828 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +000014829 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +000014830 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +000014831 .manufacture_id = ST_ID,
14832 .model_id = ST_M29F400BB,
14833 .total_size = 512,
14834 .page_size = 64 * 1024,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100014835 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +000014836 .tested = TEST_UNTESTED,
Nikolai Artemievf9329a02021-01-20 17:21:31 +110014837 .probe = probe_jedec,
14838 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
hailfingerfa513302010-07-16 22:07:20 +000014839 .block_erasers =
14840 {
14841 {
14842 .eraseblocks = {
14843 {16 * 1024, 1},
14844 {8 * 1024, 2},
14845 {32 * 1024, 1},
14846 {64 * 1024, 7},
14847 },
Nikolai Artemievb70b53a2021-01-28 16:30:58 +110014848 .block_erase = erase_sector_jedec,
hailfingerfa513302010-07-16 22:07:20 +000014849 }, {
14850 .eraseblocks = { {512 * 1024, 1} },
Nikolai Artemievb70b53a2021-01-28 16:30:58 +110014851 .block_erase = erase_chip_block_jedec,
hailfingerfa513302010-07-16 22:07:20 +000014852 }
14853 },
Nikolai Artemievc0ad4bd2021-01-20 17:31:26 +110014854 .write = write_jedec_1,
hailfingerfa513302010-07-16 22:07:20 +000014855 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014856 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +000014857 },
Alan Green753a38e2019-06-07 14:44:32 +100014858
hailfingerfa513302010-07-16 22:07:20 +000014859 {
14860 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14861 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000014862 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +000014863 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014864 .manufacture_id = ST_ID,
14865 .model_id = ST_M29F400BT,
14866 .total_size = 512,
14867 .page_size = 64 * 1024,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100014868 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014869 .tested = TEST_UNTESTED,
Nikolai Artemievf9329a02021-01-20 17:21:31 +110014870 .probe = probe_jedec,
14871 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
snelsone0c56352010-01-19 16:08:51 +000014872 .block_erasers =
14873 {
14874 {
14875 .eraseblocks = {
14876 {64 * 1024, 7},
14877 {32 * 1024, 1},
14878 {8 * 1024, 2},
14879 {16 * 1024, 1},
14880 },
Nikolai Artemievb70b53a2021-01-28 16:30:58 +110014881 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +000014882 }, {
14883 .eraseblocks = { {512 * 1024, 1} },
Nikolai Artemievb70b53a2021-01-28 16:30:58 +110014884 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +000014885 }
14886 },
Nikolai Artemievc0ad4bd2021-01-20 17:31:26 +110014887 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014888 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014889 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014890 },
14891
hailfinger286829b2009-01-08 03:40:17 +000014892 {
14893 .vendor = "ST",
14894 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +000014895 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014896 .manufacture_id = ST_ID,
14897 .model_id = ST_M29W010B,
14898 .total_size = 128,
14899 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014900 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014901 .tested = TEST_UNTESTED,
14902 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014903 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014904 .block_erasers =
14905 {
14906 {
Alan Green0d97b472019-07-26 10:33:25 +100014907 .eraseblocks = { {16 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +000014908 .block_erase = erase_sector_jedec,
14909 }, {
14910 .eraseblocks = { {128 * 1024, 1} },
14911 .block_erase = erase_chip_block_jedec,
14912 }
14913 },
snelsonc6855342010-01-28 23:55:12 +000014914 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014915 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014916 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014917 },
14918
hailfinger286829b2009-01-08 03:40:17 +000014919 {
14920 .vendor = "ST",
14921 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014922 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014923 .manufacture_id = ST_ID,
14924 .model_id = ST_M29W040B,
14925 .total_size = 512,
14926 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014927 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014928 .tested = TEST_UNTESTED,
14929 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014930 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014931 .block_erasers =
14932 {
14933 {
Alan Green0d97b472019-07-26 10:33:25 +100014934 .eraseblocks = { {64 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +000014935 .block_erase = erase_sector_jedec,
14936 }, {
14937 .eraseblocks = { {512 * 1024, 1} },
14938 .block_erase = erase_chip_block_jedec,
14939 }
14940 },
snelsonc6855342010-01-28 23:55:12 +000014941 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014942 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014943 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014944 },
14945
Alan Green753a38e2019-06-07 14:44:32 +100014946 {
14947 .vendor = "ST",
14948 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +000014949 .bustype = BUS_PARALLEL,
Alan Green753a38e2019-06-07 14:44:32 +100014950 .manufacture_id = ST_ID,
14951 .model_id = ST_M29W512B,
Alan Greena7cfa332019-06-24 15:48:14 +100014952 .total_size = 64,
14953 .page_size = 64 * 1024,
14954 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014955 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +100014956 .probe = probe_jedec,
14957 .probe_timing = TIMING_ZERO,
14958 .block_erasers =
14959 {
14960 {
14961 .eraseblocks = { {64 * 1024, 1} },
14962 .block_erase = erase_chip_block_jedec,
14963 }
14964 },
14965 .write = write_jedec_1,
14966 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014967 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +100014968 },
snelson91cd0662010-02-01 05:49:46 +000014969
hailfinger286829b2009-01-08 03:40:17 +000014970 {
14971 .vendor = "ST",
14972 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +000014973 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014974 .manufacture_id = ST_ID,
14975 .model_id = ST_M50FLW040A,
14976 .total_size = 512,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110014977 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000014978 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014979 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000014980 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000014981 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000014982 .block_erasers =
14983 {
14984 {
snelsonf88616b2010-01-19 16:39:19 +000014985 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000014986 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000014987 {64 * 1024, 5}, /* block */
14988 {4 * 1024, 16}, /* sector */
14989 {4 * 1024, 16}, /* sector */
14990 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110014991 .block_erase = erase_sector_stm50,
snelsonf88616b2010-01-19 16:39:19 +000014992 }, {
Alan Green0d97b472019-07-26 10:33:25 +100014993 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000014994 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014995 }
14996 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110014997 .unlock = unlock_regspace2_uniform_64k,
snelsonc0acbeb2010-03-19 18:47:06 +000014998 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014999 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015000 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015001 },
15002
hailfinger286829b2009-01-08 03:40:17 +000015003 {
15004 .vendor = "ST",
15005 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +000015006 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015007 .manufacture_id = ST_ID,
15008 .model_id = ST_M50FLW040B,
15009 .total_size = 512,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015010 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015011 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015012 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000015013 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000015014 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000015015 .block_erasers =
15016 {
15017 {
snelsonf88616b2010-01-19 16:39:19 +000015018 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000015019 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000015020 {4 * 1024, 16}, /* sector */
15021 {64 * 1024, 5}, /* block */
15022 {4 * 1024, 16}, /* sector */
15023 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015024 .block_erase = erase_sector_stm50,
snelsonf88616b2010-01-19 16:39:19 +000015025 }, {
Alan Green0d97b472019-07-26 10:33:25 +100015026 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000015027 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015028 }
15029 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015030 .unlock = unlock_regspace2_uniform_64k,
snelsonc0acbeb2010-03-19 18:47:06 +000015031 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015032 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015033 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015034 },
15035
hailfinger286829b2009-01-08 03:40:17 +000015036 {
15037 .vendor = "ST",
15038 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +000015039 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015040 .manufacture_id = ST_ID,
15041 .model_id = ST_M50FLW080A,
15042 .total_size = 1024,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015043 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015044 .feature_bits = FEATURE_REGISTERMAP,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015045 .tested = TEST_OK_PR,
snelsonc6855342010-01-28 23:55:12 +000015046 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000015047 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000015048 .block_erasers =
15049 {
15050 {
snelsonf88616b2010-01-19 16:39:19 +000015051 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000015052 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000015053 {64 * 1024, 13}, /* block */
15054 {4 * 1024, 16}, /* sector */
15055 {4 * 1024, 16}, /* sector */
15056 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015057 .block_erase = erase_sector_stm50,
snelsonf88616b2010-01-19 16:39:19 +000015058 }, {
Alan Green0d97b472019-07-26 10:33:25 +100015059 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000015060 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015061 }
15062 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100015063 .printlock = printlock_regspace2_block_eraser_0,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015064 .unlock = unlock_regspace2_block_eraser_0,
snelsonc0acbeb2010-03-19 18:47:06 +000015065 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015066 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015067 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015068 },
15069
hailfinger286829b2009-01-08 03:40:17 +000015070 {
15071 .vendor = "ST",
15072 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +000015073 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015074 .manufacture_id = ST_ID,
15075 .model_id = ST_M50FLW080B,
15076 .total_size = 1024,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015077 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015078 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015079 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000015080 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000015081 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000015082 .block_erasers =
15083 {
15084 {
snelsonf88616b2010-01-19 16:39:19 +000015085 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000015086 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000015087 {4 * 1024, 16}, /* sector */
15088 {64 * 1024, 13}, /* block */
15089 {4 * 1024, 16}, /* sector */
15090 },
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015091 .block_erase = erase_sector_stm50,
snelsonf88616b2010-01-19 16:39:19 +000015092 }, {
Alan Green0d97b472019-07-26 10:33:25 +100015093 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000015094 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015095 }
15096 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100015097 .printlock = printlock_regspace2_block_eraser_0,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015098 .unlock = unlock_regspace2_block_eraser_0,
snelsonc0acbeb2010-03-19 18:47:06 +000015099 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015100 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015101 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015102 },
15103
hailfinger286829b2009-01-08 03:40:17 +000015104 {
15105 .vendor = "ST",
15106 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +000015107 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015108 .manufacture_id = ST_ID,
15109 .model_id = ST_M50FW002,
15110 .total_size = 256,
Nikolai Artemievcbb894e2021-01-28 16:37:21 +110015111 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015112 .feature_bits = FEATURE_REGISTERMAP,
Edward O'Callaghan34608d82020-10-01 21:43:48 +100015113 .tested = TEST_OK_PR,
snelsonc6855342010-01-28 23:55:12 +000015114 .probe = probe_82802ab,
Nikolai Artemievdc39c032021-01-20 15:30:50 +110015115 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015116 .block_erasers =
15117 {
15118 {
15119 .eraseblocks = {
15120 {64 * 1024, 3},
15121 {32 * 1024, 1},
15122 {8 * 1024, 2},
15123 {16 * 1024, 1},
15124 },
snelsonc0acbeb2010-03-19 18:47:06 +000015125 .block_erase = erase_block_82802ab,
Nikolai Artemievcbb894e2021-01-28 16:37:21 +110015126 }, {
15127 .eraseblocks = { {256 * 1024, 1} },
15128 .block_erase = NULL, /* Only in A/A mux mode */
snelsone0c56352010-01-19 16:08:51 +000015129 }
15130 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100015131 .printlock = printlock_regspace2_block_eraser_0,
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110015132 .unlock = unlock_regspace2_block_eraser_0,
snelsonc0acbeb2010-03-19 18:47:06 +000015133 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015134 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015135 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015136 },
15137
hailfinger286829b2009-01-08 03:40:17 +000015138 {
15139 .vendor = "ST",
15140 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +000015141 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015142 .manufacture_id = ST_ID,
15143 .model_id = ST_M50FW016,
15144 .total_size = 2048,
Nikolai Artemievcbb894e2021-01-28 16:37:21 +110015145 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015146 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015147 .tested = TEST_UNTESTED,
15148 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015149 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015150 .block_erasers =
15151 {
15152 {
Alan Green0d97b472019-07-26 10:33:25 +100015153 .eraseblocks = { {64 * 1024, 32} },
snelsonc0acbeb2010-03-19 18:47:06 +000015154 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015155 }
15156 },
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110015157 .unlock = unlock_regspace2_uniform_64k,
snelsonc0acbeb2010-03-19 18:47:06 +000015158 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015159 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015160 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015161 },
15162
hailfinger286829b2009-01-08 03:40:17 +000015163 {
15164 .vendor = "ST",
15165 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +000015166 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015167 .manufacture_id = ST_ID,
15168 .model_id = ST_M50FW040,
15169 .total_size = 512,
Nikolai Artemievcbb894e2021-01-28 16:37:21 +110015170 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015171 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +000015172 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000015173 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015174 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015175 .block_erasers =
15176 {
15177 {
Alan Green0d97b472019-07-26 10:33:25 +100015178 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000015179 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015180 }
15181 },
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110015182 .unlock = unlock_regspace2_uniform_64k,
snelsonc0acbeb2010-03-19 18:47:06 +000015183 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015184 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015185 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015186 },
15187
hailfinger286829b2009-01-08 03:40:17 +000015188 {
15189 .vendor = "ST",
15190 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +000015191 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015192 .manufacture_id = ST_ID,
15193 .model_id = ST_M50FW080,
15194 .total_size = 1024,
Nikolai Artemievcbb894e2021-01-28 16:37:21 +110015195 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015196 .feature_bits = FEATURE_REGISTERMAP,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110015197 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000015198 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015199 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015200 .block_erasers =
15201 {
15202 {
Alan Green0d97b472019-07-26 10:33:25 +100015203 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000015204 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015205 }
15206 },
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110015207 .unlock = unlock_regspace2_uniform_64k,
snelsonc0acbeb2010-03-19 18:47:06 +000015208 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015209 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015210 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015211 },
15212
hailfinger286829b2009-01-08 03:40:17 +000015213 {
15214 .vendor = "ST",
Nikolai Artemievfe595da2020-08-31 17:49:27 +100015215 .name = "M50LPW080",
15216 .bustype = BUS_LPC, /* A/A Mux */
15217 .manufacture_id = ST_ID,
15218 .model_id = ST_M50LPW080,
15219 .total_size = 1024,
15220 .page_size = 0,
15221 .feature_bits = FEATURE_REGISTERMAP,
15222 .tested = TEST_UNTESTED,
15223 .probe = probe_82802ab,
15224 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15225 .block_erasers =
15226 {
15227 {
15228 .eraseblocks = { {64 * 1024, 16} },
15229 .block_erase = erase_block_82802ab,
15230 }
15231 },
15232 .unlock = unlock_regspace2_uniform_64k,
15233 .write = write_82802ab,
15234 .read = read_memmapped,
15235 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15236 },
15237
15238 {
15239 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000015240 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +000015241 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015242 .manufacture_id = ST_ID,
15243 .model_id = ST_M50LPW116,
15244 .total_size = 2048,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015245 .page_size = 0,
hailfingerb8e4e212010-03-15 03:48:42 +000015246 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015247 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000015248 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +000015249 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000015250 .block_erasers =
15251 {
15252 {
15253 .eraseblocks = {
15254 {4 * 1024, 16},
15255 {64 * 1024, 30},
15256 {32 * 1024, 1},
15257 {8 * 1024, 2},
15258 {16 * 1024, 1},
15259 },
snelsonc0acbeb2010-03-19 18:47:06 +000015260 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015261 }
15262 },
Edward O'Callaghanfda266c2020-10-01 21:56:41 +100015263 .printlock = printlock_regspace2_block_eraser_0,
Nikolai Artemiev456985f2021-02-23 14:34:18 +110015264 .unlock = unlock_regspace2_block_eraser_0,
snelsonc0acbeb2010-03-19 18:47:06 +000015265 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015266 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015267 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015268 },
15269
hailfinger286829b2009-01-08 03:40:17 +000015270 {
Nikolai Artemiev7bdf1e72020-08-31 17:50:33 +100015271 .vendor = "ST",
15272 .name = "M95M02",
15273 .bustype = BUS_SPI,
15274 .manufacture_id = ST_ID,
15275 .model_id = ST_M95M02,
15276 .total_size = 256,
15277 .page_size = 256,
15278 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
15279 .tested = TEST_OK_PREW,
15280 .probe = probe_spi_st95,
15281 .probe_timing = TIMING_ZERO,
15282 .block_erasers =
15283 {
15284 {
15285 .eraseblocks = { {256 * 1024, 1} },
15286 .block_erase = spi_block_erase_emulation,
15287 }
15288 },
15289
15290 .printlock = spi_prettyprint_status_register_bp1_srwd,
15291 .unlock = spi_disable_blockprotect_bp1_srwd,
15292 .write = spi_chip_write_256,
15293 .read = spi_chip_read,
15294 .voltage = {2500, 5500},
15295 },
15296
15297 {
15298 .vendor = "Sanyo",
15299 .name = "LE25FU106B",
15300 .bustype = BUS_SPI,
15301 .manufacture_id = SANYO_ID,
15302 .model_id = SANYO_LE25FU106B,
15303 .total_size = 128,
15304 .page_size = 256,
15305 .feature_bits = FEATURE_WRSR_WREN,
15306 .tested = TEST_UNTESTED,
15307 .probe = probe_spi_res2,
15308 .probe_timing = TIMING_ZERO,
15309 .block_erasers =
15310 {
15311 /* FIXME: Is this correct?
15312 {
15313 .eraseblocks = { {2 * 1024, 64} },
15314 .block_erase = spi_block_erase_d7,
15315 },*/
15316 {
15317 .eraseblocks = { {32 * 1024, 4} },
15318 .block_erase = spi_block_erase_d8,
15319 }, {
15320 .eraseblocks = { {128 * 1024, 1} },
15321 .block_erase = spi_block_erase_c7,
15322 }
15323 },
15324 .printlock = spi_prettyprint_status_register_bp1_srwd,
15325 .unlock = spi_disable_blockprotect_bp1_srwd,
15326 .write = spi_chip_write_256,
15327 .read = spi_chip_read,
15328 .voltage = {2300, 3600},
15329 },
15330
15331 {
15332 .vendor = "Sanyo",
15333 .name = "LE25FU206",
15334 .bustype = BUS_SPI,
15335 .manufacture_id = SANYO_ID,
15336 .model_id = SANYO_LE25FU206,
15337 .total_size = 256,
15338 .page_size = 256,
15339 .feature_bits = FEATURE_WRSR_WREN,
15340 .tested = TEST_UNTESTED,
15341 .probe = probe_spi_res2,
15342 .probe_timing = TIMING_ZERO,
15343 .block_erasers =
15344 {
15345 {
15346 .eraseblocks = { {4 * 1024, 64} },
15347 .block_erase = spi_block_erase_d7,
15348 }, {
15349 .eraseblocks = { {64 * 1024, 4} },
15350 .block_erase = spi_block_erase_d8,
15351 }, {
15352 .eraseblocks = { {256 * 1024, 1} },
15353 .block_erase = spi_block_erase_c7,
15354 }
15355 },
15356 .printlock = spi_prettyprint_status_register_bp1_srwd,
15357 .unlock = spi_disable_blockprotect_bp1_srwd,
15358 .write = spi_chip_write_256,
15359 .read = spi_chip_read,
15360 .voltage = {2300, 3600},
15361 },
15362
15363 {
15364 .vendor = "Sanyo",
15365 .name = "LE25FU206A",
15366 .bustype = BUS_SPI,
15367 .manufacture_id = SANYO_ID,
15368 .model_id = SANYO_LE25FU206A,
15369 .total_size = 256,
15370 .page_size = 256,
15371 .tested = TEST_UNTESTED,
15372 .probe = probe_spi_rdid,
15373 .probe_timing = TIMING_ZERO,
15374 .block_erasers =
15375 {
15376 {
15377 .eraseblocks = { {4 * 1024, 64} },
15378 .block_erase = spi_block_erase_20,
15379 }, {
15380 .eraseblocks = { {4 * 1024, 64} },
15381 .block_erase = spi_block_erase_d7,
15382 }, {
15383 .eraseblocks = { {64 * 1024, 4} },
15384 .block_erase = spi_block_erase_d8,
15385 }, {
15386 .eraseblocks = { {256 * 1024, 1} },
15387 .block_erase = spi_block_erase_60,
15388 }, {
15389 .eraseblocks = { {256 * 1024, 1} },
15390 .block_erase = spi_block_erase_c7,
15391 }
15392 },
15393 .printlock = spi_prettyprint_status_register_bp2_srwd,
15394 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15395 .write = spi_chip_write_256,
15396 .read = spi_chip_read,
15397 .voltage = {2300, 3600},
15398 },
15399
15400 {
15401 .vendor = "Sanyo",
15402 .name = "LE25FU406B",
15403 .bustype = BUS_SPI,
15404 .manufacture_id = SANYO_ID,
15405 .model_id = SANYO_LE25FU406B,
15406 .total_size = 512,
15407 .page_size = 256,
15408 .feature_bits = FEATURE_WRSR_WREN,
15409 .tested = TEST_OK_PREW,
15410 .probe = probe_spi_res2,
15411 .probe_timing = TIMING_ZERO,
15412 .block_erasers =
15413 {
15414 {
15415 .eraseblocks = { {4 * 1024, 128} },
15416 .block_erase = spi_block_erase_d7,
15417 }, {
15418 .eraseblocks = { {64 * 1024, 8} },
15419 .block_erase = spi_block_erase_d8,
15420 }, {
15421 .eraseblocks = { {512 * 1024, 1} },
15422 .block_erase = spi_block_erase_c7,
15423 }
15424 },
15425 .printlock = spi_prettyprint_status_register_bp2_srwd,
15426 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15427 .write = spi_chip_write_256,
15428 .read = spi_chip_read,
15429 .voltage = {2300, 3600},
15430 },
15431
15432 {
15433 .vendor = "Sanyo",
15434 .name = "LE25FU406C/LE25U40CMC",
15435 .bustype = BUS_SPI,
15436 .manufacture_id = SANYO_ID,
15437 .model_id = SANYO_LE25FU406C,
15438 .total_size = 512,
15439 .page_size = 256,
15440 .feature_bits = FEATURE_WRSR_WREN,
15441 .tested = TEST_OK_PREW,
15442 .probe = probe_spi_rdid,
15443 .probe_timing = TIMING_ZERO,
15444 .block_erasers =
15445 {
15446 {
15447 .eraseblocks = { {4 * 1024, 128} },
15448 .block_erase = spi_block_erase_20,
15449 }, {
15450 .eraseblocks = { {4 * 1024, 128} },
15451 .block_erase = spi_block_erase_d7,
15452 }, {
15453 .eraseblocks = { {64 * 1024, 8} },
15454 .block_erase = spi_block_erase_d8,
15455 }, {
15456 .eraseblocks = { {512 * 1024, 1} },
15457 .block_erase = spi_block_erase_60,
15458 }, {
15459 .eraseblocks = { {512 * 1024, 1} },
15460 .block_erase = spi_block_erase_c7,
15461 }
15462 },
15463 .printlock = spi_prettyprint_status_register_bp2_srwd,
15464 .unlock = spi_disable_blockprotect_bp2_srwd,
15465 .write = spi_chip_write_256,
15466 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
15467 .voltage = {2300, 3600},
15468 },
15469
15470 {
15471 .vendor = "Sanyo",
15472 .name = "LE25FW106",
15473 .bustype = BUS_SPI,
15474 .manufacture_id = SANYO_ID,
15475 .model_id = SANYO_LE25FW106,
15476 .total_size = 128,
15477 .page_size = 256,
15478 .feature_bits = FEATURE_WRSR_WREN,
15479 .tested = TEST_OK_PREW,
15480 .probe = probe_spi_res2,
15481 .probe_timing = TIMING_ZERO,
15482 .block_erasers =
15483 {
15484 {
15485 .eraseblocks = { {2 * 1024, 64} },
15486 .block_erase = spi_block_erase_d7,
15487 }, {
15488 .eraseblocks = { {32 * 1024, 4} },
15489 .block_erase = spi_block_erase_d8,
15490 }, {
15491 .eraseblocks = { {128 * 1024, 1} },
15492 .block_erase = spi_block_erase_c7,
15493 }
15494 },
15495 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
15496 .unlock = spi_disable_blockprotect_bp1_srwd,
15497 .write = spi_chip_write_256,
15498 .read = spi_chip_read,
15499 .voltage = {2700, 3600},
15500 },
15501
15502 {
15503 .vendor = "Sanyo",
15504 .name = "LE25FW203A",
15505 .bustype = BUS_SPI,
15506 .manufacture_id = SANYO_ID,
15507 .model_id = SANYO_LE25FW203A,
15508 .total_size = 256,
15509 .page_size = 256,
15510 .tested = TEST_UNTESTED,
15511 .probe = probe_spi_rdid,
15512 .probe_timing = TIMING_ZERO,
15513 .block_erasers =
15514 {
15515 {
15516 .eraseblocks = { {256, 1024} },
15517 .block_erase = spi_block_erase_db,
15518 }, {
15519 .eraseblocks = { {64 * 1024, 4} },
15520 .block_erase = spi_block_erase_d8,
15521 }, {
15522 .eraseblocks = { {256 * 1024, 1} },
15523 .block_erase = spi_block_erase_c7,
15524 }
15525 },
15526 .printlock = spi_prettyprint_status_register_default_welwip,
15527 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15528 .write = spi_chip_write_256,
15529 .read = spi_chip_read,
15530 .voltage = {2700, 3600},
15531 },
15532
15533 {
15534 .vendor = "Sanyo",
15535 .name = "LE25FW403A",
15536 .bustype = BUS_SPI,
15537 .manufacture_id = SANYO_ID,
15538 .model_id = SANYO_LE25FW403A,
15539 .total_size = 512,
15540 .page_size = 256,
15541 .tested = TEST_UNTESTED,
15542 .probe = probe_spi_rdid,
15543 .probe_timing = TIMING_ZERO,
15544 .block_erasers =
15545 {
15546 {
15547 .eraseblocks = { {256, 2 * 1024} },
15548 .block_erase = spi_block_erase_db,
15549 }, {
15550 .eraseblocks = { {64 * 1024, 8} },
15551 .block_erase = spi_block_erase_d8,
15552 }, {
15553 .eraseblocks = { {512 * 1024, 1} },
15554 .block_erase = spi_block_erase_c7,
15555 }
15556 },
15557 .printlock = spi_prettyprint_status_register_default_welwip,
15558 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15559 .write = spi_chip_write_256,
15560 .read = spi_chip_read,
15561 .voltage = {2700, 3600},
15562 },
15563
15564 {
15565 .vendor = "Sanyo",
15566 .name = "LE25FW406A",
15567 .bustype = BUS_SPI,
15568 .manufacture_id = SANYO_ID,
15569 .model_id = SANYO_LE25FW406A,
15570 .total_size = 512,
15571 .page_size = 256,
15572 .feature_bits = FEATURE_WRSR_WREN,
15573 .tested = TEST_OK_PREW,
15574 .probe = probe_spi_res2,
15575 .probe_timing = TIMING_ZERO,
15576 .block_erasers =
15577 {
15578 {
15579 .eraseblocks = { {4 * 1024, 128} },
15580 .block_erase = spi_block_erase_d7,
15581 }, {
15582 .eraseblocks = { {64 * 1024, 8} },
15583 .block_erase = spi_block_erase_d8,
15584 }, {
15585 .eraseblocks = { {512 * 1024, 1} },
15586 .block_erase = spi_block_erase_c7,
15587 }
15588 },
15589 .printlock = spi_prettyprint_status_register_plain,
15590 .unlock = spi_disable_blockprotect,
15591 .write = spi_chip_write_256,
15592 .read = spi_chip_read,
15593 .voltage = {2700, 3600},
15594 },
15595
15596 {
15597 .vendor = "Sanyo",
15598 .name = "LE25FW418A",
15599 .bustype = BUS_SPI,
15600 .manufacture_id = SANYO_ID,
15601 .model_id = SANYO_LE25FW418A,
15602 .total_size = 512,
15603 .page_size = 256,
15604 .feature_bits = FEATURE_WRSR_WREN,
15605 .tested = TEST_UNTESTED,
15606 .probe = probe_spi_res2,
15607 .probe_timing = TIMING_ZERO,
15608 .block_erasers =
15609 {
15610 {
15611 .eraseblocks = { {4 * 1024, 128} },
15612 .block_erase = spi_block_erase_d7,
15613 }, {
15614 .eraseblocks = { {64 * 1024, 8} },
15615 .block_erase = spi_block_erase_d8,
15616 }, {
15617 .eraseblocks = { {512 * 1024, 1} },
15618 .block_erase = spi_block_erase_c7,
15619 }
15620 },
15621 .printlock = spi_prettyprint_status_register_bp2_srwd,
15622 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15623 .write = spi_chip_write_256,
15624 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15625 .voltage = {2700, 3600},
15626 },
15627
15628 {
Alan Greend76dc1f2019-06-26 15:38:19 +100015629 .vendor = "Sanyo",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100015630 .name = "LE25FW806",
15631 .bustype = BUS_SPI,
15632 .manufacture_id = SANYO_ID,
15633 .model_id = SANYO_LE25FW806,
15634 .total_size = 1024,
15635 .page_size = 256,
15636 .feature_bits = FEATURE_WRSR_WREN,
15637 .tested = TEST_UNTESTED,
15638 .probe = probe_spi_res2,
15639 .probe_timing = TIMING_ZERO,
15640 .block_erasers =
15641 {
15642 {
15643 .eraseblocks = { {4 * 1024, 256} },
15644 .block_erase = spi_block_erase_20,
15645 }, {
15646 .eraseblocks = { {4 * 1024, 256} },
15647 .block_erase = spi_block_erase_d7,
15648 }, {
15649 .eraseblocks = { {64 * 1024, 16} },
15650 .block_erase = spi_block_erase_d8,
15651 }, {
15652 .eraseblocks = { {1024 * 1024, 1} },
15653 .block_erase = spi_block_erase_c7,
15654 }
15655 },
15656 .printlock = spi_prettyprint_status_register_bp2_srwd,
15657 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15658 .write = spi_chip_write_256,
15659 .read = spi_chip_read,
15660 .voltage = {2700, 3600},
15661 },
15662
15663 {
15664 .vendor = "Sanyo",
15665 .name = "LE25FW808",
15666 .bustype = BUS_SPI,
15667 .manufacture_id = SANYO_ID,
15668 .model_id = SANYO_LE25FW808,
15669 .total_size = 1024,
15670 .page_size = 256,
15671 .feature_bits = FEATURE_WRSR_WREN,
15672 .tested = TEST_UNTESTED,
15673 .probe = probe_spi_res2,
15674 .probe_timing = TIMING_ZERO,
15675 .block_erasers =
15676 {
15677 {
15678 .eraseblocks = { {8 * 1024, 128} },
15679 .block_erase = spi_block_erase_d7,
15680 }, {
15681 .eraseblocks = { {64 * 1024, 16} },
15682 .block_erase = spi_block_erase_d8,
15683 }, {
15684 .eraseblocks = { {1024 * 1024, 1} },
15685 .block_erase = spi_block_erase_c7,
15686 }
15687 },
15688 .printlock = spi_prettyprint_status_register_bp2_srwd,
15689 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15690 .write = spi_chip_write_256,
15691 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15692 .voltage = {2700, 3600},
15693 },
15694
15695 {
Alan Greend76dc1f2019-06-26 15:38:19 +100015696 .vendor = "Sharp",
15697 .name = "LH28F008BJT-BTLZ1",
15698 .bustype = BUS_PARALLEL,
15699 .manufacture_id = SHARP_ID,
15700 .model_id = SHARP_LH28F008BJ__PB,
15701 .total_size = 1024,
15702 .page_size = 64 * 1024,
15703 .tested = TEST_OK_PREW,
15704 .probe = probe_82802ab,
15705 .probe_timing = TIMING_ZERO,
15706 .block_erasers =
15707 {
15708 {
15709 .eraseblocks = {
15710 {8 * 1024, 8},
15711 {64 * 1024, 15}
15712 },
15713 .block_erase = erase_block_82802ab,
15714 }, {
15715 .eraseblocks = { {1024 * 1024, 1} },
15716 .block_erase = erase_sector_49lfxxxc,
15717 }
15718 },
15719 .unlock = unlock_lh28f008bjt,
15720 .write = write_82802ab,
15721 .read = read_memmapped,
15722 .voltage = {2700, 3600},
15723 },
15724
15725 {
15726 .vendor = "Sharp",
15727 .name = "LHF00L04",
15728 .bustype = BUS_FWH, /* A/A Mux */
15729 .manufacture_id = SHARP_ID,
15730 .model_id = SHARP_LHF00L04,
15731 .total_size = 1024,
15732 .page_size = 64 * 1024,
15733 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
15734 .tested = TEST_UNTESTED,
15735 .probe = probe_82802ab,
15736 .probe_timing = TIMING_ZERO,
15737 .block_erasers =
15738 {
15739 {
15740 .eraseblocks = {
15741 {64 * 1024, 15},
15742 {8 * 1024, 8}
15743 },
15744 .block_erase = erase_block_82802ab,
15745 }, {
15746 .eraseblocks = {
15747 {1024 * 1024, 1}
15748 },
15749 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
15750 },
15751 },
Alan Greena59b2ae2019-09-02 17:26:10 +100015752 .unlock = unlock_regspace2_uniform_64k,
Alan Greend76dc1f2019-06-26 15:38:19 +100015753 .write = write_82802ab,
15754 .read = read_memmapped,
15755 .voltage = {3000, 3600},
15756 },
15757
15758 {
15759 .vendor = "Spansion",
15760 .name = "S25FL004A",
15761 .bustype = BUS_SPI,
15762 .manufacture_id = SPANSION_ID,
15763 .model_id = SPANSION_S25FL004A,
15764 .total_size = 512,
15765 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015766 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100015767 .tested = TEST_UNTESTED,
15768 .probe = probe_spi_rdid,
15769 .probe_timing = TIMING_ZERO,
15770 .block_erasers =
15771 {
15772 {
15773 .eraseblocks = { {64 * 1024, 8} },
15774 .block_erase = spi_block_erase_d8,
15775 }, {
15776 .eraseblocks = { {512 * 1024, 1} },
15777 .block_erase = spi_block_erase_c7,
15778 }
15779 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100015780 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100015781 .unlock = spi_disable_blockprotect,
15782 .write = spi_chip_write_256,
15783 .read = spi_chip_read,
15784 .voltage = {2700, 3600},
15785 },
15786
15787 {
15788 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100015789 .name = "S25FL008A",
15790 .bustype = BUS_SPI,
15791 .manufacture_id = SPANSION_ID,
15792 .model_id = SPANSION_S25FL008A,
15793 .total_size = 1024,
15794 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015795 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100015796 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +100015797 .probe = probe_spi_rdid,
15798 .probe_timing = TIMING_ZERO,
15799 .block_erasers =
15800 {
15801 {
15802 .eraseblocks = { {64 * 1024, 16} },
15803 .block_erase = spi_block_erase_d8,
15804 }, {
15805 .eraseblocks = { {1024 * 1024, 1} },
15806 .block_erase = spi_block_erase_c7,
15807 }
15808 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100015809 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100015810 .unlock = spi_disable_blockprotect,
15811 .write = spi_chip_write_256,
15812 .read = spi_chip_read,
15813 .voltage = {2700, 3600},
15814 },
15815
15816 {
15817 .vendor = "Spansion",
15818 .name = "S25FL016A",
15819 .bustype = BUS_SPI,
15820 .manufacture_id = SPANSION_ID,
15821 .model_id = SPANSION_S25FL016A,
15822 .total_size = 2048,
15823 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015824 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100015825 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015826 .probe = probe_spi_rdid,
15827 .probe_timing = TIMING_ZERO,
15828 .block_erasers =
15829 {
15830 {
15831 .eraseblocks = { {64 * 1024, 32} },
15832 .block_erase = spi_block_erase_d8,
15833 }, {
15834 .eraseblocks = { {2 * 1024 * 1024, 1} },
15835 .block_erase = spi_block_erase_c7,
15836 }
15837 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100015838 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100015839 .unlock = spi_disable_blockprotect,
15840 .write = spi_chip_write_256,
15841 .read = spi_chip_read,
15842 .voltage = {2700, 3600},
15843 },
15844
15845 {
15846 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015847 .name = "S25FL032A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +100015848 .bustype = BUS_SPI,
15849 .manufacture_id = SPANSION_ID,
15850 .model_id = SPANSION_S25FL032A,
15851 .total_size = 4096,
15852 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100015853 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100015854 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015855 .probe = probe_spi_rdid,
15856 .probe_timing = TIMING_ZERO,
15857 .block_erasers =
15858 {
15859 {
15860 .eraseblocks = { {64 * 1024, 64} },
15861 .block_erase = spi_block_erase_d8,
15862 }, {
15863 .eraseblocks = { {4 * 1024 * 1024, 1} },
15864 .block_erase = spi_block_erase_c7,
15865 }
15866 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100015867 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100015868 .unlock = spi_disable_blockprotect,
15869 .write = spi_chip_write_256,
15870 .read = spi_chip_read,
15871 .voltage = {2700, 3600},
15872 },
15873
15874 {
15875 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015876 .name = "S25FL064A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +100015877 .bustype = BUS_SPI,
15878 .manufacture_id = SPANSION_ID,
15879 .model_id = SPANSION_S25FL064A,
15880 .total_size = 8192,
15881 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100015882 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100015883 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015884 .probe = probe_spi_rdid,
15885 .probe_timing = TIMING_ZERO,
15886 .block_erasers =
15887 {
15888 {
15889 .eraseblocks = { {64 * 1024, 128} },
15890 .block_erase = spi_block_erase_d8,
15891 }, {
15892 .eraseblocks = { {8 * 1024 * 1024, 1} },
15893 .block_erase = spi_block_erase_c7,
15894 }
15895 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100015896 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100015897 .unlock = spi_disable_blockprotect,
15898 .write = spi_chip_write_256,
15899 .read = spi_chip_read,
15900 .voltage = {2700, 3600},
15901 },
15902
15903 {
15904 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015905 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Alan Greend76dc1f2019-06-26 15:38:19 +100015906 .bustype = BUS_SPI,
15907 .manufacture_id = SPANSION_ID,
Nikolai Artemiev2ed04562021-01-28 16:28:42 +110015908 .model_id = SPANSION_S25FL216,
Alan Greend76dc1f2019-06-26 15:38:19 +100015909 .total_size = 2048,
15910 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100015911 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
15912 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nikolai Artemiev2ed04562021-01-28 16:28:42 +110015913 .tested = TEST_UNTESTED,
Alan Greend76dc1f2019-06-26 15:38:19 +100015914 .probe = probe_spi_rdid,
15915 .probe_timing = TIMING_ZERO,
15916 .block_erasers =
15917 {
15918 {
15919 .eraseblocks = { {4 * 1024, 512} },
15920 .block_erase = spi_block_erase_20,
15921 }, {
15922 .eraseblocks = { {64 * 1024, 32} },
15923 .block_erase = spi_block_erase_d8,
15924 }, {
Nikolai Artemiev2ed04562021-01-28 16:28:42 +110015925 .eraseblocks = { { 2048 * 1024, 1} },
15926 .block_erase = spi_block_erase_60,
15927 }, {
15928 .eraseblocks = { { 2048 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +100015929 .block_erase = spi_block_erase_c7,
15930 }
15931 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100015932 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110015933 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
Alan Greend76dc1f2019-06-26 15:38:19 +100015934 .write = spi_chip_write_256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100015935 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
Alan Greend76dc1f2019-06-26 15:38:19 +100015936 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +100015937 },
15938
15939 {
15940 .vendor = "Spansion",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100015941 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
15942 .bustype = BUS_SPI,
15943 .manufacture_id = SPANSION_ID,
15944 .model_id = SPANSION_S25FL128,
15945 .total_size = 16384,
15946 .page_size = 512,
15947 /* supports 4B addressing */
15948 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15949 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15950 .tested = TEST_UNTESTED,
15951 .probe = probe_spi_rdid,
15952 .probe_timing = TIMING_ZERO,
15953 .block_erasers =
15954 {
15955 {
15956 .eraseblocks = { {256 * 1024, 64} },
15957 .block_erase = spi_block_erase_d8,
15958 }, {
15959 .eraseblocks = { { 16384 * 1024, 1} },
15960 .block_erase = spi_block_erase_60,
15961 }, {
15962 .eraseblocks = { { 16384 * 1024, 1} },
15963 .block_erase = spi_block_erase_c7,
15964 }
15965 },
15966 .printlock = spi_prettyprint_status_register_bp2_srwd,
15967 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15968 .write = spi_chip_write_256, /* Multi I/O supported */
15969 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15970 .voltage = {2700, 3600},
15971 },
15972
15973 {
15974 .vendor = "Spansion",
15975 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15976 .bustype = BUS_SPI,
15977 .manufacture_id = SPANSION_ID,
15978 .model_id = SPANSION_S25FL128,
15979 .total_size = 16384,
15980 .page_size = 256,
15981 /* supports 4B addressing */
15982 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15983 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15984 .tested = TEST_OK_PREW,
15985 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
15986 .probe = probe_spi_rdid,
15987 .probe_timing = TIMING_ZERO,
15988 .block_erasers =
15989 {
15990 {
15991 /* This chip supports erasing of 32 so-called "parameter sectors" with
15992 * opcode 0x20 which may be configured to be on top or bottom of the address
15993 * space. Trying to access an address outside these 4kB blocks does have no
15994 * effect on the memory contents, e.g.
15995 .eraseblocks = {
15996 {4 * 1024, 32},
15997 {64 * 1024, 254} // inaccessible
15998 },
15999 .block_erase = spi_block_erase_20,
16000 }, { */
16001 .eraseblocks = { { 64 * 1024, 256} },
16002 .block_erase = spi_block_erase_d8,
16003 }, {
16004 .eraseblocks = { { 16384 * 1024, 1} },
16005 .block_erase = spi_block_erase_60,
16006 }, {
16007 .eraseblocks = { { 16384 * 1024, 1} },
16008 .block_erase = spi_block_erase_c7,
16009 }
16010 },
16011 .printlock = spi_prettyprint_status_register_bp2_srwd,
16012 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16013 .write = spi_chip_write_256, /* Multi I/O supported */
16014 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16015 .voltage = {2700, 3600},
16016 },
16017
16018 {
16019 .vendor = "Spansion",
16020 .name = "S25FL128P......0", /* uniform 64 kB sectors */
16021 .bustype = BUS_SPI,
16022 .manufacture_id = SPANSION_ID,
16023 .model_id = SPANSION_S25FL128,
16024 .total_size = 16384,
16025 .page_size = 256,
16026 .feature_bits = FEATURE_WRSR_WREN,
16027 .tested = TEST_OK_PREW,
16028 .probe = probe_spi_rdid,
16029 .probe_timing = TIMING_ZERO,
16030 .block_erasers =
16031 {
16032 {
16033 .eraseblocks = { {64 * 1024, 256} },
16034 .block_erase = spi_block_erase_20,
16035 }, {
16036 .eraseblocks = { {64 * 1024, 256} },
16037 .block_erase = spi_block_erase_d8,
16038 }, {
16039 .eraseblocks = { { 16384 * 1024, 1} },
16040 .block_erase = spi_block_erase_60,
16041 }, {
16042 .eraseblocks = { { 16384 * 1024, 1} },
16043 .block_erase = spi_block_erase_c7,
16044 }
16045 },
16046 .printlock = spi_prettyprint_status_register_bp3_srwd,
16047 .unlock = spi_disable_blockprotect_bp3_srwd,
16048 .write = spi_chip_write_256,
16049 .read = spi_chip_read, /* Fast read (0x0B) supported */
16050 .voltage = {2700, 3600},
16051 },
16052
16053 {
16054 .vendor = "Spansion",
16055 .name = "S25FL128P......1", /* uniform 256kB sectors */
16056 .bustype = BUS_SPI,
16057 .manufacture_id = SPANSION_ID,
16058 .model_id = SPANSION_S25FL128,
16059 .total_size = 16384,
16060 .page_size = 256,
16061 .feature_bits = FEATURE_WRSR_WREN,
16062 .tested = TEST_UNTESTED,
16063 .probe = probe_spi_rdid,
16064 .probe_timing = TIMING_ZERO,
16065 .block_erasers =
16066 {
16067 {
16068 .eraseblocks = { {256 * 1024, 64} },
16069 .block_erase = spi_block_erase_d8,
16070 }, {
16071 .eraseblocks = { { 16384 * 1024, 1} },
16072 .block_erase = spi_block_erase_c7,
16073 }
16074 },
16075 .printlock = spi_prettyprint_status_register_bp2_srwd,
16076 .unlock = spi_disable_blockprotect_bp2_srwd,
16077 .write = spi_chip_write_256,
16078 .read = spi_chip_read, /* Fast read (0x0B) supported */
16079 .voltage = {2700, 3600},
16080 },
16081
16082 {
16083 .vendor = "Spansion",
16084 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16085 .bustype = BUS_SPI,
16086 .manufacture_id = SPANSION_ID,
16087 .model_id = SPANSION_S25FL128,
16088 .total_size = 16384,
16089 .page_size = 256,
16090 /* supports 4B addressing */
16091 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16092 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16093 .tested = TEST_OK_PREW,
16094 .probe = probe_spi_rdid,
16095 .probe_timing = TIMING_ZERO,
16096 .block_erasers =
16097 {
16098 {
16099 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16100 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16101 * have no effect on the memory contents, but sets a flag in the SR.
16102 .eraseblocks = {
16103 {4 * 1024, 32},
16104 {64 * 1024, 254} // inaccessible
16105 },
16106 .block_erase = spi_block_erase_20,
16107 }, { */
16108 .eraseblocks = { { 64 * 1024, 256} },
16109 .block_erase = spi_block_erase_d8,
16110 }, {
16111 .eraseblocks = { { 16384 * 1024, 1} },
16112 .block_erase = spi_block_erase_60,
16113 }, {
16114 .eraseblocks = { { 16384 * 1024, 1} },
16115 .block_erase = spi_block_erase_c7,
16116 }
16117 },
16118 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16119 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16120 .write = spi_chip_write_256, /* Multi I/O supported */
16121 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16122 .voltage = {2700, 3600},
16123 },
16124
16125 {
16126 .vendor = "Spansion",
16127 .name = "S25FL128S......1", /* uniform 256 kB sectors */
16128 .bustype = BUS_SPI,
16129 .manufacture_id = SPANSION_ID,
16130 .model_id = SPANSION_S25FL128,
16131 .total_size = 16384,
16132 .page_size = 512,
16133 /* supports 4B addressing */
16134 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16135 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16136 .tested = TEST_UNTESTED,
16137 .probe = probe_spi_rdid,
16138 .probe_timing = TIMING_ZERO,
16139 .block_erasers =
16140 {
16141 {
16142 .eraseblocks = { {256 * 1024, 64} },
16143 .block_erase = spi_block_erase_d8,
16144 }, {
16145 .eraseblocks = { { 16384 * 1024, 1} },
16146 .block_erase = spi_block_erase_60,
16147 }, {
16148 .eraseblocks = { { 16384 * 1024, 1} },
16149 .block_erase = spi_block_erase_c7,
16150 }
16151 },
16152 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16153 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16154 .write = spi_chip_write_256, /* Multi I/O supported */
16155 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16156 .voltage = {2700, 3600},
16157 },
16158
16159 {
16160 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016161 .name = "S25FL128S_UL Uniform 128 kB Sectors",
16162 .bustype = BUS_SPI,
16163 .manufacture_id = SPANSION_ID,
16164 .model_id = SPANSION_S25FL128S_UL,
16165 .total_size = 16384,
16166 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016167 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016168 .tested = TEST_UNTESTED,
16169 .probe = probe_spi_big_spansion,
16170 .probe_timing = TIMING_ZERO,
16171 .block_erasers =
16172 {
16173 {
16174 .eraseblocks = { {128 * 1024, 128} },
16175 .block_erase = spi_block_erase_d8,
16176 }, {
16177 .eraseblocks = { {16 * 1024 * 1024, 1} },
16178 .block_erase = spi_block_erase_60,
16179 }, {
16180 .eraseblocks = { {16 * 1024 * 1024, 1} },
16181 .block_erase = spi_block_erase_c7,
16182 },
16183 },
16184 .unlock = spi_disable_blockprotect,
16185 .write = spi_chip_write_256,
16186 .read = spi_chip_read,
16187 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016188 },
16189
16190 {
16191 .vendor = "Spansion",
16192 .name = "S25FL128S_US Uniform 64 kB Sectors",
16193 .bustype = BUS_SPI,
16194 .manufacture_id = SPANSION_ID,
16195 .model_id = SPANSION_S25FL128S_US,
16196 .total_size = 16384,
16197 .page_size = 256,
16198 .feature_bits = FEATURE_WRSR_WREN,
16199 .tested = TEST_UNTESTED,
16200 .probe = probe_spi_big_spansion,
16201 .probe_timing = TIMING_ZERO,
16202 .block_erasers =
16203 {
16204 {
16205 .eraseblocks = { {64 * 1024, 256} },
16206 .block_erase = spi_block_erase_d8,
16207 }, {
16208 .eraseblocks = { {16 * 1024 * 1024, 1} },
16209 .block_erase = spi_block_erase_60,
16210 }, {
16211 .eraseblocks = { {16 * 1024 * 1024, 1} },
16212 .block_erase = spi_block_erase_c7,
16213 },
16214 },
16215 .unlock = spi_disable_blockprotect,
16216 .write = spi_chip_write_256,
16217 .read = spi_chip_read,
16218 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016219 },
16220
16221 {
16222 .vendor = "Spansion",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100016223 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16224 .bustype = BUS_SPI,
16225 .manufacture_id = SPANSION_ID,
16226 .model_id = SPANSION_S25FL128,
16227 .total_size = 16384,
16228 .page_size = 256,
16229 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16230 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16231 .tested = TEST_OK_PREW,
16232 .probe = probe_spi_rdid,
16233 .probe_timing = TIMING_ZERO,
16234 .block_erasers =
16235 {
16236 {
16237 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
16238 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
16239 * effect on the memory contents, but sets a flag in the SR.
16240 .eraseblocks = {
16241 {4 * 1024, 32},
16242 {64 * 1024, 254} // inaccessible
16243 },
16244 .block_erase = spi_block_erase_20,
16245 }, { */
16246 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
16247 .eraseblocks = {
16248 {8 * 1024, 16},
16249 {64 * 1024, 254} // inaccessible
16250 },
16251 .block_erase = spi_block_erase_40,
16252 }, { */
16253 .eraseblocks = { { 64 * 1024, 256} },
16254 .block_erase = spi_block_erase_d8,
16255 }, {
16256 .eraseblocks = { { 16384 * 1024, 1} },
16257 .block_erase = spi_block_erase_60,
16258 }, {
16259 .eraseblocks = { { 16384 * 1024, 1} },
16260 .block_erase = spi_block_erase_c7,
16261 }
16262 },
16263 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16264 .unlock = spi_disable_blockprotect_bp2_srwd,
16265 .write = spi_chip_write_256, /* Multi I/O supported */
16266 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16267 .voltage = {2700, 3600},
16268 },
16269
16270 {
16271 .vendor = "Spansion",
16272 .name = "S25FL129P......1", /* uniform 256 kB sectors */
16273 .bustype = BUS_SPI,
16274 .manufacture_id = SPANSION_ID,
16275 .model_id = SPANSION_S25FL128,
16276 .total_size = 16384,
16277 .page_size = 256,
16278 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16279 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16280 .tested = TEST_UNTESTED,
16281 .probe = probe_spi_rdid,
16282 .probe_timing = TIMING_ZERO,
16283 .block_erasers =
16284 {
16285 {
16286 .eraseblocks = { {256 * 1024, 64} },
16287 .block_erase = spi_block_erase_d8,
16288 }, {
16289 .eraseblocks = { { 16384 * 1024, 1} },
16290 .block_erase = spi_block_erase_60,
16291 }, {
16292 .eraseblocks = { { 16384 * 1024, 1} },
16293 .block_erase = spi_block_erase_c7,
16294 }
16295 },
16296 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16297 .unlock = spi_disable_blockprotect_bp2_srwd,
16298 .write = spi_chip_write_256, /* Multi I/O supported */
16299 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16300 .voltage = {2700, 3600},
16301 },
16302
16303 {
16304 .vendor = "Spansion",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016305 .name = "S25FL132K",
16306 .bustype = BUS_SPI,
16307 .manufacture_id = SPANSION_ID,
16308 .model_id = SPANSION_S25FL132K,
16309 .total_size = 4096,
16310 .page_size = 256,
16311 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16312 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16313 .tested = TEST_UNTESTED,
16314 .probe = probe_spi_rdid,
16315 .probe_timing = TIMING_ZERO,
16316 .block_erasers =
16317 {
16318 {
16319 .eraseblocks = { {4 * 1024, 1024} },
16320 .block_erase = spi_block_erase_20,
16321 }, {
16322 .eraseblocks = { {64 * 1024, 64} },
16323 .block_erase = spi_block_erase_d8,
16324 }, {
16325 .eraseblocks = { { 4096 * 1024, 1} },
16326 .block_erase = spi_block_erase_60,
16327 }, {
16328 .eraseblocks = { { 4096 * 1024, 1} },
16329 .block_erase = spi_block_erase_c7,
16330 }
16331 },
16332 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16333 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16334 .write = spi_chip_write_256,
16335 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16336 .voltage = {2700, 3600},
16337 },
16338
16339 {
16340 .vendor = "Spansion",
16341 .name = "S25FL164K",
16342 .bustype = BUS_SPI,
16343 .manufacture_id = SPANSION_ID,
16344 .model_id = SPANSION_S25FL164K,
16345 .total_size = 8192,
16346 .page_size = 256,
16347 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16348 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16349 .tested = TEST_OK_PREW,
16350 .probe = probe_spi_rdid,
16351 .probe_timing = TIMING_ZERO,
16352 .block_erasers =
16353 {
16354 {
16355 .eraseblocks = { {4 * 1024, 2048} },
16356 .block_erase = spi_block_erase_20,
16357 }, {
16358 .eraseblocks = { {64 * 1024, 128} },
16359 .block_erase = spi_block_erase_d8,
16360 }, {
16361 .eraseblocks = { { 8192 * 1024, 1} },
16362 .block_erase = spi_block_erase_60,
16363 }, {
16364 .eraseblocks = { { 8192 * 1024, 1} },
16365 .block_erase = spi_block_erase_c7,
16366 }
16367 },
16368 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16369 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16370 .write = spi_chip_write_256,
16371 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16372 .voltage = {2700, 3600},
16373 },
16374
16375 {
16376 .vendor = "Spansion",
16377 .name = "S25FL204K",
16378 .bustype = BUS_SPI,
16379 .manufacture_id = SPANSION_ID,
16380 .model_id = SPANSION_S25FL204,
16381 .total_size = 512,
16382 .page_size = 256,
16383 .feature_bits = FEATURE_WRSR_WREN,
16384 .tested = TEST_OK_PR,
16385 .probe = probe_spi_rdid,
16386 .probe_timing = TIMING_ZERO,
16387 .block_erasers =
16388 {
16389 {
16390 .eraseblocks = { {4 * 1024, 128} },
16391 .block_erase = spi_block_erase_20,
16392 }, {
16393 .eraseblocks = { {64 * 1024, 8} },
16394 .block_erase = spi_block_erase_d8,
16395 }, {
16396 .eraseblocks = { { 512 * 1024, 1} },
16397 .block_erase = spi_block_erase_60,
16398 }, {
16399 .eraseblocks = { { 512 * 1024, 1} },
16400 .block_erase = spi_block_erase_c7,
16401 }
16402 },
16403 .printlock = spi_prettyprint_status_register_bp3_srwd,
16404 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16405 .write = spi_chip_write_256,
16406 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16407 .voltage = {2700, 3600},
16408 },
16409
16410 {
16411 .vendor = "Spansion",
16412 .name = "S25FL208K",
16413 .bustype = BUS_SPI,
16414 .manufacture_id = SPANSION_ID,
16415 .model_id = SPANSION_S25FL208,
16416 .total_size = 1024,
16417 .page_size = 256,
16418 .feature_bits = FEATURE_WRSR_WREN,
16419 .tested = TEST_OK_PREW,
16420 .probe = probe_spi_rdid,
16421 .probe_timing = TIMING_ZERO,
16422 .block_erasers =
16423 {
16424 {
16425 .eraseblocks = { {4 * 1024, 256} },
16426 .block_erase = spi_block_erase_20,
16427 }, {
16428 .eraseblocks = { {64 * 1024, 16} },
16429 .block_erase = spi_block_erase_d8,
16430 }, {
16431 .eraseblocks = { { 1024 * 1024, 1} },
16432 .block_erase = spi_block_erase_60,
16433 }, {
16434 .eraseblocks = { { 1024 * 1024, 1} },
16435 .block_erase = spi_block_erase_c7,
16436 }
16437 },
16438 .printlock = spi_prettyprint_status_register_bp3_srwd,
16439 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16440 .write = spi_chip_write_256,
16441 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16442 .voltage = {2700, 3600},
16443 },
16444
16445 {
16446 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016447 .name = "S25FL256S Large Sectors",
16448 .bustype = BUS_SPI,
16449 .manufacture_id = SPANSION_ID,
16450 .model_id = SPANSION_S25FL256S_UL,
16451 .total_size = 16384, /* This is just half the size.... */
16452 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016453 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016454 .tested = TEST_UNTESTED,
16455 .probe = probe_spi_big_spansion,
16456 .probe_timing = TIMING_ZERO,
16457 .block_erasers =
16458 {
16459 {
16460 .eraseblocks = { {256 * 1024, 64} },
16461 .block_erase = s25fl_block_erase,
16462 }, {
16463 .eraseblocks = { {16 * 1024 * 1024, 1} },
16464 .block_erase = spi_block_erase_60,
16465 },
16466 },
16467 .unlock = spi_disable_blockprotect,
16468 .write = spi_chip_write_256,
16469 .read = spi_chip_read,
16470 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016471 },
16472
16473 {
16474 .vendor = "Spansion",
16475 .name = "S25FL256S Small Sectors",
16476 .bustype = BUS_SPI,
16477 .manufacture_id = SPANSION_ID,
16478 .model_id = SPANSION_S25FL256S_US,
16479 .total_size = 16384, /* This is just half the size.... */
16480 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016481 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100016482 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100016483 .probe = probe_spi_big_spansion,
16484 .probe_timing = TIMING_ZERO,
16485 .block_erasers =
16486 {
16487 {
16488 .eraseblocks = { {64 * 1024, 256} },
16489 .block_erase = s25fl_block_erase,
16490 }, {
16491 .eraseblocks = { {16 * 1024 * 1024, 1} },
16492 .block_erase = spi_block_erase_60,
16493 },
16494 },
16495 .unlock = spi_disable_blockprotect,
16496 .write = spi_chip_write_256,
16497 .read = spi_chip_read,
16498 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016499 },
16500
16501 {
16502 .vendor = "Spansion",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016503 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16504 .bustype = BUS_SPI,
16505 .manufacture_id = SPANSION_ID,
16506 .model_id = SPANSION_S25FL256,
16507 .total_size = 32768,
16508 .page_size = 256,
16509 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16510 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
16511 .tested = TEST_OK_PREW,
16512 .probe = probe_spi_rdid,
16513 .probe_timing = TIMING_ZERO,
16514 .block_erasers =
16515 {
16516 {
16517 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16518 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16519 * have no effect on the memory contents, but sets a flag in the SR.
16520 .eraseblocks = {
16521 {4 * 1024, 32},
16522 {64 * 1024, 254} // inaccessible
16523 },
16524 .block_erase = spi_block_erase_20,
16525 }, { */
16526 .eraseblocks = { { 64 * 1024, 512} },
16527 .block_erase = spi_block_erase_dc,
16528 }, {
16529 .eraseblocks = { { 64 * 1024, 512} },
16530 .block_erase = spi_block_erase_d8,
16531 }, {
16532 .eraseblocks = { { 32768 * 1024, 1} },
16533 .block_erase = spi_block_erase_60,
16534 }, {
16535 .eraseblocks = { { 32768 * 1024, 1} },
16536 .block_erase = spi_block_erase_c7,
16537 }
16538 },
16539 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16540 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16541 .write = spi_chip_write_256, /* Multi I/O supported */
16542 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16543 .voltage = {2700, 3600},
16544 .wrea_override = 0x17,
16545 },
16546
16547 {
16548 .vendor = "Spansion",
16549 .name = "S25FL512S",
16550 .bustype = BUS_SPI,
16551 .manufacture_id = SPANSION_ID,
16552 .model_id = SPANSION_S25FL512,
16553 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
16554 .page_size = 256,
16555 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16556 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE,
16557 .tested = TEST_OK_PREW,
16558 .probe = probe_spi_rdid,
16559 .probe_timing = TIMING_ZERO,
16560 .block_erasers =
16561 {
16562 {
16563 .eraseblocks = { { 256 * 1024, 256} },
16564 .block_erase = spi_block_erase_dc,
16565 }, {
16566 .eraseblocks = { { 65536 * 1024, 1} },
16567 .block_erase = spi_block_erase_60,
16568 }, {
16569 .eraseblocks = { { 65536 * 1024, 1} },
16570 .block_erase = spi_block_erase_c7,
16571 }
16572 },
16573 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16574 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16575 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
16576 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16577 .voltage = {2700, 3600},
16578 },
16579
16580 {
16581 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016582 .name = "S25FS128S Large Sectors",
16583 .bustype = BUS_SPI,
16584 .manufacture_id = SPANSION_ID,
16585 .model_id = SPANSION_S25FS128S_L,
16586 .total_size = 16384,
16587 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016588 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016589 .tested = TEST_UNTESTED,
16590 .probe = probe_spi_big_spansion,
16591 .probe_timing = TIMING_ZERO,
16592 .block_erasers =
16593 {
16594 {
16595 .eraseblocks = { {64 * 1024, 256} },
16596 .block_erase = s25fs_block_erase_d8,
16597 }, {
16598 .eraseblocks = { {16 * 1024 * 1024, 1} },
16599 .block_erase = spi_block_erase_60,
16600 }, {
16601 .eraseblocks = { {16 * 1024 * 1024, 1} },
16602 .block_erase = spi_block_erase_c7,
16603 },
16604 },
16605 .unlock = spi_disable_blockprotect,
16606 .write = spi_chip_write_256,
16607 .read = spi_chip_read,
16608 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016609 },
16610
16611 {
16612 .vendor = "Spansion",
16613 .name = "S25FS128S Small Sectors",
16614 .bustype = BUS_SPI,
16615 .manufacture_id = SPANSION_ID,
16616 .model_id = SPANSION_S25FS128S_S,
16617 .total_size = 16384,
16618 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016619 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100016620 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100016621 .probe = probe_spi_big_spansion,
16622 .probe_timing = TIMING_ZERO,
16623 .block_erasers =
16624 {
16625 {
16626 .eraseblocks = { {64 * 1024, 256} },
16627 .block_erase = s25fs_block_erase_d8,
16628 }, {
16629 .eraseblocks = { {16 * 1024 * 1024, 1} },
16630 .block_erase = spi_block_erase_60,
16631 }, {
16632 .eraseblocks = { {16 * 1024 * 1024, 1} },
16633 .block_erase = spi_block_erase_c7,
16634 },
16635 },
16636 .unlock = spi_disable_blockprotect,
16637 .write = spi_chip_write_256,
16638 .read = spi_chip_read,
16639 .voltage = {1700, 2000},
Alan Greend76dc1f2019-06-26 15:38:19 +100016640 },
16641
16642 {
hailfinger0ae231d2010-07-29 20:01:13 +000016643 .vendor = "SyncMOS/MoselVitelic",
16644 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +000016645 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016646 .manufacture_id = SYNCMOS_MVC_ID,
16647 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +000016648 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +000016649 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +000016650 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000016651 .tested = TEST_UNTESTED,
16652 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016653 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016654 .block_erasers =
16655 {
16656 {
16657 .eraseblocks = { {512, 256} },
16658 .block_erase = erase_sector_jedec,
16659 }, {
16660 .eraseblocks = { {128 * 1024, 1} },
16661 .block_erase = erase_chip_block_jedec,
16662 },
16663 },
snelsonc6855342010-01-28 23:55:12 +000016664 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016665 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016666 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000016667 },
16668
hailfinger286829b2009-01-08 03:40:17 +000016669 {
hailfinger0ae231d2010-07-29 20:01:13 +000016670 .vendor = "SyncMOS/MoselVitelic",
16671 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +000016672 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016673 .manufacture_id = SYNCMOS_MVC_ID,
16674 .model_id = SM_MVC_29C51001T,
16675 .total_size = 128,
16676 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +000016677 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +000016678 .tested = TEST_UNTESTED,
16679 .probe = probe_jedec,
16680 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16681 .block_erasers =
16682 {
16683 {
16684 .eraseblocks = { {512, 256} },
16685 .block_erase = erase_sector_jedec,
16686 }, {
16687 .eraseblocks = { {128 * 1024, 1} },
16688 .block_erase = erase_chip_block_jedec,
16689 },
16690 },
16691 .write = write_jedec_1,
16692 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016693 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016694 },
16695
16696 {
16697 .vendor = "SyncMOS/MoselVitelic",
16698 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +000016699 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016700 .manufacture_id = SYNCMOS_MVC_ID,
16701 .model_id = SM_MVC_29C51002B,
16702 .total_size = 256,
16703 .page_size = 512,
16704 .feature_bits = FEATURE_EITHER_RESET,
16705 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000016706 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016707 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016708 .block_erasers =
16709 {
16710 {
16711 .eraseblocks = { {512, 512} },
16712 .block_erase = erase_sector_jedec,
16713 }, {
16714 .eraseblocks = { {256 * 1024, 1} },
16715 .block_erase = erase_chip_block_jedec,
16716 },
16717 },
snelsonc6855342010-01-28 23:55:12 +000016718 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016719 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000016720 },
16721
hailfinger286829b2009-01-08 03:40:17 +000016722 {
hailfinger0ae231d2010-07-29 20:01:13 +000016723 .vendor = "SyncMOS/MoselVitelic",
16724 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +000016725 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016726 .manufacture_id = SYNCMOS_MVC_ID,
16727 .model_id = SM_MVC_29C51002T,
16728 .total_size = 256,
16729 .page_size = 512,
16730 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000016731 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +000016732 .probe = probe_jedec,
16733 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16734 .block_erasers =
16735 {
16736 {
16737 .eraseblocks = { {512, 512} },
16738 .block_erase = erase_sector_jedec,
16739 }, {
16740 .eraseblocks = { {256 * 1024, 1} },
16741 .block_erase = erase_chip_block_jedec,
16742 },
16743 },
16744 .write = write_jedec_1,
16745 .read = read_memmapped,
16746 },
16747
16748 {
16749 .vendor = "SyncMOS/MoselVitelic",
16750 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +000016751 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016752 .manufacture_id = SYNCMOS_MVC_ID,
16753 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +000016754 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +000016755 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +000016756 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000016757 .tested = TEST_UNTESTED,
16758 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016759 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +000016760 .block_erasers =
16761 {
16762 {
hailfinger0ae231d2010-07-29 20:01:13 +000016763 .eraseblocks = { {1024, 512} },
16764 .block_erase = erase_sector_jedec,
16765 }, {
16766 .eraseblocks = { {512 * 1024, 1} },
16767 .block_erase = erase_chip_block_jedec,
16768 },
16769 },
16770 .write = write_jedec_1,
16771 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016772 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016773 },
16774
16775 {
16776 .vendor = "SyncMOS/MoselVitelic",
16777 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +000016778 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016779 .manufacture_id = SYNCMOS_MVC_ID,
16780 .model_id = SM_MVC_29C51004T,
16781 .total_size = 512,
16782 .page_size = 1024,
16783 .feature_bits = FEATURE_EITHER_RESET,
16784 .tested = TEST_UNTESTED,
16785 .probe = probe_jedec,
16786 .probe_timing = TIMING_ZERO,
16787 .block_erasers =
16788 {
16789 {
16790 .eraseblocks = { {1024, 512} },
16791 .block_erase = erase_sector_jedec,
16792 }, {
16793 .eraseblocks = { {512 * 1024, 1} },
16794 .block_erase = erase_chip_block_jedec,
16795 },
16796 },
16797 .write = write_jedec_1,
16798 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016799 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016800 },
16801
16802 {
16803 .vendor = "SyncMOS/MoselVitelic",
16804 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +000016805 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016806 .manufacture_id = SYNCMOS_MVC_ID,
16807 .model_id = SM_MVC_29C31004B,
16808 .total_size = 512,
16809 .page_size = 1024,
16810 .feature_bits = FEATURE_EITHER_RESET,
16811 .tested = TEST_UNTESTED,
16812 .probe = probe_jedec,
16813 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16814 .block_erasers =
16815 {
16816 {
16817 .eraseblocks = { {1024, 512} },
16818 .block_erase = erase_sector_jedec,
16819 }, {
16820 .eraseblocks = { {512 * 1024, 1} },
16821 .block_erase = erase_chip_block_jedec,
16822 },
16823 },
16824 .write = write_jedec_1,
16825 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016826 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +000016827 },
16828
16829 {
16830 .vendor = "SyncMOS/MoselVitelic",
16831 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +000016832 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016833 .manufacture_id = SYNCMOS_MVC_ID,
16834 .model_id = SM_MVC_29C31004T,
16835 .total_size = 512,
16836 .page_size = 1024,
16837 .feature_bits = FEATURE_EITHER_RESET,
16838 .tested = TEST_UNTESTED,
16839 .probe = probe_jedec,
16840 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16841 .block_erasers =
16842 {
16843 {
16844 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +000016845 .block_erase = erase_sector_jedec,
16846 }, {
16847 .eraseblocks = { {512 * 1024, 1} },
16848 .block_erase = erase_chip_block_jedec,
16849 },
16850 },
snelsonc6855342010-01-28 23:55:12 +000016851 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016852 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016853 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000016854 },
16855
hailfinger286829b2009-01-08 03:40:17 +000016856 {
uwe77048c72009-05-27 23:17:40 +000016857 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +000016858 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +000016859 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +000016860 .manufacture_id = TI_OLD_ID,
16861 .model_id = TI_TMS29F002RB,
16862 .total_size = 256,
16863 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +000016864 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +000016865 .tested = TEST_UNTESTED,
16866 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016867 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016868 .block_erasers =
16869 {
16870 {
16871 .eraseblocks = {
16872 {16 * 1024, 1},
16873 {8 * 1024, 2},
16874 {32 * 1024, 1},
16875 {64 * 1024, 3},
16876 },
16877 .block_erase = erase_sector_jedec,
16878 }, {
16879 .eraseblocks = { {256 * 1024, 1} },
16880 .block_erase = erase_chip_block_jedec,
16881 },
16882 },
snelsonc6855342010-01-28 23:55:12 +000016883 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +000016884 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016885 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +000016886 },
16887
16888 {
uwe77048c72009-05-27 23:17:40 +000016889 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +000016890 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +000016891 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +000016892 .manufacture_id = TI_OLD_ID,
16893 .model_id = TI_TMS29F002RT,
16894 .total_size = 256,
16895 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +000016896 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +000016897 .tested = TEST_UNTESTED,
16898 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016899 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016900 .block_erasers =
16901 {
16902 {
16903 .eraseblocks = {
16904 {64 * 1024, 3},
16905 {32 * 1024, 1},
16906 {8 * 1024, 2},
16907 {16 * 1024, 1},
16908 },
16909 .block_erase = erase_sector_jedec,
16910 }, {
16911 .eraseblocks = { {256 * 1024, 1} },
16912 .block_erase = erase_chip_block_jedec,
16913 },
16914 },
snelsonc6855342010-01-28 23:55:12 +000016915 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +000016916 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016917 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +000016918 },
16919
16920 {
hailfinger286829b2009-01-08 03:40:17 +000016921 .vendor = "Winbond",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016922 .name = "W25P16",
16923 .bustype = BUS_SPI,
16924 .manufacture_id = WINBOND_NEX_ID,
16925 .model_id = WINBOND_NEX_W25P16,
16926 .total_size = 2048,
16927 .page_size = 256,
16928 .feature_bits = FEATURE_WRSR_WREN,
16929 .tested = TEST_UNTESTED,
16930 .probe = probe_spi_rdid,
16931 .probe_timing = TIMING_ZERO,
16932 .block_erasers =
16933 {
16934 {
16935 .eraseblocks = { {64 * 1024, 32} },
16936 .block_erase = spi_block_erase_d8,
16937 }, {
16938 .eraseblocks = { {2048 * 1024, 1} },
16939 .block_erase = spi_block_erase_c7,
16940 }
16941 },
16942 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16943 .unlock = spi_disable_blockprotect,
16944 .write = spi_chip_write_256,
16945 .read = spi_chip_read, /* Fast read (0x0B) supported */
16946 .voltage = {2700, 3600},
16947 },
16948
16949 {
16950 .vendor = "Winbond",
16951 .name = "W25P32",
16952 .bustype = BUS_SPI,
16953 .manufacture_id = WINBOND_NEX_ID,
16954 .model_id = WINBOND_NEX_W25P32,
16955 .total_size = 4096,
16956 .page_size = 256,
16957 .feature_bits = FEATURE_WRSR_WREN,
16958 .tested = TEST_UNTESTED,
16959 .probe = probe_spi_rdid,
16960 .probe_timing = TIMING_ZERO,
16961 .block_erasers =
16962 {
16963 {
16964 .eraseblocks = { {64 * 1024, 64} },
16965 .block_erase = spi_block_erase_d8,
16966 }, {
16967 .eraseblocks = { {4096 * 1024, 1} },
16968 .block_erase = spi_block_erase_c7,
16969 }
16970 },
16971 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16972 .unlock = spi_disable_blockprotect,
16973 .write = spi_chip_write_256,
16974 .read = spi_chip_read, /* Fast read (0x0B) supported */
16975 .voltage = {2700, 3600},
16976 },
16977
16978 {
16979 .vendor = "Winbond",
16980 .name = "W25P80",
16981 .bustype = BUS_SPI,
16982 .manufacture_id = WINBOND_NEX_ID,
16983 .model_id = WINBOND_NEX_W25P80,
16984 .total_size = 1024,
16985 .page_size = 256,
16986 .feature_bits = FEATURE_WRSR_WREN,
16987 .tested = TEST_UNTESTED,
16988 .probe = probe_spi_rdid,
16989 .probe_timing = TIMING_ZERO,
16990 .block_erasers =
16991 {
16992 {
16993 .eraseblocks = { {64 * 1024, 16} },
16994 .block_erase = spi_block_erase_d8,
16995 }, {
16996 .eraseblocks = { {1024 * 1024, 1} },
16997 .block_erase = spi_block_erase_c7,
16998 }
16999 },
17000 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17001 .unlock = spi_disable_blockprotect,
17002 .write = spi_chip_write_256,
17003 .read = spi_chip_read, /* Fast read (0x0B) supported */
17004 .voltage = {2700, 3600},
17005 },
17006
17007 {
17008 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -080017009 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +000017010 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +000017011 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +010017012 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -080017013 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +000017014 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017015 /* supports SFDP */
17016 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017017 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017018 .tested = TEST_OK_PREW,
stefancte0e52902011-05-26 14:28:51 +000017019 .probe = probe_spi_rdid,
17020 .probe_timing = TIMING_ZERO,
17021 .block_erasers =
17022 {
17023 {
David Hendricks9356d162015-03-06 14:07:25 -080017024 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +000017025 .block_erase = spi_block_erase_20,
17026 }, {
David Hendricks9356d162015-03-06 14:07:25 -080017027 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +000017028 .block_erase = spi_block_erase_52,
17029 }, {
David Hendricks9356d162015-03-06 14:07:25 -080017030 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +000017031 .block_erase = spi_block_erase_d8,
17032 }, {
David Hendricks9356d162015-03-06 14:07:25 -080017033 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000017034 .block_erase = spi_block_erase_60,
17035 }, {
David Hendricks9356d162015-03-06 14:07:25 -080017036 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000017037 .block_erase = spi_block_erase_c7,
17038 }
17039 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017040 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
stefancte0e52902011-05-26 14:28:51 +000017041 .unlock = spi_disable_blockprotect,
17042 .write = spi_chip_write_256,
17043 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100017044 .voltage = {2700, 3600},
stefancte0e52902011-05-26 14:28:51 +000017045 },
17046
17047 {
17048 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017049 .name = "W25Q128.V..M",
Martin Rothee8dcf92017-05-10 19:16:19 -060017050 .bustype = BUS_SPI,
17051 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +100017052 .model_id = WINBOND_NEX_W25Q128_V_M,
Martin Rothee8dcf92017-05-10 19:16:19 -060017053 .total_size = 16384,
17054 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017055 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +100017056 .tested = TEST_OK_PREW,
Martin Rothee8dcf92017-05-10 19:16:19 -060017057 .probe = probe_spi_rdid,
17058 .probe_timing = TIMING_ZERO,
17059 .block_erasers =
17060 {
17061 {
17062 .eraseblocks = { {4 * 1024, 4096} },
17063 .block_erase = spi_block_erase_20,
17064 }, {
17065 .eraseblocks = { {32 * 1024, 512} },
17066 .block_erase = spi_block_erase_52,
17067 }, {
17068 .eraseblocks = { {64 * 1024, 256} },
17069 .block_erase = spi_block_erase_d8,
17070 }, {
17071 .eraseblocks = { {16 * 1024 * 1024, 1} },
17072 .block_erase = spi_block_erase_60,
17073 }, {
17074 .eraseblocks = { {16 * 1024 * 1024, 1} },
17075 .block_erase = spi_block_erase_c7,
17076 }
17077 },
Alan Green6cfd0182019-07-26 13:50:04 +100017078 .printlock = spi_prettyprint_status_register_plain,
Alan Green96685f12019-08-26 15:48:25 +100017079 .unlock = spi_disable_blockprotect,
Martin Rothee8dcf92017-05-10 19:16:19 -060017080 .write = spi_chip_write_256,
17081 .read = spi_chip_read,
17082 .voltage = {2700, 3600},
Martin Rothee8dcf92017-05-10 19:16:19 -060017083 },
Alan Greena7cfa332019-06-24 15:48:14 +100017084
Martin Rothee8dcf92017-05-10 19:16:19 -060017085 {
17086 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017087 .name = "W25Q128.W",
17088 .bustype = BUS_SPI,
17089 .manufacture_id = WINBOND_NEX_ID,
17090 .model_id = WINBOND_NEX_W25Q128_W,
17091 .total_size = 16384,
17092 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017093 /* supports SFDP */
17094 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17095 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Greenb40ec892019-08-26 11:43:40 +100017096 .tested = TEST_OK_PREW,
17097 .probe = probe_spi_rdid,
17098 .probe_timing = TIMING_ZERO,
17099 .block_erasers =
17100 {
17101 {
17102 .eraseblocks = { {4 * 1024, 4096} },
17103 .block_erase = spi_block_erase_20,
17104 }, {
17105 .eraseblocks = { {32 * 1024, 512} },
17106 .block_erase = spi_block_erase_52,
17107 }, {
17108 .eraseblocks = { {64 * 1024, 256} },
17109 .block_erase = spi_block_erase_d8,
17110 }, {
17111 .eraseblocks = { {16 * 1024 * 1024, 1} },
17112 .block_erase = spi_block_erase_60,
17113 }, {
17114 .eraseblocks = { {16 * 1024 * 1024, 1} },
17115 .block_erase = spi_block_erase_c7,
17116 }
17117 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017118 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greenb40ec892019-08-26 11:43:40 +100017119 .unlock = spi_disable_blockprotect,
17120 .write = spi_chip_write_256,
17121 .read = spi_chip_read,
Alan Greenb40ec892019-08-26 11:43:40 +100017122 .voltage = {1650, 1950},
Alan Greenb40ec892019-08-26 11:43:40 +100017123 },
17124
17125 {
17126 .vendor = "Winbond",
Peichao Wang5767baa2019-11-12 08:58:59 +080017127 .name = "W25Q128.JW.DTR",
17128 .bustype = BUS_SPI,
17129 .manufacture_id = WINBOND_NEX_ID,
17130 .model_id = WINBOND_NEX_W25Q128_DTR,
17131 .total_size = 16384,
17132 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017133 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Peichao Wang5767baa2019-11-12 08:58:59 +080017134 .tested = TEST_OK_PREW,
17135 .probe = probe_spi_rdid,
17136 .probe_timing = TIMING_ZERO,
17137 .block_erasers =
17138 {
17139 {
17140 .eraseblocks = { {4 * 1024, 4096} },
17141 .block_erase = spi_block_erase_20,
17142 }, {
17143 .eraseblocks = { {32 * 1024, 512} },
17144 .block_erase = spi_block_erase_52,
17145 }, {
17146 .eraseblocks = { {64 * 1024, 256} },
17147 .block_erase = spi_block_erase_d8,
17148 }, {
17149 .eraseblocks = { {16 * 1024 * 1024, 1} },
17150 .block_erase = spi_block_erase_60,
17151 }, {
17152 .eraseblocks = { {16 * 1024 * 1024, 1} },
17153 .block_erase = spi_block_erase_c7,
17154 }
17155 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100017156 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Peichao Wang5767baa2019-11-12 08:58:59 +080017157 .unlock = spi_disable_blockprotect,
17158 .write = spi_chip_write_256,
17159 .read = spi_chip_read,
17160 .voltage = {1650, 1950},
Peichao Wang5767baa2019-11-12 08:58:59 +080017161 },
17162
17163 {
17164 .vendor = "Winbond",
Alan Green0bf96472019-09-23 13:29:37 +100017165 .name = "W25Q16.V",
Alan Green96685f12019-08-26 15:48:25 +100017166 .bustype = BUS_SPI,
17167 .manufacture_id = WINBOND_NEX_ID,
17168 .model_id = WINBOND_NEX_W25Q16_V,
17169 .total_size = 2048,
17170 .page_size = 256,
Edward O'Callaghanc21c2cc2020-10-01 21:43:09 +100017171 /* supports SFDP */
17172 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green96685f12019-08-26 15:48:25 +100017173 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17174 .tested = TEST_OK_PREW,
17175 .probe = probe_spi_rdid,
17176 .probe_timing = TIMING_ZERO,
17177 .block_erasers =
17178 {
17179 {
17180 .eraseblocks = { {4 * 1024, 512} },
17181 .block_erase = spi_block_erase_20,
17182 }, {
17183 .eraseblocks = { {32 * 1024, 64} },
17184 .block_erase = spi_block_erase_52,
17185 }, {
17186 .eraseblocks = { {64 * 1024, 32} },
17187 .block_erase = spi_block_erase_d8,
17188 }, {
17189 .eraseblocks = { {2 * 1024 * 1024, 1} },
17190 .block_erase = spi_block_erase_60,
17191 }, {
17192 .eraseblocks = { {2 * 1024 * 1024, 1} },
17193 .block_erase = spi_block_erase_c7,
17194 }
17195 },
Edward O'Callaghan4772b332020-10-01 21:42:03 +100017196 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green96685f12019-08-26 15:48:25 +100017197 .unlock = spi_disable_blockprotect,
17198 .write = spi_chip_write_256,
17199 .read = spi_chip_read,
17200 .voltage = {2700, 3600},
Alan Green96685f12019-08-26 15:48:25 +100017201 },
17202
17203 {
17204 .vendor = "Winbond",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100017205 .name = "W25Q16.W",
17206 .bustype = BUS_SPI,
17207 .manufacture_id = WINBOND_NEX_ID,
17208 .model_id = WINBOND_NEX_W25Q16_W,
17209 .total_size = 2048,
17210 .page_size = 256,
17211 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17212 /* QPI enable 0x38, disable 0xFF */
17213 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17214 .tested = TEST_UNTESTED,
17215 .probe = probe_spi_rdid,
17216 .probe_timing = TIMING_ZERO,
17217 .block_erasers =
17218 {
17219 {
17220 .eraseblocks = { {4 * 1024, 512} },
17221 .block_erase = spi_block_erase_20,
17222 }, {
17223 .eraseblocks = { {32 * 1024, 64} },
17224 .block_erase = spi_block_erase_52,
17225 }, {
17226 .eraseblocks = { {64 * 1024, 32} },
17227 .block_erase = spi_block_erase_d8,
17228 }, {
17229 .eraseblocks = { {2 * 1024 * 1024, 1} },
17230 .block_erase = spi_block_erase_60,
17231 }, {
17232 .eraseblocks = { {2 * 1024 * 1024, 1} },
17233 .block_erase = spi_block_erase_c7,
17234 }
17235 },
17236 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17237 .unlock = spi_disable_blockprotect,
17238 .write = spi_chip_write_256,
17239 .read = spi_chip_read,
17240 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17241 },
17242
17243 {
17244 .vendor = "Winbond",
Nikolai Artemieva71a7242020-08-31 17:53:09 +100017245 .name = "W25Q20.W",
17246 .bustype = BUS_SPI,
17247 .manufacture_id = WINBOND_NEX_ID,
17248 .model_id = WINBOND_NEX_W25Q20_W,
17249 .total_size = 256,
17250 .page_size = 256,
17251 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17252 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17253 .tested = TEST_UNTESTED,
17254 .probe = probe_spi_rdid,
17255 .probe_timing = TIMING_ZERO,
17256 .block_erasers =
17257 {
17258 {
17259 .eraseblocks = { {4 * 1024, 64} },
17260 .block_erase = spi_block_erase_20,
17261 }, {
17262 .eraseblocks = { {32 * 1024, 8} },
17263 .block_erase = spi_block_erase_52,
17264 }, {
17265 .eraseblocks = { {64 * 1024, 4} },
17266 .block_erase = spi_block_erase_d8,
17267 }, {
17268 .eraseblocks = { {256 * 1024, 1} },
17269 .block_erase = spi_block_erase_60,
17270 }, {
17271 .eraseblocks = { {256 * 1024, 1} },
17272 .block_erase = spi_block_erase_c7,
17273 }
17274 },
17275 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17276 .unlock = spi_disable_blockprotect,
17277 .write = spi_chip_write_256,
17278 .read = spi_chip_read,
17279 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17280 },
17281
17282 {
17283 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017284 .name = "W25Q256.V",
17285 .bustype = BUS_SPI,
17286 .manufacture_id = WINBOND_NEX_ID,
17287 .model_id = WINBOND_NEX_W25Q256_V,
17288 .total_size = 32768,
17289 .page_size = 256,
17290 /* supports SFDP */
17291 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17292 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Nikolai Artemieved9365a2021-02-16 15:45:45 +110017293 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
17294 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
Alan Green1295b292019-07-30 13:38:04 +100017295 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017296 .probe = probe_spi_rdid,
17297 .probe_timing = TIMING_ZERO,
17298 .block_erasers =
17299 {
17300 {
17301 .eraseblocks = { {4 * 1024, 8192} },
17302 .block_erase = spi_block_erase_20,
17303 }, {
17304 .eraseblocks = { {32 * 1024, 1024} },
17305 .block_erase = spi_block_erase_52,
17306 }, {
17307 .eraseblocks = { {64 * 1024, 512} },
17308 .block_erase = spi_block_erase_d8,
17309 }, {
17310 .eraseblocks = { {32 * 1024 * 1024, 1} },
17311 .block_erase = spi_block_erase_60,
17312 }, {
17313 .eraseblocks = { {32 * 1024 * 1024, 1} },
17314 .block_erase = spi_block_erase_c7,
17315 }
17316 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017317 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017318 .unlock = spi_disable_blockprotect,
17319 .write = spi_chip_write_256,
17320 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +100017321 .voltage = {2700, 3600},
17322 },
17323
17324 {
17325 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017326 .name = "W25Q256JV_M",
Shelley Chenfc338ee2018-07-20 16:27:15 -070017327 .bustype = BUS_SPI,
17328 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +100017329 .model_id = WINBOND_NEX_W25Q256JV_M,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017330 .total_size = 32768,
17331 .page_size = 256,
Nikolai Artemieved9365a2021-02-16 15:45:45 +110017332 /* supports SFDP */
17333 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17334 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
17335 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Alan Green1295b292019-07-30 13:38:04 +100017336 .tested = TEST_OK_PREW,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017337 .probe = probe_spi_rdid,
17338 .probe_timing = TIMING_ZERO,
17339 .block_erasers =
17340 {
17341 {
17342 .eraseblocks = { {4 * 1024, 8192} },
Nikolai Artemievdba65232021-03-19 11:37:47 +110017343 .block_erase = spi_block_erase_21,
17344 }, {
17345 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017346 .block_erase = spi_block_erase_20,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017347 }, {
17348 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017349 .block_erase = spi_block_erase_52,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017350 }, {
17351 .eraseblocks = { {64 * 1024, 512} },
Nikolai Artemievdba65232021-03-19 11:37:47 +110017352 .block_erase = spi_block_erase_dc,
17353 }, {
17354 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017355 .block_erase = spi_block_erase_d8,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017356 }, {
17357 .eraseblocks = { {32 * 1024 * 1024, 1} },
17358 .block_erase = spi_block_erase_60,
17359 }, {
17360 .eraseblocks = { {32 * 1024 * 1024, 1} },
17361 .block_erase = spi_block_erase_c7,
17362 }
17363 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017364 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Shelley Chenfc338ee2018-07-20 16:27:15 -070017365 .unlock = spi_disable_blockprotect,
17366 .write = spi_chip_write_256,
17367 .read = spi_chip_read,
17368 .voltage = {2700, 3600},
17369 },
Alan Greena7cfa332019-06-24 15:48:14 +100017370
Shelley Chenfc338ee2018-07-20 16:27:15 -070017371 {
17372 .vendor = "Winbond",
Nikolai Artemieva71a7242020-08-31 17:53:09 +100017373 .name = "W25Q256.W",
17374 .bustype = BUS_SPI,
17375 .manufacture_id = WINBOND_NEX_ID,
17376 .model_id = WINBOND_NEX_W25Q256_W,
17377 .total_size = 32768,
17378 .page_size = 256,
17379 /* supports SFDP */
17380 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17381 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
17382 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
17383 .tested = TEST_OK_PREW,
17384 .probe = probe_spi_rdid,
17385 .probe_timing = TIMING_ZERO,
17386 .block_erasers =
17387 {
17388 {
17389 .eraseblocks = { {4 * 1024, 8192} },
17390 .block_erase = spi_block_erase_20,
17391 }, {
17392 .eraseblocks = { {32 * 1024, 1024} },
17393 .block_erase = spi_block_erase_52,
17394 }, {
17395 .eraseblocks = { {64 * 1024, 512} },
17396 .block_erase = spi_block_erase_d8,
17397 }, {
17398 .eraseblocks = { {32 * 1024 * 1024, 1} },
17399 .block_erase = spi_block_erase_60,
17400 }, {
17401 .eraseblocks = { {32 * 1024 * 1024, 1} },
17402 .block_erase = spi_block_erase_c7,
17403 }
17404 },
17405 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17406 .unlock = spi_disable_blockprotect,
17407 .write = spi_chip_write_256,
17408 .read = spi_chip_read,
17409 .voltage = {1650, 1950},
17410 },
17411
17412 {
17413 .vendor = "Winbond",
17414 .name = "W25Q256JW_DTR",
17415 .bustype = BUS_SPI,
17416 .manufacture_id = WINBOND_NEX_ID,
17417 .model_id = WINBOND_NEX_W25Q256_DTR,
17418 .total_size = 32768,
17419 .page_size = 256,
17420 /* supports SFDP */
17421 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17422 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
17423 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17424 .tested = TEST_OK_PREW,
17425 .probe = probe_spi_rdid,
17426 .probe_timing = TIMING_ZERO,
17427 .block_erasers =
17428 {
17429 {
17430 .eraseblocks = { {4 * 1024, 8192} },
17431 .block_erase = spi_block_erase_21,
17432 }, {
17433 .eraseblocks = { {4 * 1024, 8192} },
17434 .block_erase = spi_block_erase_20,
17435 }, {
17436 .eraseblocks = { {32 * 1024, 1024} },
17437 .block_erase = spi_block_erase_52,
17438 }, {
17439 .eraseblocks = { {64 * 1024, 512} },
17440 .block_erase = spi_block_erase_dc,
17441 }, {
17442 .eraseblocks = { {64 * 1024, 512} },
17443 .block_erase = spi_block_erase_d8,
17444 }, {
17445 .eraseblocks = { {32 * 1024 * 1024, 1} },
17446 .block_erase = spi_block_erase_60,
17447 }, {
17448 .eraseblocks = { {32 * 1024 * 1024, 1} },
17449 .block_erase = spi_block_erase_c7,
17450 }
17451 },
17452 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17453 .unlock = spi_disable_blockprotect,
17454 .write = spi_chip_write_256,
17455 .read = spi_chip_read,
17456 .voltage = {1700, 1950},
17457 },
17458
17459 {
17460 .vendor = "Winbond",
Alan Green8c3c3c62019-09-23 13:55:21 +100017461 .name = "W25Q32.V",
17462 .bustype = BUS_SPI,
17463 .manufacture_id = WINBOND_NEX_ID,
17464 .model_id = WINBOND_NEX_W25Q32_V,
17465 .total_size = 4096,
17466 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017467 /* supports SFDP */
17468 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green8c3c3c62019-09-23 13:55:21 +100017469 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17470 .tested = TEST_OK_PREW,
17471 .probe = probe_spi_rdid,
17472 .probe_timing = TIMING_ZERO,
17473 .block_erasers =
17474 {
17475 {
17476 .eraseblocks = { {4 * 1024, 1024} },
17477 .block_erase = spi_block_erase_20,
17478 }, {
17479 .eraseblocks = { {32 * 1024, 128} },
17480 .block_erase = spi_block_erase_52,
17481 }, {
17482 .eraseblocks = { {64 * 1024, 64} },
17483 .block_erase = spi_block_erase_d8,
17484 }, {
17485 .eraseblocks = { {4 * 1024 * 1024, 1} },
17486 .block_erase = spi_block_erase_60,
17487 }, {
17488 .eraseblocks = { {4 * 1024 * 1024, 1} },
17489 .block_erase = spi_block_erase_c7,
17490 }
17491 },
17492 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17493 .unlock = spi_disable_blockprotect,
17494 .write = spi_chip_write_256,
17495 .read = spi_chip_read,
17496 .voltage = {2700, 3600},
Alan Green8c3c3c62019-09-23 13:55:21 +100017497 },
17498
17499 {
17500 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017501 .name = "W25Q32.W",
Alan Greend76dc1f2019-06-26 15:38:19 +100017502 .bustype = BUS_SPI,
17503 .manufacture_id = WINBOND_NEX_ID,
17504 .model_id = WINBOND_NEX_W25Q32_W,
17505 .total_size = 4096,
17506 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017507 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17508 /* QPI enable 0x38, disable 0xFF */
17509 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +100017510 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017511 .probe = probe_spi_rdid,
17512 .probe_timing = TIMING_ZERO,
17513 .block_erasers =
17514 {
17515 {
17516 .eraseblocks = { {4 * 1024, 1024} },
17517 .block_erase = spi_block_erase_20,
17518 }, {
17519 .eraseblocks = { {32 * 1024, 128} },
17520 .block_erase = spi_block_erase_52,
17521 }, {
17522 .eraseblocks = { {64 * 1024, 64} },
17523 .block_erase = spi_block_erase_d8,
17524 }, {
17525 .eraseblocks = { {4 * 1024 * 1024, 1} },
17526 .block_erase = spi_block_erase_60,
17527 }, {
17528 .eraseblocks = { {4 * 1024 * 1024, 1} },
17529 .block_erase = spi_block_erase_c7,
17530 }
17531 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017532 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017533 .unlock = spi_disable_blockprotect,
17534 .write = spi_chip_write_256,
17535 .read = spi_chip_read,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017536 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +100017537 },
17538
17539 {
17540 .vendor = "Winbond",
Nikolai Artemiev4ec4bb72021-03-30 14:57:10 +110017541 .name = "W25Q32JW..IM",
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017542 .bustype = BUS_SPI,
17543 .manufacture_id = WINBOND_NEX_ID,
17544 .model_id = WINBOND_NEX_W25Q32JW,
17545 .total_size = 4096,
17546 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017547 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017548 .tested = TEST_OK_PREW,
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017549 .probe = probe_spi_rdid,
17550 .probe_timing = TIMING_ZERO,
17551 .block_erasers =
17552 {
17553 {
17554 .eraseblocks = { {4 * 1024, 1024} },
17555 .block_erase = spi_block_erase_20,
17556 }, {
17557 .eraseblocks = { {32 * 1024, 128} },
17558 .block_erase = spi_block_erase_52,
17559 }, {
17560 .eraseblocks = { {64 * 1024, 64} },
17561 .block_erase = spi_block_erase_d8,
17562 }, {
17563 .eraseblocks = { {4 * 1024 * 1024, 1} },
17564 .block_erase = spi_block_erase_60,
17565 }, {
17566 .eraseblocks = { {4 * 1024 * 1024, 1} },
17567 .block_erase = spi_block_erase_c7,
17568 }
17569 },
17570 .unlock = spi_disable_blockprotect,
17571 .write = spi_chip_write_256,
17572 .read = spi_chip_read,
17573 .voltage = {1700, 1950},
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017574 },
Alan Greena7cfa332019-06-24 15:48:14 +100017575
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017576 {
17577 .vendor = "Winbond",
Martin Rotha608fcc2019-09-26 02:27:11 -060017578 .name = "W25Q40.V",
17579 .bustype = BUS_SPI,
17580 .manufacture_id = WINBOND_NEX_ID,
17581 .model_id = WINBOND_NEX_W25Q40_V,
17582 .total_size = 512,
17583 .page_size = 256,
17584 /* supports SFDP */
17585 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17587 .tested = TEST_OK_PREW,
17588 .probe = probe_spi_rdid,
17589 .probe_timing = TIMING_ZERO,
17590 .block_erasers =
17591 {
17592 {
17593 .eraseblocks = { {4 * 1024, 128} },
17594 .block_erase = spi_block_erase_20,
17595 }, {
17596 .eraseblocks = { {32 * 1024, 16} },
17597 .block_erase = spi_block_erase_52,
17598 }, {
17599 .eraseblocks = { {64 * 1024, 8} },
17600 .block_erase = spi_block_erase_d8,
17601 }, {
17602 .eraseblocks = { {512 * 1024, 1} },
17603 .block_erase = spi_block_erase_60,
17604 }, {
17605 .eraseblocks = { {512 * 1024, 1} },
17606 .block_erase = spi_block_erase_c7,
17607 }
17608 },
17609 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17610 .unlock = spi_disable_blockprotect,
17611 .write = spi_chip_write_256, /* Multi I/O supported */
17612 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17613 .voltage = {2700, 3600},
17614 },
17615
17616 {
17617 .vendor = "Winbond",
Nikolai Artemieva71a7242020-08-31 17:53:09 +100017618 .name = "W25Q40BW",
17619 .bustype = BUS_SPI,
17620 .manufacture_id = WINBOND_NEX_ID,
17621 .model_id = WINBOND_NEX_W25Q40BW,
17622 .total_size = 512,
17623 .page_size = 256,
17624 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17625 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17626 .tested = TEST_OK_PREW,
17627 .probe = probe_spi_rdid,
17628 .probe_timing = TIMING_ZERO,
17629 .block_erasers =
17630 {
17631 {
17632 .eraseblocks = { {4 * 1024, 128} },
17633 .block_erase = spi_block_erase_20,
17634 }, {
17635 .eraseblocks = { {32 * 1024, 16} },
17636 .block_erase = spi_block_erase_52,
17637 }, {
17638 .eraseblocks = { {64 * 1024, 8} },
17639 .block_erase = spi_block_erase_d8,
17640 }, {
17641 .eraseblocks = { {512 * 1024, 1} },
17642 .block_erase = spi_block_erase_60,
17643 }, {
17644 .eraseblocks = { {512 * 1024, 1} },
17645 .block_erase = spi_block_erase_c7,
17646 }
17647 },
17648 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17649 .unlock = spi_disable_blockprotect,
17650 .write = spi_chip_write_256,
17651 .read = spi_chip_read,
17652 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17653 },
17654
17655 {
17656 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017657 .name = "W25Q40EW",
17658 .bustype = BUS_SPI,
17659 .manufacture_id = WINBOND_NEX_ID,
17660 .model_id = WINBOND_NEX_W25Q40EW,
17661 .total_size = 512,
17662 .page_size = 256,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017663 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Alan Green1f6b6962019-09-23 16:56:02 +100017664 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017665 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017666 .probe = probe_spi_rdid,
17667 .probe_timing = TIMING_ZERO,
17668 .block_erasers =
17669 {
17670 {
17671 .eraseblocks = { {4 * 1024, 128} },
17672 .block_erase = spi_block_erase_20,
17673 }, {
17674 .eraseblocks = { {32 * 1024, 16} },
17675 .block_erase = spi_block_erase_52,
17676 }, {
17677 .eraseblocks = { {64 * 1024, 8} },
17678 .block_erase = spi_block_erase_d8,
17679 }, {
Alan Green1655a2e2019-07-26 10:55:55 +100017680 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +100017681 .block_erase = spi_block_erase_60,
17682 }, {
Alan Green1655a2e2019-07-26 10:55:55 +100017683 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +100017684 .block_erase = spi_block_erase_c7,
17685 }
17686 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017687 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017688 .unlock = spi_disable_blockprotect,
17689 .write = spi_chip_write_256,
17690 .read = spi_chip_read,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017691 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +100017692 },
17693
17694 {
17695 .vendor = "Winbond",
Joel Stanley89c9d212019-07-27 19:25:35 +093017696 .name = "W25Q512JV",
17697 .bustype = BUS_SPI,
17698 .manufacture_id = WINBOND_NEX_ID,
17699 .model_id = WINBOND_NEX_W25Q512JV,
17700 .total_size = 64 * 1024,
17701 .page_size = 256,
17702 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17703 .tested = TEST_OK_PREW,
17704 .probe = probe_spi_rdid,
17705 .probe_timing = TIMING_ZERO,
17706 .block_erasers =
17707 {
17708 {
17709 .eraseblocks = { {4 * 1024, 16384} },
17710 .block_erase = spi_block_erase_21,
17711 }, {
17712 .eraseblocks = { {4 * 1024, 16384} },
17713 .block_erase = spi_block_erase_20,
17714 }, {
17715 .eraseblocks = { {32 * 1024, 2048} },
17716 .block_erase = spi_block_erase_52,
17717 }, {
17718 .eraseblocks = { {64 * 1024, 1024} },
17719 .block_erase = spi_block_erase_dc,
17720 }, {
17721 .eraseblocks = { {64 * 1024, 1024} },
17722 .block_erase = spi_block_erase_d8,
17723 }, {
17724 .eraseblocks = { {64 * 1024 * 1024, 1} },
17725 .block_erase = spi_block_erase_60,
17726 }, {
17727 .eraseblocks = { {64 * 1024 * 1024, 1} },
17728 .block_erase = spi_block_erase_c7,
17729 }
17730 },
17731 .printlock = spi_prettyprint_status_register_plain,
17732 .unlock = spi_disable_blockprotect,
17733 .write = spi_chip_write_256,
17734 .read = spi_chip_read,
17735 .voltage = {2700, 3600},
17736 },
17737
17738 {
17739 .vendor = "Winbond",
Alan Greend3624cb2019-09-23 17:08:05 +100017740 .name = "W25Q64.V",
Alan Greend76dc1f2019-06-26 15:38:19 +100017741 .bustype = BUS_SPI,
17742 .manufacture_id = WINBOND_NEX_ID,
17743 .model_id = WINBOND_NEX_W25Q64_V,
17744 .total_size = 8192,
17745 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017746 /* supports SFDP */
17747 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017749 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017750 .probe = probe_spi_rdid,
17751 .probe_timing = TIMING_ZERO,
17752 .block_erasers =
17753 {
17754 {
17755 .eraseblocks = { {4 * 1024, 2048} },
17756 .block_erase = spi_block_erase_20,
17757 }, {
17758 .eraseblocks = { {32 * 1024, 256} },
17759 .block_erase = spi_block_erase_52,
17760 }, {
17761 .eraseblocks = { {64 * 1024, 128} },
17762 .block_erase = spi_block_erase_d8,
17763 }, {
17764 .eraseblocks = { {8 * 1024 * 1024, 1} },
17765 .block_erase = spi_block_erase_60,
17766 }, {
17767 .eraseblocks = { {8 * 1024 * 1024, 1} },
17768 .block_erase = spi_block_erase_c7,
17769 }
17770 },
Alan Greend3624cb2019-09-23 17:08:05 +100017771 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017772 .unlock = spi_disable_blockprotect,
17773 .write = spi_chip_write_256,
17774 .read = spi_chip_read,
17775 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +100017776 },
17777
17778 {
17779 .vendor = "Winbond",
Alan Greenfa6db7e2019-10-04 11:43:55 +100017780 .name = "W25Q64.W",
Alan Greend76dc1f2019-06-26 15:38:19 +100017781 .bustype = BUS_SPI,
17782 .manufacture_id = WINBOND_NEX_ID,
17783 .model_id = WINBOND_NEX_W25Q64_W,
17784 .total_size = 8192,
17785 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017786 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17787 /* QPI enable 0x38, disable 0xFF */
17788 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Alan Green1295b292019-07-30 13:38:04 +100017789 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017790 .probe = probe_spi_rdid,
17791 .probe_timing = TIMING_ZERO,
17792 .block_erasers =
17793 {
17794 {
17795 .eraseblocks = { {4 * 1024, 2048} },
17796 .block_erase = spi_block_erase_20,
17797 }, {
17798 .eraseblocks = { {32 * 1024, 256} },
17799 .block_erase = spi_block_erase_52,
17800 }, {
17801 .eraseblocks = { {64 * 1024, 128} },
17802 .block_erase = spi_block_erase_d8,
17803 }, {
17804 .eraseblocks = { {8 * 1024 * 1024, 1} },
17805 .block_erase = spi_block_erase_60,
17806 }, {
17807 .eraseblocks = { {8 * 1024 * 1024, 1} },
17808 .block_erase = spi_block_erase_c7,
17809 }
17810 },
Alan Greenfa6db7e2019-10-04 11:43:55 +100017811 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017812 .unlock = spi_disable_blockprotect,
17813 .write = spi_chip_write_256,
17814 .read = spi_chip_read,
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100017815 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Alan Greend76dc1f2019-06-26 15:38:19 +100017816 },
17817
17818 {
17819 .vendor = "Winbond",
Scott Chao0448a6b2020-04-08 22:10:50 +080017820 .name = "W25Q64JW",
17821 .bustype = BUS_SPI,
17822 .manufacture_id = WINBOND_NEX_ID,
17823 .model_id = WINBOND_NEX_W25Q64JW,
17824 .total_size = 8192,
17825 .page_size = 256,
17826 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17827 /* QPI enable 0x38, disable 0xFF */
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017828 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Scott Chao0448a6b2020-04-08 22:10:50 +080017829 .tested = TEST_OK_PREW,
17830 .probe = probe_spi_rdid,
17831 .probe_timing = TIMING_ZERO,
17832 .block_erasers =
17833 {
17834 {
17835 .eraseblocks = { {4 * 1024, 2048} },
17836 .block_erase = spi_block_erase_20,
17837 }, {
17838 .eraseblocks = { {32 * 1024, 256} },
17839 .block_erase = spi_block_erase_52,
17840 }, {
17841 .eraseblocks = { {64 * 1024, 128} },
17842 .block_erase = spi_block_erase_d8,
17843 }, {
17844 .eraseblocks = { {8 * 1024 * 1024, 1} },
17845 .block_erase = spi_block_erase_60,
17846 }, {
17847 .eraseblocks = { {8 * 1024 * 1024, 1} },
17848 .block_erase = spi_block_erase_c7,
17849 }
17850 },
17851 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17852 .unlock = spi_disable_blockprotect,
17853 .write = spi_chip_write_256,
17854 .read = spi_chip_read,
17855 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
Scott Chao0448a6b2020-04-08 22:10:50 +080017856 },
17857
17858 {
17859 .vendor = "Winbond",
Alan Green57aca1e2019-10-04 11:55:52 +100017860 .name = "W25Q80.V",
Alan Greend76dc1f2019-06-26 15:38:19 +100017861 .bustype = BUS_SPI,
17862 .manufacture_id = WINBOND_NEX_ID,
17863 .model_id = WINBOND_NEX_W25Q80_V,
17864 .total_size = 1024,
17865 .page_size = 256,
Nikolai Artemieva9634d92020-09-30 12:12:06 +100017866 /* supports SFDP */
17867 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017868 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017869 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017870 .probe = probe_spi_rdid,
17871 .probe_timing = TIMING_ZERO,
17872 .block_erasers =
17873 {
17874 {
17875 .eraseblocks = { {4 * 1024, 256} },
17876 .block_erase = spi_block_erase_20,
17877 }, {
17878 .eraseblocks = { {32 * 1024, 32} },
17879 .block_erase = spi_block_erase_52,
17880 }, {
17881 .eraseblocks = { {64 * 1024, 16} },
17882 .block_erase = spi_block_erase_d8,
17883 }, {
17884 .eraseblocks = { {1024 * 1024, 1} },
17885 .block_erase = spi_block_erase_60,
17886 }, {
17887 .eraseblocks = { {1024 * 1024, 1} },
17888 .block_erase = spi_block_erase_c7,
17889 }
17890 },
Alan Green57aca1e2019-10-04 11:55:52 +100017891 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017892 .unlock = spi_disable_blockprotect,
17893 .write = spi_chip_write_256,
17894 .read = spi_chip_read,
17895 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +100017896 },
17897
17898 {
17899 .vendor = "Winbond",
Nikolai Artemieva71a7242020-08-31 17:53:09 +100017900 .name = "W25Q80BW",
17901 .bustype = BUS_SPI,
17902 .manufacture_id = WINBOND_NEX_ID,
17903 .model_id = WINBOND_NEX_W25Q80BW,
17904 .total_size = 1024,
17905 .page_size = 256,
17906 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17907 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17908 .tested = TEST_OK_PREW,
17909 .probe = probe_spi_rdid,
17910 .probe_timing = TIMING_ZERO,
17911 .block_erasers =
17912 {
17913 {
17914 .eraseblocks = { {4 * 1024, 256} },
17915 .block_erase = spi_block_erase_20,
17916 }, {
17917 .eraseblocks = { {32 * 1024, 32} },
17918 .block_erase = spi_block_erase_52,
17919 }, {
17920 .eraseblocks = { {64 * 1024, 16} },
17921 .block_erase = spi_block_erase_d8,
17922 }, {
17923 .eraseblocks = { {1 * 1024 * 1024, 1} },
17924 .block_erase = spi_block_erase_60,
17925 }, {
17926 .eraseblocks = { {1 * 1024 * 1024, 1} },
17927 .block_erase = spi_block_erase_c7,
17928 }
17929 },
17930 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17931 .unlock = spi_disable_blockprotect,
17932 .write = spi_chip_write_256,
17933 .read = spi_chip_read,
17934 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17935 },
17936
17937 {
17938 .vendor = "Winbond",
17939 .name = "W25Q80EW",
17940 .bustype = BUS_SPI,
17941 .manufacture_id = WINBOND_NEX_ID,
17942 .model_id = WINBOND_NEX_W25Q80EW,
17943 .total_size = 1024,
17944 .page_size = 256,
17945 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17946 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17947 .tested = TEST_OK_PREW,
17948 .probe = probe_spi_rdid,
17949 .probe_timing = TIMING_ZERO,
17950 .block_erasers =
17951 {
17952 {
17953 .eraseblocks = { {4 * 1024, 256} },
17954 .block_erase = spi_block_erase_20,
17955 }, {
17956 .eraseblocks = { {32 * 1024, 32} },
17957 .block_erase = spi_block_erase_52,
17958 }, {
17959 .eraseblocks = { {64 * 1024, 16} },
17960 .block_erase = spi_block_erase_d8,
17961 }, {
17962 .eraseblocks = { {1 * 1024 * 1024, 1} },
17963 .block_erase = spi_block_erase_60,
17964 }, {
17965 .eraseblocks = { {1 * 1024 * 1024, 1} },
17966 .block_erase = spi_block_erase_c7,
17967 }
17968 },
17969 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17970 .unlock = spi_disable_blockprotect,
17971 .write = spi_chip_write_256,
17972 .read = spi_chip_read,
17973 .voltage = {1650, 1950}, /* Fast read (0x0B) and multi I/O supported */
17974 },
17975
17976 {
17977 .vendor = "Winbond",
17978 .name = "W25X05",
17979 .bustype = BUS_SPI,
17980 .manufacture_id = WINBOND_NEX_ID,
17981 .model_id = WINBOND_NEX_W25X05,
17982 .total_size = 64,
17983 .page_size = 256,
17984 .feature_bits = FEATURE_WRSR_WREN,
17985 .tested = TEST_OK_PREW,
17986 .probe = probe_spi_rdid,
17987 .probe_timing = TIMING_ZERO,
17988 .block_erasers =
17989 {
17990 {
17991 .eraseblocks = { {4 * 1024, 16} },
17992 .block_erase = spi_block_erase_20,
17993 }, {
17994 .eraseblocks = { {32 * 1024, 2} },
17995 .block_erase = spi_block_erase_52,
17996 }, {
17997 .eraseblocks = { {64 * 1024, 1} },
17998 .block_erase = spi_block_erase_d8,
17999 }
18000 },
18001 .printlock = spi_prettyprint_status_register_plain,
18002 .unlock = spi_disable_blockprotect,
18003 .write = spi_chip_write_256,
18004 .read = spi_chip_read,
18005 .voltage = {2300, 3600},
18006 },
18007
18008 {
18009 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000018010 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +000018011 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018012 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000018013 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +000018014 .total_size = 128,
18015 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018016 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100018017 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018018 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018019 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000018020 .block_erasers =
18021 {
18022 {
18023 .eraseblocks = { {4 * 1024, 32} },
18024 .block_erase = spi_block_erase_20,
18025 }, {
snelson376060c2010-01-19 03:24:55 +000018026 .eraseblocks = { {64 * 1024, 2} },
18027 .block_erase = spi_block_erase_d8,
18028 }, {
18029 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000018030 .block_erase = spi_block_erase_c7,
18031 }
18032 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018033 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +000018034 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000018035 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000018036 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000018037 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018038 },
18039
hailfinger286829b2009-01-08 03:40:17 +000018040 {
18041 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000018042 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +000018043 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +000018044 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000018045 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +000018046 .total_size = 2048,
18047 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018048 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100018049 .tested = TEST_OK_PREW,
hailfingerea04a9e2009-07-11 19:39:11 +000018050 .probe = probe_spi_rdid,
18051 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000018052 .block_erasers =
18053 {
18054 {
18055 .eraseblocks = { {4 * 1024, 512} },
18056 .block_erase = spi_block_erase_20,
18057 }, {
18058 .eraseblocks = { {32 * 1024, 64} },
18059 .block_erase = spi_block_erase_52,
18060 }, {
18061 .eraseblocks = { {64 * 1024, 32} },
18062 .block_erase = spi_block_erase_d8,
18063 }, {
18064 .eraseblocks = { {2 * 1024 * 1024, 1} },
18065 .block_erase = spi_block_erase_60,
18066 }, {
18067 .eraseblocks = { {2 * 1024 * 1024, 1} },
18068 .block_erase = spi_block_erase_c7,
18069 }
18070 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018071 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +000018072 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +000018073 .write = spi_chip_write_256,
18074 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000018075 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +000018076 },
18077
18078 {
18079 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018080 .name = "W25X20",
18081 .bustype = BUS_SPI,
18082 .manufacture_id = WINBOND_NEX_ID,
18083 .model_id = WINBOND_NEX_W25X20,
18084 .total_size = 256,
18085 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018086 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100018087 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100018088 .probe = probe_spi_rdid,
18089 .probe_timing = TIMING_ZERO,
18090 .block_erasers =
18091 {
18092 {
18093 .eraseblocks = { {4 * 1024, 64} },
18094 .block_erase = spi_block_erase_20,
18095 }, {
18096 .eraseblocks = { {64 * 1024, 4} },
18097 .block_erase = spi_block_erase_d8,
18098 }, {
18099 .eraseblocks = { {256 * 1024, 1} },
18100 .block_erase = spi_block_erase_c7,
18101 }
18102 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018103 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100018104 .unlock = spi_disable_blockprotect,
18105 .write = spi_chip_write_256,
18106 .read = spi_chip_read,
18107 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +100018108 },
18109
18110 {
18111 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000018112 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +000018113 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000018114 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000018115 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +000018116 .total_size = 4096,
18117 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018118 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100018119 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000018120 .probe = probe_spi_rdid,
18121 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000018122 .block_erasers =
18123 {
18124 {
18125 .eraseblocks = { {4 * 1024, 1024} },
18126 .block_erase = spi_block_erase_20,
18127 }, {
18128 .eraseblocks = { {32 * 1024, 128} },
18129 .block_erase = spi_block_erase_52,
18130 }, {
18131 .eraseblocks = { {64 * 1024, 64} },
18132 .block_erase = spi_block_erase_d8,
18133 }, {
18134 .eraseblocks = { {4 * 1024 * 1024, 1} },
18135 .block_erase = spi_block_erase_60,
18136 }, {
18137 .eraseblocks = { {4 * 1024 * 1024, 1} },
18138 .block_erase = spi_block_erase_c7,
18139 }
18140 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018141 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +000018142 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000018143 .write = spi_chip_write_256,
18144 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000018145 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000018146 },
18147
18148 {
18149 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018150 .name = "W25X40",
18151 .bustype = BUS_SPI,
18152 .manufacture_id = WINBOND_NEX_ID,
18153 .model_id = WINBOND_NEX_W25X40,
18154 .total_size = 512,
18155 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018156 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100018157 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100018158 .probe = probe_spi_rdid,
18159 .probe_timing = TIMING_ZERO,
18160 .block_erasers =
18161 {
18162 {
18163 .eraseblocks = { {4 * 1024, 128} },
18164 .block_erase = spi_block_erase_20,
18165 }, {
18166 .eraseblocks = { {64 * 1024, 8} },
18167 .block_erase = spi_block_erase_d8,
18168 }, {
18169 .eraseblocks = { {512 * 1024, 1} },
18170 .block_erase = spi_block_erase_c7,
18171 }
18172 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018173 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100018174 .unlock = spi_disable_blockprotect,
18175 .write = spi_chip_write_256,
18176 .read = spi_chip_read,
18177 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +100018178 },
18179
18180 {
18181 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000018182 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +000018183 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000018184 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000018185 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +000018186 .total_size = 8192,
18187 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018188 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100018189 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000018190 .probe = probe_spi_rdid,
18191 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000018192 .block_erasers =
18193 {
18194 {
18195 .eraseblocks = { {4 * 1024, 2048} },
18196 .block_erase = spi_block_erase_20,
18197 }, {
18198 .eraseblocks = { {32 * 1024, 256} },
18199 .block_erase = spi_block_erase_52,
18200 }, {
18201 .eraseblocks = { {64 * 1024, 128} },
18202 .block_erase = spi_block_erase_d8,
18203 }, {
18204 .eraseblocks = { {8 * 1024 * 1024, 1} },
18205 .block_erase = spi_block_erase_60,
18206 }, {
18207 .eraseblocks = { {8 * 1024 * 1024, 1} },
18208 .block_erase = spi_block_erase_c7,
18209 }
18210 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018211 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +000018212 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000018213 .write = spi_chip_write_256,
18214 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000018215 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000018216 },
18217
18218 {
18219 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018220 .name = "W25X80",
18221 .bustype = BUS_SPI,
18222 .manufacture_id = WINBOND_NEX_ID,
18223 .model_id = WINBOND_NEX_W25X80,
18224 .total_size = 1024,
18225 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100018226 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100018227 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100018228 .probe = probe_spi_rdid,
18229 .probe_timing = TIMING_ZERO,
hailfingere51a2012011-07-26 14:18:52 +000018230 .block_erasers =
18231 {
18232 {
Alan Greend76dc1f2019-06-26 15:38:19 +100018233 .eraseblocks = { {4 * 1024, 256} },
18234 .block_erase = spi_block_erase_20,
18235 }, {
18236 .eraseblocks = { {64 * 1024, 16} },
18237 .block_erase = spi_block_erase_d8,
18238 }, {
18239 .eraseblocks = { {1024 * 1024, 1} },
18240 .block_erase = spi_block_erase_c7,
hailfingere51a2012011-07-26 14:18:52 +000018241 }
18242 },
Nikolai Artemiev8d69a5a2020-09-28 11:26:16 +100018243 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100018244 .unlock = spi_disable_blockprotect,
18245 .write = spi_chip_write_256,
18246 .read = spi_chip_read,
18247 .voltage = {2700, 3600},
hailfingere51a2012011-07-26 14:18:52 +000018248 },
18249
Alan Green753a38e2019-06-07 14:44:32 +100018250 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
18251 {
hailfingere51a2012011-07-26 14:18:52 +000018252 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000018253 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +000018254 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000018255 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018256 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +000018257 .total_size = 128,
18258 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018259 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +000018260 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018261 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000018262 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +000018263 .block_erasers =
18264 {
18265 {
18266 .eraseblocks = { {128 * 1024, 1} },
18267 .block_erase = erase_chip_block_jedec,
18268 }
18269 },
hailfinger286829b2009-01-08 03:40:17 +000018270 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000018271 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000018272 },
18273
hailfinger286829b2009-01-08 03:40:17 +000018274 {
18275 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018276 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
18277 .bustype = BUS_PARALLEL,
18278 .manufacture_id = WINBOND_ID,
18279 .model_id = WINBOND_W29C010,
18280 .total_size = 128,
18281 .page_size = 128,
18282 .feature_bits = FEATURE_LONG_RESET,
Alan Greenc63f8d62019-08-26 15:10:04 +100018283 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100018284 .probe = probe_w29ee011,
18285 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
18286 .block_erasers =
18287 {
18288 {
18289 .eraseblocks = { {128 * 1024, 1} },
18290 .block_erase = erase_chip_block_jedec,
18291 }
18292 },
18293 .write = write_jedec,
18294 .read = read_memmapped,
18295 },
18296
18297 {
18298 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000018299 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000018300 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000018301 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018302 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000018303 .total_size = 256,
18304 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018305 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100018306 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018307 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000018308 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018309 .block_erasers =
18310 {
18311 {
18312 .eraseblocks = { {256 * 1024, 1} },
18313 .block_erase = erase_chip_block_jedec,
18314 }
18315 },
hailfinger286829b2009-01-08 03:40:17 +000018316 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000018317 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018318 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000018319 },
18320
hailfinger286829b2009-01-08 03:40:17 +000018321 {
18322 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000018323 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000018324 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000018325 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018326 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000018327 .total_size = 512,
18328 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000018329 .feature_bits = FEATURE_LONG_RESET,
18330 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000018331 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060018332 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018333 .block_erasers =
18334 {
18335 {
18336 .eraseblocks = { {512 * 1024, 1} },
18337 .block_erase = erase_chip_block_jedec,
18338 }
18339 },
hailfinger286829b2009-01-08 03:40:17 +000018340 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000018341 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018342 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000018343 },
18344
hailfinger286829b2009-01-08 03:40:17 +000018345 {
18346 .vendor = "Winbond",
Nikolai Artemieva71a7242020-08-31 17:53:09 +100018347 .name = "W29C512A/W29EE512",
18348 .bustype = BUS_PARALLEL,
18349 .manufacture_id = WINBOND_ID,
18350 .model_id = WINBOND_W29C512A,
18351 .total_size = 64,
18352 .page_size = 128,
18353 .feature_bits = FEATURE_LONG_RESET,
18354 .tested = TEST_OK_PREW,
18355 .probe = probe_jedec,
18356 .probe_timing = 10,
18357 .block_erasers =
18358 {
18359 {
18360 .eraseblocks = { {64 * 1024, 1} },
18361 .block_erase = erase_chip_block_jedec,
18362 }
18363 },
18364 .write = write_jedec,
18365 .read = read_memmapped,
18366 .voltage = {4500, 5500},
18367 },
18368
18369 {
18370 .vendor = "Winbond",
18371 .name = "W29GL032CB",
18372 .bustype = BUS_PARALLEL,
18373 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18374 .model_id = WINBOND_W29GL032CB,
18375 .total_size = 4096,
18376 .page_size = 128 * 1024, /* actual page size is 16 */
18377 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18378 .tested = TEST_UNTESTED,
18379 .probe = probe_jedec_29gl,
18380 .probe_timing = TIMING_ZERO,
18381 .block_erasers =
18382 {
18383 {
18384 .eraseblocks = {
18385 {8 * 1024, 8},
18386 {64 * 1024, 63},
18387 },
18388 .block_erase = erase_sector_jedec,
18389 }, {
18390 .eraseblocks = { {4 * 1024 * 1024, 1} },
18391 .block_erase = erase_chip_block_jedec,
18392 },
18393 },
18394 .write = write_jedec_1,
18395 .read = read_memmapped,
18396 .voltage = {2700, 3600},
18397 },
18398
18399 {
18400 .vendor = "Winbond",
18401 .name = "W29GL032CH/L",
18402 .bustype = BUS_PARALLEL,
18403 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18404 .model_id = WINBOND_W29GL032CHL,
18405 .total_size = 4096,
18406 .page_size = 128 * 1024, /* actual page size is 16 */
18407 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18408 .tested = TEST_UNTESTED,
18409 .probe = probe_jedec_29gl,
18410 .probe_timing = TIMING_ZERO,
18411 .block_erasers =
18412 {
18413 {
18414 .eraseblocks = { {64 * 1024, 64} },
18415 .block_erase = erase_sector_jedec,
18416 }, {
18417 .eraseblocks = { {4 * 1024 * 1024, 1} },
18418 .block_erase = erase_chip_block_jedec,
18419 },
18420 },
18421 .write = write_jedec_1,
18422 .read = read_memmapped,
18423 .voltage = {2700, 3600},
18424 },
18425
18426 {
18427 .vendor = "Winbond",
Nikolai Artemievbac3d6b2020-08-31 18:03:54 +100018428 .name = "W29GL032CT",
18429 .bustype = BUS_PARALLEL,
18430 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18431 .model_id = WINBOND_W29GL032CT,
18432 .total_size = 4096,
18433 .page_size = 128 * 1024, /* actual page size is 16 */
18434 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18435 .tested = TEST_UNTESTED,
18436 .probe = probe_jedec_29gl,
18437 .probe_timing = TIMING_ZERO,
18438 .block_erasers =
18439 {
18440 {
18441 .eraseblocks = {
18442 {64 * 1024, 63},
18443 {8 * 1024, 8},
18444 },
18445 .block_erase = erase_sector_jedec,
18446 }, {
18447 .eraseblocks = { {4 * 1024 * 1024, 1} },
18448 .block_erase = erase_chip_block_jedec,
18449 },
18450 },
18451 .write = write_jedec_1,
18452 .read = read_memmapped,
18453 .voltage = {2700, 3600},
18454 },
18455
18456 {
18457 .vendor = "Winbond",
18458 .name = "W29GL064CB",
18459 .bustype = BUS_PARALLEL,
18460 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18461 .model_id = WINBOND_W29GL064CB,
18462 .total_size = 8192,
18463 .page_size = 128 * 1024, /* actual page size is 16 */
18464 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18465 .tested = TEST_UNTESTED,
18466 .probe = probe_jedec_29gl,
18467 .probe_timing = TIMING_ZERO,
18468 .block_erasers =
18469 {
18470 {
18471 .eraseblocks = {
18472 {8 * 1024, 8},
18473 {64 * 1024, 127},
18474 },
18475 .block_erase = erase_sector_jedec,
18476 }, {
18477 .eraseblocks = { {8 * 1024 * 1024, 1} },
18478 .block_erase = erase_chip_block_jedec,
18479 },
18480 },
18481 .write = write_jedec_1,
18482 .read = read_memmapped,
18483 .voltage = {2700, 3600},
18484 },
18485
18486 {
18487 .vendor = "Winbond",
18488 .name = "W29GL064CH/L",
18489 .bustype = BUS_PARALLEL,
18490 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18491 .model_id = WINBOND_W29GL064CHL,
18492 .total_size = 8192,
18493 .page_size = 128 * 1024, /* actual page size is 16 */
18494 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18495 .tested = TEST_UNTESTED,
18496 .probe = probe_jedec_29gl,
18497 .probe_timing = TIMING_ZERO,
18498 .block_erasers =
18499 {
18500 {
18501 .eraseblocks = { {64 * 1024, 128} },
18502 .block_erase = erase_sector_jedec,
18503 }, {
18504 .eraseblocks = { {8 * 1024 * 1024, 1} },
18505 .block_erase = erase_chip_block_jedec,
18506 },
18507 },
18508 .write = write_jedec_1,
18509 .read = read_memmapped,
18510 .voltage = {2700, 3600},
18511 },
18512
18513 {
18514 .vendor = "Winbond",
18515 .name = "W29GL064CT",
18516 .bustype = BUS_PARALLEL,
18517 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18518 .model_id = WINBOND_W29GL064CT,
18519 .total_size = 8192,
18520 .page_size = 128 * 1024, /* actual page size is 16 */
18521 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18522 .tested = TEST_UNTESTED,
18523 .probe = probe_jedec_29gl,
18524 .probe_timing = TIMING_ZERO,
18525 .block_erasers =
18526 {
18527 {
18528 .eraseblocks = {
18529 {64 * 1024, 127},
18530 {8 * 1024, 8},
18531 },
18532 .block_erase = erase_sector_jedec,
18533 }, {
18534 .eraseblocks = { {8 * 1024 * 1024, 1} },
18535 .block_erase = erase_chip_block_jedec,
18536 },
18537 },
18538 .write = write_jedec_1,
18539 .read = read_memmapped,
18540 .voltage = {2700, 3600},
18541 },
18542
18543 {
18544 .vendor = "Winbond",
18545 .name = "W29GL128C",
18546 .bustype = BUS_PARALLEL,
18547 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
18548 .model_id = WINBOND_W29GL128CHL,
18549 .total_size = 16384,
18550 .page_size = 128 * 1024, /* actual page size is 16 */
18551 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
18552 .tested = TEST_UNTESTED,
18553 .probe = probe_jedec_29gl,
18554 .probe_timing = TIMING_ZERO,
18555 .block_erasers =
18556 {
18557 {
18558 .eraseblocks = { {128 * 1024, 128} },
18559 .block_erase = erase_sector_jedec,
18560 }, {
18561 .eraseblocks = { {16 * 1024 * 1024, 1} },
18562 .block_erase = erase_chip_block_jedec,
18563 },
18564 },
18565 .write = write_jedec_1,
18566 .read = read_memmapped,
18567 .voltage = {2700, 3600},
18568 },
18569
18570 {
18571 .vendor = "Winbond",
18572 .name = "W39F010",
18573 .bustype = BUS_PARALLEL,
18574 .manufacture_id = WINBOND_ID,
18575 .model_id = WINBOND_W39F010,
18576 .total_size = 128,
18577 .page_size = 4 * 1024,
18578 .feature_bits = FEATURE_EITHER_RESET,
18579 .tested = TEST_OK_PREW,
18580 .probe = probe_jedec,
18581 .probe_timing = 10,
18582 .block_erasers =
18583 {
18584 {
18585 .eraseblocks = { {4 * 1024, 32} },
18586 .block_erase = erase_block_jedec,
18587 }, {
18588 .eraseblocks = { {128 * 1024, 1} },
18589 .block_erase = erase_chip_block_jedec,
18590 }
18591 },
18592 .printlock = printlock_w39f010,
18593 .write = write_jedec_1,
18594 .read = read_memmapped,
18595 .voltage = {4500, 5500},
18596 },
18597
18598 {
18599 .vendor = "Winbond",
18600 .name = "W39L010",
18601 .bustype = BUS_PARALLEL,
18602 .manufacture_id = WINBOND_ID,
18603 .model_id = WINBOND_W39L010,
18604 .total_size = 128,
18605 .page_size = 4 * 1024,
18606 .feature_bits = FEATURE_EITHER_RESET,
18607 .tested = TEST_UNTESTED,
18608 .probe = probe_jedec,
18609 .probe_timing = 10,
18610 .block_erasers =
18611 {
18612 {
18613 .eraseblocks = { {4 * 1024, 32} },
18614 .block_erase = erase_block_jedec,
18615 }, {
18616 .eraseblocks = { {128 * 1024, 1} },
18617 .block_erase = erase_chip_block_jedec,
18618 }
18619 },
18620 .printlock = printlock_w39l010,
18621 .write = write_jedec_1,
18622 .read = read_memmapped,
18623 .voltage = {3000, 3600},
18624 },
18625
18626 {
18627 .vendor = "Winbond",
18628 .name = "W39L020",
18629 .bustype = BUS_PARALLEL,
18630 .manufacture_id = WINBOND_ID,
18631 .model_id = WINBOND_W39L020,
18632 .total_size = 256,
18633 .page_size = 4 * 1024,
18634 .feature_bits = FEATURE_EITHER_RESET,
18635 .tested = TEST_UNTESTED,
18636 .probe = probe_jedec,
18637 .probe_timing = 10,
18638 .block_erasers =
18639 {
18640 {
18641 .eraseblocks = { {4 * 1024, 64} },
18642 .block_erase = erase_block_jedec,
18643 }, {
18644 .eraseblocks = { {64 * 1024, 4} },
18645 .block_erase = erase_sector_jedec,
18646 }, {
18647 .eraseblocks = { {256 * 1024, 1} },
18648 .block_erase = erase_chip_block_jedec,
18649 }
18650 },
18651 .printlock = printlock_w39l020,
18652 .write = write_jedec_1,
18653 .read = read_memmapped,
18654 .voltage = {3000, 3600},
18655 },
18656
18657 {
18658 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000018659 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000018660 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000018661 .manufacture_id = WINBOND_ID,
18662 .model_id = WINBOND_W39L040,
18663 .total_size = 512,
18664 .page_size = 64 * 1024,
18665 .feature_bits = FEATURE_EITHER_RESET,
18666 .tested = TEST_OK_PR,
18667 .probe = probe_jedec,
18668 .probe_timing = 10,
18669 .block_erasers =
18670 {
18671 {
18672 .eraseblocks = { {4 * 1024, 128} },
18673 .block_erase = erase_block_jedec,
18674 }, {
18675 .eraseblocks = { {64 * 1024, 8} },
18676 .block_erase = erase_sector_jedec,
18677 }, {
18678 .eraseblocks = { {512 * 1024, 1} },
18679 .block_erase = erase_chip_block_jedec,
18680 }
18681 },
18682 .printlock = printlock_w39l040,
18683 .write = write_jedec_1,
18684 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000018685 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000018686 },
18687
18688 {
18689 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000018690 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000018691 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018692 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018693 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000018694 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018695 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018696 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000018697 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018698 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000018699 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018700 .block_erasers =
18701 {
18702 {
18703 .eraseblocks = { {64 * 1024, 8} },
18704 .block_erase = erase_sector_jedec,
18705 }, {
18706 .eraseblocks = { {512 * 1024, 1} },
18707 .block_erase = erase_chip_block_jedec,
18708 }
18709 },
hailfingerf8993012010-12-05 16:33:59 +000018710 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000018711 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018712 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018713 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018714 },
18715
hailfinger286829b2009-01-08 03:40:17 +000018716 {
18717 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018718 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000018719 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018720 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018721 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000018722 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018723 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018724 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000018725 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018726 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000018727 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018728 .block_erasers =
18729 {
18730 {
18731 .eraseblocks = { {64 * 1024, 8} },
18732 .block_erase = erase_sector_jedec,
18733 }, {
18734 .eraseblocks = { {512 * 1024, 1} },
18735 .block_erase = erase_chip_block_jedec,
18736 }
18737 },
hailfingerf8993012010-12-05 16:33:59 +000018738 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000018739 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018740 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018741 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018742 },
18743
hailfinger286829b2009-01-08 03:40:17 +000018744 {
18745 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018746 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000018747 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018748 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018749 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000018750 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018751 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018752 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000018753 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000018754 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000018755 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018756 .block_erasers =
18757 {
18758 {
18759 .eraseblocks = { {64 * 1024, 8} },
18760 .block_erase = erase_sector_jedec,
18761 }, {
18762 .eraseblocks = { {512 * 1024, 1} },
18763 .block_erase = erase_chip_block_jedec,
18764 }
18765 },
snelson1ee293c2010-02-19 00:52:10 +000018766 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000018767 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018768 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018769 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018770 },
18771
hailfinger286829b2009-01-08 03:40:17 +000018772 {
18773 .vendor = "Winbond",
18774 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000018775 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000018776 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018777 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000018778 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018779 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000018780 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Nikolai Artemiev46dd5982021-01-28 16:27:02 +110018781 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018782 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000018783 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018784 .block_erasers =
18785 {
18786 {
18787 .eraseblocks = { {4 * 1024, 128} },
18788 .block_erase = erase_block_jedec,
18789 }, {
18790 .eraseblocks = { {64 * 1024, 8} },
18791 .block_erase = erase_sector_jedec,
18792 }, {
18793 .eraseblocks = { {512 * 1024, 1} },
18794 .block_erase = erase_chip_block_jedec,
18795 }
18796 },
hailfingerf8993012010-12-05 16:33:59 +000018797 .printlock = printlock_w39v040fa,
Nikolai Artemieva31a3c82021-01-20 15:47:33 +110018798 .unlock = unlock_regspace2_uniform_64k,
snelsonc6855342010-01-28 23:55:12 +000018799 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018800 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018801 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018802 },
18803
hailfinger286829b2009-01-08 03:40:17 +000018804 {
18805 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018806 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000018807 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000018808 .manufacture_id = WINBOND_ID,
18809 .model_id = WINBOND_W39V040B,
18810 .total_size = 512,
18811 .page_size = 64 * 1024,
18812 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000018813 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000018814 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060018815 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000018816 .block_erasers =
18817 {
18818 {
18819 .eraseblocks = { {64 * 1024, 8} },
18820 .block_erase = erase_sector_jedec,
18821 }, {
18822 .eraseblocks = { {512 * 1024, 1} },
18823 .block_erase = erase_chip_block_jedec,
18824 }
18825 },
18826 .printlock = printlock_w39v040fb,
Edward O'Callaghan868b2b02020-11-28 13:43:44 +110018827 .unlock = unlock_regspace2_uniform_64k,
hailfingerf8993012010-12-05 16:33:59 +000018828 .write = write_jedec_1,
18829 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000018830 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000018831 },
18832
18833 {
18834 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080018835 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000018836 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080018837 .manufacture_id = WINBOND_ID,
18838 .model_id = WINBOND_W39V040C,
18839 .total_size = 512,
18840 .page_size = 64 * 1024,
18841 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100018842 .tested = TEST_OK_PREW,
18843 .probe = probe_jedec,
18844 .probe_timing = 10,
18845 .block_erasers =
18846 {
18847 {
18848 .eraseblocks = { {64 * 1024, 8} },
18849 .block_erase = erase_sector_jedec,
18850 }, {
18851 .eraseblocks = { {512 * 1024, 1} },
18852 .block_erase = erase_chip_block_jedec,
18853 }
18854 },
18855 .printlock = printlock_w39v040fc,
18856 .write = write_jedec_1,
18857 .read = read_memmapped,
18858 .voltage = {3000, 3600}, /* Also has 12V fast program */
18859 },
18860
18861 {
18862 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000018863 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000018864 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018865 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018866 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000018867 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000018868 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018869 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070018870 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018871 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060018872 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018873 .block_erasers =
18874 {
18875 {
18876 .eraseblocks = { {64 * 1024, 16} },
18877 .block_erase = erase_sector_jedec,
18878 }, {
18879 .eraseblocks = { {1024 * 1024, 1} },
18880 .block_erase = erase_chip_block_jedec,
18881 }
18882 },
hailfingerf8993012010-12-05 16:33:59 +000018883 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000018884 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018885 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018886 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018887 },
18888
hailfinger286829b2009-01-08 03:40:17 +000018889 {
18890 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018891 .name = "W39V080FA",
18892 .bustype = BUS_FWH,
18893 .manufacture_id = WINBOND_ID,
18894 .model_id = WINBOND_W39V080FA,
18895 .total_size = 1024,
18896 .page_size = 64 * 1024,
18897 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18898 .tested = TEST_OK_PREW,
18899 .probe = probe_jedec,
18900 .probe_timing = 10,
18901 .block_erasers =
18902 {
18903 {
Alan Green0d97b472019-07-26 10:33:25 +100018904 .eraseblocks = { {64 * 1024, 16} },
Alan Greend76dc1f2019-06-26 15:38:19 +100018905 .block_erase = erase_sector_jedec,
18906 }, {
18907 .eraseblocks = { {1024 * 1024, 1} },
18908 .block_erase = erase_chip_block_jedec,
18909 }
18910 },
18911 .printlock = printlock_w39v080fa,
Edward O'Callaghan868b2b02020-11-28 13:43:44 +110018912 .unlock = unlock_regspace2_uniform_64k,
Alan Greend76dc1f2019-06-26 15:38:19 +100018913 .write = write_jedec_1,
18914 .read = read_memmapped,
18915 .voltage = {3000, 3600}, /* Also has 12V fast program */
18916 },
18917
18918 {
18919 .vendor = "Winbond",
18920 .name = "W39V080FA (dual mode)",
18921 .bustype = BUS_FWH,
18922 .manufacture_id = WINBOND_ID,
18923 .model_id = WINBOND_W39V080FA_DM,
18924 .total_size = 512,
18925 .page_size = 64 * 1024,
18926 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18927 .tested = TEST_UNTESTED,
18928 .probe = probe_jedec,
18929 .probe_timing = 10,
18930 .block_erasers =
18931 {
18932 {
Alan Green0d97b472019-07-26 10:33:25 +100018933 .eraseblocks = { {64 * 1024, 8} },
Alan Greend76dc1f2019-06-26 15:38:19 +100018934 .block_erase = erase_sector_jedec,
18935 }, {
18936 .eraseblocks = { {512 * 1024, 1} },
18937 .block_erase = erase_chip_block_jedec,
18938 }
18939 },
18940 .printlock = printlock_w39v080fa_dual,
18941 .write = write_jedec_1,
18942 .read = read_memmapped,
18943 .voltage = {3000, 3600}, /* Also has 12V fast program */
18944 },
18945
18946 {
18947 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000018948 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000018949 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000018950 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018951 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000018952 .total_size = 256,
18953 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018954 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000018955 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018956 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000018957 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018958 .block_erasers =
18959 {
18960 {
18961 .eraseblocks = {
18962 {128 * 1024, 1},
18963 {96 * 1024, 1},
18964 {8 * 1024, 2},
18965 {16 * 1024, 1},
18966 },
18967 .block_erase = erase_sector_jedec,
18968 }, {
18969 .eraseblocks = { {256 * 1024, 1} },
18970 .block_erase = erase_chip_block_jedec,
18971 }
18972 },
snelsonc6855342010-01-28 23:55:12 +000018973 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018974 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018975 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000018976 },
18977
hailfinger286829b2009-01-08 03:40:17 +000018978 {
18979 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000018980 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000018981 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000018982 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018983 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000018984 .total_size = 256,
18985 .page_size = 128,
18986 .feature_bits = FEATURE_EITHER_RESET,
18987 .tested = TEST_OK_PROBE,
18988 .probe = probe_jedec,
18989 .probe_timing = 10,
18990 .block_erasers =
18991 {
18992 {
18993 .eraseblocks = { {256 * 1024, 1} },
18994 .block_erase = erase_chip_block_jedec,
18995 }
18996 },
18997 .write = write_jedec_1,
18998 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018999 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000019000 },
19001
19002 {
19003 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000019004 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000019005 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000019006 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000019007 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000019008 .total_size = 256,
19009 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000019010 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100019011 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019012 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000019013 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000019014 .block_erasers =
19015 {
19016 {
19017 .eraseblocks = {
19018 {64 * 1024, 3},
19019 {32 * 1024, 1},
19020 {8 * 1024, 2},
19021 {16 * 1024, 1},
19022 },
19023 .block_erase = erase_sector_jedec,
19024 }, {
19025 .eraseblocks = { {256 * 1024, 1} },
19026 .block_erase = erase_chip_block_jedec,
19027 }
19028 },
snelsonc6855342010-01-28 23:55:12 +000019029 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000019030 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000019031 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000019032 },
19033
hailfinger286829b2009-01-08 03:40:17 +000019034 {
19035 .vendor = "Winbond",
19036 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000019037 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000019038 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000019039 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000019040 .total_size = 256,
19041 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000019042 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100019043 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019044 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000019045 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000019046 .block_erasers =
19047 {
19048 {
19049 .eraseblocks = {
19050 {64 * 1024, 3},
19051 {32 * 1024, 1},
19052 {8 * 1024, 2},
19053 {16 * 1024, 1},
19054 },
19055 .block_erase = erase_sector_jedec,
19056 }, {
19057 .eraseblocks = { {256 * 1024, 1} },
19058 .block_erase = erase_chip_block_jedec,
19059 }
19060 },
snelsonc6855342010-01-28 23:55:12 +000019061 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000019062 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000019063 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000019064 },
19065
hailfinger286829b2009-01-08 03:40:17 +000019066 {
luke he4bb484f2020-12-28 18:22:21 +080019067 .vendor = "XMC",
19068 .name = "XM25QH64C",
19069 .bustype = BUS_SPI,
19070 .manufacture_id = ST_ID,
19071 .model_id = XMC_XM25QH64C,
19072 .total_size = 8192,
19073 .page_size = 256,
19074 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19075 .tested = TEST_UNTESTED,
19076 .probe = probe_spi_rdid,
19077 .probe_timing = TIMING_ZERO,
19078 .block_erasers =
19079 {
19080 {
19081 .eraseblocks = { {4 * 1024, 2048} },
19082 .block_erase = spi_block_erase_20,
19083 }, {
19084 .eraseblocks = { {32 * 1024, 256} },
19085 .block_erase = spi_block_erase_52,
19086 }, {
19087 .eraseblocks = { {64 * 1024, 128} },
19088 .block_erase = spi_block_erase_d8,
19089 }, {
19090 .eraseblocks = { {8 * 1024 * 1024, 1} },
19091 .block_erase = spi_block_erase_60,
19092 }, {
19093 .eraseblocks = { {8 * 1024 * 1024, 1} },
19094 .block_erase = spi_block_erase_c7,
19095 }
19096 },
19097 .printlock = spi_prettyprint_status_register_plain,
19098 .unlock = spi_disable_blockprotect,
19099 .write = spi_chip_write_256,
19100 .read = spi_chip_read,
19101 .voltage = {2700, 3600},
19102 },
19103
19104 {
19105 .vendor = "XMC",
19106 .name = "XM25QU64C",
19107 .bustype = BUS_SPI,
19108 .manufacture_id = ST_ID,
19109 .model_id = XMC_XM25QU64C,
19110 .total_size = 8192,
19111 .page_size = 256,
19112 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19113 .tested = TEST_UNTESTED,
19114 .probe = probe_spi_rdid,
19115 .probe_timing = TIMING_ZERO,
19116 .block_erasers =
19117 {
19118 {
19119 .eraseblocks = { {4 * 1024, 2048} },
19120 .block_erase = spi_block_erase_20,
19121 }, {
19122 .eraseblocks = { {32 * 1024, 256} },
19123 .block_erase = spi_block_erase_52,
19124 }, {
19125 .eraseblocks = { {64 * 1024, 128} },
19126 .block_erase = spi_block_erase_d8,
19127 }, {
19128 .eraseblocks = { {8 * 1024 * 1024, 1} },
19129 .block_erase = spi_block_erase_60,
19130 }, {
19131 .eraseblocks = { {8 * 1024 * 1024, 1} },
19132 .block_erase = spi_block_erase_c7,
19133 }
19134 },
19135 .printlock = spi_prettyprint_status_register_plain,
19136 .unlock = spi_disable_blockprotect,
19137 .write = spi_chip_write_256,
19138 .read = spi_chip_read,
19139 .voltage = {1650, 1950},
19140 },
19141
19142 {
19143 .vendor = "XMC",
19144 .name = "XM25QH128C",
19145 .bustype = BUS_SPI,
19146 .manufacture_id = ST_ID,
19147 .model_id = XMC_XM25QH128C,
19148 .total_size = 16384,
19149 .page_size = 256,
19150 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19151 .tested = TEST_UNTESTED,
19152 .probe = probe_spi_rdid,
19153 .probe_timing = TIMING_ZERO,
19154 .block_erasers =
19155 {
19156 {
19157 .eraseblocks = { {4 * 1024, 4096} },
19158 .block_erase = spi_block_erase_20,
19159 }, {
19160 .eraseblocks = { {32 * 1024, 512} },
19161 .block_erase = spi_block_erase_52,
19162 }, {
19163 .eraseblocks = { {64 * 1024, 256} },
19164 .block_erase = spi_block_erase_d8,
19165 }, {
19166 .eraseblocks = { {16 * 1024 * 1024, 1} },
19167 .block_erase = spi_block_erase_60,
19168 }, {
19169 .eraseblocks = { {16 * 1024 * 1024, 1} },
19170 .block_erase = spi_block_erase_c7,
19171 }
19172 },
19173 .printlock = spi_prettyprint_status_register_plain,
19174 .unlock = spi_disable_blockprotect,
19175 .write = spi_chip_write_256,
19176 .read = spi_chip_read,
19177 .voltage = {2700, 3600},
19178 },
19179
19180 {
19181 .vendor = "XMC",
19182 .name = "XM25QU128C",
19183 .bustype = BUS_SPI,
19184 .manufacture_id = ST_ID,
19185 .model_id = XMC_XM25QU128C,
19186 .total_size = 16384,
19187 .page_size = 256,
19188 /* supports SFDP */
19189 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19190 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
19191 .tested = TEST_UNTESTED,
19192 .probe = probe_spi_rdid,
19193 .probe_timing = TIMING_ZERO,
19194 .block_erasers =
19195 {
19196 {
19197 .eraseblocks = { {4 * 1024, 4096} },
19198 .block_erase = spi_block_erase_20,
19199 }, {
19200 .eraseblocks = { {32 * 1024, 512} },
19201 .block_erase = spi_block_erase_52,
19202 }, {
19203 .eraseblocks = { {64 * 1024, 256} },
19204 .block_erase = spi_block_erase_d8,
19205 }, {
19206 .eraseblocks = { {16 * 1024 * 1024, 1} },
19207 .block_erase = spi_block_erase_60,
19208 }, {
19209 .eraseblocks = { {16 * 1024 * 1024, 1} },
19210 .block_erase = spi_block_erase_c7,
19211 }
19212 },
19213 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19214 .unlock = spi_disable_blockprotect,
19215 .write = spi_chip_write_256,
19216 .read = spi_chip_read,
19217 .voltage = {1650, 1950},
19218 },
19219
19220 {
19221 .vendor = "XMC",
19222 .name = "XM25QH256C",
19223 .bustype = BUS_SPI,
19224 .manufacture_id = ST_ID,
19225 .model_id = XMC_XM25QH256C,
19226 .total_size = 32768,
19227 .page_size = 256,
19228 /* supports SFDP */
19229 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19230 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
19231 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
19232 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
19233 .tested = TEST_UNTESTED,
19234 .probe = probe_spi_rdid,
19235 .probe_timing = TIMING_ZERO,
19236 .block_erasers =
19237 {
19238 {
19239 .eraseblocks = { {4 * 1024, 8192} },
19240 .block_erase = spi_block_erase_20,
19241 }, {
19242 .eraseblocks = { {32 * 1024, 1024} },
19243 .block_erase = spi_block_erase_52,
19244 }, {
19245 .eraseblocks = { {64 * 1024, 512} },
19246 .block_erase = spi_block_erase_d8,
19247 }, {
19248 .eraseblocks = { {32 * 1024 * 1024, 1} },
19249 .block_erase = spi_block_erase_60,
19250 }, {
19251 .eraseblocks = { {32 * 1024 * 1024, 1} },
19252 .block_erase = spi_block_erase_c7,
19253 }
19254 },
19255 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19256 .unlock = spi_disable_blockprotect,
19257 .write = spi_chip_write_256,
19258 .read = spi_chip_read,
19259 .voltage = {2700, 3600},
19260 },
19261
19262 {
19263 .vendor = "XMC",
19264 .name = "XM25QU256C",
19265 .bustype = BUS_SPI,
19266 .manufacture_id = ST_ID,
19267 .model_id = XMC_XM25QU256C,
19268 .total_size = 32768,
19269 .page_size = 256,
19270 /* supports SFDP */
19271 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19272 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
19273 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_ENTER_WREN
19274 | FEATURE_4BA_EXT_ADDR | FEATURE_4BA_READ | FEATURE_4BA_FAST_READ,
19275 .tested = TEST_UNTESTED,
19276 .probe = probe_spi_rdid,
19277 .probe_timing = TIMING_ZERO,
19278 .block_erasers =
19279 {
19280 {
19281 .eraseblocks = { {4 * 1024, 8192} },
19282 .block_erase = spi_block_erase_20,
19283 }, {
19284 .eraseblocks = { {32 * 1024, 1024} },
19285 .block_erase = spi_block_erase_52,
19286 }, {
19287 .eraseblocks = { {64 * 1024, 512} },
19288 .block_erase = spi_block_erase_d8,
19289 }, {
19290 .eraseblocks = { {32 * 1024 * 1024, 1} },
19291 .block_erase = spi_block_erase_60,
19292 }, {
19293 .eraseblocks = { {32 * 1024 * 1024, 1} },
19294 .block_erase = spi_block_erase_c7,
19295 }
19296 },
19297 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19298 .unlock = spi_disable_blockprotect,
19299 .write = spi_chip_write_256,
19300 .read = spi_chip_read,
19301 .voltage = {1650, 1950},
19302 },
19303
19304 {
Nikolai Artemievbac3d6b2020-08-31 18:03:54 +100019305 .vendor = "Zetta Device",
19306 .name = "ZD25D20",
19307 .bustype = BUS_SPI,
19308 .manufacture_id = ZETTADEVICE_ID,
19309 .model_id = ZETTADEVICE_ZD25D20,
19310 .total_size = 256,
19311 .page_size = 256,
19312 .feature_bits = FEATURE_WRSR_WREN,
19313 .tested = TEST_UNTESTED,
19314 .probe = probe_spi_rdid,
19315 .probe_timing = TIMING_ZERO,
19316 .block_erasers =
19317 {
19318 {
19319 .eraseblocks = { {4 * 1024, 64} },
19320 .block_erase = spi_block_erase_20,
19321 }, {
19322 .eraseblocks = { {32 * 1024, 8} },
19323 .block_erase = spi_block_erase_52,
19324 }, {
19325 .eraseblocks = { {64 * 1024, 4} },
19326 .block_erase = spi_block_erase_d8,
19327 }, {
19328 .eraseblocks = { {256 * 1024, 1} },
19329 .block_erase = spi_block_erase_60,
19330 }, {
19331 .eraseblocks = { {256 * 1024, 1} },
19332 .block_erase = spi_block_erase_c7,
19333 }
19334 },
19335 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19336 .unlock = spi_disable_blockprotect,
19337 .write = spi_chip_write_256,
19338 .read = spi_chip_read,
19339 .voltage = {2700, 3600},
19340 },
19341
19342 {
19343 .vendor = "Zetta Device",
19344 .name = "ZD25D40",
19345 .bustype = BUS_SPI,
19346 .manufacture_id = ZETTADEVICE_ID,
19347 .model_id = ZETTADEVICE_ZD25D40,
19348 .total_size = 512,
19349 .page_size = 256,
19350 .feature_bits = FEATURE_WRSR_WREN,
19351 .tested = TEST_UNTESTED,
19352 .probe = probe_spi_rdid,
19353 .probe_timing = TIMING_ZERO,
19354 .block_erasers =
19355 {
19356 {
19357 .eraseblocks = { {4 * 1024, 128} },
19358 .block_erase = spi_block_erase_20,
19359 }, {
19360 .eraseblocks = { {32 * 1024, 16} },
19361 .block_erase = spi_block_erase_52,
19362 }, {
19363 .eraseblocks = { {64 * 1024, 8} },
19364 .block_erase = spi_block_erase_d8,
19365 }, {
19366 .eraseblocks = { {512 * 1024, 1} },
19367 .block_erase = spi_block_erase_60,
19368 }, {
19369 .eraseblocks = { {512 * 1024, 1} },
19370 .block_erase = spi_block_erase_c7,
19371 }
19372 },
19373 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19374 .unlock = spi_disable_blockprotect,
19375 .write = spi_chip_write_256,
19376 .read = spi_chip_read,
19377 .voltage = {2700, 3600},
19378 },
19379
19380 {
Edward O'Callaghaneb022ec2020-09-24 22:39:00 +100019381 .vendor = "Unknown",
19382 .name = "SFDP-capable chip",
19383 .bustype = BUS_SPI,
19384 .manufacture_id = GENERIC_MANUF_ID,
19385 .model_id = SFDP_DEVICE_ID,
19386 .total_size = 0, /* set by probing function */
19387 .page_size = 0, /* set by probing function */
19388 .feature_bits = 0, /* set by probing function */
19389 /* We present our own "report this" text hence we do not */
19390 /* want the default "This flash part has status UNTESTED..." */
19391 /* text to be printed. */
19392 .tested = TEST_OK_PREW,
19393 .probe = probe_spi_sfdp,
19394 .block_erasers = {}, /* set by probing function */
19395 .unlock = spi_disable_blockprotect, /* is this safe? */
19396 .write = NULL, /* set by probing function */
19397 .read = spi_chip_read,
19398 /* FIXME: some vendor extensions define this */
19399 .voltage = {0},
19400 },
19401
19402 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000019403 .vendor = "Programmer",
19404 .name = "Opaque flash chip",
19405 .bustype = BUS_PROG,
19406 .manufacture_id = PROGMANUF_ID,
19407 .model_id = PROGDEV_ID,
19408 .total_size = 0,
19409 .page_size = 256,
19410 /* probe is assumed to work, rest will be filled in by probe */
19411 .tested = TEST_OK_PROBE,
19412 .probe = probe_opaque,
19413 /* eraseblock sizes will be set by the probing function */
19414 .block_erasers =
19415 {
19416 {
19417 .block_erase = erase_opaque,
19418 }
19419 },
19420 .write = write_opaque,
19421 .read = read_opaque,
19422 },
19423
19424 {
hailfinger867df6b2010-07-22 11:44:38 +000019425 .vendor = "AMIC",
19426 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019427 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000019428 .manufacture_id = AMIC_ID,
19429 .model_id = GENERIC_DEVICE_ID,
19430 .total_size = 0,
19431 .page_size = 256,
19432 .tested = TEST_BAD_PREW,
19433 .probe = probe_spi_rdid4,
19434 .probe_timing = TIMING_ZERO,
19435 .write = NULL,
19436 .read = NULL,
19437 },
19438
19439 {
hailfinger286829b2009-01-08 03:40:17 +000019440 .vendor = "Atmel",
19441 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019442 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000019443 .manufacture_id = ATMEL_ID,
19444 .model_id = GENERIC_DEVICE_ID,
19445 .total_size = 0,
19446 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019447 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019448 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019449 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019450 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019451 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019452 },
19453
hailfinger286829b2009-01-08 03:40:17 +000019454 {
hailfinger61958912010-07-28 22:20:20 +000019455 .vendor = "Eon",
19456 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019457 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000019458 .manufacture_id = EON_ID_NOPREFIX,
19459 .model_id = GENERIC_DEVICE_ID,
19460 .total_size = 0,
19461 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019462 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019463 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019464 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019465 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019466 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019467 },
19468
hailfinger286829b2009-01-08 03:40:17 +000019469 {
19470 .vendor = "Macronix",
19471 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019472 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000019473 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000019474 .model_id = GENERIC_DEVICE_ID,
19475 .total_size = 0,
19476 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019477 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019478 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019479 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019480 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019481 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019482 },
19483
hailfinger286829b2009-01-08 03:40:17 +000019484 {
19485 .vendor = "PMC",
19486 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019487 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000019488 .manufacture_id = PMC_ID,
19489 .model_id = GENERIC_DEVICE_ID,
19490 .total_size = 0,
19491 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019492 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019493 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019494 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019495 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019496 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019497 },
19498
hailfinger286829b2009-01-08 03:40:17 +000019499 {
19500 .vendor = "SST",
19501 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019502 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000019503 .manufacture_id = SST_ID,
19504 .model_id = GENERIC_DEVICE_ID,
19505 .total_size = 0,
19506 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019507 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019508 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019509 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019510 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019511 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019512 },
19513
hailfinger286829b2009-01-08 03:40:17 +000019514 {
19515 .vendor = "ST",
19516 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019517 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000019518 .manufacture_id = ST_ID,
19519 .model_id = GENERIC_DEVICE_ID,
19520 .total_size = 0,
19521 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000019522 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000019523 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000019524 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000019525 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000019526 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000019527 },
uwec93fbdb2008-03-16 02:06:25 +000019528
hailfinger63165602009-11-20 01:12:45 +000019529 {
hailfinger201f62f2009-11-24 02:08:11 +000019530 .vendor = "Sanyo",
19531 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019532 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000019533 .manufacture_id = SANYO_ID,
19534 .model_id = GENERIC_DEVICE_ID,
19535 .total_size = 0,
19536 .page_size = 256,
19537 .tested = TEST_BAD_PREW,
19538 .probe = probe_spi_rdid,
19539 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000019540 .write = NULL,
19541 .read = NULL,
19542 },
19543
19544 {
Nikolai Artemievdd640d32021-04-01 14:49:46 +110019545 .vendor = "Winbond",
19546 .name = "unknown Winbond (ex Nexcom) SPI chip",
19547 .bustype = BUS_SPI,
19548 .manufacture_id = WINBOND_NEX_ID,
19549 .model_id = GENERIC_DEVICE_ID,
19550 .total_size = 0,
19551 .page_size = 256,
19552 .tested = TEST_BAD_PREW,
19553 .probe = probe_spi_rdid,
19554 .probe_timing = TIMING_ZERO,
19555 .write = NULL,
19556 .read = NULL,
19557 },
19558
19559 {
hailfinger63165602009-11-20 01:12:45 +000019560 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080019561 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000019562 .bustype = BUS_SPI,
Edward O'Callaghane0772312020-09-16 17:57:19 +100019563 .manufacture_id = PROGMANUF_ID,
19564 .model_id = PROGDEV_ID,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080019565 .total_size = 64, /* This size is set temporarily */
19566 .page_size = 256,
Nico Hubercbf89c82021-05-11 18:50:30 +020019567 .feature_bits = FEATURE_4BA_READ | FEATURE_4BA_WRITE,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080019568 .tested = TEST_OK_PREW,
19569 .probe = probe_variable_size,
19570 .block_erasers =
19571 {
19572 {
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080019573 .eraseblocks = { {64 * 1024, 1} },
Namyoon Woob71a2962020-08-27 16:27:49 -070019574 .block_erase = spi_block_erase_c7,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080019575 }
19576 },
19577 .write = spi_chip_write_256,
19578 .read = spi_chip_read,
19579 },
19580
19581 {
19582 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000019583 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000019584 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000019585 .manufacture_id = GENERIC_MANUF_ID,
19586 .model_id = GENERIC_DEVICE_ID,
19587 .total_size = 0,
19588 .page_size = 256,
19589 .tested = TEST_BAD_PREW,
19590 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000019591 .write = NULL,
19592 },
David Hendricks07af3a42011-07-11 22:13:02 -070019593
hailfinger63165602009-11-20 01:12:45 +000019594 {
19595 .vendor = "Generic",
19596 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000019597 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000019598 .manufacture_id = GENERIC_MANUF_ID,
19599 .model_id = GENERIC_DEVICE_ID,
19600 .total_size = 0,
19601 .page_size = 256,
19602 .tested = TEST_BAD_PREW,
19603 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000019604 .write = NULL,
19605 },
19606
Edward O'Callaghan6240c852019-07-02 15:49:58 +100019607 {0}
stuge7be5d032009-04-21 01:46:07 +000019608};
Simon Glass4c214132013-07-16 10:09:28 -060019609
Edward O'Callaghan6240c852019-07-02 15:49:58 +100019610const unsigned int flashchips_size = ARRAY_SIZE(flashchips);