blob: 9a06e5c7e7b13f1c1e52c240976771bcc43a8add [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"
David Hendricks23cd7782010-08-25 12:42:38 -070024#include "writeprotect.h"
ollie6a600992005-11-26 21:55:36 +000025
uwec93fbdb2008-03-16 02:06:25 +000026/**
uwe3cfe8a52009-05-21 15:55:46 +000027 * List of supported flash chips.
uwec93fbdb2008-03-16 02:06:25 +000028 *
29 * Please keep the list sorted by vendor name and chip name, so that
30 * the output of 'flashrom -L' is alphabetically sorted.
31 */
hailfinger48ed3e22011-05-04 00:39:50 +000032const struct flashchip flashchips[] = {
uwec93fbdb2008-03-16 02:06:25 +000033
hailfinger3000b1f2009-07-23 12:42:01 +000034 /*
35 * .vendor = Vendor name
36 * .name = Chip name
37 * .bustype = Supported flash bus types (Parallel, LPC...)
38 * .manufacture_id = Manufacturer chip ID
39 * .model_id = Model chip ID
40 * .total_size = Total size in (binary) kbytes
41 * .page_size = Page or eraseblock(?) size in bytes
42 * .tested = Test status
43 * .probe = Probe function
44 * .probe_timing = Probe function delay
hailfinger91cf1032009-10-01 13:15:01 +000045 * .block_erasers[] = Array of erase layouts and erase functions
46 * {
47 * .eraseblocks[] = Array of { blocksize, blockcount }
48 * .block_erase = Block erase function
49 * }
snelson1ee293c2010-02-19 00:52:10 +000050 * .printlock = Chip lock status function
51 * .unlock = Chip unlock function
hailfinger3000b1f2009-07-23 12:42:01 +000052 * .write = Chip write function
53 * .read = Chip read function
stefanct7e00e222011-06-03 07:26:31 +000054 * .voltage = Voltage range in millivolt
stepanaa1b6a22008-12-08 18:15:10 +000055 */
56
hailfinger286829b2009-01-08 03:40:17 +000057 {
58 .vendor = "AMD",
59 .name = "Am29F002(N)BB",
hailfingere1e41ea2011-07-27 07:13:06 +000060 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000061 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000062 .model_id = AMD_AM29F002BB,
hailfinger286829b2009-01-08 03:40:17 +000063 .total_size = 256,
64 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000065 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
hailfinger286829b2009-01-08 03:40:17 +000066 .tested = TEST_UNTESTED,
67 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000068 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +000069 .block_erasers =
70 {
71 {
72 .eraseblocks = {
73 {16 * 1024, 1},
74 {8 * 1024, 2},
75 {32 * 1024, 1},
76 {64 * 1024, 3},
77 },
78 .block_erase = erase_sector_jedec,
79 }, {
80 .eraseblocks = { {256 * 1024, 1} },
81 .block_erase = erase_chip_block_jedec,
82 },
83 },
hailfingerfff99532009-11-27 17:49:42 +000084 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000085 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000086 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000087 },
88
hailfinger286829b2009-01-08 03:40:17 +000089 {
90 .vendor = "AMD",
91 .name = "Am29F002(N)BT",
hailfingere1e41ea2011-07-27 07:13:06 +000092 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000093 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +000094 .model_id = AMD_AM29F002BT,
hailfinger286829b2009-01-08 03:40:17 +000095 .total_size = 256,
96 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000097 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
98 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000099 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000100 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000101 .block_erasers =
102 {
103 {
104 .eraseblocks = {
105 {64 * 1024, 3},
106 {32 * 1024, 1},
107 {8 * 1024, 2},
108 {16 * 1024, 1},
109 },
110 .block_erase = erase_sector_jedec,
111 }, {
112 .eraseblocks = { {256 * 1024, 1} },
113 .block_erase = erase_chip_block_jedec,
114 },
115 },
hailfingerfff99532009-11-27 17:49:42 +0000116 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000117 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000118 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +0000119 },
120
hailfinger286829b2009-01-08 03:40:17 +0000121 {
122 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000123 .name = "Am29F010",
124 .bustype = BUS_PARALLEL,
125 .manufacture_id = AMD_ID,
126 .model_id = AMD_AM29F010,
127 .total_size = 128,
128 .page_size = 16 * 1024,
129 .feature_bits = FEATURE_SHORT_RESET,
130 .tested = TEST_UNTESTED,
131 .probe = probe_jedec,
132 .probe_timing = TIMING_ZERO,
133 .block_erasers =
134 {
135 {
136 .eraseblocks = { {16 * 1024, 8} },
137 .block_erase = erase_sector_jedec,
138 }, {
139 .eraseblocks = { {128 * 1024, 1} },
140 .block_erase = erase_chip_block_jedec,
141 },
142 },
143 .write = write_jedec_1,
144 .read = read_memmapped,
145 .voltage = {4500, 5500},
146 },
147
148 {
149 .vendor = "AMD",
Alan Greend76dc1f2019-06-26 15:38:19 +1000150 .name = "Am29F010A/B",
151 .bustype = BUS_PARALLEL,
152 .manufacture_id = AMD_ID,
153 .model_id = AMD_AM29F010, /* Same as Am29F010A */
154 .total_size = 128,
155 .page_size = 16 * 1024,
156 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
157 .tested = TEST_OK_PRE,
158 .probe = probe_jedec,
159 .probe_timing = TIMING_ZERO,
160 .block_erasers =
161 {
162 {
163 .eraseblocks = { {16 * 1024, 8} },
164 .block_erase = erase_sector_jedec,
165 }, {
166 .eraseblocks = { {128 * 1024, 1} },
167 .block_erase = erase_chip_block_jedec,
168 },
169 },
170 .write = write_jedec_1,
171 .read = read_memmapped,
172 .voltage = {4500, 5500},
173 },
174
175 {
176 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000177 .name = "Am29F016D",
hailfingere1e41ea2011-07-27 07:13:06 +0000178 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000179 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000180 .model_id = AMD_AM29F016D,
hailfingerc43afc92009-12-22 22:15:33 +0000181 .total_size = 2 * 1024,
hailfinger286829b2009-01-08 03:40:17 +0000182 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000183 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +0000184 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000185 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000186 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000187 .block_erasers =
188 {
189 {
190 .eraseblocks = { {64 * 1024, 32} },
snelsonc6855342010-01-28 23:55:12 +0000191 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000192 }, {
193 .eraseblocks = { {2048 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000194 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000195 },
196 },
snelsonc6855342010-01-28 23:55:12 +0000197 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000198 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000199 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000200 },
201
hailfinger286829b2009-01-08 03:40:17 +0000202 {
203 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000204 .name = "Am29F040",
205 .bustype = BUS_PARALLEL,
206 .manufacture_id = AMD_ID,
207 .model_id = AMD_AM29F040,
208 .total_size = 512,
209 .page_size = 64 * 1024,
210 .feature_bits = FEATURE_EITHER_RESET,
211 .tested = TEST_UNTESTED,
212 .probe = probe_jedec,
213 .probe_timing = TIMING_ZERO,
214 .block_erasers =
215 {
216 {
217 .eraseblocks = { {64 * 1024, 8} },
218 .block_erase = erase_sector_jedec,
219 }, {
220 .eraseblocks = { {512 * 1024, 1} },
221 .block_erase = erase_chip_block_jedec,
222 },
223 },
224 .write = write_jedec_1,
225 .read = read_memmapped,
226 .voltage = {4500, 5500},
227 },
228
229 {
230 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000231 .name = "Am29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000232 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000233 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100234 .model_id = AMD_AM29F040,
hailfinger286829b2009-01-08 03:40:17 +0000235 .total_size = 512,
236 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000237 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
238 .tested = TEST_UNTESTED,
239 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000240 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000241 .block_erasers =
242 {
243 {
244 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000245 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000246 }, {
247 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000248 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000249 },
250 },
snelsonc6855342010-01-28 23:55:12 +0000251 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000252 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000253 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +0000254 },
255
hailfinger286829b2009-01-08 03:40:17 +0000256 {
257 .vendor = "AMD",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +1000258 .name = "Am29F080",
259 .bustype = BUS_PARALLEL,
260 .manufacture_id = AMD_ID,
261 .model_id = AMD_AM29F080,
262 .total_size = 1024,
263 .page_size = 64 * 1024,
264 .feature_bits = FEATURE_EITHER_RESET,
265 .tested = TEST_UNTESTED,
266 .probe = probe_jedec,
267 .probe_timing = TIMING_ZERO,
268 .block_erasers =
269 {
270 {
271 .eraseblocks = { {64 * 1024, 16} },
272 .block_erase = erase_sector_jedec,
273 }, {
274 .eraseblocks = { {1024 * 1024, 1} },
275 .block_erase = erase_chip_block_jedec,
276 },
277 },
278 .write = write_jedec_1,
279 .read = read_memmapped,
280 .voltage = {4500, 5500},
281 },
282
283 {
284 .vendor = "AMD",
stuged9f66152009-01-25 23:55:12 +0000285 .name = "Am29F080B",
hailfingere1e41ea2011-07-27 07:13:06 +0000286 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000287 .manufacture_id = AMD_ID,
Patrick Georgi6ad860e2017-02-03 19:09:03 +0100288 .model_id = AMD_AM29F080,
stuged9f66152009-01-25 23:55:12 +0000289 .total_size = 1024,
290 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000291 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stuged9f66152009-01-25 23:55:12 +0000292 .tested = TEST_UNTESTED,
293 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +0000294 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000295 .block_erasers =
296 {
297 {
298 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000299 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000300 }, {
301 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000302 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000303 },
304 },
snelsonc6855342010-01-28 23:55:12 +0000305 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000306 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +0000307 .voltage = {4500, 5500},
stuged9f66152009-01-25 23:55:12 +0000308 },
309
310 {
311 .vendor = "AMD",
hailfinger5a8bd5a2011-02-05 12:11:17 +0000312 .name = "Am29LV001BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000313 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000314 .manufacture_id = AMD_ID,
315 .model_id = AMD_AM29LV001BB,
316 .total_size = 128,
317 .page_size = 64 * 1024, /* unused */
318 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
319 .tested = TEST_OK_PREW,
320 .probe = probe_jedec,
321 .probe_timing = TIMING_ZERO,
322 .block_erasers =
323 {
324 {
325 .eraseblocks = {
326 {8 * 1024, 1},
327 {4 * 1024, 2},
328 {16 * 1024, 7},
329 },
330 .block_erase = erase_sector_jedec,
331 }, {
332 .eraseblocks = { {128 * 1024, 1} },
333 .block_erase = erase_chip_block_jedec,
334 },
335 },
336 .write = write_jedec_1,
337 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000338 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000339 },
340
341 {
342 .vendor = "AMD",
343 .name = "Am29LV001BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000344 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000345 .manufacture_id = AMD_ID,
346 .model_id = AMD_AM29LV001BT,
347 .total_size = 128,
348 .page_size = 64 * 1024, /* unused */
349 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
350 .tested = TEST_UNTESTED,
351 .probe = probe_jedec,
352 .probe_timing = TIMING_ZERO,
353 .block_erasers =
354 {
355 {
356 .eraseblocks = {
357 {16 * 1024, 7},
358 {4 * 1024, 2},
359 {8 * 1024, 1},
360 },
361 .block_erase = erase_sector_jedec,
362 }, {
363 .eraseblocks = { {128 * 1024, 1} },
364 .block_erase = erase_chip_block_jedec,
365 },
366 },
367 .write = write_jedec_1,
368 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000369 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000370 },
371
372 {
373 .vendor = "AMD",
374 .name = "Am29LV002BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000375 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000376 .manufacture_id = AMD_ID,
377 .model_id = AMD_AM29LV002BB,
378 .total_size = 256,
379 .page_size = 64 * 1024, /* unused */
380 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
381 .tested = TEST_UNTESTED,
382 .probe = probe_jedec,
383 .probe_timing = TIMING_ZERO,
384 .block_erasers =
385 {
386 {
387 .eraseblocks = {
388 {16 * 1024, 1},
389 {8 * 1024, 2},
390 {32 * 1024, 1},
391 {64 * 1024, 3},
392 },
393 .block_erase = erase_sector_jedec,
394 }, {
395 .eraseblocks = { {256 * 1024, 1} },
396 .block_erase = erase_chip_block_jedec,
397 },
398 },
399 .write = write_jedec_1,
400 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000401 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000402 },
403
404 {
405 .vendor = "AMD",
406 .name = "Am29LV002BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000407 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000408 .manufacture_id = AMD_ID,
409 .model_id = AMD_AM29LV002BT,
410 .total_size = 256,
411 .page_size = 64 * 1024, /* unused */
412 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
413 .tested = TEST_UNTESTED,
414 .probe = probe_jedec,
415 .probe_timing = TIMING_ZERO,
416 .block_erasers =
417 {
418 {
419 .eraseblocks = {
420 {64 * 1024, 3},
421 {32 * 1024, 1},
422 {8 * 1024, 2},
423 {16 * 1024, 1},
424 },
425 .block_erase = erase_sector_jedec,
426 }, {
427 .eraseblocks = { {256 * 1024, 1} },
428 .block_erase = erase_chip_block_jedec,
429 },
430 },
431 .write = write_jedec_1,
432 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000433 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000434 },
435
436 {
437 .vendor = "AMD",
438 .name = "Am29LV004BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000439 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000440 .manufacture_id = AMD_ID,
441 .model_id = AMD_AM29LV004BB,
442 .total_size = 512,
443 .page_size = 64 * 1024, /* unused */
444 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
445 .tested = TEST_UNTESTED,
446 .probe = probe_jedec,
447 .probe_timing = TIMING_ZERO,
448 .block_erasers =
449 {
450 {
451 .eraseblocks = {
452 {16 * 1024, 1},
453 {8 * 1024, 2},
454 {32 * 1024, 1},
455 {64 * 1024, 7},
456 },
457 .block_erase = erase_sector_jedec,
458 }, {
459 .eraseblocks = { {512 * 1024, 1} },
460 .block_erase = erase_chip_block_jedec,
461 },
462 },
463 .write = write_jedec_1,
464 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000465 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000466 },
467
468 {
469 .vendor = "AMD",
470 .name = "Am29LV004BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000471 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000472 .manufacture_id = AMD_ID,
473 .model_id = AMD_AM29LV004BT,
474 .total_size = 512,
475 .page_size = 64 * 1024, /* unused */
476 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
477 .tested = TEST_UNTESTED,
478 .probe = probe_jedec,
479 .probe_timing = TIMING_ZERO,
480 .block_erasers =
481 {
482 {
483 .eraseblocks = {
484 {64 * 1024, 7},
485 {32 * 1024, 1},
486 {8 * 1024, 2},
487 {16 * 1024, 1},
488 },
489 .block_erase = erase_sector_jedec,
490 }, {
491 .eraseblocks = { {512 * 1024, 1} },
492 .block_erase = erase_chip_block_jedec,
493 },
494 },
495 .write = write_jedec_1,
496 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000497 .voltage = {2700, 3600},
hailfinger5a8bd5a2011-02-05 12:11:17 +0000498 },
499
500 {
501 .vendor = "AMD",
502 .name = "Am29LV008BB",
hailfingere1e41ea2011-07-27 07:13:06 +0000503 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000504 .manufacture_id = AMD_ID,
505 .model_id = AMD_AM29LV008BB,
506 .total_size = 1024,
507 .page_size = 64 * 1024, /* unused */
508 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
uwe67f685c2011-08-25 22:54:23 +0000509 .tested = TEST_OK_PREW,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000510 .probe = probe_jedec,
511 .probe_timing = TIMING_ZERO,
512 .block_erasers =
513 {
514 {
515 .eraseblocks = {
516 {16 * 1024, 1},
517 {8 * 1024, 2},
518 {32 * 1024, 1},
519 {64 * 1024, 15},
520 },
521 .block_erase = erase_sector_jedec,
522 }, {
523 .eraseblocks = { {1024 * 1024, 1} },
524 .block_erase = erase_chip_block_jedec,
525 },
526 },
527 .write = write_jedec_1,
528 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000529 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000530 },
531
532 {
533 .vendor = "AMD",
534 .name = "Am29LV008BT",
hailfingere1e41ea2011-07-27 07:13:06 +0000535 .bustype = BUS_PARALLEL,
hailfinger5a8bd5a2011-02-05 12:11:17 +0000536 .manufacture_id = AMD_ID,
537 .model_id = AMD_AM29LV008BT,
538 .total_size = 1024,
539 .page_size = 64 * 1024, /* unused */
540 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
541 .tested = TEST_UNTESTED,
542 .probe = probe_jedec,
543 .probe_timing = TIMING_ZERO,
544 .block_erasers =
545 {
546 {
547 .eraseblocks = {
548 {64 * 1024, 15},
549 {32 * 1024, 1},
550 {8 * 1024, 2},
551 {16 * 1024, 1},
552 },
553 .block_erase = erase_sector_jedec,
554 }, {
555 .eraseblocks = { {1024 * 1024, 1} },
556 .block_erase = erase_chip_block_jedec,
557 },
558 },
559 .write = write_jedec_1,
560 .read = read_memmapped,
Alan Greena7cfa332019-06-24 15:48:14 +1000561 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
hailfinger5a8bd5a2011-02-05 12:11:17 +0000562 },
563
564 {
565 .vendor = "AMD",
hailfinger286829b2009-01-08 03:40:17 +0000566 .name = "Am29LV040B",
hailfingere1e41ea2011-07-27 07:13:06 +0000567 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +0000568 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000569 .model_id = AMD_AM29LV040B,
hailfinger286829b2009-01-08 03:40:17 +0000570 .total_size = 512,
571 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +0000572 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfingerd217d122010-10-08 18:52:29 +0000573 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +0000574 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000575 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000576 .block_erasers =
577 {
578 {
579 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +0000580 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000581 }, {
582 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000583 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000584 },
585 },
snelsonc6855342010-01-28 23:55:12 +0000586 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000587 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000588 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
stepanaa1b6a22008-12-08 18:15:10 +0000589 },
590
hailfinger286829b2009-01-08 03:40:17 +0000591 {
stuged9f66152009-01-25 23:55:12 +0000592 .vendor = "AMD",
593 .name = "Am29LV081B",
hailfingere1e41ea2011-07-27 07:13:06 +0000594 .bustype = BUS_PARALLEL,
hailfingeradd36042009-06-02 00:38:14 +0000595 .manufacture_id = AMD_ID,
mhmd3c80cd2010-09-15 23:31:03 +0000596 .model_id = AMD_AM29LV080B,
stuged9f66152009-01-25 23:55:12 +0000597 .total_size = 1024,
598 .page_size = 64 * 1024,
hailfinger8ddaff32010-12-04 03:26:40 +0000599 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
stuged9f66152009-01-25 23:55:12 +0000600 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +0000601 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +0000602 .probe_timing = TIMING_ZERO,
hailfingerc43afc92009-12-22 22:15:33 +0000603 .block_erasers =
604 {
605 {
606 .eraseblocks = { {64 * 1024, 16} },
snelsonc6855342010-01-28 23:55:12 +0000607 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000608 }, {
609 .eraseblocks = { {1024 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +0000610 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +0000611 },
612 },
snelsonc6855342010-01-28 23:55:12 +0000613 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +0000614 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +0000615 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
stuged9f66152009-01-25 23:55:12 +0000616 },
617
618 {
hailfinger61958912010-07-28 22:20:20 +0000619 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000620 .name = "A25L010",
621 .bustype = BUS_SPI,
622 .manufacture_id = AMIC_ID_NOPREFIX,
623 .model_id = AMIC_A25L010,
624 .total_size = 128,
625 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000626 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000627 .tested = TEST_UNTESTED,
628 .probe = probe_spi_rdid,
629 .probe_timing = TIMING_ZERO,
630 .block_erasers =
631 {
632 {
633 .eraseblocks = { { 4 * 1024, 32 } },
634 .block_erase = spi_block_erase_20,
635 }, {
636 .eraseblocks = { { 64 * 1024, 2 } },
637 .block_erase = spi_block_erase_d8,
638 }, {
639 .eraseblocks = { { 128 * 1024, 1 } },
640 .block_erase = spi_block_erase_c7,
641 }
642 },
Alan Green0c65ed02019-07-26 08:07:01 +1000643 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000644 .unlock = spi_disable_blockprotect,
645 .write = spi_chip_write_256,
646 .read = spi_chip_read,
647 .voltage = {2700, 3600},
648 },
649
650 {
651 .vendor = "AMIC",
652 .name = "A25L016",
653 .bustype = BUS_SPI,
654 .manufacture_id = AMIC_ID_NOPREFIX,
655 .model_id = AMIC_A25L016,
656 .total_size = 2048,
657 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000658 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000659 .tested = TEST_UNTESTED,
660 .probe = probe_spi_rdid,
661 .probe_timing = TIMING_ZERO,
662 .block_erasers =
663 {
664 {
665 .eraseblocks = { { 4 * 1024, 512 } },
666 .block_erase = spi_block_erase_20,
667 }, {
668 .eraseblocks = { { 64 * 1024, 32 } },
669 .block_erase = spi_block_erase_d8,
670 }, {
671 .eraseblocks = { { 2048 * 1024, 1 } },
672 .block_erase = spi_block_erase_c7,
673 }
674 },
Alan Green0c65ed02019-07-26 08:07:01 +1000675 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000676 .unlock = spi_disable_blockprotect,
677 .write = spi_chip_write_256,
678 .read = spi_chip_read,
679 .voltage = {2700, 3600},
680 },
681
682 {
683 .vendor = "AMIC",
684 .name = "A25L020",
685 .bustype = BUS_SPI,
686 .manufacture_id = AMIC_ID_NOPREFIX,
687 .model_id = AMIC_A25L020,
688 .total_size = 256,
689 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000690 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000691 .tested = TEST_UNTESTED,
692 .probe = probe_spi_rdid,
693 .probe_timing = TIMING_ZERO,
694 .block_erasers =
695 {
696 {
697 .eraseblocks = { { 4 * 1024, 64 } },
698 .block_erase = spi_block_erase_20,
699 }, {
700 .eraseblocks = { { 64 * 1024, 4 } },
701 .block_erase = spi_block_erase_d8,
702 }, {
703 .eraseblocks = { { 256 * 1024, 1 } },
704 .block_erase = spi_block_erase_c7,
705 }
706 },
Alan Green0c65ed02019-07-26 08:07:01 +1000707 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000708 .unlock = spi_disable_blockprotect,
709 .write = spi_chip_write_256,
710 .read = spi_chip_read,
711 .voltage = {2700, 3600},
712 },
713
714 {
715 .vendor = "AMIC",
716 .name = "A25L032",
717 .bustype = BUS_SPI,
718 .manufacture_id = AMIC_ID_NOPREFIX,
719 .model_id = AMIC_A25L032,
720 .total_size = 4096,
721 .page_size = 256,
722 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +1000723 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greena3e041d2019-07-26 08:24:53 +1000724 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +1000725 .probe = probe_spi_rdid,
726 .probe_timing = TIMING_ZERO,
727 .block_erasers =
728 {
729 {
730 .eraseblocks = { { 4 * 1024, 1024 } },
731 .block_erase = spi_block_erase_20,
732 }, {
733 .eraseblocks = { { 64 * 1024, 64 } },
734 .block_erase = spi_block_erase_52,
735 }, {
736 .eraseblocks = { { 64 * 1024, 64 } },
737 .block_erase = spi_block_erase_d8,
738 }, {
739 .eraseblocks = { { 4096 * 1024, 1 } },
740 .block_erase = spi_block_erase_60,
741 }, {
742 .eraseblocks = { { 4096 * 1024, 1 } },
743 .block_erase = spi_block_erase_c7,
744 }
745 },
Alan Greena3e041d2019-07-26 08:24:53 +1000746 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
747 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +1000748 .write = spi_chip_write_256,
749 .read = spi_chip_read,
750 .voltage = {2700, 3600},
751 },
752
753 {
754 .vendor = "AMIC",
755 .name = "A25L040",
756 .bustype = BUS_SPI,
757 .manufacture_id = AMIC_ID_NOPREFIX,
758 .model_id = AMIC_A25L040,
759 .total_size = 512,
760 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000761 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000762 .tested = TEST_UNTESTED,
763 .probe = probe_spi_rdid,
764 .probe_timing = TIMING_ZERO,
765 .block_erasers =
766 {
767 {
768 .eraseblocks = { { 4 * 1024, 128 } },
769 .block_erase = spi_block_erase_20,
770 }, {
771 .eraseblocks = { { 64 * 1024, 8 } },
772 .block_erase = spi_block_erase_d8,
773 }, {
774 .eraseblocks = { { 512 * 1024, 1 } },
775 .block_erase = spi_block_erase_c7,
776 }
777 },
Alan Green0c65ed02019-07-26 08:07:01 +1000778 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000779 .unlock = spi_disable_blockprotect,
780 .write = spi_chip_write_256,
781 .read = spi_chip_read,
782 .voltage = {2700, 3600},
783 .wp = &wp_w25,
784 },
785
786 {
787 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000788 .name = "A25L05PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000789 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000790 .manufacture_id = AMIC_ID,
791 .model_id = AMIC_A25L05PT,
792 .total_size = 64,
793 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000794 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000795 .tested = TEST_UNTESTED,
796 .probe = probe_spi_rdid4,
797 .probe_timing = TIMING_ZERO,
798 .block_erasers =
799 {
800 {
801 .eraseblocks = {
802 {32 * 1024, 1},
803 {16 * 1024, 1},
804 {8 * 1024, 1},
805 {4 * 1024, 2},
806 },
807 .block_erase = spi_block_erase_d8,
808 }, {
809 .eraseblocks = { {64 * 1024, 1} },
810 .block_erase = spi_block_erase_c7,
811 }
812 },
Alan Green1ca1c862019-07-26 08:35:15 +1000813 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000814 .unlock = spi_disable_blockprotect,
815 .write = spi_chip_write_256,
816 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000817 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000818 },
819
820 {
821 .vendor = "AMIC",
822 .name = "A25L05PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000823 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000824 .manufacture_id = AMIC_ID,
825 .model_id = AMIC_A25L05PU,
826 .total_size = 64,
827 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000828 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000829 .tested = TEST_UNTESTED,
830 .probe = probe_spi_rdid4,
831 .probe_timing = TIMING_ZERO,
832 .block_erasers =
833 {
834 {
835 .eraseblocks = {
836 {4 * 1024, 2},
837 {8 * 1024, 1},
838 {16 * 1024, 1},
839 {32 * 1024, 1},
840 },
841 .block_erase = spi_block_erase_d8,
842 }, {
843 .eraseblocks = { {64 * 1024, 1} },
844 .block_erase = spi_block_erase_c7,
845 }
846 },
Alan Green1ca1c862019-07-26 08:35:15 +1000847 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000848 .unlock = spi_disable_blockprotect,
849 .write = spi_chip_write_256,
850 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +0000851 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000852 },
853
854 {
855 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000856 .name = "A25L080",
857 .bustype = BUS_SPI,
858 .manufacture_id = AMIC_ID_NOPREFIX,
859 .model_id = AMIC_A25L080,
860 .total_size = 1024,
861 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +1000862 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000863 .tested = TEST_UNTESTED,
864 .probe = probe_spi_rdid,
865 .probe_timing = TIMING_ZERO,
866 .block_erasers =
867 {
868 {
869 .eraseblocks = { { 4 * 1024, 256 } },
870 .block_erase = spi_block_erase_20,
871 }, {
872 .eraseblocks = { { 64 * 1024, 16 } },
873 .block_erase = spi_block_erase_d8,
874 }, {
875 .eraseblocks = { { 1024 * 1024, 1 } },
876 .block_erase = spi_block_erase_c7,
877 }
878 },
Alan Green0c65ed02019-07-26 08:07:01 +1000879 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000880 .unlock = spi_disable_blockprotect,
881 .write = spi_chip_write_256,
882 .read = spi_chip_read,
883 .voltage = {2700, 3600},
884 },
885
886 {
887 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +0000888 .name = "A25L10PT",
hailfingere1e41ea2011-07-27 07:13:06 +0000889 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000890 .manufacture_id = AMIC_ID,
891 .model_id = AMIC_A25L10PT,
892 .total_size = 128,
893 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000894 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000895 .tested = TEST_UNTESTED,
896 .probe = probe_spi_rdid4,
897 .probe_timing = TIMING_ZERO,
898 .block_erasers =
899 {
900 {
901 .eraseblocks = {
902 {64 * 1024, 1},
903 {32 * 1024, 1},
904 {16 * 1024, 1},
905 {8 * 1024, 1},
906 {4 * 1024, 2},
907 },
908 .block_erase = spi_block_erase_d8,
909 }, {
910 .eraseblocks = { {128 * 1024, 1} },
911 .block_erase = spi_block_erase_c7,
912 }
913 },
Alan Green1ca1c862019-07-26 08:35:15 +1000914 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000915 .unlock = spi_disable_blockprotect,
916 .write = spi_chip_write_256,
917 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000918 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000919 },
920
921 {
922 .vendor = "AMIC",
923 .name = "A25L10PU",
hailfingere1e41ea2011-07-27 07:13:06 +0000924 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +0000925 .manufacture_id = AMIC_ID,
926 .model_id = AMIC_A25L10PU,
927 .total_size = 128,
928 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000929 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +0000930 .tested = TEST_UNTESTED,
931 .probe = probe_spi_rdid4,
932 .probe_timing = TIMING_ZERO,
933 .block_erasers =
934 {
935 {
936 .eraseblocks = {
937 {4 * 1024, 2},
938 {8 * 1024, 1},
939 {16 * 1024, 1},
940 {32 * 1024, 1},
941 {64 * 1024, 1},
942 },
943 .block_erase = spi_block_erase_d8,
944 }, {
945 .eraseblocks = { {128 * 1024, 1} },
946 .block_erase = spi_block_erase_c7,
947 }
948 },
Alan Green1ca1c862019-07-26 08:35:15 +1000949 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +0000950 .unlock = spi_disable_blockprotect,
951 .write = spi_chip_write_256,
952 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +0000953 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +0000954 },
955
956 {
957 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +1000958 .name = "A25L16PT",
959 .bustype = BUS_SPI,
960 .manufacture_id = AMIC_ID,
961 .model_id = AMIC_A25L16PT,
962 .total_size = 2048,
963 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +1000964 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +1000965 .tested = TEST_UNTESTED,
966 .probe = probe_spi_rdid4,
967 .probe_timing = TIMING_ZERO,
968 .block_erasers =
969 {
970 {
971 .eraseblocks = {
972 {64 * 1024, 31},
973 {32 * 1024, 1},
974 {16 * 1024, 1},
975 {8 * 1024, 1},
976 {4 * 1024, 2},
977 },
978 .block_erase = spi_block_erase_d8,
979 }, {
980 .eraseblocks = { {2048 * 1024, 1} },
981 .block_erase = spi_block_erase_60,
982 }, {
983 .eraseblocks = { {2048 * 1024, 1} },
984 .block_erase = spi_block_erase_c7,
985 }
986 },
Alan Green0c65ed02019-07-26 08:07:01 +1000987 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +1000988 .unlock = spi_disable_blockprotect,
989 .write = spi_chip_write_256,
990 .read = spi_chip_read,
991 .voltage = {2700, 3600},
992 },
993
994 {
995 .vendor = "AMIC",
996 .name = "A25L16PU",
997 .bustype = BUS_SPI,
998 .manufacture_id = AMIC_ID,
999 .model_id = AMIC_A25L16PU,
1000 .total_size = 2048,
1001 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001002 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001003 .tested = TEST_OK_PR,
Alan Greend76dc1f2019-06-26 15:38:19 +10001004 .probe = probe_spi_rdid4,
1005 .probe_timing = TIMING_ZERO,
1006 .block_erasers =
1007 {
1008 {
1009 .eraseblocks = {
1010 {4 * 1024, 2},
1011 {8 * 1024, 1},
1012 {16 * 1024, 1},
1013 {32 * 1024, 1},
1014 {64 * 1024, 31},
1015 },
1016 .block_erase = spi_block_erase_d8,
1017 }, {
1018 .eraseblocks = { {2048 * 1024, 1} },
1019 .block_erase = spi_block_erase_60,
1020 }, {
1021 .eraseblocks = { {2048 * 1024, 1} },
1022 .block_erase = spi_block_erase_c7,
1023 }
1024 },
Alan Green0c65ed02019-07-26 08:07:01 +10001025 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10001026 .unlock = spi_disable_blockprotect,
1027 .write = spi_chip_write_256,
1028 .read = spi_chip_read,
1029 .voltage = {2700, 3600},
1030 },
1031
1032 {
1033 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001034 .name = "A25L20PT",
hailfingere1e41ea2011-07-27 07:13:06 +00001035 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001036 .manufacture_id = AMIC_ID,
1037 .model_id = AMIC_A25L20PT,
1038 .total_size = 256,
1039 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001040 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +00001041 .tested = TEST_UNTESTED,
1042 .probe = probe_spi_rdid4,
1043 .probe_timing = TIMING_ZERO,
1044 .block_erasers =
1045 {
1046 {
1047 .eraseblocks = {
1048 {64 * 1024, 3},
1049 {32 * 1024, 1},
1050 {16 * 1024, 1},
1051 {8 * 1024, 1},
1052 {4 * 1024, 2},
1053 },
1054 .block_erase = spi_block_erase_d8,
1055 }, {
1056 .eraseblocks = { {256 * 1024, 1} },
1057 .block_erase = spi_block_erase_c7,
1058 }
1059 },
Alan Green1ca1c862019-07-26 08:35:15 +10001060 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +00001061 .unlock = spi_disable_blockprotect,
1062 .write = spi_chip_write_256,
1063 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001064 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001065 },
1066
1067 {
1068 .vendor = "AMIC",
1069 .name = "A25L20PU",
hailfingere1e41ea2011-07-27 07:13:06 +00001070 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001071 .manufacture_id = AMIC_ID,
1072 .model_id = AMIC_A25L20PU,
1073 .total_size = 256,
1074 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001075 .feature_bits = FEATURE_WRSR_WREN,
hailfinger61958912010-07-28 22:20:20 +00001076 .tested = TEST_UNTESTED,
1077 .probe = probe_spi_rdid4,
1078 .probe_timing = TIMING_ZERO,
1079 .block_erasers =
1080 {
1081 {
1082 .eraseblocks = {
1083 {4 * 1024, 2},
1084 {8 * 1024, 1},
1085 {16 * 1024, 1},
1086 {32 * 1024, 1},
1087 {64 * 1024, 3},
1088 },
1089 .block_erase = spi_block_erase_d8,
1090 }, {
1091 .eraseblocks = { {256 * 1024, 1} },
1092 .block_erase = spi_block_erase_c7,
1093 }
1094 },
Alan Green1ca1c862019-07-26 08:35:15 +10001095 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfinger61958912010-07-28 22:20:20 +00001096 .unlock = spi_disable_blockprotect,
1097 .write = spi_chip_write_256,
1098 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001099 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001100 },
1101
1102 /* The A25L40P{T,U} chips are distinguished by their
1103 * erase block layouts, but without any distinction in RDID.
1104 * This inexplicable quirk was verified by Rudolf Marek
1105 * and discussed on the flashrom mailing list on 2010-07-12.
1106 */
1107 {
1108 .vendor = "AMIC",
1109 .name = "A25L40PT",
hailfingere1e41ea2011-07-27 07:13:06 +00001110 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001111 .manufacture_id = AMIC_ID,
1112 .model_id = AMIC_A25L40PT,
1113 .total_size = 512,
1114 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001115 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001116 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001117 .probe = probe_spi_rdid4,
1118 .probe_timing = TIMING_ZERO,
1119 .block_erasers =
1120 {
1121 {
1122 .eraseblocks = {
1123 {64 * 1024, 7},
1124 {32 * 1024, 1},
1125 {16 * 1024, 1},
1126 {8 * 1024, 1},
1127 {4 * 1024, 2},
1128 },
1129 .block_erase = spi_block_erase_d8,
1130 }, {
1131 .eraseblocks = { {512 * 1024, 1} },
1132 .block_erase = spi_block_erase_c7,
1133 }
1134 },
Alan Green0c65ed02019-07-26 08:07:01 +10001135 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001136 .unlock = spi_disable_blockprotect,
1137 .write = spi_chip_write_256,
1138 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001139 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001140 },
1141
1142 {
1143 .vendor = "AMIC",
1144 .name = "A25L40PU",
hailfingere1e41ea2011-07-27 07:13:06 +00001145 .bustype = BUS_SPI,
hailfinger61958912010-07-28 22:20:20 +00001146 .manufacture_id = AMIC_ID,
1147 .model_id = AMIC_A25L40PU,
1148 .total_size = 512,
1149 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001150 .feature_bits = FEATURE_WRSR_WREN,
Alan Greene3e4fb82019-09-09 16:28:33 +10001151 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001152 .probe = probe_spi_rdid4,
1153 .probe_timing = TIMING_ZERO,
1154 .block_erasers =
1155 {
1156 {
1157 .eraseblocks = {
1158 {4 * 1024, 2},
1159 {8 * 1024, 1},
1160 {16 * 1024, 1},
1161 {32 * 1024, 1},
1162 {64 * 1024, 7},
1163 },
1164 .block_erase = spi_block_erase_d8,
1165 }, {
1166 .eraseblocks = { {512 * 1024, 1} },
1167 .block_erase = spi_block_erase_c7,
1168 }
1169 },
Alan Green0c65ed02019-07-26 08:07:01 +10001170 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger61958912010-07-28 22:20:20 +00001171 .unlock = spi_disable_blockprotect,
1172 .write = spi_chip_write_256,
1173 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001174 .voltage = {2700, 3600},
hailfinger61958912010-07-28 22:20:20 +00001175 },
1176
1177 {
1178 .vendor = "AMIC",
hailfinger6eb433a2010-07-29 15:00:40 +00001179 .name = "A25L512",
hailfingere1e41ea2011-07-27 07:13:06 +00001180 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001181 .manufacture_id = AMIC_ID_NOPREFIX,
1182 .model_id = AMIC_A25L512,
1183 .total_size = 64,
1184 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001185 .feature_bits = FEATURE_WRSR_WREN,
hailfinger6eb433a2010-07-29 15:00:40 +00001186 .tested = TEST_UNTESTED,
1187 .probe = probe_spi_rdid,
1188 .probe_timing = TIMING_ZERO,
1189 .block_erasers =
1190 {
1191 {
1192 .eraseblocks = { { 4 * 1024, 16 } },
1193 .block_erase = spi_block_erase_20,
1194 }, {
1195 .eraseblocks = { { 64 * 1024, 1 } },
1196 .block_erase = spi_block_erase_d8,
1197 }, {
1198 .eraseblocks = { { 64 * 1024, 1 } },
1199 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001200 }
hailfinger6eb433a2010-07-29 15:00:40 +00001201 },
Alan Green0c65ed02019-07-26 08:07:01 +10001202 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001203 .unlock = spi_disable_blockprotect,
1204 .write = spi_chip_write_256,
1205 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001206 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001207 },
1208
1209 {
1210 .vendor = "AMIC",
Alan Greend76dc1f2019-06-26 15:38:19 +10001211 .name = "A25L80P",
hailfingere1e41ea2011-07-27 07:13:06 +00001212 .bustype = BUS_SPI,
Alan Greend76dc1f2019-06-26 15:38:19 +10001213 .manufacture_id = AMIC_ID,
1214 .model_id = AMIC_A25L80P,
hailfinger6eb433a2010-07-29 15:00:40 +00001215 .total_size = 1024,
1216 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10001217 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10001218 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +10001219 .probe = probe_spi_rdid4,
hailfinger6eb433a2010-07-29 15:00:40 +00001220 .probe_timing = TIMING_ZERO,
1221 .block_erasers =
1222 {
1223 {
Alan Greend76dc1f2019-06-26 15:38:19 +10001224 .eraseblocks = {
1225 {4 * 1024, 2},
1226 {8 * 1024, 1},
1227 {16 * 1024, 1},
1228 {32 * 1024, 1},
1229 {64 * 1024, 15},
1230 },
hailfinger6eb433a2010-07-29 15:00:40 +00001231 .block_erase = spi_block_erase_d8,
1232 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10001233 .eraseblocks = { {1024 * 1024, 1} },
hailfinger6eb433a2010-07-29 15:00:40 +00001234 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001235 }
hailfinger6eb433a2010-07-29 15:00:40 +00001236 },
Alan Green0c65ed02019-07-26 08:07:01 +10001237 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfinger6eb433a2010-07-29 15:00:40 +00001238 .unlock = spi_disable_blockprotect,
1239 .write = spi_chip_write_256,
1240 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001241 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001242 },
1243
1244 {
1245 .vendor = "AMIC",
Alan Greenbacd3232019-07-26 09:32:45 +10001246 .name = "A25LQ032/A25LQ32A",
hailfingere1e41ea2011-07-27 07:13:06 +00001247 .bustype = BUS_SPI,
hailfinger6eb433a2010-07-29 15:00:40 +00001248 .manufacture_id = AMIC_ID_NOPREFIX,
1249 .model_id = AMIC_A25LQ032,
1250 .total_size = 4096,
1251 .page_size = 256,
Alan Greenbacd3232019-07-26 09:32:45 +10001252 /* A25LQ32A supports SFDP */
Stefan Tauner9816fc82016-08-12 15:47:49 -07001253 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001254 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger6eb433a2010-07-29 15:00:40 +00001255 .tested = TEST_UNTESTED,
1256 .probe = probe_spi_rdid,
1257 .probe_timing = TIMING_ZERO,
1258 .block_erasers =
1259 {
1260 {
1261 .eraseblocks = { { 4 * 1024, 1024 } },
1262 .block_erase = spi_block_erase_20,
1263 }, {
1264 .eraseblocks = { { 64 * 1024, 64 } },
1265 .block_erase = spi_block_erase_52,
1266 }, {
1267 .eraseblocks = { { 64 * 1024, 64 } },
1268 .block_erase = spi_block_erase_d8,
1269 }, {
1270 .eraseblocks = { { 4096 * 1024, 1 } },
1271 .block_erase = spi_block_erase_60,
1272 }, {
1273 .eraseblocks = { { 4096 * 1024, 1 } },
1274 .block_erase = spi_block_erase_c7,
Simon Glass8dc82732013-07-16 10:13:51 -06001275 }
hailfinger6eb433a2010-07-29 15:00:40 +00001276 },
Alan Greene2e73402019-09-02 15:47:59 +10001277 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1278 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
hailfinger6eb433a2010-07-29 15:00:40 +00001279 .write = spi_chip_write_256,
1280 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001281 .voltage = {2700, 3600},
hailfinger6eb433a2010-07-29 15:00:40 +00001282 },
1283
1284 {
1285 .vendor = "AMIC",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001286 .name = "A25LQ16",
1287 .bustype = BUS_SPI,
1288 .manufacture_id = AMIC_ID_NOPREFIX,
1289 .model_id = AMIC_A25LQ16,
1290 .total_size = 2048,
1291 .page_size = 256,
1292 /* supports SFDP */
1293 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1295 .tested = TEST_UNTESTED,
1296 .probe = probe_spi_rdid,
1297 .probe_timing = TIMING_ZERO,
1298 .block_erasers =
1299 {
1300 {
1301 .eraseblocks = { { 4 * 1024, 512 } },
1302 .block_erase = spi_block_erase_20,
1303 }, {
1304 .eraseblocks = { { 64 * 1024, 32 } },
1305 .block_erase = spi_block_erase_52,
1306 }, {
1307 .eraseblocks = { { 64 * 1024, 32 } },
1308 .block_erase = spi_block_erase_d8,
1309 }, {
1310 .eraseblocks = { { 2048 * 1024, 1 } },
1311 .block_erase = spi_block_erase_60,
1312 }, {
1313 .eraseblocks = { { 2048 * 1024, 1 } },
1314 .block_erase = spi_block_erase_c7,
1315 }
1316 },
1317 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1318 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1319 .write = spi_chip_write_256,
1320 .read = spi_chip_read,
1321 .voltage = {2700, 3600},
1322 },
1323
1324 {
1325 .vendor = "AMIC",
1326 .name = "A25LQ64",
1327 .bustype = BUS_SPI,
1328 .manufacture_id = AMIC_ID_NOPREFIX,
1329 .model_id = AMIC_A25LQ64,
1330 .total_size = 8192,
1331 .page_size = 256,
1332 /* supports SFDP */
1333 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
1334 /* QPI enable 0x35, disable 0xF5 */
1335 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
1336 .tested = TEST_UNTESTED,
1337 .probe = probe_spi_rdid,
1338 .probe_timing = TIMING_ZERO,
1339 .block_erasers =
1340 {
1341 {
1342 .eraseblocks = { { 4 * 1024, 2048 } },
1343 .block_erase = spi_block_erase_20,
1344 }, {
1345 .eraseblocks = { { 32 * 1024, 256 } },
1346 .block_erase = spi_block_erase_52,
1347 }, {
1348 .eraseblocks = { { 64 * 1024, 128 } },
1349 .block_erase = spi_block_erase_d8,
1350 }, {
1351 .eraseblocks = { { 8192 * 1024, 1 } },
1352 .block_erase = spi_block_erase_60,
1353 }, {
1354 .eraseblocks = { { 8192 * 1024, 1 } },
1355 .block_erase = spi_block_erase_c7,
1356 }
1357 },
1358 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
1359 .unlock = spi_disable_blockprotect_bp3_srwd,
1360 .write = spi_chip_write_256,
1361 .read = spi_chip_read,
1362 .voltage = {2700, 3600},
1363 },
1364
1365 {
1366 .vendor = "AMIC",
hailfinger61958912010-07-28 22:20:20 +00001367 .name = "A29002B",
hailfingere1e41ea2011-07-27 07:13:06 +00001368 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001369 .manufacture_id = AMIC_ID_NOPREFIX,
1370 .model_id = AMIC_A29002B,
1371 .total_size = 256,
1372 .page_size = 64 * 1024,
1373 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1374 .tested = TEST_UNTESTED,
1375 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001376 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001377 .block_erasers =
1378 {
1379 {
Simon Glass8dc82732013-07-16 10:13:51 -06001380 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001381 {16 * 1024, 1},
1382 {8 * 1024, 2},
1383 {32 * 1024, 1},
1384 {64 * 1024, 3},
1385 },
1386 .block_erase = erase_sector_jedec,
1387 }, {
1388 .eraseblocks = { {256 * 1024, 1} },
1389 .block_erase = erase_chip_block_jedec,
1390 },
1391 },
1392 .write = write_jedec_1,
1393 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001394 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001395 },
1396
1397 {
1398 .vendor = "AMIC",
1399 .name = "A29002T",
hailfingere1e41ea2011-07-27 07:13:06 +00001400 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001401 .manufacture_id = AMIC_ID_NOPREFIX,
1402 .model_id = AMIC_A29002T,
1403 .total_size = 256,
1404 .page_size = 64 * 1024,
1405 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00001406 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001407 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001408 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001409 .block_erasers =
1410 {
1411 {
Simon Glass8dc82732013-07-16 10:13:51 -06001412 .eraseblocks = {
hailfinger61958912010-07-28 22:20:20 +00001413 {64 * 1024, 3},
1414 {32 * 1024, 1},
1415 {8 * 1024, 2},
1416 {16 * 1024, 1},
1417 },
1418 .block_erase = erase_sector_jedec,
1419 }, {
1420 .eraseblocks = { {256 * 1024, 1} },
1421 .block_erase = erase_chip_block_jedec,
1422 },
1423 },
1424 .write = write_jedec_1,
1425 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001426 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001427 },
1428
1429 {
1430 .vendor = "AMIC",
1431 .name = "A29040B",
hailfingere1e41ea2011-07-27 07:13:06 +00001432 .bustype = BUS_PARALLEL,
hailfinger61958912010-07-28 22:20:20 +00001433 .manufacture_id = AMIC_ID_NOPREFIX,
1434 .model_id = AMIC_A29040B,
1435 .total_size = 512,
1436 .page_size = 64 * 1024,
1437 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Alan Greena9956bd2019-07-26 09:10:41 +10001438 .tested = TEST_OK_PREW,
hailfinger61958912010-07-28 22:20:20 +00001439 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00001440 .probe_timing = TIMING_ZERO,
hailfinger61958912010-07-28 22:20:20 +00001441 .block_erasers =
1442 {
1443 {
1444 .eraseblocks = { {64 * 1024, 8} },
1445 .block_erase = erase_sector_jedec,
1446 }, {
1447 .eraseblocks = { {512 * 1024, 1} },
1448 .block_erase = erase_chip_block_jedec,
1449 },
1450 },
1451 .write = write_jedec_1,
1452 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001453 .voltage = {4500, 5500},
hailfinger61958912010-07-28 22:20:20 +00001454 },
1455
1456 {
1457 .vendor = "AMIC",
1458 .name = "A49LF040A",
hailfingere1e41ea2011-07-27 07:13:06 +00001459 .bustype = BUS_LPC,
hailfinger61958912010-07-28 22:20:20 +00001460 .manufacture_id = AMIC_ID_NOPREFIX,
1461 .model_id = AMIC_A49LF040A,
1462 .total_size = 512,
1463 .page_size = 64 * 1024,
1464 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +10001465 .tested = TEST_OK_PR,
hailfinger61958912010-07-28 22:20:20 +00001466 .probe = probe_jedec,
1467 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1468 .block_erasers =
1469 {
1470 {
1471 .eraseblocks = { {64 * 1024, 8} },
1472 .block_erase = erase_block_jedec,
1473 }, {
1474 .eraseblocks = { {512 * 1024, 1} },
1475 .block_erase = erase_chip_block_jedec,
1476 }
1477 },
Alan Green90539742019-09-02 17:06:30 +10001478 .unlock = unlock_regspace2_uniform_64k,
hailfinger61958912010-07-28 22:20:20 +00001479 .write = write_jedec_1,
1480 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00001481 .voltage = {3000, 3600},
hailfinger61958912010-07-28 22:20:20 +00001482 },
1483
1484 {
hailfinger286829b2009-01-08 03:40:17 +00001485 .vendor = "Atmel",
1486 .name = "AT25DF021",
hailfingere1e41ea2011-07-27 07:13:06 +00001487 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001488 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001489 .model_id = ATMEL_AT25DF021,
hailfinger286829b2009-01-08 03:40:17 +00001490 .total_size = 256,
1491 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001492 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001493 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00001494 .tested = TEST_UNTESTED,
1495 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001496 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001497 .block_erasers =
1498 {
1499 {
1500 .eraseblocks = { {4 * 1024, 64} },
1501 .block_erase = spi_block_erase_20,
1502 }, {
1503 .eraseblocks = { {32 * 1024, 8} },
1504 .block_erase = spi_block_erase_52,
1505 }, {
1506 .eraseblocks = { {64 * 1024, 4} },
1507 .block_erase = spi_block_erase_d8,
1508 }, {
1509 .eraseblocks = { {256 * 1024, 1} },
1510 .block_erase = spi_block_erase_60,
1511 }, {
1512 .eraseblocks = { {256 * 1024, 1} },
1513 .block_erase = spi_block_erase_c7,
1514 }
1515 },
hailfingerc33d4732010-07-29 13:09:18 +00001516 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001517 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001518 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001519 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001520 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001521 },
1522
hailfinger286829b2009-01-08 03:40:17 +00001523 {
1524 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001525 .name = "AT25DF021A",
1526 .bustype = BUS_SPI,
1527 .manufacture_id = ATMEL_ID,
1528 .model_id = ATMEL_AT25DF021A,
1529 .total_size = 256,
1530 .page_size = 256,
1531 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1532 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1533 .tested = TEST_OK_PREW,
1534 .probe = probe_spi_rdid,
1535 .probe_timing = TIMING_ZERO,
1536 .block_erasers =
1537 {
1538 {
1539 .eraseblocks = { {4 * 1024, 64} },
1540 .block_erase = spi_block_erase_20,
1541 }, {
1542 .eraseblocks = { {32 * 1024, 8} },
1543 .block_erase = spi_block_erase_52,
1544 }, {
1545 .eraseblocks = { {64 * 1024, 4} },
1546 .block_erase = spi_block_erase_d8,
1547 }, {
1548 .eraseblocks = { {256 * 1024, 1} },
1549 .block_erase = spi_block_erase_60,
1550 }, {
1551 .eraseblocks = { {256 * 1024, 1} },
1552 .block_erase = spi_block_erase_c7,
1553 }
1554 },
1555 .printlock = spi_prettyprint_status_register_at25df,
1556 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1557 .write = spi_chip_write_256,
1558 .read = spi_chip_read,
1559 .voltage = {1650, 3600},
1560 },
1561
1562 {
1563 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00001564 .name = "AT25DF041A",
hailfingere1e41ea2011-07-27 07:13:06 +00001565 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001566 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001567 .model_id = ATMEL_AT25DF041A,
hailfinger286829b2009-01-08 03:40:17 +00001568 .total_size = 512,
1569 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001570 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001571 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001572 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001573 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001574 .block_erasers =
1575 {
1576 {
1577 .eraseblocks = { {4 * 1024, 128} },
1578 .block_erase = spi_block_erase_20,
1579 }, {
1580 .eraseblocks = { {32 * 1024, 16} },
1581 .block_erase = spi_block_erase_52,
1582 }, {
1583 .eraseblocks = { {64 * 1024, 8} },
1584 .block_erase = spi_block_erase_d8,
1585 }, {
1586 .eraseblocks = { {512 * 1024, 1} },
1587 .block_erase = spi_block_erase_60,
1588 }, {
1589 .eraseblocks = { {512 * 1024, 1} },
1590 .block_erase = spi_block_erase_c7,
1591 }
1592 },
hailfingerc33d4732010-07-29 13:09:18 +00001593 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001594 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001595 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001596 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001597 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
stepanaa1b6a22008-12-08 18:15:10 +00001598 },
1599
hailfinger286829b2009-01-08 03:40:17 +00001600 {
1601 .vendor = "Atmel",
1602 .name = "AT25DF081",
hailfingere1e41ea2011-07-27 07:13:06 +00001603 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001604 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001605 .model_id = ATMEL_AT25DF081,
hailfinger286829b2009-01-08 03:40:17 +00001606 .total_size = 1024,
1607 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001608 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00001609 .tested = TEST_UNTESTED,
1610 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001611 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001612 .block_erasers =
1613 {
1614 {
1615 .eraseblocks = { {4 * 1024, 256} },
1616 .block_erase = spi_block_erase_20,
1617 }, {
1618 .eraseblocks = { {32 * 1024, 32} },
1619 .block_erase = spi_block_erase_52,
1620 }, {
1621 .eraseblocks = { {64 * 1024, 16} },
1622 .block_erase = spi_block_erase_d8,
1623 }, {
1624 .eraseblocks = { {1024 * 1024, 1} },
1625 .block_erase = spi_block_erase_60,
1626 }, {
1627 .eraseblocks = { {1024 * 1024, 1} },
1628 .block_erase = spi_block_erase_c7,
1629 }
1630 },
hailfingerc33d4732010-07-29 13:09:18 +00001631 .printlock = spi_prettyprint_status_register_at25df,
Alan Green64b91de2019-09-09 16:34:07 +10001632 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfingerc33d4732010-07-29 13:09:18 +00001633 .write = spi_chip_write_256,
1634 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001635 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
hailfingerc33d4732010-07-29 13:09:18 +00001636 },
1637
1638 {
1639 .vendor = "Atmel",
1640 .name = "AT25DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00001641 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001642 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001643 .model_id = ATMEL_AT25DF081A,
hailfingerc33d4732010-07-29 13:09:18 +00001644 .total_size = 1024,
1645 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001646 .feature_bits = FEATURE_WRSR_WREN,
hailfingerc33d4732010-07-29 13:09:18 +00001647 .tested = TEST_UNTESTED,
1648 .probe = probe_spi_rdid,
1649 .probe_timing = TIMING_ZERO,
1650 .block_erasers =
1651 {
1652 {
1653 .eraseblocks = { {4 * 1024, 256} },
1654 .block_erase = spi_block_erase_20,
1655 }, {
1656 .eraseblocks = { {32 * 1024, 32} },
1657 .block_erase = spi_block_erase_52,
1658 }, {
1659 .eraseblocks = { {64 * 1024, 16} },
1660 .block_erase = spi_block_erase_d8,
1661 }, {
1662 .eraseblocks = { {1024 * 1024, 1} },
1663 .block_erase = spi_block_erase_60,
1664 }, {
1665 .eraseblocks = { {1024 * 1024, 1} },
1666 .block_erase = spi_block_erase_c7,
1667 }
1668 },
1669 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001670 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001671 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001672 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00001673 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001674 },
1675
hailfinger286829b2009-01-08 03:40:17 +00001676 {
1677 .vendor = "Atmel",
1678 .name = "AT25DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00001679 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001680 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001681 .model_id = ATMEL_AT25DF161,
hailfinger286829b2009-01-08 03:40:17 +00001682 .total_size = 2048,
1683 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001684 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001685 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001686 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001687 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001688 .block_erasers =
1689 {
1690 {
1691 .eraseblocks = { {4 * 1024, 512} },
1692 .block_erase = spi_block_erase_20,
1693 }, {
1694 .eraseblocks = { {32 * 1024, 64} },
1695 .block_erase = spi_block_erase_52,
1696 }, {
1697 .eraseblocks = { {64 * 1024, 32} },
1698 .block_erase = spi_block_erase_d8,
1699 }, {
1700 .eraseblocks = { {2 * 1024 * 1024, 1} },
1701 .block_erase = spi_block_erase_60,
1702 }, {
1703 .eraseblocks = { {2 * 1024 * 1024, 1} },
1704 .block_erase = spi_block_erase_c7,
1705 }
1706 },
hailfingerc33d4732010-07-29 13:09:18 +00001707 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001708 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001709 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001710 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001711 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001712 },
1713
hailfinger286829b2009-01-08 03:40:17 +00001714 {
1715 .vendor = "Atmel",
1716 .name = "AT25DF321",
hailfingere1e41ea2011-07-27 07:13:06 +00001717 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001718 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001719 .model_id = ATMEL_AT25DF321,
hailfinger286829b2009-01-08 03:40:17 +00001720 .total_size = 4096,
1721 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001722 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001723 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001724 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001725 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001726 .block_erasers =
1727 {
1728 {
1729 .eraseblocks = { {4 * 1024, 1024} },
1730 .block_erase = spi_block_erase_20,
1731 }, {
1732 .eraseblocks = { {32 * 1024, 128} },
1733 .block_erase = spi_block_erase_52,
1734 }, {
1735 .eraseblocks = { {64 * 1024, 64} },
1736 .block_erase = spi_block_erase_d8,
1737 }, {
1738 .eraseblocks = { {4 * 1024 * 1024, 1} },
1739 .block_erase = spi_block_erase_60,
1740 }, {
1741 .eraseblocks = { {4 * 1024 * 1024, 1} },
1742 .block_erase = spi_block_erase_c7,
1743 }
1744 },
hailfingerc33d4732010-07-29 13:09:18 +00001745 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10001746 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00001747 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001748 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001749 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001750 },
1751
hailfinger286829b2009-01-08 03:40:17 +00001752 {
1753 .vendor = "Atmel",
1754 .name = "AT25DF321A",
hailfingere1e41ea2011-07-27 07:13:06 +00001755 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001756 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001757 .model_id = ATMEL_AT25DF321A,
hailfinger286829b2009-01-08 03:40:17 +00001758 .total_size = 4096,
1759 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001760 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001761 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenb2d50132019-09-16 12:26:24 +10001762 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001763 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001764 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001765 .block_erasers =
1766 {
1767 {
1768 .eraseblocks = { {4 * 1024, 1024} },
1769 .block_erase = spi_block_erase_20,
1770 }, {
1771 .eraseblocks = { {32 * 1024, 128} },
1772 .block_erase = spi_block_erase_52,
1773 }, {
1774 .eraseblocks = { {64 * 1024, 64} },
1775 .block_erase = spi_block_erase_d8,
1776 }, {
1777 .eraseblocks = { {4 * 1024 * 1024, 1} },
1778 .block_erase = spi_block_erase_60,
1779 }, {
1780 .eraseblocks = { {4 * 1024 * 1024, 1} },
1781 .block_erase = spi_block_erase_c7,
1782 }
1783 },
hailfingerc33d4732010-07-29 13:09:18 +00001784 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001785 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001786 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001787 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001788 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001789 },
1790
hailfinger286829b2009-01-08 03:40:17 +00001791 {
1792 .vendor = "Atmel",
Stefan Tauner718d1eb2016-08-18 18:00:53 -07001793 .name = "AT25DF641(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00001794 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00001795 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001796 .model_id = ATMEL_AT25DF641,
hailfinger286829b2009-01-08 03:40:17 +00001797 .total_size = 8192,
1798 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10001799 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10001800 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00001801 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00001802 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00001803 .block_erasers =
1804 {
1805 {
1806 .eraseblocks = { {4 * 1024, 2048} },
1807 .block_erase = spi_block_erase_20,
1808 }, {
1809 .eraseblocks = { {32 * 1024, 256} },
1810 .block_erase = spi_block_erase_52,
1811 }, {
1812 .eraseblocks = { {64 * 1024, 128} },
1813 .block_erase = spi_block_erase_d8,
1814 }, {
1815 .eraseblocks = { {8 * 1024 * 1024, 1} },
1816 .block_erase = spi_block_erase_60,
1817 }, {
1818 .eraseblocks = { {8 * 1024 * 1024, 1} },
1819 .block_erase = spi_block_erase_c7,
1820 }
1821 },
hailfingerc33d4732010-07-29 13:09:18 +00001822 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Greenb2d50132019-09-16 12:26:24 +10001823 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfingerc33d4732010-07-29 13:09:18 +00001824 .write = spi_chip_write_256,
1825 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001826 .voltage = {2700, 3600},
hailfingerc33d4732010-07-29 13:09:18 +00001827 },
1828
1829 {
1830 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001831 .name = "AT25DL081",
1832 .bustype = BUS_SPI,
1833 .manufacture_id = ATMEL_ID,
1834 .model_id = ATMEL_AT25DF081,
1835 .total_size = 1024,
1836 .page_size = 256,
1837 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1838 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1839 .tested = TEST_UNTESTED,
1840 .probe = probe_spi_rdid,
1841 .probe_timing = TIMING_ZERO,
1842 .block_erasers =
1843 {
1844 {
1845 .eraseblocks = { {4 * 1024, 256} },
1846 .block_erase = spi_block_erase_20,
1847 }, {
1848 .eraseblocks = { {32 * 1024, 32} },
1849 .block_erase = spi_block_erase_52,
1850 }, {
1851 .eraseblocks = { {64 * 1024, 16} },
1852 .block_erase = spi_block_erase_d8,
1853 }, {
1854 .eraseblocks = { {1 * 1024 * 1024, 1} },
1855 .block_erase = spi_block_erase_60,
1856 }, {
1857 .eraseblocks = { {1 * 1024 * 1024, 1} },
1858 .block_erase = spi_block_erase_c7,
1859 }
1860 },
1861 .printlock = spi_prettyprint_status_register_at25df_sec,
1862 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1863 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1864 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1865 .voltage = {1650, 1950},
1866 },
1867
1868 {
1869 .vendor = "Atmel",
1870 .name = "AT25DL161",
1871 .bustype = BUS_SPI,
1872 .manufacture_id = ATMEL_ID,
1873 .model_id = ATMEL_AT25DL161,
1874 .total_size = 2048,
1875 .page_size = 256,
1876 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1877 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1878 .tested = TEST_UNTESTED,
1879 .probe = probe_spi_rdid,
1880 .probe_timing = TIMING_ZERO,
1881 .block_erasers =
1882 {
1883 {
1884 .eraseblocks = { {4 * 1024, 512} },
1885 .block_erase = spi_block_erase_20,
1886 }, {
1887 .eraseblocks = { {32 * 1024, 64} },
1888 .block_erase = spi_block_erase_52,
1889 }, {
1890 .eraseblocks = { {64 * 1024, 32} },
1891 .block_erase = spi_block_erase_d8,
1892 }, {
1893 .eraseblocks = { {2 * 1024 * 1024, 1} },
1894 .block_erase = spi_block_erase_60,
1895 }, {
1896 .eraseblocks = { {2 * 1024 * 1024, 1} },
1897 .block_erase = spi_block_erase_c7,
1898 }
1899 },
1900 .printlock = spi_prettyprint_status_register_at25df_sec,
1901 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1902 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1903 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1904 .voltage = {1650, 1950},
1905 },
1906
1907 {
1908 .vendor = "Atmel",
hailfingerc33d4732010-07-29 13:09:18 +00001909 .name = "AT25DQ161",
hailfingere1e41ea2011-07-27 07:13:06 +00001910 .bustype = BUS_SPI,
hailfingerc33d4732010-07-29 13:09:18 +00001911 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00001912 .model_id = ATMEL_AT25DQ161,
hailfingerc33d4732010-07-29 13:09:18 +00001913 .total_size = 2048,
1914 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07001915 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10001916 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerc33d4732010-07-29 13:09:18 +00001917 .tested = TEST_UNTESTED,
1918 .probe = probe_spi_rdid,
1919 .probe_timing = TIMING_ZERO,
1920 .block_erasers =
1921 {
1922 {
1923 .eraseblocks = { {4 * 1024, 512} },
1924 .block_erase = spi_block_erase_20,
1925 }, {
1926 .eraseblocks = { {32 * 1024, 64} },
1927 .block_erase = spi_block_erase_52,
1928 }, {
1929 .eraseblocks = { {64 * 1024, 32} },
1930 .block_erase = spi_block_erase_d8,
1931 }, {
1932 .eraseblocks = { {2 * 1024 * 1024, 1} },
1933 .block_erase = spi_block_erase_60,
1934 }, {
1935 .eraseblocks = { {2 * 1024 * 1024, 1} },
1936 .block_erase = spi_block_erase_c7,
1937 }
1938 },
1939 .printlock = spi_prettyprint_status_register_at25df_sec,
Alan Green64b91de2019-09-09 16:34:07 +10001940 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
hailfinger87c05482009-05-09 02:34:18 +00001941 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00001942 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00001943 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00001944 },
1945
hailfinger286829b2009-01-08 03:40:17 +00001946 {
1947 .vendor = "Atmel",
Nikolai Artemiev27a99ec2020-08-31 17:23:18 +10001948 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
1949 * All other properties seem to be the same.*/
1950 .name = "AT25F1024(A)",
1951 .bustype = BUS_SPI,
1952 .manufacture_id = ATMEL_ID,
1953 .model_id = ATMEL_AT25F1024,
1954 .total_size = 128,
1955 .page_size = 256,
1956 .feature_bits = FEATURE_WRSR_WREN,
1957 .tested = TEST_OK_PREW,
1958 .probe = probe_spi_at25f,
1959 .probe_timing = TIMING_ZERO,
1960 .block_erasers =
1961 {
1962 {
1963 .eraseblocks = { {32 * 1024, 4} },
1964 .block_erase = spi_block_erase_52,
1965 }, {
1966 .eraseblocks = { {128 * 1024, 1} },
1967 .block_erase = spi_block_erase_62,
1968 }
1969 },
1970 .printlock = spi_prettyprint_status_register_at25f,
1971 .unlock = spi_disable_blockprotect_at25f,
1972 .write = spi_chip_write_256,
1973 .read = spi_chip_read,
1974 .voltage = {2700, 3600},
1975 },
1976
1977 {
1978 .vendor = "Atmel",
1979 .name = "AT25F2048",
1980 .bustype = BUS_SPI,
1981 .manufacture_id = ATMEL_ID,
1982 .model_id = ATMEL_AT25F2048,
1983 .total_size = 256,
1984 .page_size = 256,
1985 .feature_bits = FEATURE_WRSR_WREN,
1986 .tested = TEST_UNTESTED,
1987 .probe = probe_spi_at25f,
1988 .probe_timing = TIMING_ZERO,
1989 .block_erasers =
1990 {
1991 {
1992 .eraseblocks = { {64 * 1024, 4} },
1993 .block_erase = spi_block_erase_52,
1994 }, {
1995 .eraseblocks = { {256 * 1024, 1} },
1996 .block_erase = spi_block_erase_62,
1997 }
1998 },
1999 .printlock = spi_prettyprint_status_register_at25f,
2000 .unlock = spi_disable_blockprotect_at25f,
2001 .write = spi_chip_write_256,
2002 .read = spi_chip_read,
2003 .voltage = {2700, 3600},
2004 },
2005
2006 {
2007 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002008 .name = "AT25F4096",
2009 .bustype = BUS_SPI,
2010 .manufacture_id = ATMEL_ID,
2011 .model_id = ATMEL_AT25F4096,
2012 .total_size = 512,
2013 .page_size = 256,
2014 .feature_bits = FEATURE_WRSR_WREN,
2015 .tested = TEST_OK_PREW,
2016 .probe = probe_spi_at25f,
2017 .probe_timing = TIMING_ZERO,
2018 .block_erasers =
2019 {
2020 {
2021 .eraseblocks = { {64 * 1024, 8} },
2022 .block_erase = spi_block_erase_52,
2023 }, {
2024 .eraseblocks = { {512 * 1024, 1} },
2025 .block_erase = spi_block_erase_62,
2026 }
2027 },
2028 .printlock = spi_prettyprint_status_register_at25f4096,
2029 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2030 .unlock = spi_disable_blockprotect_bp2_srwd,
2031 .write = spi_chip_write_256,
2032 .read = spi_chip_read,
2033 .voltage = {2700, 3600},
2034 },
2035
2036 {
2037 .vendor = "Atmel",
2038 .name = "AT25F512",
2039 .bustype = BUS_SPI,
2040 .manufacture_id = ATMEL_ID,
2041 .model_id = ATMEL_AT25F512,
2042 .total_size = 64,
2043 .page_size = 256,
2044 .feature_bits = FEATURE_WRSR_WREN,
2045 .tested = TEST_OK_PREW,
2046 .probe = probe_spi_at25f,
2047 .probe_timing = TIMING_ZERO,
2048 .block_erasers =
2049 {
2050 {
2051 .eraseblocks = { {32 * 1024, 2} },
2052 .block_erase = spi_block_erase_52,
2053 }, {
2054 .eraseblocks = { {64 * 1024, 1} },
2055 .block_erase = spi_block_erase_62,
2056 }
2057 },
2058 .printlock = spi_prettyprint_status_register_at25f,
2059 .unlock = spi_disable_blockprotect_at25f,
2060 .write = spi_chip_write_256,
2061 .read = spi_chip_read,
2062 .voltage = {2700, 3600},
2063 },
2064
2065 {
2066 .vendor = "Atmel",
2067 .name = "AT25F512A",
2068 .bustype = BUS_SPI,
2069 .manufacture_id = ATMEL_ID,
2070 .model_id = ATMEL_AT25F512A,
2071 .total_size = 64,
2072 .page_size = 128,
2073 .feature_bits = FEATURE_WRSR_WREN,
2074 .tested = TEST_OK_PREW,
2075 .probe = probe_spi_at25f,
2076 .probe_timing = TIMING_ZERO,
2077 .block_erasers =
2078 {
2079 {
2080 .eraseblocks = { {32 * 1024, 2} },
2081 .block_erase = spi_block_erase_52,
2082 }, {
2083 .eraseblocks = { {64 * 1024, 1} },
2084 .block_erase = spi_block_erase_62,
2085 }
2086 },
2087 .printlock = spi_prettyprint_status_register_at25f512a,
2088 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2089 .unlock = spi_disable_blockprotect_at25f512a,
2090 .write = spi_chip_write_256,
2091 .read = spi_chip_read,
2092 .voltage = {2700, 3600},
2093 },
2094
2095 {
2096 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002097 .name = "AT25F512B",
hailfingere1e41ea2011-07-27 07:13:06 +00002098 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002099 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002100 .model_id = ATMEL_AT25F512B,
hailfinger286829b2009-01-08 03:40:17 +00002101 .total_size = 64,
2102 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07002103 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Edward O'Callaghan27486212019-07-26 21:59:55 +10002104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger286829b2009-01-08 03:40:17 +00002105 .tested = TEST_UNTESTED,
2106 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002107 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002108 .block_erasers =
2109 {
2110 {
2111 .eraseblocks = { {4 * 1024, 16} },
2112 .block_erase = spi_block_erase_20,
2113 }, {
2114 .eraseblocks = { {32 * 1024, 2} },
2115 .block_erase = spi_block_erase_52,
2116 }, {
2117 .eraseblocks = { {32 * 1024, 2} },
2118 .block_erase = spi_block_erase_d8,
2119 }, {
2120 .eraseblocks = { {64 * 1024, 1} },
2121 .block_erase = spi_block_erase_60,
2122 }, {
2123 .eraseblocks = { {64 * 1024, 1} },
2124 .block_erase = spi_block_erase_c7,
Alan Green5d709732019-09-16 12:32:25 +10002125 }, {
2126 .eraseblocks = { {64 * 1024, 1} },
2127 .block_erase = spi_block_erase_62,
hailfinger22155a82009-12-23 12:02:55 +00002128 }
2129 },
Alan Green5d709732019-09-16 12:32:25 +10002130 .printlock = spi_prettyprint_status_register_at25f512b,
2131 .unlock = spi_disable_blockprotect_at25f512b,
hailfinger87c05482009-05-09 02:34:18 +00002132 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002133 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002134 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002135 },
2136
hailfinger286829b2009-01-08 03:40:17 +00002137 {
2138 .vendor = "Atmel",
2139 .name = "AT25FS010",
hailfingere1e41ea2011-07-27 07:13:06 +00002140 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002141 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002142 .model_id = ATMEL_AT25FS010,
hailfinger286829b2009-01-08 03:40:17 +00002143 .total_size = 128,
2144 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002145 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002146 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002147 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002148 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002149 .block_erasers =
2150 {
2151 {
2152 .eraseblocks = { {4 * 1024, 32} },
2153 .block_erase = spi_block_erase_20,
2154 }, {
hailfingerc33d4732010-07-29 13:09:18 +00002155 .eraseblocks = { {4 * 1024, 32} },
2156 .block_erase = spi_block_erase_d7,
2157 }, {
hailfinger22155a82009-12-23 12:02:55 +00002158 .eraseblocks = { {32 * 1024, 4} },
2159 .block_erase = spi_block_erase_52,
2160 }, {
2161 .eraseblocks = { {32 * 1024, 4} },
2162 .block_erase = spi_block_erase_d8,
2163 }, {
2164 .eraseblocks = { {128 * 1024, 1} },
2165 .block_erase = spi_block_erase_60,
2166 }, {
2167 .eraseblocks = { {128 * 1024, 1} },
2168 .block_erase = spi_block_erase_c7,
2169 }
2170 },
hailfingerc33d4732010-07-29 13:09:18 +00002171 .printlock = spi_prettyprint_status_register_at25fs010,
2172 .unlock = spi_disable_blockprotect_at25fs010,
hailfinger87c05482009-05-09 02:34:18 +00002173 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002174 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002175 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002176 },
2177
hailfinger286829b2009-01-08 03:40:17 +00002178 {
2179 .vendor = "Atmel",
2180 .name = "AT25FS040",
hailfingere1e41ea2011-07-27 07:13:06 +00002181 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002182 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002183 .model_id = ATMEL_AT25FS040,
hailfinger286829b2009-01-08 03:40:17 +00002184 .total_size = 512,
2185 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002186 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00002187 .tested = TEST_UNTESTED,
2188 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002189 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002190 .block_erasers =
2191 {
2192 {
2193 .eraseblocks = { {4 * 1024, 128} },
2194 .block_erase = spi_block_erase_20,
2195 }, {
2196 .eraseblocks = { {64 * 1024, 8} },
2197 .block_erase = spi_block_erase_52,
2198 }, {
2199 .eraseblocks = { {64 * 1024, 8} },
2200 .block_erase = spi_block_erase_d8,
2201 }, {
2202 .eraseblocks = { {512 * 1024, 1} },
2203 .block_erase = spi_block_erase_60,
2204 }, {
2205 .eraseblocks = { {512 * 1024, 1} },
2206 .block_erase = spi_block_erase_c7,
2207 }
2208 },
hailfingerc33d4732010-07-29 13:09:18 +00002209 .printlock = spi_prettyprint_status_register_at25fs040,
2210 .unlock = spi_disable_blockprotect_at25fs040,
hailfinger87c05482009-05-09 02:34:18 +00002211 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002212 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002213 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002214 },
2215
hailfinger286829b2009-01-08 03:40:17 +00002216 {
2217 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002218 .name = "AT25SF041",
2219 .bustype = BUS_SPI,
2220 .manufacture_id = ATMEL_ID,
2221 .model_id = ATMEL_AT25SF041,
2222 .total_size = 512,
2223 .page_size = 256,
2224 .feature_bits = FEATURE_WRSR_WREN,
2225 .tested = TEST_OK_PREW,
2226 .probe = probe_spi_rdid,
2227 .probe_timing = TIMING_ZERO,
2228 .block_erasers =
2229 {
2230 {
2231 .eraseblocks = { {4 * 1024, 128} },
2232 .block_erase = spi_block_erase_20,
2233 }, {
2234 .eraseblocks = { {32 * 1024, 16} },
2235 .block_erase = spi_block_erase_52,
2236 }, {
2237 .eraseblocks = { {64 * 1024, 8} },
2238 .block_erase = spi_block_erase_d8,
2239 }, {
2240 .eraseblocks = { {512 * 1024, 1} },
2241 .block_erase = spi_block_erase_60,
2242 }, {
2243 .eraseblocks = { {512 * 1024, 1} },
2244 .block_erase = spi_block_erase_c7,
2245 }
2246 },
2247 .printlock = spi_prettyprint_status_register_plain,
2248 .unlock = spi_disable_blockprotect,
2249 .write = spi_chip_write_256,
2250 .read = spi_chip_read,
2251 .voltage = {2500, 3600},
2252 },
2253
2254 {
2255 .vendor = "Atmel",
2256 .name = "AT25SF081",
2257 .bustype = BUS_SPI,
2258 .manufacture_id = ATMEL_ID,
2259 .model_id = ATMEL_AT25SF081,
2260 .total_size = 1024,
2261 .page_size = 256,
2262 .feature_bits = FEATURE_WRSR_WREN,
2263 .tested = TEST_OK_PREW,
2264 .probe = probe_spi_rdid,
2265 .probe_timing = TIMING_ZERO,
2266 .block_erasers =
2267 {
2268 {
2269 .eraseblocks = { {4 * 1024, 256} },
2270 .block_erase = spi_block_erase_20,
2271 }, {
2272 .eraseblocks = { {32 * 1024, 32} },
2273 .block_erase = spi_block_erase_52,
2274 }, {
2275 .eraseblocks = { {64 * 1024, 16} },
2276 .block_erase = spi_block_erase_d8,
2277 }, {
2278 .eraseblocks = { {1024 * 1024, 1} },
2279 .block_erase = spi_block_erase_60,
2280 }, {
2281 .eraseblocks = { {1024 * 1024, 1} },
2282 .block_erase = spi_block_erase_c7,
2283 }
2284 },
2285 .printlock = spi_prettyprint_status_register_plain,
2286 .unlock = spi_disable_blockprotect,
2287 .write = spi_chip_write_256,
2288 .read = spi_chip_read,
2289 .voltage = {2300, 3600},
2290 },
2291
2292 {
2293 .vendor = "Atmel",
Alan Greenab43dc02019-08-06 15:56:21 +10002294 .name = "AT25SF128A",
2295 .bustype = BUS_SPI,
2296 .manufacture_id = ATMEL_ID,
2297 .model_id = ATMEL_AT25SF128A,
2298 .total_size = 16384,
2299 .page_size = 256,
2300 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green597a4122019-09-02 10:57:28 +10002301 .tested = TEST_OK_PR,
Alan Greenab43dc02019-08-06 15:56:21 +10002302 .probe = probe_spi_rdid,
2303 .probe_timing = TIMING_ZERO,
2304 .block_erasers =
2305 {
2306 {
2307 .eraseblocks = { {4 * 1024, 4096} },
2308 .block_erase = spi_block_erase_20,
2309 }, {
2310 .eraseblocks = { {32 * 1024, 512} },
2311 .block_erase = spi_block_erase_52,
2312 }, {
2313 .eraseblocks = { {64 * 1024, 256} },
2314 .block_erase = spi_block_erase_d8,
2315 }, {
2316 .eraseblocks = { {16 * 1024 * 1024, 1} },
2317 .block_erase = spi_block_erase_60,
2318 }, {
2319 .eraseblocks = { {16 * 1024 * 1024, 1} },
2320 .block_erase = spi_block_erase_c7,
2321 }
2322 },
Alan Green597a4122019-09-02 10:57:28 +10002323 .printlock = spi_prettyprint_status_register_bp4_srwd,
2324 .unlock = spi_disable_blockprotect_bp4_srwd,
Alan Greenab43dc02019-08-06 15:56:21 +10002325 .write = spi_chip_write_256,
2326 .read = spi_chip_read,
2327 .voltage = {1700, 2000},
2328 .wp = &wp_w25q,
2329 },
2330
2331 {
2332 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10002333 .name = "AT25SF161",
2334 .bustype = BUS_SPI,
2335 .manufacture_id = ATMEL_ID,
2336 .model_id = ATMEL_AT25SF161,
2337 .total_size = 2048,
2338 .page_size = 256,
2339 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2340 .tested = TEST_OK_PREW,
2341 .probe = probe_spi_rdid,
2342 .probe_timing = TIMING_ZERO,
2343 .block_erasers =
2344 {
2345 {
2346 .eraseblocks = { {4 * 1024, 512} },
2347 .block_erase = spi_block_erase_20,
2348 }, {
2349 .eraseblocks = { {32 * 1024, 64} },
2350 .block_erase = spi_block_erase_52,
2351 }, {
2352 .eraseblocks = { {64 * 1024, 32} },
2353 .block_erase = spi_block_erase_d8,
2354 }, {
2355 .eraseblocks = { {2048 * 1024, 1} },
2356 .block_erase = spi_block_erase_60,
2357 }, {
2358 .eraseblocks = { {2048 * 1024, 1} },
2359 .block_erase = spi_block_erase_c7,
2360 }
2361 },
2362 .printlock = spi_prettyprint_status_register_plain,
2363 .unlock = spi_disable_blockprotect,
2364 .write = spi_chip_write_256,
2365 .read = spi_chip_read,
2366 .voltage = {2500, 3600},
2367 },
2368
2369 {
2370 .vendor = "Atmel",
darkarniumdfec39a2019-11-04 20:06:48 +00002371 .name = "AT25SF321",
2372 .bustype = BUS_SPI,
2373 .manufacture_id = ATMEL_ID,
2374 .model_id = ATMEL_AT25SF321,
2375 .total_size = 4096,
2376 .page_size = 256,
2377 .feature_bits = FEATURE_WRSR_WREN,
2378 .tested = TEST_OK_PR,
2379 .probe = probe_spi_rdid,
2380 .probe_timing = TIMING_ZERO,
2381 .block_erasers =
2382 {
2383 {
2384 .eraseblocks = { {4 * 1024, 1024} },
2385 .block_erase = spi_block_erase_20,
2386 }, {
2387 .eraseblocks = { {32 * 1024, 128} },
2388 .block_erase = spi_block_erase_52,
2389 }, {
2390 .eraseblocks = { {64 * 1024, 64} },
2391 .block_erase = spi_block_erase_d8,
2392 }, {
2393 .eraseblocks = { {4096 * 1024, 1} },
2394 .block_erase = spi_block_erase_60,
2395 }, {
2396 .eraseblocks = { {4096 * 1024, 1} },
2397 .block_erase = spi_block_erase_c7,
2398 }
2399 },
2400 .printlock = spi_prettyprint_status_register_plain,
2401 .unlock = spi_disable_blockprotect,
2402 .write = spi_chip_write_256,
2403 .read = spi_chip_read,
2404 .voltage = {2500, 3600},
2405 },
2406
2407 {
2408 .vendor = "Atmel",
Alan Greenab43dc02019-08-06 15:56:21 +10002409 .name = "AT25SL128A",
2410 .bustype = BUS_SPI,
2411 .manufacture_id = ATMEL_ID,
2412 .model_id = ATMEL_AT25SL128A,
2413 .total_size = 16384,
2414 .page_size = 256,
2415 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2416 .tested = TEST_OK_PREW,
2417 .probe = probe_spi_rdid,
2418 .probe_timing = TIMING_ZERO,
2419 .block_erasers =
2420 {
2421 {
2422 .eraseblocks = { {4 * 1024, 4096} },
2423 .block_erase = spi_block_erase_20,
2424 }, {
2425 .eraseblocks = { {32 * 1024, 512} },
2426 .block_erase = spi_block_erase_52,
2427 }, {
2428 .eraseblocks = { {64 * 1024, 256} },
2429 .block_erase = spi_block_erase_d8,
2430 }, {
2431 .eraseblocks = { {16 * 1024 * 1024, 1} },
2432 .block_erase = spi_block_erase_60,
2433 }, {
2434 .eraseblocks = { {16 * 1024 * 1024, 1} },
2435 .block_erase = spi_block_erase_c7,
2436 }
2437 },
2438 .printlock = spi_prettyprint_status_register_at25df,
2439 .unlock = spi_disable_blockprotect_at25df,
2440 .write = spi_chip_write_256,
2441 .read = spi_chip_read,
2442 .voltage = {1700, 2000},
2443 .wp = &wp_w25q,
2444 },
2445
2446 {
2447 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002448 .name = "AT26DF041",
hailfingere1e41ea2011-07-27 07:13:06 +00002449 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002450 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002451 .model_id = ATMEL_AT26DF041,
hailfinger286829b2009-01-08 03:40:17 +00002452 .total_size = 512,
2453 .page_size = 256,
Alan Green1fdf13b2019-09-16 12:54:45 +10002454 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2455 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002456 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002457 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002458 .block_erasers =
2459 {
2460 {
Alan Green1fdf13b2019-09-16 12:54:45 +10002461 .eraseblocks = { {256, 2048} },
2462 .block_erase = spi_block_erase_81,
2463 }, {
2464 .eraseblocks = { {2 * 1024, 256} },
2465 .block_erase = spi_block_erase_50,
2466 }, {
hailfinger22155a82009-12-23 12:02:55 +00002467 .eraseblocks = { {4 * 1024, 128} },
2468 .block_erase = spi_block_erase_20,
2469 }
2470 },
Alan Green6cfd0182019-07-26 13:50:04 +10002471 .printlock = spi_prettyprint_status_register_plain,
Alan Green1fdf13b2019-09-16 12:54:45 +10002472 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
2473 .write = spi_chip_write_1,
2474 .read = spi_chip_read, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002475 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
stepanaa1b6a22008-12-08 18:15:10 +00002476 },
2477
hailfinger286829b2009-01-08 03:40:17 +00002478 {
2479 .vendor = "Atmel",
2480 .name = "AT26DF081A",
hailfingere1e41ea2011-07-27 07:13:06 +00002481 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002482 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002483 .model_id = ATMEL_AT26DF081A,
hailfinger286829b2009-01-08 03:40:17 +00002484 .total_size = 1024,
2485 .page_size = 256,
krause9d38a2f2011-01-17 07:45:54 +00002486 .feature_bits = FEATURE_WRSR_WREN,
2487 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002488 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002489 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002490 .block_erasers =
2491 {
2492 {
2493 .eraseblocks = { {4 * 1024, 256} },
2494 .block_erase = spi_block_erase_20,
2495 }, {
2496 .eraseblocks = { {32 * 1024, 32} },
2497 .block_erase = spi_block_erase_52,
2498 }, {
2499 .eraseblocks = { {64 * 1024, 16} },
2500 .block_erase = spi_block_erase_d8,
2501 }, {
2502 .eraseblocks = { {1024 * 1024, 1} },
2503 .block_erase = spi_block_erase_60,
2504 }, {
2505 .eraseblocks = { {1024 * 1024, 1} },
2506 .block_erase = spi_block_erase_c7,
2507 }
2508 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002509 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Green64b91de2019-09-09 16:34:07 +10002510 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002511 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002512 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002513 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002514 },
2515
hailfinger286829b2009-01-08 03:40:17 +00002516 {
2517 .vendor = "Atmel",
2518 .name = "AT26DF161",
hailfingere1e41ea2011-07-27 07:13:06 +00002519 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002520 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002521 .model_id = ATMEL_AT26DF161,
hailfinger286829b2009-01-08 03:40:17 +00002522 .total_size = 2048,
2523 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002524 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10002525 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002526 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002527 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002528 .block_erasers =
2529 {
2530 {
2531 .eraseblocks = { {4 * 1024, 512} },
2532 .block_erase = spi_block_erase_20,
2533 }, {
2534 .eraseblocks = { {32 * 1024, 64} },
2535 .block_erase = spi_block_erase_52,
2536 }, {
2537 .eraseblocks = { {64 * 1024, 32} },
2538 .block_erase = spi_block_erase_d8,
2539 }, {
2540 .eraseblocks = { {2 * 1024 * 1024, 1} },
2541 .block_erase = spi_block_erase_60,
2542 }, {
2543 .eraseblocks = { {2 * 1024 * 1024, 1} },
2544 .block_erase = spi_block_erase_c7,
2545 }
2546 },
hailfinger7533bc82011-05-19 00:06:06 +00002547 .printlock = spi_prettyprint_status_register_at25df,
Alan Greenb2d50132019-09-16 12:26:24 +10002548 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002549 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002550 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002551 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002552 },
2553
hailfinger286829b2009-01-08 03:40:17 +00002554 {
2555 .vendor = "Atmel",
2556 .name = "AT26DF161A",
hailfingere1e41ea2011-07-27 07:13:06 +00002557 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002558 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002559 .model_id = ATMEL_AT26DF161A,
hailfinger286829b2009-01-08 03:40:17 +00002560 .total_size = 2048,
2561 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002562 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenb2d50132019-09-16 12:26:24 +10002563 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002564 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002565 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002566 .block_erasers =
2567 {
2568 {
2569 .eraseblocks = { {4 * 1024, 512} },
2570 .block_erase = spi_block_erase_20,
2571 }, {
2572 .eraseblocks = { {32 * 1024, 64} },
2573 .block_erase = spi_block_erase_52,
2574 }, {
2575 .eraseblocks = { {64 * 1024, 32} },
2576 .block_erase = spi_block_erase_d8,
2577 }, {
2578 .eraseblocks = { {2 * 1024 * 1024, 1} },
2579 .block_erase = spi_block_erase_60,
2580 }, {
2581 .eraseblocks = { {2 * 1024 * 1024, 1} },
2582 .block_erase = spi_block_erase_c7,
2583 }
2584 },
Edward O'Callaghanb5dee7a2019-03-05 13:32:51 +11002585 .printlock = spi_prettyprint_status_register_at26df081a,
Alan Greenb2d50132019-09-16 12:26:24 +10002586 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
hailfinger87c05482009-05-09 02:34:18 +00002587 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00002588 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002589 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002590 },
2591
hailfinger286829b2009-01-08 03:40:17 +00002592 {
2593 .vendor = "Atmel",
2594 .name = "AT26F004",
hailfingere1e41ea2011-07-27 07:13:06 +00002595 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002596 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002597 .model_id = ATMEL_AT26F004,
hailfinger286829b2009-01-08 03:40:17 +00002598 .total_size = 512,
2599 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10002600 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10002601 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
hailfinger286829b2009-01-08 03:40:17 +00002602 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002603 .probe_timing = TIMING_ZERO,
hailfinger22155a82009-12-23 12:02:55 +00002604 .block_erasers =
2605 {
2606 {
2607 .eraseblocks = { {4 * 1024, 128} },
2608 .block_erase = spi_block_erase_20,
2609 }, {
2610 .eraseblocks = { {32 * 1024, 16} },
2611 .block_erase = spi_block_erase_52,
2612 }, {
2613 .eraseblocks = { {64 * 1024, 8} },
2614 .block_erase = spi_block_erase_d8,
2615 }, {
2616 .eraseblocks = { {512 * 1024, 1} },
2617 .block_erase = spi_block_erase_60,
2618 }, {
2619 .eraseblocks = { {512 * 1024, 1} },
2620 .block_erase = spi_block_erase_c7,
2621 }
2622 },
Alan Green6cfd0182019-07-26 13:50:04 +10002623 .printlock = spi_prettyprint_status_register_plain,
Alan Greenab57f8f2019-07-09 12:42:39 +10002624 .write = NULL, /* Incompatible Page write */
hailfinger286829b2009-01-08 03:40:17 +00002625 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00002626 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00002627 },
2628
hailfinger286829b2009-01-08 03:40:17 +00002629 {
2630 .vendor = "Atmel",
uweb3a82ef2009-05-16 21:39:19 +00002631 .name = "AT29C010A",
hailfingere1e41ea2011-07-27 07:13:06 +00002632 .bustype = BUS_PARALLEL,
uweb3a82ef2009-05-16 21:39:19 +00002633 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002634 .model_id = ATMEL_AT29C010A,
uweb3a82ef2009-05-16 21:39:19 +00002635 .total_size = 128,
2636 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +00002637 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +00002638 .tested = TEST_OK_PRE,
uweb3a82ef2009-05-16 21:39:19 +00002639 .probe = probe_jedec,
hailfingerd5b35922009-06-03 14:46:22 +00002640 .probe_timing = 10000, /* 10mS, Enter=Exec */
hailfinger22155a82009-12-23 12:02:55 +00002641 .block_erasers =
2642 {
2643 {
2644 .eraseblocks = { {128 * 1024, 1} },
2645 .block_erase = erase_chip_block_jedec,
2646 }
2647 },
uweb3a82ef2009-05-16 21:39:19 +00002648 .write = write_jedec, /* FIXME */
2649 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002650 .voltage = {4500, 5500},
uweb3a82ef2009-05-16 21:39:19 +00002651 },
2652
2653 {
2654 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002655 .name = "AT29C020",
hailfingere1e41ea2011-07-27 07:13:06 +00002656 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002657 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002658 .model_id = ATMEL_AT29C020,
hailfinger286829b2009-01-08 03:40:17 +00002659 .total_size = 256,
2660 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002661 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10002662 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00002663 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +00002664 .probe_timing = 10000, /* 10ms */
hailfinger22155a82009-12-23 12:02:55 +00002665 .block_erasers =
2666 {
2667 {
2668 .eraseblocks = { {256 * 1024, 1} },
2669 .block_erase = erase_chip_block_jedec,
2670 }
2671 },
hailfinger286829b2009-01-08 03:40:17 +00002672 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002673 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002674 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002675 },
2676
hailfinger286829b2009-01-08 03:40:17 +00002677 {
2678 .vendor = "Atmel",
2679 .name = "AT29C040A",
hailfingere1e41ea2011-07-27 07:13:06 +00002680 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00002681 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002682 .model_id = ATMEL_AT29C040A,
hailfinger286829b2009-01-08 03:40:17 +00002683 .total_size = 512,
2684 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00002685 .feature_bits = FEATURE_LONG_RESET,
hailfinger286829b2009-01-08 03:40:17 +00002686 .tested = TEST_UNTESTED,
2687 .probe = probe_jedec,
hailfingerf850e0a2009-06-12 21:29:36 +00002688 .probe_timing = 10000, /* 10 ms */
hailfinger22155a82009-12-23 12:02:55 +00002689 .block_erasers =
2690 {
2691 {
2692 .eraseblocks = { {512 * 1024, 1} },
2693 .block_erase = erase_chip_block_jedec,
2694 }
2695 },
hailfinger286829b2009-01-08 03:40:17 +00002696 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +00002697 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00002698 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00002699 },
2700
hailfinger286829b2009-01-08 03:40:17 +00002701 {
2702 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10002703 .name = "AT29C512",
2704 .bustype = BUS_PARALLEL,
2705 .manufacture_id = ATMEL_ID,
2706 .model_id = ATMEL_AT29C512,
2707 .total_size = 64,
2708 .page_size = 128,
2709 .feature_bits = FEATURE_LONG_RESET,
2710 .tested = TEST_OK_PREW,
2711 .probe = probe_jedec,
2712 .probe_timing = 10000, /* 10mS, Enter=Exec */
2713 .block_erasers =
2714 {
2715 {
2716 .eraseblocks = { {64 * 1024, 1} },
2717 .block_erase = erase_chip_block_jedec,
2718 }
2719 },
2720 .write = write_jedec,
2721 .read = read_memmapped,
2722 .voltage = {4500, 5500},
2723 },
2724
2725 {
2726 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00002727 .name = "AT45CS1282",
hailfingere1e41ea2011-07-27 07:13:06 +00002728 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002729 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002730 .model_id = ATMEL_AT45CS1282,
Alan Greenab57f8f2019-07-09 12:42:39 +10002731 .total_size = 16896, /* No power of two sizes */
2732 .page_size = 1056, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002733 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2734 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2735 .feature_bits = FEATURE_OTP,
2736 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002737 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002738 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002739 .block_erasers =
2740 {
2741 {
2742 .eraseblocks = {
2743 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2744 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2745 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2746 },
2747 .block_erase = spi_erase_at45cs_sector,
2748 }
2749 },
Alan Green6cfd0182019-07-26 13:50:04 +10002750 .printlock = spi_prettyprint_status_register_plain,
Alan Greendad2dae2019-09-16 15:55:08 +10002751 .write = spi_write_at45db,
2752 .read = spi_read_at45db,
stefanct7e00e222011-06-03 07:26:31 +00002753 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10002754 .gran = write_gran_1056bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00002755 },
stepanaa1b6a22008-12-08 18:15:10 +00002756
hailfinger286829b2009-01-08 03:40:17 +00002757 {
2758 .vendor = "Atmel",
2759 .name = "AT45DB011D",
hailfingere1e41ea2011-07-27 07:13:06 +00002760 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002761 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002762 .model_id = ATMEL_AT45DB011D,
Alan Greendad2dae2019-09-16 15:55:08 +10002763 .total_size = 128, /* or 132, determined from status register */
2764 .page_size = 256, /* or 264, determined from status register */
2765 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2766 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2767 .feature_bits = FEATURE_OTP,
2768 .tested = TEST_OK_PREW,
2769 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002770 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002771 .block_erasers =
2772 {
2773 {
2774 .eraseblocks = { {256, 512} },
2775 .block_erase = spi_erase_at45db_page,
2776 }, {
2777 .eraseblocks = { {8 * 256, 512/8} },
2778 .block_erase = spi_erase_at45db_block,
2779 }, {
2780 .eraseblocks = {
2781 {8 * 256, 1},
2782 {120 * 256, 1},
2783 {128 * 256, 3},
2784 },
2785 .block_erase = spi_erase_at45db_sector
2786 }, {
2787 .eraseblocks = { {128 * 1024, 1} },
2788 .block_erase = spi_erase_at45db_chip,
2789 }
2790 },
2791 .printlock = spi_prettyprint_status_register_at45db,
2792 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2793 /* granularity will be set by the probing function. */
2794 .write = spi_write_at45db,
2795 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002796 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002797 },
stepanaa1b6a22008-12-08 18:15:10 +00002798
hailfinger286829b2009-01-08 03:40:17 +00002799 {
2800 .vendor = "Atmel",
2801 .name = "AT45DB021D",
hailfingere1e41ea2011-07-27 07:13:06 +00002802 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002803 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002804 .model_id = ATMEL_AT45DB021D,
Alan Greendad2dae2019-09-16 15:55:08 +10002805 .total_size = 256, /* or 264, determined from status register */
2806 .page_size = 256, /* or 264, determined from status register */
2807 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2808 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2809 .feature_bits = FEATURE_OTP,
2810 .tested = TEST_OK_PREW,
2811 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002812 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002813 .block_erasers =
2814 {
2815 {
2816 .eraseblocks = { {256, 1024} },
2817 .block_erase = spi_erase_at45db_page,
2818 }, {
2819 .eraseblocks = { {8 * 256, 1024/8} },
2820 .block_erase = spi_erase_at45db_block,
2821 }, {
2822 .eraseblocks = {
2823 {8 * 256, 1},
2824 {120 * 256, 1},
2825 {128 * 256, 7},
2826 },
2827 .block_erase = spi_erase_at45db_sector
2828 }, {
2829 .eraseblocks = { {256 * 1024, 1} },
2830 .block_erase = spi_erase_at45db_chip,
2831 }
2832 },
2833 .printlock = spi_prettyprint_status_register_at45db,
2834 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2835 /* granularity will be set by the probing function. */
2836 .write = spi_write_at45db,
2837 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00002838 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00002839 },
stepanaa1b6a22008-12-08 18:15:10 +00002840
hailfinger286829b2009-01-08 03:40:17 +00002841 {
2842 .vendor = "Atmel",
2843 .name = "AT45DB041D",
hailfingere1e41ea2011-07-27 07:13:06 +00002844 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002845 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002846 .model_id = ATMEL_AT45DB041D,
Alan Greendad2dae2019-09-16 15:55:08 +10002847 .total_size = 512, /* or 528, determined from status register */
2848 .page_size = 256, /* or 264, determined from status register */
2849 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2850 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2851 .feature_bits = FEATURE_OTP,
2852 .tested = TEST_OK_PREW,
2853 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002854 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002855 .block_erasers =
2856 {
2857 {
2858 .eraseblocks = { {256, 2048} },
2859 .block_erase = spi_erase_at45db_page,
2860 }, {
2861 .eraseblocks = { {8 * 256, 2048/8} },
2862 .block_erase = spi_erase_at45db_block,
2863 }, {
2864 .eraseblocks = {
2865 {8 * 256, 1},
2866 {248 * 256, 1},
2867 {256 * 256, 7},
2868 },
2869 .block_erase = spi_erase_at45db_sector
2870 }, {
2871 .eraseblocks = { {512 * 1024, 1} },
2872 .block_erase = spi_erase_at45db_chip,
2873 }
2874 },
2875 .printlock = spi_prettyprint_status_register_at45db,
2876 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2877 /* granularity will be set by the probing function. */
2878 .write = spi_write_at45db,
2879 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Alan Green5dc48da2019-08-26 15:35:10 +10002880 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002881 },
stepanaa1b6a22008-12-08 18:15:10 +00002882
hailfinger286829b2009-01-08 03:40:17 +00002883 {
2884 .vendor = "Atmel",
2885 .name = "AT45DB081D",
hailfingere1e41ea2011-07-27 07:13:06 +00002886 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002887 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002888 .model_id = ATMEL_AT45DB081D,
Alan Greendad2dae2019-09-16 15:55:08 +10002889 .total_size = 1024, /* or 1056, determined from status register */
2890 .page_size = 256, /* or 264, determined from status register */
2891 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2892 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2893 .feature_bits = FEATURE_OTP,
2894 .tested = TEST_OK_PREW,
2895 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002896 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002897 .block_erasers =
2898 {
2899 {
2900 .eraseblocks = { {256, 4096} },
2901 .block_erase = spi_erase_at45db_page,
2902 }, {
2903 .eraseblocks = { {8 * 256, 4096/8} },
2904 .block_erase = spi_erase_at45db_block,
2905 }, {
2906 .eraseblocks = {
2907 {8 * 256, 1},
2908 {248 * 256, 1},
2909 {256 * 256, 15},
2910 },
2911 .block_erase = spi_erase_at45db_sector
2912 }, {
2913 .eraseblocks = { {1024 * 1024, 1} },
2914 .block_erase = spi_erase_at45db_chip,
2915 }
2916 },
2917 .printlock = spi_prettyprint_status_register_at45db,
2918 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2919 /* granularity will be set by the probing function. */
2920 .write = spi_write_at45db,
2921 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002922 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002923 },
stepanaa1b6a22008-12-08 18:15:10 +00002924
hailfinger286829b2009-01-08 03:40:17 +00002925 {
2926 .vendor = "Atmel",
2927 .name = "AT45DB161D",
hailfingere1e41ea2011-07-27 07:13:06 +00002928 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002929 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002930 .model_id = ATMEL_AT45DB161D,
Alan Greendad2dae2019-09-16 15:55:08 +10002931 .total_size = 2048, /* or 2112, determined from status register */
2932 .page_size = 512, /* or 528, determined from status register */
2933 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2934 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2935 .feature_bits = FEATURE_OTP,
2936 .tested = TEST_OK_PREW,
2937 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00002938 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002939 .block_erasers =
2940 {
2941 {
2942 .eraseblocks = { {512, 4096} },
2943 .block_erase = spi_erase_at45db_page,
2944 }, {
2945 .eraseblocks = { {8 * 512, 4096/8} },
2946 .block_erase = spi_erase_at45db_block,
2947 }, {
2948 .eraseblocks = {
2949 {8 * 512, 1},
2950 {248 * 512, 1},
2951 {256 * 512, 15},
2952 },
2953 .block_erase = spi_erase_at45db_sector
2954 }, {
2955 .eraseblocks = { {2048 * 1024, 1} },
2956 .block_erase = spi_erase_at45db_chip,
2957 }
2958 },
2959 .printlock = spi_prettyprint_status_register_at45db,
2960 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
2961 /* granularity will be set by the probing function. */
2962 .write = spi_write_at45db,
2963 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct66c8c1b2011-07-19 08:50:18 +00002964 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00002965 },
stepanaa1b6a22008-12-08 18:15:10 +00002966
hailfinger286829b2009-01-08 03:40:17 +00002967 {
2968 .vendor = "Atmel",
2969 .name = "AT45DB321C",
hailfingere1e41ea2011-07-27 07:13:06 +00002970 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00002971 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00002972 .model_id = ATMEL_AT45DB321C,
Alan Greenab57f8f2019-07-09 12:42:39 +10002973 .total_size = 4224, /* No power of two sizes */
2974 .page_size = 528, /* No power of two sizes */
Alan Greendad2dae2019-09-16 15:55:08 +10002975 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
2976 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2977 .feature_bits = FEATURE_OTP,
2978 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +00002979 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00002980 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10002981 .block_erasers =
2982 {
2983 {
2984 .eraseblocks = { {528, 8192} },
2985 .block_erase = spi_erase_at45db_page,
2986 }, {
2987 .eraseblocks = { {8 * 528, 8192/8} },
2988 .block_erase = spi_erase_at45db_block,
2989 }, /* Although the datasheets describes sectors (which can be write protected)
2990 * there seems to be no erase functions for them.
2991 {
2992 .eraseblocks = {
2993 {8 * 528, 1},
2994 {120 * 528, 1},
2995 {128 * 528, 63},
2996 },
2997 .block_erase = spi_erase_at45db_sector
2998 }, */ {
2999 .eraseblocks = { {4224 * 1024, 1} },
3000 .block_erase = spi_erase_at45db_chip,
3001 }
3002 },
3003 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
3004 .write = spi_write_at45db,
3005 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
stefanct7e00e222011-06-03 07:26:31 +00003006 .voltage = {2700, 3600},
Alan Greendad2dae2019-09-16 15:55:08 +10003007 .gran = write_gran_528bytes,
hailfingerf60abdb2009-03-19 12:18:13 +00003008 },
stepanaa1b6a22008-12-08 18:15:10 +00003009
hailfinger286829b2009-01-08 03:40:17 +00003010 {
3011 .vendor = "Atmel",
3012 .name = "AT45DB321D",
hailfingere1e41ea2011-07-27 07:13:06 +00003013 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00003014 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003015 .model_id = ATMEL_AT45DB321D,
Alan Greendad2dae2019-09-16 15:55:08 +10003016 .total_size = 4096, /* or 4224, determined from status register */
3017 .page_size = 512, /* or 528, determined from status register */
3018 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner9816fc82016-08-12 15:47:49 -07003019 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3020 .feature_bits = FEATURE_OTP,
Alan Greendad2dae2019-09-16 15:55:08 +10003021 .tested = TEST_OK_PREW,
3022 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00003023 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10003024 .block_erasers =
3025 {
3026 {
3027 .eraseblocks = { {512, 8192} },
3028 .block_erase = spi_erase_at45db_page,
3029 }, {
3030 .eraseblocks = { {8 * 512, 8192/8} },
3031 .block_erase = spi_erase_at45db_block,
3032 }, {
3033 .eraseblocks = {
3034 {8 * 512, 1},
3035 {120 * 512, 1},
3036 {128 * 512, 63},
3037 },
3038 .block_erase = spi_erase_at45db_sector
3039 }, {
3040 .eraseblocks = { {4096 * 1024, 1} },
3041 .block_erase = spi_erase_at45db_chip,
3042 }
3043 },
3044 .printlock = spi_prettyprint_status_register_at45db,
3045 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3046 /* granularity will be set by the probing function. */
3047 .write = spi_write_at45db,
3048 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3049 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
hailfingerf60abdb2009-03-19 12:18:13 +00003050 },
stepanaa1b6a22008-12-08 18:15:10 +00003051
hailfinger286829b2009-01-08 03:40:17 +00003052 {
3053 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003054 .name = "AT45DB321E",
3055 .bustype = BUS_SPI,
3056 .manufacture_id = ATMEL_ID,
3057 .model_id = ATMEL_AT45DB321C,
3058 .total_size = 4096, /* or 4224, determined from status register */
3059 .page_size = 512, /* or 528, determined from status register */
3060 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3061 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3062 .feature_bits = FEATURE_OTP,
3063 .tested = TEST_UNTESTED,
3064 .probe = probe_spi_at45db,
3065 .probe_timing = TIMING_ZERO,
3066 .block_erasers =
3067 {
3068 {
3069 .eraseblocks = { {512, 8192} },
3070 .block_erase = spi_erase_at45db_page,
3071 }, {
3072 .eraseblocks = { {8 * 512, 8192/8} },
3073 .block_erase = spi_erase_at45db_block,
3074 }, {
3075 .eraseblocks = {
3076 {8 * 512, 1},
3077 {120 * 512, 1},
3078 {128 * 512, 63},
3079 },
3080 .block_erase = spi_erase_at45db_sector
3081 }, {
3082 .eraseblocks = { {4096 * 1024, 1} },
3083 .block_erase = spi_erase_at45db_chip,
3084 }
3085 },
3086 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
3087 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3088 /* granularity will be set by the probing function. */
3089 .write = spi_write_at45db,
3090 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3091 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
3092 },
3093
3094 {
3095 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00003096 .name = "AT45DB642D",
hailfingere1e41ea2011-07-27 07:13:06 +00003097 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +00003098 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003099 .model_id = ATMEL_AT45DB642D,
Alan Greendad2dae2019-09-16 15:55:08 +10003100 .total_size = 8192, /* or 8448, determined from status register */
3101 .page_size = 1024, /* or 1056, determined from status register */
3102 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3103 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3104 .feature_bits = FEATURE_OTP,
3105 .tested = TEST_OK_PREW,
3106 .probe = probe_spi_at45db,
hailfingere3095d92009-06-05 13:46:17 +00003107 .probe_timing = TIMING_ZERO,
Alan Greendad2dae2019-09-16 15:55:08 +10003108 .block_erasers =
3109 {
3110 {
3111 .eraseblocks = { {1024, 8192} },
3112 .block_erase = spi_erase_at45db_page,
3113 }, {
3114 .eraseblocks = { {8 * 1024, 8192/8} },
3115 .block_erase = spi_erase_at45db_block,
3116 }, {
3117 .eraseblocks = {
3118 {8 * 1024, 1},
3119 {248 * 1024, 1},
3120 {256 * 1024, 31},
3121 },
3122 .block_erase = spi_erase_at45db_sector
3123 }, {
3124 .eraseblocks = { {8192 * 1024, 1} },
3125 .block_erase = spi_erase_at45db_chip,
3126 }
3127 },
3128 .printlock = spi_prettyprint_status_register_at45db,
3129 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
3130 /* granularity will be set by the probing function. */
3131 .write = spi_write_at45db,
3132 .read = spi_read_at45db, /* Fast read (0x0B) supported */
stefanct7e00e222011-06-03 07:26:31 +00003133 .voltage = {2700, 3600},
hailfingerf60abdb2009-03-19 12:18:13 +00003134 },
stepanaa1b6a22008-12-08 18:15:10 +00003135
hailfinger286829b2009-01-08 03:40:17 +00003136 {
3137 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003138 .name = "AT49(H)F010",
3139 .bustype = BUS_PARALLEL,
3140 .manufacture_id = ATMEL_ID,
3141 .model_id = ATMEL_AT49F010,
3142 .total_size = 128,
3143 .page_size = 0, /* unused */
3144 .feature_bits = FEATURE_EITHER_RESET,
3145 .tested = TEST_OK_PREW,
3146 .probe = probe_jedec,
3147 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3148 .block_erasers =
3149 {
3150 {
3151 .eraseblocks = { {128 * 1024, 1} },
3152 .block_erase = erase_chip_block_jedec,
3153 }
3154 },
3155 .printlock = printlock_at49f,
3156 .write = write_jedec_1,
3157 .read = read_memmapped,
3158 .voltage = {4500, 5500},
3159 },
3160
3161 {
3162 .vendor = "Atmel",
uwe0f5a3a22009-05-13 11:36:06 +00003163 .name = "AT49BV512",
hailfingere1e41ea2011-07-27 07:13:06 +00003164 .bustype = BUS_PARALLEL,
uwe0f5a3a22009-05-13 11:36:06 +00003165 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003166 .model_id = ATMEL_AT49BV512,
uwe0f5a3a22009-05-13 11:36:06 +00003167 .total_size = 64,
3168 .page_size = 64,
snelsonc6855342010-01-28 23:55:12 +00003169 .feature_bits = FEATURE_EITHER_RESET,
stefanct896d61e2011-06-04 13:13:34 +00003170 .tested = TEST_OK_PREW,
uwe0f5a3a22009-05-13 11:36:06 +00003171 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003172 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003173 .block_erasers =
3174 {
3175 {
3176 .eraseblocks = { {64 * 1024, 1} },
3177 .block_erase = erase_chip_block_jedec,
3178 }
3179 },
snelsonc6855342010-01-28 23:55:12 +00003180 .write = write_jedec_1,
uwe0f5a3a22009-05-13 11:36:06 +00003181 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003182 .voltage = {2700, 3600},
uwe0f5a3a22009-05-13 11:36:06 +00003183 },
3184
3185 {
3186 .vendor = "Atmel",
hailfinger286829b2009-01-08 03:40:17 +00003187 .name = "AT49F002(N)",
hailfingere1e41ea2011-07-27 07:13:06 +00003188 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003189 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003190 .model_id = ATMEL_AT49F002N,
hailfinger286829b2009-01-08 03:40:17 +00003191 .total_size = 256,
3192 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003193 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00003194 .tested = TEST_UNTESTED,
3195 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003196 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003197 .block_erasers =
3198 {
3199 {
3200 .eraseblocks = {
3201 {16 * 1024, 1},
3202 {8 * 1024, 2},
3203 {96 * 1024, 1},
3204 {128 * 1024, 1},
3205 },
3206 .block_erase = erase_sector_jedec,
3207 }, {
3208 .eraseblocks = { {256 * 1024, 1} },
3209 .block_erase = erase_chip_block_jedec,
3210 }
3211 },
snelsonc6855342010-01-28 23:55:12 +00003212 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003213 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003214 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003215 },
3216
hailfinger286829b2009-01-08 03:40:17 +00003217 {
3218 .vendor = "Atmel",
3219 .name = "AT49F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00003220 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00003221 .manufacture_id = ATMEL_ID,
mhmd3c80cd2010-09-15 23:31:03 +00003222 .model_id = ATMEL_AT49F002NT,
hailfinger286829b2009-01-08 03:40:17 +00003223 .total_size = 256,
3224 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00003225 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +00003226 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00003227 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00003228 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
hailfinger22155a82009-12-23 12:02:55 +00003229 .block_erasers =
3230 {
3231 {
3232 .eraseblocks = {
3233 {128 * 1024, 1},
3234 {96 * 1024, 1},
3235 {8 * 1024, 2},
3236 {16 * 1024, 1},
3237 },
3238 .block_erase = erase_sector_jedec,
3239 }, {
3240 .eraseblocks = { {256 * 1024, 1} },
3241 .block_erase = erase_chip_block_jedec,
3242 }
3243 },
snelsonc6855342010-01-28 23:55:12 +00003244 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00003245 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00003246 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00003247 },
3248
hailfinger867df6b2010-07-22 11:44:38 +00003249 {
uwe598c14d2011-09-08 19:55:18 +00003250 .vendor = "Atmel",
Alan Greend76dc1f2019-06-26 15:38:19 +10003251 .name = "AT49F020",
3252 .bustype = BUS_PARALLEL,
3253 .manufacture_id = ATMEL_ID,
3254 .model_id = ATMEL_AT49F020,
3255 .total_size = 256,
Alan Greenebbee922019-09-02 11:36:59 +10003256 .page_size = 0, /* unused */
Alan Greend76dc1f2019-06-26 15:38:19 +10003257 .feature_bits = FEATURE_EITHER_RESET,
3258 .tested = TEST_OK_PRE,
3259 .probe = probe_jedec,
3260 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3261 .block_erasers =
3262 {
3263 {
3264 .eraseblocks = { {256 * 1024, 1} },
3265 .block_erase = erase_chip_block_jedec,
3266 }
Alan Greenebbee922019-09-02 11:36:59 +10003267 /* Chip features an optional permanent write protection
3268 * of the first 8 kB. The erase function is the same as
3269 * above, but 00000H to 01FFFH will not be erased.
3270 * FIXME: add another eraser when partial erasers are
3271 * supported.
3272 */
Alan Greend76dc1f2019-06-26 15:38:19 +10003273 },
Alan Greenebbee922019-09-02 11:36:59 +10003274 .printlock = printlock_at49f,
Alan Greend76dc1f2019-06-26 15:38:19 +10003275 .write = write_jedec_1,
3276 .read = read_memmapped,
3277 .voltage = {4500, 5500},
3278 },
3279
3280 {
3281 .vendor = "Atmel",
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003282 .name = "AT49F040",
3283 .bustype = BUS_PARALLEL,
3284 .manufacture_id = ATMEL_ID,
3285 .model_id = ATMEL_AT49F040,
3286 .total_size = 512,
3287 .page_size = 0, /* unused */
3288 .feature_bits = FEATURE_EITHER_RESET,
3289 .tested = TEST_UNTESTED,
3290 .probe = probe_jedec,
3291 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3292 .block_erasers =
3293 {
3294 {
3295 .eraseblocks = { {512 * 1024, 1} },
3296 .block_erase = erase_chip_block_jedec,
3297 }
3298 /* Chip features an optional permanent write protection
3299 * of the first 16 kB. The erase function is the same as
3300 * above, but 00000H to 03FFFH will not be erased.
3301 * FIXME: add another eraser when partial erasers are
3302 * supported.
3303 */
3304 },
3305 .printlock = printlock_at49f,
3306 .write = write_jedec_1,
3307 .read = read_memmapped,
3308 .voltage = {4500, 5500},
3309 },
3310
3311 {
3312 .vendor = "Atmel",
3313 .name = "AT49F080",
3314 .bustype = BUS_PARALLEL,
3315 .manufacture_id = ATMEL_ID,
3316 .model_id = ATMEL_AT49F080,
3317 .total_size = 1024,
3318 .page_size = 0, /* unused */
3319 .feature_bits = FEATURE_EITHER_RESET,
3320 .tested = TEST_UNTESTED,
3321 .probe = probe_jedec,
3322 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3323 .block_erasers =
3324 {
3325 {
3326 .eraseblocks = { {1024 * 1024, 1} },
3327 .block_erase = erase_chip_block_jedec,
3328 }
3329 /* Chip features an optional permanent write protection
3330 * of the first 16 kB. The erase function is the same as
3331 * above, but 00000H to 03FFFH will not be erased.
3332 * FIXME: add another eraser when partial erasers are
3333 * supported.
3334 */
3335 },
3336 .printlock = printlock_at49f,
3337 .write = write_jedec_1,
3338 .read = read_memmapped,
3339 .voltage = {4500, 5500},
3340 },
3341
3342 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003343 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3344 .vendor = "Atmel",
3345 .name = "AT49F080T",
3346 .bustype = BUS_PARALLEL,
3347 .manufacture_id = ATMEL_ID,
3348 .model_id = ATMEL_AT49F080T,
3349 .total_size = 1024,
3350 .page_size = 0, /* unused */
3351 .feature_bits = FEATURE_EITHER_RESET,
3352 .tested = TEST_UNTESTED,
3353 .probe = probe_jedec,
3354 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3355 .block_erasers =
3356 {
3357 {
3358 .eraseblocks = { {1024 * 1024, 1} },
3359 .block_erase = erase_chip_block_jedec,
3360 }
3361 /* Chip features an optional permanent write protection
3362 * of the first 16 kB. The erase function is the same as
3363 * above, but FC000H to FFFFFH will not be erased.
3364 * FIXME: add another eraser when partial erasers are
3365 * supported.
3366 */
3367 },
3368 .printlock = printlock_at49f,
3369 .write = write_jedec_1,
3370 .read = read_memmapped,
3371 .voltage = {4500, 5500},
3372 },
3373
3374 {
Nikolai Artemievd4d18272020-08-31 17:27:14 +10003375 .vendor = "Atmel",
uwe598c14d2011-09-08 19:55:18 +00003376 .name = "AT49LH002",
3377 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3378 .manufacture_id = ATMEL_ID,
3379 .model_id = ATMEL_AT49LH002,
3380 .total_size = 256,
3381 .page_size = 0, /* unused */
3382 .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
3383 .tested = TEST_UNTESTED,
3384 .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
Alan Green52ad0822019-09-16 16:01:09 +10003385 .probe_timing = TIMING_ZERO,
uwe598c14d2011-09-08 19:55:18 +00003386 .block_erasers =
3387 {
3388 {
3389 .eraseblocks = {
3390 {64 * 1024, 3},
3391 {32 * 1024, 1},
3392 {8 * 1024, 2},
3393 {16 * 1024, 1},
3394 },
Alan Green52ad0822019-09-16 16:01:09 +10003395 .block_erase = NULL, /* TODO: Implement. */
uwe598c14d2011-09-08 19:55:18 +00003396 }, {
3397 .eraseblocks = {
3398 {64 * 1024, 4},
3399 },
Alan Green52ad0822019-09-16 16:01:09 +10003400 .block_erase = erase_block_82802ab,
uwe598c14d2011-09-08 19:55:18 +00003401 },
3402 },
Alan Green52ad0822019-09-16 16:01:09 +10003403 .printlock = printlock_regspace2_block_eraser_0,
3404 .unlock = unlock_regspace2_block_eraser_0,
uwe598c14d2011-09-08 19:55:18 +00003405 .write = write_82802ab,
3406 .read = read_memmapped,
3407 .voltage = {3000, 3600},
3408 },
3409
3410 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003411 .vendor = "Atmel",
3412 .name = "AT49LH004",
3413 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3414 .manufacture_id = ATMEL_ID,
3415 .model_id = ATMEL_AT49LH004,
3416 .total_size = 512,
3417 .page_size = 0, /* unused */
3418 .feature_bits = FEATURE_REGISTERMAP,
3419 .tested = TEST_UNTESTED,
3420 .probe = probe_82802ab,
3421 .probe_timing = TIMING_ZERO,
3422 .block_erasers =
3423 {
3424 {
3425 .eraseblocks = {
3426 {64 * 1024, 7},
3427 {32 * 1024, 1},
3428 {8 * 1024, 2},
3429 {16 * 1024, 1},
3430 },
3431 .block_erase = erase_block_82802ab,
3432 }, {
3433 .eraseblocks = {
3434 {64 * 1024, 8},
3435 },
3436 .block_erase = NULL, /* TODO: Implement. */
3437 },
3438 },
3439 .printlock = printlock_regspace2_block_eraser_0,
3440 .unlock = unlock_regspace2_block_eraser_0,
3441 .write = write_82802ab,
3442 .read = read_memmapped,
3443 .voltage = {3000, 3600},
3444 },
3445
3446 {
3447 .vendor = "Atmel",
3448 .name = "AT49LH00B4",
3449 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3450 .manufacture_id = ATMEL_ID,
3451 .model_id = ATMEL_AT49LH00B4,
3452 .total_size = 512,
3453 .page_size = 0, /* unused */
3454 .feature_bits = FEATURE_REGISTERMAP,
3455 .tested = TEST_UNTESTED,
3456 .probe = probe_82802ab,
3457 .probe_timing = TIMING_ZERO,
3458 .block_erasers =
3459 {
3460 {
3461 .eraseblocks = {
3462 {8 * 1024, 2},
3463 {16 * 1024, 1},
3464 {32 * 1024, 1},
3465 {64 * 1024, 7},
3466 },
3467 .block_erase = NULL, /* TODO: Implement. */
3468 }, {
3469 .eraseblocks = {
3470 {64 * 1024, 8},
3471 },
3472 .block_erase = erase_block_82802ab,
3473 },
3474 },
3475 .printlock = printlock_regspace2_block_eraser_0,
3476 .unlock = unlock_regspace2_block_eraser_0,
3477 .write = write_82802ab,
3478 .read = read_memmapped,
3479 .voltage = {3000, 3600},
3480 },
3481
3482 {
Alan Greend76dc1f2019-06-26 15:38:19 +10003483 .vendor = "Bright",
3484 .name = "BM29F040",
3485 .bustype = BUS_PARALLEL,
3486 .manufacture_id = BRIGHT_ID,
3487 .model_id = BRIGHT_BM29F040,
3488 .total_size = 512,
3489 .page_size = 64 * 1024,
3490 .feature_bits = FEATURE_EITHER_RESET,
3491 .tested = TEST_OK_PR,
3492 .probe = probe_jedec,
3493 .probe_timing = TIMING_ZERO,
3494 .block_erasers =
3495 {
3496 {
3497 .eraseblocks = { {64 * 1024, 8} },
3498 .block_erase = erase_sector_jedec,
3499 }, {
3500 .eraseblocks = { {512 * 1024, 1} },
3501 .block_erase = erase_chip_block_jedec,
3502 },
3503 },
3504 .write = write_jedec_1,
3505 .read = read_memmapped,
3506 .voltage = {4500, 5500},
3507 },
3508
3509 {
uwe97b20792011-09-13 22:05:44 +00003510 .vendor = "Catalyst",
3511 .name = "CAT28F512",
3512 .bustype = BUS_PARALLEL,
3513 .manufacture_id = CATALYST_ID,
3514 .model_id = CATALYST_CAT28F512,
3515 .total_size = 64,
3516 .page_size = 0, /* unused */
3517 .feature_bits = 0,
Alan Greenf5424a22019-07-26 14:32:32 +10003518 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
uwe97b20792011-09-13 22:05:44 +00003519 .probe = probe_jedec, /* FIXME! */
3520 .probe_timing = TIMING_ZERO,
3521 .block_erasers =
3522 {
3523 {
3524 .eraseblocks = { {64 * 1024, 1} },
3525 .block_erase = NULL, /* TODO */
3526 },
3527 },
3528 .write = NULL, /* TODO */
3529 .read = read_memmapped,
3530 .voltage = {4500, 5500},
3531 },
3532
3533 {
Alan Green58393332019-07-31 16:35:44 +10003534 .vendor = "ENE",
3535 .name = "KB9012 (EDI)",
3536 .bustype = BUS_SPI,
3537 .total_size = 128,
3538 .page_size = 128,
Alan Greendbeec2b2019-09-16 14:36:52 +10003539 .feature_bits = FEATURE_ERASED_ZERO,
Alan Green58393332019-07-31 16:35:44 +10003540 .tested = TEST_OK_PREW,
3541 .spi_cmd_set = SPI_EDI,
3542 .probe = edi_probe_kb9012,
3543 .probe_timing = TIMING_ZERO,
3544 .block_erasers =
3545 {
3546 {
3547 .eraseblocks = { {128, 1024} },
3548 .block_erase = edi_chip_block_erase,
3549 },
3550 },
3551 .write = edi_chip_write,
3552 .read = edi_chip_read,
3553 .voltage = {2700, 3600},
Alan Green956eb9c2019-09-16 14:29:45 +10003554 .gran = write_gran_128bytes,
Alan Green58393332019-07-31 16:35:44 +10003555 },
3556
3557 {
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003558 .vendor = "ESI",
3559 .name = "ES25P16",
3560 .bustype = BUS_SPI,
3561 .manufacture_id = EXCEL_ID_NOPREFIX,
3562 .model_id = EXCEL_ES25P16,
3563 .total_size = 2 * 1024,
3564 .page_size = 256,
3565 /* 256-byte parameter page separate from memory array:
3566 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3567 .feature_bits = FEATURE_WRSR_WREN,
3568 .tested = TEST_UNTESTED,
3569 .probe = probe_spi_rdid,
3570 .probe_timing = TIMING_ZERO,
3571 .block_erasers =
3572 {
3573 {
3574 .eraseblocks = { {64 * 1024, 32} },
3575 .block_erase = spi_block_erase_d8,
3576 }, {
3577 .eraseblocks = { {2 * 1024 * 1024, 1} },
3578 .block_erase = spi_block_erase_c7,
3579 }
3580 },
3581 .printlock = spi_prettyprint_status_register_bp2_srwd,
3582 .unlock = spi_disable_blockprotect_bp2_srwd,
3583 .write = spi_chip_write_256,
3584 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3585 .voltage = {2700, 3600},
3586 },
3587
3588 {
3589 .vendor = "ESI",
3590 .name = "ES25P40",
3591 .bustype = BUS_SPI,
3592 .manufacture_id = EXCEL_ID_NOPREFIX,
3593 .model_id = EXCEL_ES25P40,
3594 .total_size = 512,
3595 .page_size = 256,
3596 /* 256-byte parameter page separate from memory array:
3597 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3598 .feature_bits = FEATURE_WRSR_WREN,
3599 .tested = TEST_UNTESTED,
3600 .probe = probe_spi_rdid,
3601 .probe_timing = TIMING_ZERO,
3602 .block_erasers =
3603 {
3604 {
3605 .eraseblocks = { {64 * 1024, 8} },
3606 .block_erase = spi_block_erase_d8,
3607 }, {
3608 .eraseblocks = { {512 * 1024, 1} },
3609 .block_erase = spi_block_erase_c7,
3610 }
3611 },
3612 .printlock = spi_prettyprint_status_register_bp2_srwd,
3613 .unlock = spi_disable_blockprotect_bp2_srwd,
3614 .write = spi_chip_write_256,
3615 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3616 .voltage = {2700, 3600},
3617 },
3618
3619 {
3620 .vendor = "ESI",
3621 .name = "ES25P80",
3622 .bustype = BUS_SPI,
3623 .manufacture_id = EXCEL_ID_NOPREFIX,
3624 .model_id = EXCEL_ES25P80,
3625 .total_size = 1024,
3626 .page_size = 256,
3627 /* 256-byte parameter page separate from memory array:
3628 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3629 .feature_bits = FEATURE_WRSR_WREN,
3630 .tested = TEST_UNTESTED,
3631 .probe = probe_spi_rdid,
3632 .probe_timing = TIMING_ZERO,
3633 .block_erasers =
3634 {
3635 {
3636 .eraseblocks = { {64 * 1024, 16} },
3637 .block_erase = spi_block_erase_d8,
3638 }, {
3639 .eraseblocks = { {1024 * 1024, 1} },
3640 .block_erase = spi_block_erase_c7,
3641 }
3642 },
3643 .printlock = spi_prettyprint_status_register_bp2_srwd,
3644 .unlock = spi_disable_blockprotect_bp2_srwd,
3645 .write = spi_chip_write_256,
3646 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3647 .voltage = {2700, 3600},
3648 },
3649
3650 {
Alan Green58393332019-07-31 16:35:44 +10003651 .vendor = "ESMT",
mkarcherf6986732010-06-19 22:06:35 +00003652 .name = "F25L008A",
hailfingere1e41ea2011-07-27 07:13:06 +00003653 .bustype = BUS_SPI,
Patrick Georgi07e1ed92017-02-06 11:37:23 +01003654 .manufacture_id = ESMT_ID,
3655 .model_id = ESMT_F25L008A,
mkarcherf6986732010-06-19 22:06:35 +00003656 .total_size = 1024,
3657 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003658 .feature_bits = FEATURE_WRSR_EITHER,
Alan Greena3c9bbe2019-09-16 14:51:07 +10003659 .tested = TEST_OK_PREW,
mkarcherf6986732010-06-19 22:06:35 +00003660 .probe = probe_spi_rdid,
3661 .probe_timing = TIMING_ZERO,
3662 .block_erasers =
3663 {
3664 {
3665 .eraseblocks = { {4 * 1024, 256} },
3666 .block_erase = spi_block_erase_20,
3667 }, {
3668 .eraseblocks = { {64 * 1024, 16} },
3669 .block_erase = spi_block_erase_d8,
3670 }, {
3671 .eraseblocks = { {1024 * 1024, 1} },
3672 .block_erase = spi_block_erase_60,
3673 }, {
3674 .eraseblocks = { {1024 * 1024, 1} },
3675 .block_erase = spi_block_erase_c7,
3676 }
3677 },
Alan Greena3c9bbe2019-09-16 14:51:07 +10003678 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
hailfingerb9560ee2010-07-14 20:21:22 +00003679 .unlock = spi_disable_blockprotect,
hailfingerc7d06c62010-07-14 16:19:05 +00003680 .write = spi_chip_write_1,
mkarcher84fe8cb2010-07-10 19:34:15 +00003681 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003682 .voltage = {2700, 3600},
mkarcherf6986732010-06-19 22:06:35 +00003683 },
3684
3685 {
Edward O'Callaghana9c81002019-02-24 15:54:40 +11003686 .vendor = "ESMT",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10003687 .name = "F25L32PA",
3688 .bustype = BUS_SPI,
3689 .manufacture_id = ESMT_ID,
3690 .model_id = ESMT_F25L32PA,
3691 .total_size = 4096,
3692 .page_size = 256,
3693 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3694 .tested = TEST_UNTESTED,
3695 .probe = probe_spi_rdid,
3696 .probe_timing = TIMING_ZERO,
3697 .block_erasers =
3698 {
3699 {
3700 .eraseblocks = { {4 * 1024, 1024} },
3701 .block_erase = spi_block_erase_20,
3702 }, {
3703 .eraseblocks = { {64 * 1024, 64} },
3704 .block_erase = spi_block_erase_d8,
3705 }, {
3706 .eraseblocks = { {4 * 1024 * 1024, 1} },
3707 .block_erase = spi_block_erase_60,
3708 }, {
3709 .eraseblocks = { {4 * 1024 * 1024, 1} },
3710 .block_erase = spi_block_erase_c7,
3711 }
3712 },
3713 .printlock = spi_prettyprint_status_register_bp2_bpl,
3714 .unlock = spi_disable_blockprotect,
3715 .write = spi_chip_write_256,
3716 .read = spi_chip_read,
3717 .voltage = {2700, 3600},
3718 },
3719
3720 {
3721 .vendor = "ESMT",
Alan Greend76dc1f2019-06-26 15:38:19 +10003722 .name = "F49B002UA",
3723 .bustype = BUS_PARALLEL,
3724 .manufacture_id = ESMT_ID,
3725 .model_id = ESMT_F49B002UA,
3726 .total_size = 256,
3727 .page_size = 4096,
3728 .feature_bits = FEATURE_EITHER_RESET,
3729 .tested = TEST_UNTESTED,
3730 .probe = probe_jedec,
3731 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3732 .block_erasers =
3733 {
3734 {
3735 .eraseblocks = {
3736 {128 * 1024, 1},
3737 {96 * 1024, 1},
3738 {8 * 1024, 2},
3739 {16 * 1024, 1},
3740 },
3741 .block_erase = erase_sector_jedec,
3742 }, {
3743 .eraseblocks = { {256 * 1024, 1} },
3744 .block_erase = erase_chip_block_jedec,
3745 }
3746 },
3747 .write = write_jedec_1,
3748 .read = read_memmapped,
3749 .voltage = {4500, 5500},
3750 },
3751
3752 {
hailfingerab07cbd2009-06-05 20:53:07 +00003753 .vendor = "Eon",
3754 .name = "EN25B05",
hailfingere1e41ea2011-07-27 07:13:06 +00003755 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003756 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003757 .model_id = EON_EN25B05,
hailfingerab07cbd2009-06-05 20:53:07 +00003758 .total_size = 64,
3759 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003760 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003761 .tested = TEST_UNTESTED,
3762 .probe = probe_spi_rdid,
3763 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003764 .block_erasers =
3765 {
3766 {
3767 .eraseblocks = {
3768 {4 * 1024, 2},
3769 {8 * 1024, 1},
3770 {16 * 1024, 1},
3771 {32 * 1024, 1},
3772 },
3773 .block_erase = spi_block_erase_d8,
3774 }, {
3775 .eraseblocks = { {64 * 1024, 1} },
3776 .block_erase = spi_block_erase_c7,
3777 }
3778 },
Alan Green6cfd0182019-07-26 13:50:04 +10003779 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003780 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003781 .write = spi_chip_write_256,
3782 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003783 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003784 },
3785
3786 {
3787 .vendor = "Eon",
3788 .name = "EN25B05T",
hailfingere1e41ea2011-07-27 07:13:06 +00003789 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003790 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003791 .model_id = EON_EN25B05,
snelson2d471072010-01-09 05:30:14 +00003792 .total_size = 64,
3793 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003794 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00003795 .tested = TEST_UNTESTED,
3796 .probe = probe_spi_rdid,
3797 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003798 .block_erasers =
3799 {
3800 {
3801 .eraseblocks = {
3802 {32 * 1024, 1},
3803 {16 * 1024, 1},
3804 {8 * 1024, 1},
3805 {4 * 1024, 2},
3806 },
3807 .block_erase = spi_block_erase_d8,
3808 }, {
3809 .eraseblocks = { {64 * 1024, 1} },
3810 .block_erase = spi_block_erase_c7,
3811 }
3812 },
Alan Green6cfd0182019-07-26 13:50:04 +10003813 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003814 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003815 .write = spi_chip_write_256,
3816 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003817 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003818 },
3819
3820 {
3821 .vendor = "Eon",
3822 .name = "EN25B10",
hailfingere1e41ea2011-07-27 07:13:06 +00003823 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003824 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003825 .model_id = EON_EN25B10,
hailfingerab07cbd2009-06-05 20:53:07 +00003826 .total_size = 128,
3827 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003828 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003829 .tested = TEST_UNTESTED,
3830 .probe = probe_spi_rdid,
3831 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003832 .block_erasers =
3833 {
3834 {
3835 .eraseblocks = {
3836 {4 * 1024, 2},
3837 {8 * 1024, 1},
3838 {16 * 1024, 1},
3839 {32 * 1024, 3},
3840 },
3841 .block_erase = spi_block_erase_d8,
3842 }, {
3843 .eraseblocks = { {128 * 1024, 1} },
3844 .block_erase = spi_block_erase_c7,
3845 }
3846 },
Alan Green6cfd0182019-07-26 13:50:04 +10003847 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003848 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003849 .write = spi_chip_write_256,
3850 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003851 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003852 },
3853
3854 {
3855 .vendor = "Eon",
3856 .name = "EN25B10T",
hailfingere1e41ea2011-07-27 07:13:06 +00003857 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003858 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003859 .model_id = EON_EN25B10,
snelson2d471072010-01-09 05:30:14 +00003860 .total_size = 128,
3861 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003862 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10003863 .tested = TEST_OK_PREW,
snelson2d471072010-01-09 05:30:14 +00003864 .probe = probe_spi_rdid,
3865 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003866 .block_erasers =
3867 {
3868 {
3869 .eraseblocks = {
3870 {32 * 1024, 3},
3871 {16 * 1024, 1},
3872 {8 * 1024, 1},
3873 {4 * 1024, 2},
3874 },
3875 .block_erase = spi_block_erase_d8,
3876 }, {
3877 .eraseblocks = { {128 * 1024, 1} },
3878 .block_erase = spi_block_erase_c7,
3879 }
3880 },
Alan Green6cfd0182019-07-26 13:50:04 +10003881 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003882 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003883 .write = spi_chip_write_256,
3884 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003885 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003886 },
3887
3888 {
3889 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00003890 .name = "EN25B16",
hailfingere1e41ea2011-07-27 07:13:06 +00003891 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00003892 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003893 .model_id = EON_EN25B16,
hailfingerab07cbd2009-06-05 20:53:07 +00003894 .total_size = 2048,
3895 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003896 .feature_bits = FEATURE_WRSR_WREN,
hailfingerab07cbd2009-06-05 20:53:07 +00003897 .tested = TEST_UNTESTED,
3898 .probe = probe_spi_rdid,
3899 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003900 .block_erasers =
3901 {
3902 {
3903 .eraseblocks = {
3904 {4 * 1024, 2},
3905 {8 * 1024, 1},
3906 {16 * 1024, 1},
3907 {32 * 1024, 1},
3908 {64 * 1024, 31},
3909 },
3910 .block_erase = spi_block_erase_d8,
3911 }, {
3912 .eraseblocks = { {2 * 1024 * 1024, 1} },
3913 .block_erase = spi_block_erase_c7,
3914 }
3915 },
Alan Green6cfd0182019-07-26 13:50:04 +10003916 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003917 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00003918 .write = spi_chip_write_256,
3919 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003920 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00003921 },
3922
3923 {
3924 .vendor = "Eon",
3925 .name = "EN25B16T",
hailfingere1e41ea2011-07-27 07:13:06 +00003926 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00003927 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00003928 .model_id = EON_EN25B16,
snelson2d471072010-01-09 05:30:14 +00003929 .total_size = 2048,
3930 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003931 .feature_bits = FEATURE_WRSR_WREN,
snelson2d471072010-01-09 05:30:14 +00003932 .tested = TEST_UNTESTED,
3933 .probe = probe_spi_rdid,
3934 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00003935 .block_erasers =
3936 {
3937 {
3938 .eraseblocks = {
3939 {64 * 1024, 31},
3940 {32 * 1024, 1},
3941 {16 * 1024, 1},
3942 {8 * 1024, 1},
3943 {4 * 1024, 2},
3944 },
3945 .block_erase = spi_block_erase_d8,
3946 }, {
3947 .eraseblocks = { {2 * 1024 * 1024, 1} },
3948 .block_erase = spi_block_erase_c7,
3949 }
3950 },
Alan Green6cfd0182019-07-26 13:50:04 +10003951 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00003952 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00003953 .write = spi_chip_write_256,
3954 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00003955 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00003956 },
3957
3958 {
3959 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10003960 .name = "EN25B20",
3961 .bustype = BUS_SPI,
3962 .manufacture_id = EON_ID_NOPREFIX,
3963 .model_id = EON_EN25B20,
3964 .total_size = 256,
3965 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10003966 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10003967 .tested = TEST_UNTESTED,
3968 .probe = probe_spi_rdid,
3969 .probe_timing = TIMING_ZERO,
3970 .block_erasers =
3971 {
3972 {
3973 .eraseblocks = {
3974 {4 * 1024, 2},
3975 {8 * 1024, 1},
3976 {16 * 1024, 1},
3977 {32 * 1024, 1},
3978 {64 * 1024, 3}
3979 },
3980 .block_erase = spi_block_erase_d8,
3981 }, {
3982 .eraseblocks = { {256 * 1024, 1} },
3983 .block_erase = spi_block_erase_c7,
3984 }
3985 },
Alan Green6cfd0182019-07-26 13:50:04 +10003986 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10003987 .unlock = spi_disable_blockprotect,
3988 .write = spi_chip_write_256,
3989 .read = spi_chip_read,
3990 .voltage = {2700, 3600},
3991 },
3992
3993 {
3994 .vendor = "Eon",
3995 .name = "EN25B20T",
3996 .bustype = BUS_SPI,
3997 .manufacture_id = EON_ID_NOPREFIX,
3998 .model_id = EON_EN25B20,
3999 .total_size = 256,
4000 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004001 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004002 .tested = TEST_UNTESTED,
4003 .probe = probe_spi_rdid,
4004 .probe_timing = TIMING_ZERO,
4005 .block_erasers =
4006 {
4007 {
4008 .eraseblocks = {
4009 {64 * 1024, 3},
4010 {32 * 1024, 1},
4011 {16 * 1024, 1},
4012 {8 * 1024, 1},
4013 {4 * 1024, 2},
4014 },
4015 .block_erase = spi_block_erase_d8,
4016 }, {
4017 .eraseblocks = { {256 * 1024, 1} },
4018 .block_erase = spi_block_erase_c7,
4019 }
4020 },
Alan Green6cfd0182019-07-26 13:50:04 +10004021 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004022 .unlock = spi_disable_blockprotect,
4023 .write = spi_chip_write_256,
4024 .read = spi_chip_read,
4025 .voltage = {2700, 3600},
4026 },
4027
4028 {
4029 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004030 .name = "EN25B32",
hailfingere1e41ea2011-07-27 07:13:06 +00004031 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004032 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004033 .model_id = EON_EN25B32,
hailfingerab07cbd2009-06-05 20:53:07 +00004034 .total_size = 4096,
4035 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10004036 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00004037 .tested = TEST_UNTESTED,
4038 .probe = probe_spi_rdid,
4039 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004040 .block_erasers =
4041 {
4042 {
4043 .eraseblocks = {
4044 {4 * 1024, 2},
4045 {8 * 1024, 1},
4046 {16 * 1024, 1},
4047 {32 * 1024, 1},
4048 {64 * 1024, 63},
4049 },
4050 .block_erase = spi_block_erase_d8,
4051 }, {
4052 .eraseblocks = { {4 * 1024 * 1024, 1} },
4053 .block_erase = spi_block_erase_c7,
4054 }
4055 },
Alan Green6cfd0182019-07-26 13:50:04 +10004056 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004057 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00004058 .write = spi_chip_write_256,
4059 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004060 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00004061 },
4062
4063 {
4064 .vendor = "Eon",
4065 .name = "EN25B32T",
hailfingere1e41ea2011-07-27 07:13:06 +00004066 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00004067 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004068 .model_id = EON_EN25B32,
snelson2d471072010-01-09 05:30:14 +00004069 .total_size = 4096,
4070 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10004071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00004072 .tested = TEST_UNTESTED,
4073 .probe = probe_spi_rdid,
4074 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004075 .block_erasers =
4076 {
4077 {
4078 .eraseblocks = {
4079 {64 * 1024, 63},
4080 {32 * 1024, 1},
4081 {16 * 1024, 1},
4082 {8 * 1024, 1},
4083 {4 * 1024, 2},
4084 },
4085 .block_erase = spi_block_erase_d8,
4086 }, {
4087 .eraseblocks = { {4 * 1024 * 1024, 1} },
4088 .block_erase = spi_block_erase_c7,
4089 }
4090 },
Alan Green6cfd0182019-07-26 13:50:04 +10004091 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004092 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004093 .write = spi_chip_write_256,
4094 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004095 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004096 },
4097
4098 {
4099 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004100 .name = "EN25B40",
4101 .bustype = BUS_SPI,
4102 .manufacture_id = EON_ID_NOPREFIX,
4103 .model_id = EON_EN25B40,
4104 .total_size = 512,
4105 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004106 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004107 .tested = TEST_UNTESTED,
4108 .probe = probe_spi_rdid,
4109 .probe_timing = TIMING_ZERO,
4110 .block_erasers =
4111 {
4112 {
4113 .eraseblocks = {
4114 {4 * 1024, 2},
4115 {8 * 1024, 1},
4116 {16 * 1024, 1},
4117 {32 * 1024, 1},
4118 {64 * 1024, 7}
4119 },
4120 .block_erase = spi_block_erase_d8,
4121 }, {
4122 .eraseblocks = { {512 * 1024, 1} },
4123 .block_erase = spi_block_erase_c7,
4124 }
4125 },
Alan Green6cfd0182019-07-26 13:50:04 +10004126 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004127 .unlock = spi_disable_blockprotect,
4128 .write = spi_chip_write_256,
4129 .read = spi_chip_read,
4130 .voltage = {2700, 3600},
4131 },
4132
4133 {
4134 .vendor = "Eon",
4135 .name = "EN25B40T",
4136 .bustype = BUS_SPI,
4137 .manufacture_id = EON_ID_NOPREFIX,
4138 .model_id = EON_EN25B40,
4139 .total_size = 512,
4140 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004141 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004142 .tested = TEST_UNTESTED,
4143 .probe = probe_spi_rdid,
4144 .probe_timing = TIMING_ZERO,
4145 .block_erasers =
4146 {
4147 {
4148 .eraseblocks = {
4149 {64 * 1024, 7},
4150 {32 * 1024, 1},
4151 {16 * 1024, 1},
4152 {8 * 1024, 1},
4153 {4 * 1024, 2},
4154 },
4155 .block_erase = spi_block_erase_d8,
4156 }, {
4157 .eraseblocks = { {512 * 1024, 1} },
4158 .block_erase = spi_block_erase_c7,
4159 }
4160 },
Alan Green6cfd0182019-07-26 13:50:04 +10004161 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004162 .unlock = spi_disable_blockprotect,
4163 .write = spi_chip_write_256,
4164 .read = spi_chip_read,
4165 .voltage = {2700, 3600},
4166 },
4167
4168 {
4169 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004170 .name = "EN25B64",
hailfingere1e41ea2011-07-27 07:13:06 +00004171 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004172 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004173 .model_id = EON_EN25B64,
hailfingerab07cbd2009-06-05 20:53:07 +00004174 .total_size = 8192,
4175 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10004176 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfingerab07cbd2009-06-05 20:53:07 +00004177 .tested = TEST_UNTESTED,
4178 .probe = probe_spi_rdid,
4179 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004180 .block_erasers =
4181 {
4182 {
4183 .eraseblocks = {
4184 {4 * 1024, 2},
4185 {8 * 1024, 1},
4186 {16 * 1024, 1},
4187 {32 * 1024, 1},
4188 {64 * 1024, 127},
4189 },
4190 .block_erase = spi_block_erase_d8,
4191 }, {
4192 .eraseblocks = { {8 * 1024 * 1024, 1} },
4193 .block_erase = spi_block_erase_c7,
4194 }
4195 },
Alan Green6cfd0182019-07-26 13:50:04 +10004196 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004197 .unlock = spi_disable_blockprotect,
snelson2d471072010-01-09 05:30:14 +00004198 .write = spi_chip_write_256,
4199 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004200 .voltage = {2700, 3600},
snelson2d471072010-01-09 05:30:14 +00004201 },
4202
4203 {
4204 .vendor = "Eon",
4205 .name = "EN25B64T",
hailfingere1e41ea2011-07-27 07:13:06 +00004206 .bustype = BUS_SPI,
snelson2d471072010-01-09 05:30:14 +00004207 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004208 .model_id = EON_EN25B64,
snelson2d471072010-01-09 05:30:14 +00004209 .total_size = 8192,
4210 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10004211 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
snelson2d471072010-01-09 05:30:14 +00004212 .tested = TEST_UNTESTED,
4213 .probe = probe_spi_rdid,
4214 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004215 .block_erasers =
4216 {
4217 {
4218 .eraseblocks = {
4219 {64 * 1024, 127},
4220 {32 * 1024, 1},
4221 {16 * 1024, 1},
4222 {8 * 1024, 1},
4223 {4 * 1024, 2},
4224 },
4225 .block_erase = spi_block_erase_d8,
4226 }, {
4227 .eraseblocks = { {8 * 1024 * 1024, 1} },
4228 .block_erase = spi_block_erase_c7,
4229 }
4230 },
Alan Green6cfd0182019-07-26 13:50:04 +10004231 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004232 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004233 .write = spi_chip_write_256,
4234 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004235 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004236 },
4237
4238 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004239 .vendor = "Eon",
4240 .name = "EN25B80",
4241 .bustype = BUS_SPI,
4242 .manufacture_id = EON_ID_NOPREFIX,
4243 .model_id = EON_EN25B80,
4244 .total_size = 1024,
4245 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004246 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004247 .tested = TEST_UNTESTED,
4248 .probe = probe_spi_rdid,
4249 .probe_timing = TIMING_ZERO,
4250 .block_erasers =
4251 {
4252 {
4253 .eraseblocks = {
4254 {4 * 1024, 2},
4255 {8 * 1024, 1},
4256 {16 * 1024, 1},
4257 {32 * 1024, 1},
4258 {64 * 1024, 15}
4259 },
4260 .block_erase = spi_block_erase_d8,
4261 }, {
4262 .eraseblocks = { {1024 * 1024, 1} },
4263 .block_erase = spi_block_erase_c7,
4264 }
4265 },
Alan Green6cfd0182019-07-26 13:50:04 +10004266 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004267 .unlock = spi_disable_blockprotect,
4268 .write = spi_chip_write_256,
4269 .read = spi_chip_read,
4270 .voltage = {2700, 3600},
4271 },
4272
4273 {
4274 .vendor = "Eon",
4275 .name = "EN25B80T",
4276 .bustype = BUS_SPI,
4277 .manufacture_id = EON_ID_NOPREFIX,
4278 .model_id = EON_EN25B80,
4279 .total_size = 1024,
4280 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +10004281 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10004282 .tested = TEST_UNTESTED,
4283 .probe = probe_spi_rdid,
4284 .probe_timing = TIMING_ZERO,
4285 .block_erasers =
4286 {
4287 {
4288 .eraseblocks = {
4289 {64 * 1024, 15},
4290 {32 * 1024, 1},
4291 {16 * 1024, 1},
4292 {8 * 1024, 1},
4293 {4 * 1024, 2},
4294 },
4295 .block_erase = spi_block_erase_d8,
4296 }, {
4297 .eraseblocks = { {1024 * 1024, 1} },
4298 .block_erase = spi_block_erase_c7,
4299 }
4300 },
Alan Green6cfd0182019-07-26 13:50:04 +10004301 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004302 .unlock = spi_disable_blockprotect,
4303 .write = spi_chip_write_256,
4304 .read = spi_chip_read,
4305 .voltage = {2700, 3600},
4306 },
4307
4308 {
David Hendrickse185bf22011-05-24 15:34:18 -07004309 /* Note: EN25Q16 is an evil twin which shares the model ID
4310 but has different write protection capabilities */
hailfingerab07cbd2009-06-05 20:53:07 +00004311 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00004312 .name = "EN25D16",
hailfingere1e41ea2011-07-27 07:13:06 +00004313 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004314 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004315 .model_id = EON_EN25D16,
hailfinger77c5d932009-06-15 12:10:57 +00004316 .total_size = 2048,
4317 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07004318 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
hailfinger77c5d932009-06-15 12:10:57 +00004320 .tested = TEST_UNTESTED,
4321 .probe = probe_spi_rdid,
4322 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004323 .block_erasers =
4324 {
4325 {
4326 .eraseblocks = { {4 * 1024, 512} },
4327 .block_erase = spi_block_erase_20,
4328 }, {
4329 .eraseblocks = { {64 * 1024, 32} },
4330 .block_erase = spi_block_erase_d8,
4331 }, {
4332 .eraseblocks = { {64 * 1024, 32} },
4333 .block_erase = spi_block_erase_52,
4334 }, {
4335 .eraseblocks = { {2 * 1024 * 1024, 1} },
4336 .block_erase = spi_block_erase_60,
4337 }, {
4338 .eraseblocks = { {2 * 1024 * 1024, 1} },
4339 .block_erase = spi_block_erase_c7,
4340 }
4341 },
hailfingerb9560ee2010-07-14 20:21:22 +00004342 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004343 .write = spi_chip_write_256,
4344 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004345 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004346 },
4347
4348 {
4349 .vendor = "Eon",
4350 .name = "EN25F05",
hailfingere1e41ea2011-07-27 07:13:06 +00004351 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004352 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004353 .model_id = EON_EN25F05,
hailfinger77c5d932009-06-15 12:10:57 +00004354 .total_size = 64,
4355 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004356 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004357 .tested = TEST_OK_PREW,
hailfinger77c5d932009-06-15 12:10:57 +00004358 .probe = probe_spi_rdid,
4359 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004360 .block_erasers =
4361 {
4362 {
4363 .eraseblocks = { {4 * 1024, 16} },
4364 .block_erase = spi_block_erase_20,
4365 }, {
4366 .eraseblocks = { {32 * 1024, 2} },
4367 .block_erase = spi_block_erase_d8,
4368 }, {
4369 .eraseblocks = { {32 * 1024, 2} },
4370 .block_erase = spi_block_erase_52,
4371 }, {
4372 .eraseblocks = { {64 * 1024, 1} },
4373 .block_erase = spi_block_erase_60,
4374 }, {
4375 .eraseblocks = { {64 * 1024, 1} },
4376 .block_erase = spi_block_erase_c7,
4377 }
4378 },
Alan Green6cfd0182019-07-26 13:50:04 +10004379 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004380 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004381 .write = spi_chip_write_256,
4382 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004383 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004384 },
4385
4386 {
4387 .vendor = "Eon",
4388 .name = "EN25F10",
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_EN25F10,
hailfinger77c5d932009-06-15 12:10:57 +00004392 .total_size = 128,
4393 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004394 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00004395 .tested = TEST_UNTESTED,
4396 .probe = probe_spi_rdid,
4397 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004398 .block_erasers =
4399 {
4400 {
4401 .eraseblocks = { {4 * 1024, 32} },
4402 .block_erase = spi_block_erase_20,
4403 }, {
4404 .eraseblocks = { {32 * 1024, 4} },
4405 .block_erase = spi_block_erase_d8,
4406 }, {
4407 .eraseblocks = { {32 * 1024, 4} },
4408 .block_erase = spi_block_erase_52,
4409 }, {
4410 .eraseblocks = { {128 * 1024, 1} },
4411 .block_erase = spi_block_erase_60,
4412 }, {
4413 .eraseblocks = { {128 * 1024, 1} },
4414 .block_erase = spi_block_erase_c7,
4415 }
4416 },
Alan Green6cfd0182019-07-26 13:50:04 +10004417 .printlock = spi_prettyprint_status_register_plain,
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",
Alan Greend76dc1f2019-06-26 15:38:19 +10004426 .name = "EN25F16",
4427 .bustype = BUS_SPI,
4428 .manufacture_id = EON_ID_NOPREFIX,
4429 .model_id = EON_EN25F16,
4430 .total_size = 2048,
4431 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004432 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004433 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10004434 .probe = probe_spi_rdid,
4435 .probe_timing = TIMING_ZERO,
4436 .block_erasers =
4437 {
4438 {
4439 .eraseblocks = { {4 * 1024, 512} },
4440 .block_erase = spi_block_erase_20,
4441 }, {
4442 .eraseblocks = { {64 * 1024, 32} },
4443 .block_erase = spi_block_erase_d8,
4444 }, {
4445 .eraseblocks = { {2 * 1024 * 1024, 1} },
4446 .block_erase = spi_block_erase_60,
4447 }, {
4448 .eraseblocks = { {2 * 1024 * 1024, 1} },
4449 .block_erase = spi_block_erase_c7,
4450 }
4451 },
Alan Green6cfd0182019-07-26 13:50:04 +10004452 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004453 .unlock = spi_disable_blockprotect,
4454 .write = spi_chip_write_256,
4455 .read = spi_chip_read,
4456 .voltage = {2700, 3600},
4457 },
4458
4459 {
4460 .vendor = "Eon",
hailfinger77c5d932009-06-15 12:10:57 +00004461 .name = "EN25F20",
hailfingere1e41ea2011-07-27 07:13:06 +00004462 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004463 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004464 .model_id = EON_EN25F20,
hailfinger77c5d932009-06-15 12:10:57 +00004465 .total_size = 256,
4466 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004467 .feature_bits = FEATURE_WRSR_WREN,
hailfinger77c5d932009-06-15 12:10:57 +00004468 .tested = TEST_UNTESTED,
4469 .probe = probe_spi_rdid,
4470 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004471 .block_erasers =
4472 {
4473 {
4474 .eraseblocks = { {4 * 1024, 64} },
4475 .block_erase = spi_block_erase_20,
4476 }, {
4477 .eraseblocks = { {64 * 1024, 4} },
4478 .block_erase = spi_block_erase_d8,
4479 }, {
4480 .eraseblocks = { {64 * 1024, 4} },
4481 .block_erase = spi_block_erase_52,
4482 }, {
4483 .eraseblocks = { {256 * 1024, 1} },
4484 .block_erase = spi_block_erase_60,
4485 }, {
4486 .eraseblocks = { {256 * 1024, 1} },
4487 .block_erase = spi_block_erase_c7,
4488 }
4489 },
Alan Green6cfd0182019-07-26 13:50:04 +10004490 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004491 .unlock = spi_disable_blockprotect,
hailfinger77c5d932009-06-15 12:10:57 +00004492 .write = spi_chip_write_256,
4493 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004494 .voltage = {2700, 3600},
hailfinger77c5d932009-06-15 12:10:57 +00004495 },
4496
4497 {
4498 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004499 .name = "EN25F32",
4500 .bustype = BUS_SPI,
4501 .manufacture_id = EON_ID_NOPREFIX,
4502 .model_id = EON_EN25F32,
4503 .total_size = 4096,
4504 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004505 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004506 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10004507 .probe = probe_spi_rdid,
4508 .probe_timing = TIMING_ZERO,
4509 .block_erasers =
4510 {
4511 {
4512 .eraseblocks = { {4 * 1024, 1024} },
4513 .block_erase = spi_block_erase_20,
4514 }, {
4515 .eraseblocks = { {64 * 1024, 64} },
4516 .block_erase = spi_block_erase_d8,
4517 }, {
4518 .eraseblocks = { {4 * 1024 * 1024, 1} },
4519 .block_erase = spi_block_erase_60,
4520 }, {
4521 .eraseblocks = { {4 * 1024 * 1024, 1} },
4522 .block_erase = spi_block_erase_c7,
4523 }
4524 },
Alan Green6cfd0182019-07-26 13:50:04 +10004525 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +10004526 .unlock = spi_disable_blockprotect,
4527 .write = spi_chip_write_256,
4528 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10004529 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10004530 },
4531
4532 {
4533 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004534 .name = "EN25F40",
hailfingere1e41ea2011-07-27 07:13:06 +00004535 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004536 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004537 .model_id = EON_EN25F40,
hailfingerab07cbd2009-06-05 20:53:07 +00004538 .total_size = 512,
4539 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004540 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +10004541 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00004542 .probe = probe_spi_rdid,
4543 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00004544 .block_erasers =
4545 {
4546 {
snelson2d471072010-01-09 05:30:14 +00004547 .eraseblocks = { {4 * 1024, 128} },
snelson1c03aa12009-12-23 17:05:59 +00004548 .block_erase = spi_block_erase_20,
4549 }, {
snelson2d471072010-01-09 05:30:14 +00004550 .eraseblocks = { {64 * 1024, 8} },
snelson1c03aa12009-12-23 17:05:59 +00004551 .block_erase = spi_block_erase_d8,
4552 }, {
snelson2d471072010-01-09 05:30:14 +00004553 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00004554 .block_erase = spi_block_erase_60,
4555 }, {
snelson2d471072010-01-09 05:30:14 +00004556 .eraseblocks = { {512 * 1024, 1} },
snelson1c03aa12009-12-23 17:05:59 +00004557 .block_erase = spi_block_erase_c7,
4558 },
4559 },
Alan Green6cfd0182019-07-26 13:50:04 +10004560 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004561 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004562 .write = spi_chip_write_256,
4563 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004564 .voltage = {2700, 3600},
Louis Yung-Chieh Lod6572b32011-05-24 16:28:27 +08004565 .wp = &wp_w25,
hailfingerab07cbd2009-06-05 20:53:07 +00004566 },
4567
4568 {
4569 .vendor = "Eon",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10004570 .name = "EN25F64",
4571 .bustype = BUS_SPI,
4572 .manufacture_id = EON_ID_NOPREFIX,
4573 .model_id = EON_EN25F64,
4574 .total_size = 8192,
4575 .page_size = 256,
4576 .feature_bits = FEATURE_WRSR_WREN,
4577 .tested = TEST_OK_PREW,
4578 .probe = probe_spi_rdid,
4579 .probe_timing = TIMING_ZERO,
4580 .block_erasers =
4581 {
4582 {
4583 .eraseblocks = { {4 * 1024, 2048} },
4584 .block_erase = spi_block_erase_20,
4585 }, {
4586 .eraseblocks = { {64 * 1024, 128} },
4587 .block_erase = spi_block_erase_d8,
4588 }, {
4589 .eraseblocks = { {8 * 1024 * 1024, 1} },
4590 .block_erase = spi_block_erase_60,
4591 }, {
4592 .eraseblocks = { {8 * 1024 * 1024, 1} },
4593 .block_erase = spi_block_erase_c7,
4594 }
4595 },
4596 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4597 .unlock = spi_disable_blockprotect,
4598 .write = spi_chip_write_256,
4599 .read = spi_chip_read,
4600 .voltage = {2700, 3600},
4601 },
4602
4603 {
4604 .vendor = "Eon",
hailfingerab07cbd2009-06-05 20:53:07 +00004605 .name = "EN25F80",
hailfingere1e41ea2011-07-27 07:13:06 +00004606 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004607 .manufacture_id = EON_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +00004608 .model_id = EON_EN25F80,
hailfingerab07cbd2009-06-05 20:53:07 +00004609 .total_size = 1024,
4610 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10004611 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10004612 .tested = TEST_OK_PREW,
hailfingerab07cbd2009-06-05 20:53:07 +00004613 .probe = probe_spi_rdid,
4614 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00004615 .block_erasers =
4616 {
4617 {
4618 .eraseblocks = { {4 * 1024, 256} },
4619 .block_erase = spi_block_erase_20,
4620 }, {
4621 .eraseblocks = { {64 * 1024, 16} },
4622 .block_erase = spi_block_erase_d8,
4623 }, {
4624 .eraseblocks = { {1024 * 1024, 1} },
4625 .block_erase = spi_block_erase_60,
4626 }, {
4627 .eraseblocks = { {1024 * 1024, 1} },
4628 .block_erase = spi_block_erase_c7,
4629 }
4630 },
Alan Green6cfd0182019-07-26 13:50:04 +10004631 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +00004632 .unlock = spi_disable_blockprotect,
hailfingerab07cbd2009-06-05 20:53:07 +00004633 .write = spi_chip_write_256,
4634 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00004635 .voltage = {2700, 3600},
hailfingerab07cbd2009-06-05 20:53:07 +00004636 },
4637
4638 {
4639 .vendor = "Eon",
Nikolai Artemiev93b77192020-08-31 17:29:34 +10004640 .name = "EN25P05",
4641 .bustype = BUS_SPI,
4642 .manufacture_id = EON_ID_NOPREFIX,
4643 .model_id = EON_EN25B05,
4644 .total_size = 64,
4645 .page_size = 256,
4646 .feature_bits = FEATURE_WRSR_WREN,
4647 .tested = TEST_UNTESTED,
4648 .probe = probe_spi_rdid,
4649 .probe_timing = TIMING_ZERO,
4650 .block_erasers =
4651 {
4652 {
4653 .eraseblocks = {
4654 {32 * 1024, 2} },
4655 .block_erase = spi_block_erase_d8,
4656 }, {
4657 .eraseblocks = { {64 * 1024, 1} },
4658 .block_erase = spi_block_erase_c7,
4659 }
4660 },
4661 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4662 .unlock = spi_disable_blockprotect,
4663 .write = spi_chip_write_256,
4664 .read = spi_chip_read, /* Fast read (0x0B) supported */
4665 .voltage = {2700, 3600},
4666 },
4667
4668 {
4669 .vendor = "Eon",
4670 .name = "EN25P10",
4671 .bustype = BUS_SPI,
4672 .manufacture_id = EON_ID_NOPREFIX,
4673 .model_id = EON_EN25B10,
4674 .total_size = 128,
4675 .page_size = 256,
4676 .feature_bits = FEATURE_WRSR_WREN,
4677 .tested = TEST_UNTESTED,
4678 .probe = probe_spi_rdid,
4679 .probe_timing = TIMING_ZERO,
4680 .block_erasers =
4681 {
4682 {
4683 .eraseblocks = { {32 * 1024, 4} },
4684 .block_erase = spi_block_erase_d8,
4685 }, {
4686 .eraseblocks = { {128 * 1024, 1} },
4687 .block_erase = spi_block_erase_c7,
4688 }
4689 },
4690 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4691 .unlock = spi_disable_blockprotect,
4692 .write = spi_chip_write_256,
4693 .read = spi_chip_read, /* Fast read (0x0B) supported */
4694 .voltage = {2700, 3600},
4695 },
4696
4697 {
4698 .vendor = "Eon",
Nikolai Artemiev12898322020-08-31 17:33:18 +10004699 .name = "EN25P16",
4700 .bustype = BUS_SPI,
4701 .manufacture_id = EON_ID_NOPREFIX,
4702 .model_id = EON_EN25B16,
4703 .total_size = 2048,
4704 .page_size = 256,
4705 .feature_bits = FEATURE_WRSR_WREN,
4706 .tested = TEST_UNTESTED,
4707 .probe = probe_spi_rdid,
4708 .probe_timing = TIMING_ZERO,
4709 .block_erasers =
4710 {
4711 {
4712 .eraseblocks = { {64 * 1024, 32} },
4713 .block_erase = spi_block_erase_d8,
4714 }, {
4715 .eraseblocks = { {2 * 1024 * 1024, 1} },
4716 .block_erase = spi_block_erase_c7,
4717 }
4718 },
4719 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4720 .unlock = spi_disable_blockprotect,
4721 .write = spi_chip_write_256,
4722 .read = spi_chip_read, /* Fast read (0x0B) supported */
4723 .voltage = {2700, 3600},
4724 },
4725
4726 {
4727 .vendor = "Eon",
4728 .name = "EN25P20",
4729 .bustype = BUS_SPI,
4730 .manufacture_id = EON_ID_NOPREFIX,
4731 .model_id = EON_EN25B20,
4732 .total_size = 256,
4733 .page_size = 256,
4734 .feature_bits = FEATURE_WRSR_WREN,
4735 .tested = TEST_UNTESTED,
4736 .probe = probe_spi_rdid,
4737 .probe_timing = TIMING_ZERO,
4738 .block_erasers =
4739 {
4740 {
4741 .eraseblocks = { {64 * 1024, 4} },
4742 .block_erase = spi_block_erase_d8,
4743 }, {
4744 .eraseblocks = { {256 * 1024, 1} },
4745 .block_erase = spi_block_erase_c7,
4746 }
4747 },
4748 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4749 .unlock = spi_disable_blockprotect,
4750 .write = spi_chip_write_256,
4751 .read = spi_chip_read, /* Fast read (0x0B) supported */
4752 .voltage = {2700, 3600},
4753 },
4754
4755 {
4756 .vendor = "Eon",
4757 .name = "EN25P32", /* Uniform version of EN25B32 */
4758 .bustype = BUS_SPI,
4759 .manufacture_id = EON_ID_NOPREFIX,
4760 .model_id = EON_EN25B32,
4761 .total_size = 4096,
4762 .page_size = 256,
4763 /* OTP: 512B total; enter 0x3A */
4764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4765 .tested = TEST_UNTESTED,
4766 .probe = probe_spi_rdid,
4767 .probe_timing = TIMING_ZERO,
4768 .block_erasers =
4769 {
4770 {
4771 .eraseblocks = { {64 * 1024, 64} },
4772 .block_erase = spi_block_erase_d8,
4773 }, {
4774 .eraseblocks = { {4 * 1024 * 1024, 1} },
4775 .block_erase = spi_block_erase_c7,
4776 }
4777 },
4778 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4779 .unlock = spi_disable_blockprotect,
4780 .write = spi_chip_write_256,
4781 .read = spi_chip_read, /* Fast read (0x0B) supported */
4782 .voltage = {2700, 3600},
4783 },
4784
4785 {
4786 .vendor = "Eon",
4787 .name = "EN25P40",
4788 .bustype = BUS_SPI,
4789 .manufacture_id = EON_ID_NOPREFIX,
4790 .model_id = EON_EN25B40,
4791 .total_size = 512,
4792 .page_size = 256,
4793 .feature_bits = FEATURE_WRSR_WREN,
4794 .tested = TEST_UNTESTED,
4795 .probe = probe_spi_rdid,
4796 .probe_timing = TIMING_ZERO,
4797 .block_erasers =
4798 {
4799 {
4800 .eraseblocks = { {64 * 1024, 8} },
4801 .block_erase = spi_block_erase_d8,
4802 }, {
4803 .eraseblocks = { {512 * 1024, 1} },
4804 .block_erase = spi_block_erase_c7,
4805 }
4806 },
4807 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4808 .unlock = spi_disable_blockprotect,
4809 .write = spi_chip_write_256,
4810 .read = spi_chip_read, /* Fast read (0x0B) supported */
4811 .voltage = {2700, 3600},
4812 },
4813
4814 {
4815 .vendor = "Eon",
4816 .name = "EN25P64",
4817 .bustype = BUS_SPI,
4818 .manufacture_id = EON_ID_NOPREFIX,
4819 .model_id = EON_EN25B64,
4820 .total_size = 8192,
4821 .page_size = 256,
4822 /* OTP: 512B total; enter 0x3A */
4823 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4824 .tested = TEST_UNTESTED,
4825 .probe = probe_spi_rdid,
4826 .probe_timing = TIMING_ZERO,
4827 .block_erasers =
4828 {
4829 {
4830 .eraseblocks = { {64 * 1024, 128} },
4831 .block_erase = spi_block_erase_d8,
4832 }, {
4833 .eraseblocks = { {8 * 1024 * 1024, 1} },
4834 .block_erase = spi_block_erase_c7,
4835 }
4836 },
4837 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4838 .unlock = spi_disable_blockprotect,
4839 .write = spi_chip_write_256,
4840 .read = spi_chip_read, /* Fast read (0x0B) supported */
4841 .voltage = {2700, 3600},
4842 },
4843
4844 {
4845 .vendor = "Eon",
4846 .name = "EN25P80",
4847 .bustype = BUS_SPI,
4848 .manufacture_id = EON_ID_NOPREFIX,
4849 .model_id = EON_EN25B80,
4850 .total_size = 1024,
4851 .page_size = 256,
4852 .feature_bits = FEATURE_WRSR_WREN,
4853 .tested = TEST_UNTESTED,
4854 .probe = probe_spi_rdid,
4855 .probe_timing = TIMING_ZERO,
4856 .block_erasers =
4857 {
4858 {
4859 .eraseblocks = { {64 * 1024, 16} },
4860 .block_erase = spi_block_erase_d8,
4861 }, {
4862 .eraseblocks = { {1024 * 1024, 1} },
4863 .block_erase = spi_block_erase_c7,
4864 }
4865 },
4866 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4867 .unlock = spi_disable_blockprotect,
4868 .write = spi_chip_write_256,
4869 .read = spi_chip_read, /* Fast read (0x0B) supported */
4870 .voltage = {2700, 3600},
4871 },
4872
4873 {
4874 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004875 .name = "EN25Q128",
hailfingere1e41ea2011-07-27 07:13:06 +00004876 .bustype = BUS_SPI,
hailfinger77c5d932009-06-15 12:10:57 +00004877 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10004878 .model_id = EON_EN25Q128,
4879 .total_size = 16384,
hailfinger77c5d932009-06-15 12:10:57 +00004880 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004881 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004882 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greene3e4fb82019-09-09 16:28:33 +10004883 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07004884 .probe = probe_spi_rdid,
4885 .probe_timing = TIMING_ZERO,
4886 .block_erasers =
4887 {
4888 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004889 .eraseblocks = { {4 * 1024, 4096} },
David Hendrickse185bf22011-05-24 15:34:18 -07004890 .block_erase = spi_block_erase_20,
4891 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004892 .eraseblocks = { {64 * 1024, 256} },
David Hendrickse185bf22011-05-24 15:34:18 -07004893 .block_erase = spi_block_erase_d8,
4894 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004895 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004896 .block_erase = spi_block_erase_60,
4897 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004898 .eraseblocks = { {16 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004899 .block_erase = spi_block_erase_c7,
4900 }
4901 },
Alan Green6cfd0182019-07-26 13:50:04 +10004902 .printlock = spi_prettyprint_status_register_plain,
David Hendrickse185bf22011-05-24 15:34:18 -07004903 .unlock = spi_disable_blockprotect,
4904 .write = spi_chip_write_256,
4905 .read = spi_chip_read,
David Hendrickse185bf22011-05-24 15:34:18 -07004906 .wp = &wp_w25,
4907 },
4908
4909 {
Nikolai Artemiev12898322020-08-31 17:33:18 +10004910 /* Note: EN25D16 is an evil twin which shares the model ID
4911 but has different write protection capabilities */
4912 .vendor = "Eon",
4913 .name = "EN25Q16",
4914 .bustype = BUS_SPI,
4915 .manufacture_id = EON_ID_NOPREFIX,
4916 .model_id = EON_EN25Q16,
4917 .total_size = 2048,
4918 .page_size = 256,
4919 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
4920 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4921 .tested = TEST_UNTESTED,
4922 .probe = probe_spi_rdid,
4923 .probe_timing = TIMING_ZERO,
4924 .block_erasers =
4925 {
4926 {
4927 .eraseblocks = { {4 * 1024, 512} },
4928 .block_erase = spi_block_erase_20,
4929 }, {
4930 .eraseblocks = { {64 * 1024, 32} },
4931 .block_erase = spi_block_erase_d8,
4932 }, {
4933 /* not supported by Q16 version */
4934 .eraseblocks = { {64 * 1024, 32} },
4935 .block_erase = spi_block_erase_52,
4936 }, {
4937 .eraseblocks = { {2 * 1024 * 1024, 1} },
4938 .block_erase = spi_block_erase_60,
4939 }, {
4940 .eraseblocks = { {2 * 1024 * 1024, 1} },
4941 .block_erase = spi_block_erase_c7,
4942 }
4943 },
4944 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4945 .unlock = spi_disable_blockprotect,
4946 .write = spi_chip_write_256,
4947 .read = spi_chip_read,
4948 .voltage = {2700, 3600},
4949 },
4950
4951 {
David Hendrickse185bf22011-05-24 15:34:18 -07004952 .vendor = "Eon",
Alan Greend76dc1f2019-06-26 15:38:19 +10004953 .name = "EN25Q32(A/B)",
hailfingere1e41ea2011-07-27 07:13:06 +00004954 .bustype = BUS_SPI,
David Hendrickse185bf22011-05-24 15:34:18 -07004955 .manufacture_id = EON_ID_NOPREFIX,
Alan Greend76dc1f2019-06-26 15:38:19 +10004956 .model_id = EON_EN25Q32,
4957 .total_size = 4096,
David Hendrickse185bf22011-05-24 15:34:18 -07004958 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10004959 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004960 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10004961 .tested = TEST_OK_PREW,
David Hendrickse185bf22011-05-24 15:34:18 -07004962 .probe = probe_spi_rdid,
4963 .probe_timing = TIMING_ZERO,
4964 .block_erasers =
4965 {
4966 {
Alan Greend76dc1f2019-06-26 15:38:19 +10004967 .eraseblocks = { {4 * 1024, 1024} },
David Hendrickse185bf22011-05-24 15:34:18 -07004968 .block_erase = spi_block_erase_20,
4969 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004970 .eraseblocks = { {64 * 1024, 64} },
David Hendrickse185bf22011-05-24 15:34:18 -07004971 .block_erase = spi_block_erase_d8,
4972 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004973 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004974 .block_erase = spi_block_erase_60,
4975 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10004976 .eraseblocks = { {4 * 1024 * 1024, 1} },
David Hendrickse185bf22011-05-24 15:34:18 -07004977 .block_erase = spi_block_erase_c7,
4978 }
4979 },
Alan Green6cfd0182019-07-26 13:50:04 +10004980 .printlock = spi_prettyprint_status_register_plain,
David Hendrickse185bf22011-05-24 15:34:18 -07004981 .unlock = spi_disable_blockprotect,
4982 .write = spi_chip_write_256,
4983 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10004984 .voltage = {2700, 3600},
David Hendrickse185bf22011-05-24 15:34:18 -07004985 .wp = &wp_w25,
hailfinger77c5d932009-06-15 12:10:57 +00004986 },
4987
4988 {
snelson2b18d0f2010-03-05 08:44:11 +00004989 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00004990 .name = "EN25Q40",
hailfingere1e41ea2011-07-27 07:13:06 +00004991 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00004992 .manufacture_id = EON_ID_NOPREFIX,
4993 .model_id = EON_EN25Q40,
4994 .total_size = 512,
4995 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07004996 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10004997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00004998 .tested = TEST_UNTESTED,
4999 .probe = probe_spi_rdid,
5000 .probe_timing = TIMING_ZERO,
5001 .block_erasers =
5002 {
5003 {
5004 .eraseblocks = { {4 * 1024, 128} },
5005 .block_erase = spi_block_erase_20,
5006 }, {
5007 .eraseblocks = { {64 * 1024, 8} },
5008 .block_erase = spi_block_erase_d8,
5009 }, {
5010 .eraseblocks = { {512 * 1024, 1} },
5011 .block_erase = spi_block_erase_60,
5012 }, {
5013 .eraseblocks = { {512 * 1024, 1} },
5014 .block_erase = spi_block_erase_c7,
5015 }
5016 },
Alan Green6cfd0182019-07-26 13:50:04 +10005017 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00005018 .unlock = spi_disable_blockprotect,
5019 .write = spi_chip_write_256,
5020 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005021 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10005022 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00005023 },
5024
5025 {
5026 .vendor = "Eon",
5027 .name = "EN25Q64",
hailfingere1e41ea2011-07-27 07:13:06 +00005028 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00005029 .manufacture_id = EON_ID_NOPREFIX,
5030 .model_id = EON_EN25Q64,
5031 .total_size = 8192,
5032 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005033 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005034 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Greenc63f8d62019-08-26 15:10:04 +10005035 .tested = TEST_OK_PREW,
stefanct5d10cff2011-07-24 22:21:57 +00005036 .probe = probe_spi_rdid,
5037 .probe_timing = TIMING_ZERO,
5038 .block_erasers =
5039 {
5040 {
5041 .eraseblocks = { {4 * 1024, 2048} },
5042 .block_erase = spi_block_erase_20,
5043 }, {
5044 .eraseblocks = { {64 * 1024, 128} },
5045 .block_erase = spi_block_erase_d8,
5046 }, {
5047 .eraseblocks = { {8 * 1024 * 1024, 1} },
5048 .block_erase = spi_block_erase_60,
5049 }, {
5050 .eraseblocks = { {8 * 1024 * 1024, 1} },
5051 .block_erase = spi_block_erase_c7,
5052 }
5053 },
Alan Green6cfd0182019-07-26 13:50:04 +10005054 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00005055 .unlock = spi_disable_blockprotect,
5056 .write = spi_chip_write_256,
5057 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005058 .voltage = {2700, 3600},
Alan Greend76dc1f2019-06-26 15:38:19 +10005059 .wp = &wp_w25,
5060 },
5061
5062 {
5063 .vendor = "Eon",
5064 .name = "EN25Q80(A)",
5065 .bustype = BUS_SPI,
5066 .manufacture_id = EON_ID_NOPREFIX,
5067 .model_id = EON_EN25Q80,
5068 .total_size = 1024,
5069 .page_size = 256,
5070 /* OTP: 256B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
stefanct5d10cff2011-07-24 22:21:57 +00005072 .tested = TEST_UNTESTED,
5073 .probe = probe_spi_rdid,
5074 .probe_timing = TIMING_ZERO,
5075 .block_erasers =
5076 {
5077 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005078 .eraseblocks = { {4 * 1024, 256} },
stefanct5d10cff2011-07-24 22:21:57 +00005079 .block_erase = spi_block_erase_20,
5080 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005081 .eraseblocks = { {64 * 1024, 16} },
stefanct5d10cff2011-07-24 22:21:57 +00005082 .block_erase = spi_block_erase_d8,
5083 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005084 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00005085 .block_erase = spi_block_erase_60,
5086 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005087 .eraseblocks = { {1024 * 1024, 1} },
stefanct5d10cff2011-07-24 22:21:57 +00005088 .block_erase = spi_block_erase_c7,
5089 }
5090 },
Alan Green6cfd0182019-07-26 13:50:04 +10005091 .printlock = spi_prettyprint_status_register_plain,
stefanct5d10cff2011-07-24 22:21:57 +00005092 .unlock = spi_disable_blockprotect,
5093 .write = spi_chip_write_256,
5094 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10005095 .voltage = {2700, 3600},
Alan Green35299002019-06-25 16:14:02 +10005096 .wp = &wp_w25,
stefanct5d10cff2011-07-24 22:21:57 +00005097 },
5098
5099 {
5100 .vendor = "Eon",
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005101 .name = "EN25QH128",
5102 .bustype = BUS_SPI,
5103 .manufacture_id = EON_ID_NOPREFIX,
5104 .model_id = EON_EN25QH128,
5105 .total_size = 16384,
5106 .page_size = 256,
5107 /* supports SFDP */
5108 /* OTP: 512B total; enter 0x3A */
5109 /* QPI enable 0x38, disable 0xFF */
5110 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
Tim Chen045e05e2020-07-06 14:59:21 +08005111 .tested = TEST_OK_PREW,
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005112 .probe = probe_spi_rdid,
5113 .probe_timing = TIMING_ZERO,
5114 .block_erasers =
5115 {
5116 {
5117 .eraseblocks = { {4 * 1024, 4096} },
5118 .block_erase = spi_block_erase_20,
5119 }, {
5120 .eraseblocks = { {64 * 1024, 256} },
5121 .block_erase = spi_block_erase_d8,
5122 }, {
5123 .eraseblocks = { { 16384 * 1024, 1} },
5124 .block_erase = spi_block_erase_60,
5125 }, {
5126 .eraseblocks = { { 16384 * 1024, 1} },
5127 .block_erase = spi_block_erase_c7,
5128 }
5129 },
5130 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5131 .unlock = spi_disable_blockprotect_bp3_srwd,
5132 .write = spi_chip_write_256,
5133 .read = spi_chip_read,
5134 .voltage = {2700, 3600},
Tim Chen136fd0a2020-06-30 19:12:50 +08005135 .wp = &wp_w25,
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005136 },
5137
5138 {
5139 .vendor = "Eon",
stefanct5d10cff2011-07-24 22:21:57 +00005140 .name = "EN25QH16",
hailfingere1e41ea2011-07-27 07:13:06 +00005141 .bustype = BUS_SPI,
stefanct5d10cff2011-07-24 22:21:57 +00005142 .manufacture_id = EON_ID_NOPREFIX,
5143 .model_id = EON_EN25QH16,
5144 .total_size = 2048,
5145 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005146 /* supports SFDP */
5147 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005148 /* QPI enable 0x38, disable 0xFF */
5149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5150 .tested = TEST_OK_PREW,
stefanct5d10cff2011-07-24 22:21:57 +00005151 .probe = probe_spi_rdid,
5152 .probe_timing = TIMING_ZERO,
5153 .block_erasers =
5154 {
5155 {
5156 .eraseblocks = { {4 * 1024, 512} },
5157 .block_erase = spi_block_erase_20,
5158 }, {
5159 .eraseblocks = { {64 * 1024, 32} },
5160 .block_erase = spi_block_erase_d8,
5161 }, {
5162 .eraseblocks = { {1024 * 2048, 1} },
5163 .block_erase = spi_block_erase_60,
5164 }, {
5165 .eraseblocks = { {1024 * 2048, 1} },
5166 .block_erase = spi_block_erase_c7,
5167 }
5168 },
Edward O'Callaghan023087b2020-06-25 12:32:21 +10005169 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5170 .unlock = spi_disable_blockprotect_bp3_srwd,
5171 .write = spi_chip_write_256,
5172 .read = spi_chip_read,
5173 .voltage = {2700, 3600},
5174 },
5175
5176 {
5177 .vendor = "Eon",
5178 .name = "EN25QH32",
5179 .bustype = BUS_SPI,
5180 .manufacture_id = EON_ID_NOPREFIX,
5181 .model_id = EON_EN25QH32,
5182 .total_size = 4096,
5183 .page_size = 256,
5184 /* supports SFDP */
5185 /* OTP: 512B total; enter 0x3A */
5186 /* QPI enable 0x38, disable 0xFF */
5187 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5188 .tested = TEST_OK_PREW,
5189 .probe = probe_spi_rdid,
5190 .probe_timing = TIMING_ZERO,
5191 .block_erasers =
5192 {
5193 {
5194 .eraseblocks = { {4 * 1024, 1024} },
5195 .block_erase = spi_block_erase_20,
5196 }, {
5197 .eraseblocks = { {64 * 1024, 64} },
5198 .block_erase = spi_block_erase_d8,
5199 }, {
5200 .eraseblocks = { {1024 * 4096, 1} },
5201 .block_erase = spi_block_erase_60,
5202 }, {
5203 .eraseblocks = { {1024 * 4096, 1} },
5204 .block_erase = spi_block_erase_c7,
5205 }
5206 },
5207 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5208 .unlock = spi_disable_blockprotect_bp3_srwd,
5209 .write = spi_chip_write_256,
5210 .read = spi_chip_read,
5211 .voltage = {2700, 3600},
5212 },
5213
5214 {
5215 .vendor = "Eon",
5216 .name = "EN25QH64",
5217 .bustype = BUS_SPI,
5218 .manufacture_id = EON_ID_NOPREFIX,
5219 .model_id = EON_EN25QH64,
5220 .total_size = 8192,
5221 .page_size = 256,
5222 /* supports SFDP */
5223 /* OTP: 512B total; enter 0x3A */
5224 /* QPI enable 0x38, disable 0xFF */
5225 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5226 .tested = TEST_OK_PREW,
5227 .probe = probe_spi_rdid,
5228 .probe_timing = TIMING_ZERO,
5229 .block_erasers =
5230 {
5231 {
5232 .eraseblocks = { {4 * 1024, 2048} },
5233 .block_erase = spi_block_erase_20,
5234 }, {
5235 .eraseblocks = { {64 * 1024, 128} },
5236 .block_erase = spi_block_erase_d8,
5237 }, {
5238 .eraseblocks = { { 8192 * 1024, 1} },
5239 .block_erase = spi_block_erase_60,
5240 }, {
5241 .eraseblocks = { { 8192 * 1024, 1} },
5242 .block_erase = spi_block_erase_c7,
5243 }
5244 },
5245 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5246 .unlock = spi_disable_blockprotect_bp3_srwd,
stefanct5d10cff2011-07-24 22:21:57 +00005247 .write = spi_chip_write_256,
5248 .read = spi_chip_read,
Alan Greena7cfa332019-06-24 15:48:14 +10005249 .voltage = {2700, 3600},
stefanct5d10cff2011-07-24 22:21:57 +00005250 },
Alan Greena7cfa332019-06-24 15:48:14 +10005251
Marc Jonesb2f90022014-04-29 17:37:23 -06005252 {
5253 .vendor = "Eon",
Nikolai Artemiev12898322020-08-31 17:33:18 +10005254 .name = "EN25S10",
5255 .bustype = BUS_SPI,
5256 .manufacture_id = EON_ID_NOPREFIX,
5257 .model_id = EON_EN25S10,
5258 .total_size = 128,
5259 .page_size = 256,
5260 /* OTP: 256B total; enter 0x3A */
5261 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5262 .tested = TEST_UNTESTED,
5263 .probe = probe_spi_rdid,
5264 .probe_timing = TIMING_ZERO,
5265 .block_erasers =
5266 {
5267 {
5268 .eraseblocks = { {4 * 1024, 32} },
5269 .block_erase = spi_block_erase_20,
5270 }, {
5271 .eraseblocks = { {32 * 1024, 4} },
5272 .block_erase = spi_block_erase_52,
5273 }, {
5274 .eraseblocks = { {128 * 1024, 1} },
5275 .block_erase = spi_block_erase_60,
5276 }, {
5277 .eraseblocks = { {128 * 1024, 1} },
5278 .block_erase = spi_block_erase_c7,
5279 }
5280 },
5281 .printlock = spi_prettyprint_status_register_bp2_srwd,
5282 .unlock = spi_disable_blockprotect,
5283 .write = spi_chip_write_256,
5284 .read = spi_chip_read,
5285 .voltage = {1650, 1950},
5286 },
5287
5288 {
5289 .vendor = "Eon",
5290 .name = "EN25S16",
5291 .bustype = BUS_SPI,
5292 .manufacture_id = EON_ID_NOPREFIX,
5293 .model_id = EON_EN25S16,
5294 .total_size = 2048,
5295 .page_size = 256,
5296 /* OTP: 512B total; enter 0x3A */
5297 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5298 .tested = TEST_UNTESTED,
5299 .probe = probe_spi_rdid,
5300 .probe_timing = TIMING_ZERO,
5301 .block_erasers =
5302 {
5303 {
5304 .eraseblocks = { {4 * 1024, 512} },
5305 .block_erase = spi_block_erase_20,
5306 }, {
5307 .eraseblocks = { {64 * 1024, 32} },
5308 .block_erase = spi_block_erase_52,
5309 }, {
5310 .eraseblocks = { {32 * 1024, 64} },
5311 .block_erase = spi_block_erase_d8,
5312 }, {
5313 .eraseblocks = { {2048 * 1024, 1} },
5314 .block_erase = spi_block_erase_60,
5315 }, {
5316 .eraseblocks = { {2048 * 1024, 1} },
5317 .block_erase = spi_block_erase_c7,
5318 }
5319 },
5320 .printlock = spi_prettyprint_status_register_en25s_wp,
5321 .unlock = spi_disable_blockprotect_bp3_srwd,
5322 .write = spi_chip_write_256,
5323 .read = spi_chip_read,
5324 .voltage = {1650, 1950},
5325 },
5326
5327 {
5328 .vendor = "Eon",
5329 .name = "EN25S20",
5330 .bustype = BUS_SPI,
5331 .manufacture_id = EON_ID_NOPREFIX,
5332 .model_id = EON_EN25S20,
5333 .total_size = 256,
5334 .page_size = 256,
5335 /* OTP: 256B total; enter 0x3A */
5336 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5337 .tested = TEST_UNTESTED,
5338 .probe = probe_spi_rdid,
5339 .probe_timing = TIMING_ZERO,
5340 .block_erasers =
5341 {
5342 {
5343 .eraseblocks = { {4 * 1024, 64} },
5344 .block_erase = spi_block_erase_20,
5345 }, {
5346 .eraseblocks = { {64 * 1024, 4} },
5347 .block_erase = spi_block_erase_d8,
5348 }, {
5349 .eraseblocks = { {256 * 1024, 1} },
5350 .block_erase = spi_block_erase_60,
5351 }, {
5352 .eraseblocks = { {256 * 1024, 1} },
5353 .block_erase = spi_block_erase_c7,
5354 }
5355 },
5356 .printlock = spi_prettyprint_status_register_bp2_srwd,
5357 .unlock = spi_disable_blockprotect,
5358 .write = spi_chip_write_256,
5359 .read = spi_chip_read,
5360 .voltage = {1650, 1950},
5361 },
5362
5363 {
5364 .vendor = "Eon",
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005365 .name = "EN25S32",
5366 .bustype = BUS_SPI,
5367 .manufacture_id = EON_ID_NOPREFIX,
5368 .model_id = EON_EN25S32,
5369 .total_size = 4096,
5370 .page_size = 256,
5371 /* OTP: 512B total; enter 0x3A */
5372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
5373 .tested = TEST_UNTESTED,
5374 .probe = probe_spi_rdid,
5375 .probe_timing = TIMING_ZERO,
5376 .block_erasers =
5377 {
5378 {
5379 .eraseblocks = { {4 * 1024, 1024} },
5380 .block_erase = spi_block_erase_20,
5381 }, {
5382 .eraseblocks = { {32 * 1024, 128} },
5383 .block_erase = spi_block_erase_52,
5384 }, {
5385 .eraseblocks = { {64 * 1024, 64} },
5386 .block_erase = spi_block_erase_d8,
5387 }, {
5388 .eraseblocks = { {4096 * 1024, 1} },
5389 .block_erase = spi_block_erase_60,
5390 }, {
5391 .eraseblocks = { {4096 * 1024, 1} },
5392 .block_erase = spi_block_erase_c7,
5393 }
5394 },
5395 .printlock = spi_prettyprint_status_register_en25s_wp,
5396 .unlock = spi_disable_blockprotect_bp3_srwd,
5397 .write = spi_chip_write_256,
5398 .read = spi_chip_read,
5399 .voltage = {1650, 1950},
5400 },
5401
5402 {
5403 .vendor = "Eon",
5404 .name = "EN25S40",
5405 .bustype = BUS_SPI,
5406 .manufacture_id = EON_ID_NOPREFIX,
5407 .model_id = EON_EN25S40,
5408 .total_size = 512,
5409 .page_size = 256,
5410 /* OTP: 256B total; enter 0x3A */
5411 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5412 .tested = TEST_OK_PREW,
5413 .probe = probe_spi_rdid,
5414 .probe_timing = TIMING_ZERO,
5415 .block_erasers =
5416 {
5417 {
5418 .eraseblocks = { {4 * 1024, 128} },
5419 .block_erase = spi_block_erase_20,
5420 }, {
5421 .eraseblocks = { {64 * 1024, 8} },
5422 .block_erase = spi_block_erase_d8,
5423 }, {
5424 .eraseblocks = { {512 * 1024, 1} },
5425 .block_erase = spi_block_erase_60,
5426 }, {
5427 .eraseblocks = { {512 * 1024, 1} },
5428 .block_erase = spi_block_erase_c7,
5429 }
5430 },
5431 .printlock = spi_prettyprint_status_register_bp2_srwd,
5432 .unlock = spi_disable_blockprotect,
5433 .write = spi_chip_write_256,
5434 .read = spi_chip_read,
5435 .voltage = {1650, 1950},
5436 },
5437
5438 {
5439 .vendor = "Eon",
Marc Jonesb2f90022014-04-29 17:37:23 -06005440 .name = "EN25S64",
5441 .bustype = BUS_SPI,
5442 .manufacture_id = EON_ID_NOPREFIX,
5443 .model_id = EON_EN25S64,
5444 .total_size = 8192,
5445 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -07005446 /* FIXME: add FEATURE_QPI removed */
Marc Jonesb2f90022014-04-29 17:37:23 -06005447 /* OTP: 512B total; enter 0x3A */
Edward O'Callaghan27486212019-07-26 21:59:55 +10005448 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10005449 .tested = TEST_OK_PREW,
Marc Jonesb2f90022014-04-29 17:37:23 -06005450 .probe = probe_spi_rdid,
5451 .probe_timing = TIMING_ZERO,
Alan Greena7cfa332019-06-24 15:48:14 +10005452 .block_erasers =
5453 {
Marc Jonesb2f90022014-04-29 17:37:23 -06005454 {
5455 .eraseblocks = { {4 * 1024, 2048} },
5456 .block_erase = spi_block_erase_20,
5457 }, {
5458 .eraseblocks = { {64 * 1024, 128} },
5459 .block_erase = spi_block_erase_d8,
5460 }, {
5461 .eraseblocks = { {8192 * 1024, 1} },
5462 .block_erase = spi_block_erase_60,
5463 }, {
5464 .eraseblocks = { {8192 * 1024, 1} },
5465 .block_erase = spi_block_erase_c7,
5466 }
5467 },
5468 .unlock = spi_disable_blockprotect,
5469 .write = spi_chip_write_256,
5470 .read = spi_chip_read,
5471 .voltage = {1650, 1950},
Marc Jones51c8a162014-05-06 15:02:14 -06005472 .wp = &wp_w25,
Marc Jonesb2f90022014-04-29 17:37:23 -06005473 },
stefanct5d10cff2011-07-24 22:21:57 +00005474
5475 {
5476 .vendor = "Eon",
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005477 .name = "EN25S80",
5478 .bustype = BUS_SPI,
5479 .manufacture_id = EON_ID_NOPREFIX,
5480 .model_id = EON_EN25S80,
5481 .total_size = 1024,
5482 .page_size = 256,
5483 /* OTP: 256B total; enter 0x3A */
5484 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5485 .tested = TEST_UNTESTED,
5486 .probe = probe_spi_rdid,
5487 .probe_timing = TIMING_ZERO,
5488 .block_erasers =
5489 {
5490 {
5491 .eraseblocks = { {4 * 1024, 256} },
5492 .block_erase = spi_block_erase_20,
5493 }, {
5494 .eraseblocks = { {64 * 1024, 16} },
5495 .block_erase = spi_block_erase_d8,
5496 }, {
5497 .eraseblocks = { {1024 * 1024, 1} },
5498 .block_erase = spi_block_erase_60,
5499 }, {
5500 .eraseblocks = { {1024 * 1024, 1} },
5501 .block_erase = spi_block_erase_c7,
5502 }
5503 },
5504 .printlock = spi_prettyprint_status_register_bp2_srwd,
5505 .unlock = spi_disable_blockprotect,
5506 .write = spi_chip_write_256,
5507 .read = spi_chip_read,
5508 .voltage = {1650, 1950},
5509 },
5510
5511 {
5512 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00005513 .name = "EN29F002(A)(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00005514 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005515 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005516 .model_id = EON_EN29F002B,
hailfinger286829b2009-01-08 03:40:17 +00005517 .total_size = 256,
5518 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00005519 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +00005520 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005521 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005522 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005523 .block_erasers =
5524 {
5525 {
Simon Glass8dc82732013-07-16 10:13:51 -06005526 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005527 {16 * 1024, 1},
mkarcher8dc09ff2010-03-13 23:47:09 +00005528 {8 * 1024, 2},
5529 {32 * 1024, 1},
5530 {64 * 1024, 3},
snelson1c03aa12009-12-23 17:05:59 +00005531 },
5532 .block_erase = erase_sector_jedec,
5533 }, {
5534 .eraseblocks = { {256 * 1024, 1} },
5535 .block_erase = erase_chip_block_jedec,
5536 },
5537 },
hailfingerfff99532009-11-27 17:49:42 +00005538 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005539 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005540 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005541 },
5542
hailfinger286829b2009-01-08 03:40:17 +00005543 {
hailfinger61958912010-07-28 22:20:20 +00005544 .vendor = "Eon",
hailfinger286829b2009-01-08 03:40:17 +00005545 .name = "EN29F002(A)(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00005546 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005547 .manufacture_id = EON_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005548 .model_id = EON_EN29F002T,
hailfinger286829b2009-01-08 03:40:17 +00005549 .total_size = 256,
5550 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +00005551 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +10005552 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00005553 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005554 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005555 .block_erasers =
5556 {
5557 {
Simon Glass8dc82732013-07-16 10:13:51 -06005558 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005559 {64 * 1024, 3},
mkarcher8dc09ff2010-03-13 23:47:09 +00005560 {32 * 1024, 1},
5561 {8 * 1024, 2},
5562 {16 * 1024, 1},
snelson1c03aa12009-12-23 17:05:59 +00005563 },
5564 .block_erase = erase_sector_jedec,
5565 }, {
5566 .eraseblocks = { {256 * 1024, 1} },
5567 .block_erase = erase_chip_block_jedec,
5568 },
5569 },
hailfingerfff99532009-11-27 17:49:42 +00005570 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005571 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005572 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005573 },
5574
hailfinger286829b2009-01-08 03:40:17 +00005575 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005576 .vendor = "Eon",
5577 .name = "EN29F010",
5578 .bustype = BUS_PARALLEL,
5579 .manufacture_id = EON_ID,
5580 .model_id = EON_EN29F010,
5581 .total_size = 128,
5582 .page_size = 128,
5583 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5584 .tested = TEST_OK_PRE,
5585 .probe = probe_jedec,
5586 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5587 .block_erasers =
5588 {
5589 {
5590 .eraseblocks = { {16 * 1024, 8} },
5591 .block_erase = erase_sector_jedec,
5592 },
5593 {
5594 .eraseblocks = { {128 * 1024, 1} },
5595 .block_erase = erase_chip_block_jedec,
5596 },
5597 },
5598 .write = write_jedec_1,
5599 .read = read_memmapped,
5600 .voltage = {4500, 5500},
5601 },
5602
5603 {
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005604 .vendor = "Eon",
5605 .name = "EN29GL064(A)B",
5606 .bustype = BUS_PARALLEL,
5607 .manufacture_id = EON_ID,
5608 .model_id = EON_EN29GL064B,
5609 .total_size = 8192,
5610 .page_size = 128 * 1024, /* actual page size is 16 */
5611 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5612 .tested = TEST_UNTESTED,
5613 .probe = probe_jedec_29gl,
5614 .probe_timing = TIMING_ZERO,
5615 .block_erasers =
5616 {
5617 {
5618 .eraseblocks = {
5619 {8 * 1024, 8},
5620 {64 * 1024, 127},
5621 },
5622 .block_erase = erase_sector_jedec,
5623 }, {
5624 .eraseblocks = { {8 * 1024 * 1024, 1} },
5625 .block_erase = erase_chip_block_jedec,
5626 },
5627 },
5628 .write = write_jedec_1,
5629 .read = read_memmapped,
5630 .voltage = {2700, 3600},
5631 },
5632
5633 {
5634 .vendor = "Eon",
5635 .name = "EN29GL064(A)T",
5636 .bustype = BUS_PARALLEL,
5637 .manufacture_id = EON_ID,
5638 .model_id = EON_EN29GL064T,
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 {64 * 1024, 127},
5650 {8 * 1024, 8},
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 = "EN29GL064H/L",
5666 .bustype = BUS_PARALLEL,
5667 .manufacture_id = EON_ID,
5668 .model_id = EON_EN29GL064HL,
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 = { {64 * 1024, 128} },
5679 .block_erase = erase_sector_jedec,
5680 }, {
5681 .eraseblocks = { {8 * 1024 * 1024, 1} },
5682 .block_erase = erase_chip_block_jedec,
5683 },
5684 },
5685 .write = write_jedec_1,
5686 .read = read_memmapped,
5687 .voltage = {2700, 3600},
5688 },
5689
5690 {
5691 .vendor = "Eon",
5692 .name = "EN29GL128",
5693 .bustype = BUS_PARALLEL,
5694 .manufacture_id = EON_ID,
5695 .model_id = EON_EN29GL128HL,
5696 .total_size = 16384,
5697 .page_size = 128 * 1024, /* actual page size is 16 */
5698 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5699 .tested = TEST_UNTESTED,
5700 .probe = probe_jedec_29gl,
5701 .probe_timing = TIMING_ZERO,
5702 .block_erasers =
5703 {
5704 {
5705 .eraseblocks = { {128 * 1024, 128} },
5706 .block_erase = erase_sector_jedec,
5707 }, {
5708 .eraseblocks = { {16 * 1024 * 1024, 1} },
5709 .block_erase = erase_chip_block_jedec,
5710 },
5711 },
5712 .write = write_jedec_1,
5713 .read = read_memmapped,
5714 .voltage = {2700, 3600},
5715 },
5716
5717 {
5718 .vendor = "Eon",
5719 .name = "EN29LV040(A)",
5720 .bustype = BUS_PARALLEL,
5721 .manufacture_id = EON_ID,
5722 .model_id = EON_EN29LV040,
5723 .total_size = 512,
5724 .page_size = 4 * 1024,
5725 .tested = TEST_OK_PREW,
5726 .probe = probe_jedec,
5727 .probe_timing = TIMING_ZERO,
5728 .block_erasers =
5729 {
5730 {
5731 .eraseblocks = { {64 * 1024, 8} },
5732 .block_erase = erase_sector_jedec,
5733 },
5734 {
5735 .eraseblocks = { {512 * 1024, 1} },
5736 .block_erase = erase_chip_block_jedec,
5737 },
5738 },
5739 .write = write_jedec_1,
5740 .read = read_memmapped,
5741 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
5742 },
5743
5744 {
5745 .vendor = "Eon",
5746 .name = "EN29LV640B",
5747 .bustype = BUS_PARALLEL,
5748 .manufacture_id = EON_ID,
5749 .model_id = EON_EN29LV640B,
5750 .total_size = 8192,
5751 .page_size = 8192,
5752 .feature_bits = FEATURE_ADDR_SHIFTED,
5753 .tested = TEST_OK_PREW,
5754 .probe = probe_en29lv640b,
5755 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
5756 .block_erasers =
5757 {
5758 {
5759 .eraseblocks = {
5760 {8 * 1024, 8},
5761 {64 * 1024, 127},
5762 },
5763 .block_erase = erase_block_jedec,
5764 }, {
5765 .eraseblocks = { {8 * 1024 * 1024, 1} },
5766 .block_erase = erase_chip_block_jedec,
5767 },
5768 },
5769 .write = write_en29lv640b,
5770 .read = read_memmapped,
5771 .voltage = {2700, 3600},
5772 },
5773
5774 {
hailfinger286829b2009-01-08 03:40:17 +00005775 .vendor = "Fujitsu",
5776 .name = "MBM29F004BC",
hailfingere1e41ea2011-07-27 07:13:06 +00005777 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005778 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005779 .model_id = FUJITSU_MBM29F004BC,
hailfinger286829b2009-01-08 03:40:17 +00005780 .total_size = 512,
5781 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005782 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005783 .tested = TEST_UNTESTED,
5784 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005785 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005786 .block_erasers =
5787 {
5788 {
Simon Glass8dc82732013-07-16 10:13:51 -06005789 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005790 {16 * 1024, 1},
5791 {8 * 1024, 2},
5792 {32 * 1024, 1},
5793 {64 * 1024, 7},
5794 },
snelsonc6855342010-01-28 23:55:12 +00005795 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005796 }, {
5797 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005798 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005799 },
5800 },
hailfinger286829b2009-01-08 03:40:17 +00005801 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00005802 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005803 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005804 },
5805
hailfinger286829b2009-01-08 03:40:17 +00005806 {
5807 .vendor = "Fujitsu",
5808 .name = "MBM29F004TC",
hailfingere1e41ea2011-07-27 07:13:06 +00005809 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005810 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005811 .model_id = FUJITSU_MBM29F004TC,
hailfinger286829b2009-01-08 03:40:17 +00005812 .total_size = 512,
5813 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00005814 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +00005815 .tested = TEST_UNTESTED,
5816 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00005817 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson1c03aa12009-12-23 17:05:59 +00005818 .block_erasers =
5819 {
5820 {
Simon Glass8dc82732013-07-16 10:13:51 -06005821 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005822 {64 * 1024, 7},
5823 {32 * 1024, 1},
5824 {8 * 1024, 2},
5825 {16 * 1024, 1},
5826 },
snelsonc6855342010-01-28 23:55:12 +00005827 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005828 }, {
5829 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00005830 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005831 },
5832 },
hailfinger286829b2009-01-08 03:40:17 +00005833 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +00005834 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00005835 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00005836 },
5837
hailfinger286829b2009-01-08 03:40:17 +00005838 {
snelsonc6855342010-01-28 23:55:12 +00005839 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +00005840 .vendor = "Fujitsu",
5841 .name = "MBM29F400BC",
hailfingere1e41ea2011-07-27 07:13:06 +00005842 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +00005843 .manufacture_id = FUJITSU_ID,
mhmd3c80cd2010-09-15 23:31:03 +00005844 .model_id = FUJITSU_MBM29F400BC,
hailfinger286829b2009-01-08 03:40:17 +00005845 .total_size = 512,
5846 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10005847 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +00005848 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10005849 .probe = probe_jedec,
5850 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
snelson1c03aa12009-12-23 17:05:59 +00005851 .block_erasers =
5852 {
5853 {
Simon Glass8dc82732013-07-16 10:13:51 -06005854 .eraseblocks = {
snelson1c03aa12009-12-23 17:05:59 +00005855 {16 * 1024, 1},
5856 {8 * 1024, 2},
5857 {32 * 1024, 1},
5858 {64 * 1024, 7},
5859 },
Alan Green607cc632019-09-16 16:09:32 +10005860 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005861 }, {
5862 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10005863 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00005864 },
5865 },
Alan Green607cc632019-09-16 16:09:32 +10005866 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00005867 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00005868 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +00005869 },
5870
hailfinger286829b2009-01-08 03:40:17 +00005871 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005872 .vendor = "Fujitsu",
5873 .name = "MBM29F400TC",
5874 .bustype = BUS_PARALLEL,
5875 .manufacture_id = FUJITSU_ID,
5876 .model_id = FUJITSU_MBM29F400TC,
5877 .total_size = 512,
5878 .page_size = 64 * 1024,
Alan Green607cc632019-09-16 16:09:32 +10005879 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07005880 .tested = TEST_UNTESTED,
Alan Green607cc632019-09-16 16:09:32 +10005881 .probe = probe_jedec,
5882 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07005883 .block_erasers =
5884 {
5885 {
Alan Greend76dc1f2019-06-26 15:38:19 +10005886 .eraseblocks = {
5887 {64 * 1024, 7},
5888 {32 * 1024, 1},
5889 {8 * 1024, 2},
5890 {16 * 1024, 1},
5891 },
Alan Green607cc632019-09-16 16:09:32 +10005892 .block_erase = erase_sector_jedec,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07005893 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10005894 .eraseblocks = { {512 * 1024, 1} },
Alan Green607cc632019-09-16 16:09:32 +10005895 .block_erase = erase_chip_block_jedec,
Alan Greend76dc1f2019-06-26 15:38:19 +10005896 },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07005897 },
Alan Green607cc632019-09-16 16:09:32 +10005898 .write = write_jedec_1,
Alan Greend76dc1f2019-06-26 15:38:19 +10005899 .read = read_memmapped,
5900 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07005901 },
5902
5903 {
Nikolai Artemiev88a798c2020-08-31 17:34:25 +10005904 .vendor = "Fujitsu",
5905 .name = "MBM29LV160BE",
5906 .bustype = BUS_PARALLEL,
5907 .manufacture_id = FUJITSU_ID,
5908 .model_id = FUJITSU_MBM29LV160BE,
5909 .total_size = 2 * 1024,
5910 .page_size = 0,
5911 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5912 .tested = TEST_UNTESTED,
5913 .probe = probe_jedec,
5914 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5915 .block_erasers =
5916 {
5917 {
5918 .eraseblocks = {
5919 {16 * 1024, 1},
5920 {8 * 1024, 2},
5921 {32 * 1024, 1},
5922 {64 * 1024, 31},
5923 },
5924 .block_erase = erase_block_jedec,
5925 }, {
5926 .eraseblocks = { {2048 * 1024, 1} },
5927 .block_erase = erase_chip_block_jedec,
5928 },
5929 },
5930 .write = write_jedec_1, /* Supports a fast mode too */
5931 .read = read_memmapped,
5932 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5933 },
5934
5935 {
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10005936 .vendor = "Fujitsu",
5937 .name = "MBM29LV160TE",
5938 .bustype = BUS_PARALLEL,
5939 .manufacture_id = FUJITSU_ID,
5940 .model_id = FUJITSU_MBM29LV160TE,
5941 .total_size = 2 * 1024,
5942 .page_size = 0,
5943 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
5944 .tested = TEST_UNTESTED,
5945 .probe = probe_jedec,
5946 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
5947 .block_erasers =
5948 {
5949 {
5950 .eraseblocks = {
5951 {64 * 1024, 31},
5952 {32 * 1024, 1},
5953 {8 * 1024, 2},
5954 {16 * 1024, 1},
5955 },
5956 .block_erase = erase_block_jedec,
5957 }, {
5958 .eraseblocks = { {2048 * 1024, 1} },
5959 .block_erase = erase_chip_block_jedec,
5960 },
5961 },
5962 .write = write_jedec_1, /* Supports a fast mode too */
5963 .read = read_memmapped,
5964 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
5965 },
5966
5967 {
5968 .vendor = "GigaDevice",
5969 .name = "GD25B128B/GD25Q128B",
5970 .bustype = BUS_SPI,
5971 .manufacture_id = GIGADEVICE_ID,
5972 .model_id = GIGADEVICE_GD25Q128,
5973 .total_size = 16384,
5974 .page_size = 256,
5975 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
5976 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5977 .tested = TEST_OK_PREW,
5978 .probe = probe_spi_rdid,
5979 .probe_timing = TIMING_ZERO,
5980 .block_erasers =
5981 {
5982 {
5983 .eraseblocks = { {4 * 1024, 4096} },
5984 .block_erase = spi_block_erase_20,
5985 }, {
5986 .eraseblocks = { {32 * 1024, 512} },
5987 .block_erase = spi_block_erase_52,
5988 }, {
5989 .eraseblocks = { {64 * 1024, 256} },
5990 .block_erase = spi_block_erase_d8,
5991 }, {
5992 .eraseblocks = { {16 * 1024 * 1024, 1} },
5993 .block_erase = spi_block_erase_60,
5994 }, {
5995 .eraseblocks = { {16 * 1024 * 1024, 1} },
5996 .block_erase = spi_block_erase_c7,
5997 }
5998 },
5999 .printlock = spi_prettyprint_status_register_bp4_srwd,
6000 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6001 .write = spi_chip_write_256,
6002 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6003 .voltage = {2700, 3600},
6004 },
6005
6006 {
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006007 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10006008 .name = "GD25LQ128C/GD25LQ128D",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006009 .bustype = BUS_SPI,
6010 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006011 .model_id = GIGADEVICE_GD25LQ128CD,
6012 .total_size = 16384,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006013 .page_size = 256,
Edward O'Callaghan7f47d092020-01-13 23:44:15 +11006014 /* OTP: 1024B total, 256B reserved; read 0x48; write x42, erase 0x44 */
6015 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006016 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006017 .probe = probe_spi_rdid,
6018 .probe_timing = TIMING_ZERO,
6019 .block_erasers =
6020 {
6021 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006022 .eraseblocks = { {4 * 1024, 4096} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006023 .block_erase = spi_block_erase_20,
6024 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006025 .eraseblocks = { {32 * 1024, 512} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006026 .block_erase = spi_block_erase_52,
6027 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006028 .eraseblocks = { {64 * 1024, 256} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006029 .block_erase = spi_block_erase_d8,
6030 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006031 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006032 .block_erase = spi_block_erase_60,
6033 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006034 .eraseblocks = { {16 * 1024 * 1024, 1} },
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006035 .block_erase = spi_block_erase_c7,
6036 }
6037 },
Edward O'Callaghan7f47d092020-01-13 23:44:15 +11006038 .printlock = spi_prettyprint_status_register_bp4_srwd,
6039 .unlock = spi_disable_blockprotect_bp4_srwd,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006040 .write = spi_chip_write_256,
6041 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006042 .voltage = {1695, 1950},
Alan Greend76dc1f2019-06-26 15:38:19 +10006043 .wp = &wp_generic,
6044 },
6045
6046 {
6047 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006048 .name = "GD25LQ16",
6049 .bustype = BUS_SPI,
6050 .manufacture_id = GIGADEVICE_ID,
6051 .model_id = GIGADEVICE_GD25LQ16,
6052 .total_size = 2048,
6053 .page_size = 256,
6054 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6055 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6056 .tested = TEST_UNTESTED,
6057 .probe = probe_spi_rdid,
6058 .probe_timing = TIMING_ZERO,
6059 .block_erasers =
6060 {
6061 {
6062 .eraseblocks = { {4 * 1024, 512} },
6063 .block_erase = spi_block_erase_20,
6064 }, {
6065 .eraseblocks = { {32 * 1024, 64} },
6066 .block_erase = spi_block_erase_52,
6067 }, {
6068 .eraseblocks = { {64 * 1024, 32} },
6069 .block_erase = spi_block_erase_d8,
6070 }, {
6071 .eraseblocks = { {2 * 1024 * 1024, 1} },
6072 .block_erase = spi_block_erase_60,
6073 }, {
6074 .eraseblocks = { {2 * 1024 * 1024, 1} },
6075 .block_erase = spi_block_erase_c7,
6076 }
6077 },
6078 .printlock = spi_prettyprint_status_register_bp4_srwd,
6079 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6080 .write = spi_chip_write_256,
6081 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6082 .voltage = {1695, 1950},
6083 },
6084
6085 {
6086 .vendor = "GigaDevice",
Alan Greend76dc1f2019-06-26 15:38:19 +10006087 .name = "GD25LQ32",
6088 .bustype = BUS_SPI,
6089 .manufacture_id = GIGADEVICE_ID,
6090 .model_id = GIGADEVICE_GD25LQ32,
6091 .total_size = 4096,
6092 .page_size = 256,
Alan Green6b94e402019-09-16 16:30:59 +10006093 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006094 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006095 .probe = probe_spi_rdid,
6096 .probe_timing = TIMING_ZERO,
6097 .block_erasers =
6098 {
6099 {
6100 .eraseblocks = { {4 * 1024, 1024} },
6101 .block_erase = spi_block_erase_20,
6102 }, {
6103 .eraseblocks = { {32 * 1024, 128} },
6104 .block_erase = spi_block_erase_52,
6105 }, {
6106 .eraseblocks = { {64 * 1024, 64} },
6107 .block_erase = spi_block_erase_d8,
6108 }, {
6109 .eraseblocks = { {4 * 1024 * 1024, 1} },
6110 .block_erase = spi_block_erase_60,
6111 }, {
6112 .eraseblocks = { {4 * 1024 * 1024, 1} },
6113 .block_erase = spi_block_erase_c7,
6114 }
6115 },
Alan Green6b94e402019-09-16 16:30:59 +10006116 .printlock = spi_prettyprint_status_register_bp4_srwd,
6117 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006118 .write = spi_chip_write_256,
6119 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006120 .voltage = {1695, 1950},
Alan Greend76dc1f2019-06-26 15:38:19 +10006121 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006122 },
6123
6124 {
6125 .vendor = "GigaDevice",
David Schneider59543cd2016-04-27 02:11:00 -07006126 .name = "GD25LQ40",
6127 .bustype = BUS_SPI,
6128 .manufacture_id = GIGADEVICE_ID,
6129 .model_id = GIGADEVICE_GD25LQ40,
6130 .total_size = 512,
6131 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006132 .feature_bits = FEATURE_WRSR_WREN,
David Schneider59543cd2016-04-27 02:11:00 -07006133 .tested = TEST_UNTESTED,
6134 .probe = probe_spi_rdid,
6135 .probe_timing = TIMING_ZERO,
6136 .block_erasers =
6137 {
6138 {
6139 .eraseblocks = { {4 * 1024, 128} },
6140 .block_erase = spi_block_erase_20,
6141 }, {
6142 .eraseblocks = { {32 * 1024, 16} },
6143 .block_erase = spi_block_erase_52,
6144 }, {
6145 .eraseblocks = { {64 * 1024, 8} },
6146 .block_erase = spi_block_erase_d8,
6147 }, {
6148 .eraseblocks = { {512 * 1024, 1} },
6149 .block_erase = spi_block_erase_60,
6150 }, {
6151 .eraseblocks = { {512 * 1024, 1} },
6152 .block_erase = spi_block_erase_c7,
6153 }
6154 },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006155 .printlock = spi_prettyprint_status_register_bp3_srwd,
David Schneider59543cd2016-04-27 02:11:00 -07006156 .unlock = spi_disable_blockprotect,
6157 .write = spi_chip_write_256,
6158 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006159 .voltage = {1695, 1950},
David Schneider59543cd2016-04-27 02:11:00 -07006160 },
6161
6162 {
6163 .vendor = "GigaDevice",
Alan Green78d8f702019-08-06 16:46:42 +10006164 .name = "GD25LQ64(B)",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006165 .bustype = BUS_SPI,
6166 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006167 .model_id = GIGADEVICE_GD25LQ64,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006168 .total_size = 8192,
6169 .page_size = 256,
Alan Green78d8f702019-08-06 16:46:42 +10006170 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006171 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006172 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006173 .probe = probe_spi_rdid,
6174 .probe_timing = TIMING_ZERO,
6175 .block_erasers =
6176 {
6177 {
6178 .eraseblocks = { {4 * 1024, 2048} },
6179 .block_erase = spi_block_erase_20,
6180 }, {
6181 .eraseblocks = { {32 * 1024, 256} },
6182 .block_erase = spi_block_erase_52,
6183 }, {
6184 .eraseblocks = { {64 * 1024, 128} },
6185 .block_erase = spi_block_erase_d8,
6186 }, {
6187 .eraseblocks = { {8 * 1024 * 1024, 1} },
6188 .block_erase = spi_block_erase_60,
6189 }, {
6190 .eraseblocks = { {8 * 1024 * 1024, 1} },
6191 .block_erase = spi_block_erase_c7,
6192 }
6193 },
Alan Green78d8f702019-08-06 16:46:42 +10006194 .printlock = spi_prettyprint_status_register_bp4_srwd,
6195 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006196 .write = spi_chip_write_256,
Alan Green78d8f702019-08-06 16:46:42 +10006197 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6198 .voltage = {1695, 1950},
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006199 .wp = &wp_w25,
6200 },
6201
6202 {
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006203 .vendor = "GigaDevice",
6204 .name = "GD25LQ80",
6205 .bustype = BUS_SPI,
6206 .manufacture_id = GIGADEVICE_ID,
6207 .model_id = GIGADEVICE_GD25LQ80,
6208 .total_size = 1024,
6209 .page_size = 256,
6210 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
6211 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6212 .tested = TEST_UNTESTED,
6213 .probe = probe_spi_rdid,
6214 .probe_timing = TIMING_ZERO,
6215 .block_erasers =
6216 {
6217 {
6218 .eraseblocks = { {4 * 1024, 256} },
6219 .block_erase = spi_block_erase_20,
6220 }, {
6221 .eraseblocks = { {32 * 1024, 32} },
6222 .block_erase = spi_block_erase_52,
6223 }, {
6224 .eraseblocks = { {64 * 1024, 16} },
6225 .block_erase = spi_block_erase_d8,
6226 }, {
6227 .eraseblocks = { {1 * 1024 * 1024, 1} },
6228 .block_erase = spi_block_erase_60,
6229 }, {
6230 .eraseblocks = { {1 * 1024 * 1024, 1} },
6231 .block_erase = spi_block_erase_c7,
6232 }
6233 },
6234 .printlock = spi_prettyprint_status_register_bp4_srwd,
6235 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6236 .write = spi_chip_write_256,
6237 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6238 .voltage = {1695, 1950},
6239 },
6240
6241 {
6242 .vendor = "GigaDevice",
6243 .name = "GD25Q10",
6244 .bustype = BUS_SPI,
6245 .manufacture_id = GIGADEVICE_ID,
6246 .model_id = GIGADEVICE_GD25Q10,
6247 .total_size = 128,
6248 .page_size = 256,
6249 .feature_bits = FEATURE_WRSR_WREN,
6250 .tested = TEST_UNTESTED,
6251 .probe = probe_spi_rdid,
6252 .probe_timing = TIMING_ZERO,
6253 .block_erasers =
6254 {
6255 {
6256 .eraseblocks = { {4 * 1024, 32} },
6257 .block_erase = spi_block_erase_20,
6258 }, {
6259 .eraseblocks = { {32 * 1024, 4} },
6260 .block_erase = spi_block_erase_52,
6261 }, {
6262 .eraseblocks = { {64 * 1024, 2} },
6263 .block_erase = spi_block_erase_d8,
6264 }, {
6265 .eraseblocks = { {128 * 1024, 1} },
6266 .block_erase = spi_block_erase_60,
6267 }, {
6268 .eraseblocks = { {128 * 1024, 1} },
6269 .block_erase = spi_block_erase_c7,
6270 }
6271 },
6272 .printlock = spi_prettyprint_status_register_bp4_srwd,
6273 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6274 .write = spi_chip_write_256,
6275 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6276 .voltage = {2700, 3600},
6277 },
6278
6279 {
David Hendricksf5c122d2016-03-14 15:46:04 -07006280 /*
Stefan Tauner9816fc82016-08-12 15:47:49 -07006281 * TODO: There is a GD25Q128B without QPI support which can
6282 * be differentiated using SFDP, but for now we only care
6283 * about the GD25Q128C.
David Hendricksf5c122d2016-03-14 15:46:04 -07006284 */
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006285 .vendor = "GigaDevice",
Martin Roth4216ba32017-05-10 21:20:47 -06006286 .name = "GD25Q127C/GD25Q128C",
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006287 .bustype = BUS_SPI,
6288 .manufacture_id = GIGADEVICE_ID,
6289 .model_id = GIGADEVICE_GD25Q128,
6290 .total_size = 16384,
6291 .page_size = 256,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006292 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006293 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006294 .tested = TEST_OK_PREW,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006295 .probe = probe_spi_rdid,
6296 .probe_timing = TIMING_ZERO,
6297 .block_erasers =
6298 {
6299 {
6300 .eraseblocks = { {4 * 1024, 4096} },
6301 .block_erase = spi_block_erase_20,
6302 }, {
6303 .eraseblocks = { {32 * 1024, 512} },
6304 .block_erase = spi_block_erase_52,
6305 }, {
6306 .eraseblocks = { {64 * 1024, 256} },
6307 .block_erase = spi_block_erase_d8,
6308 }, {
6309 .eraseblocks = { {16 * 1024 * 1024, 1} },
6310 .block_erase = spi_block_erase_60,
6311 }, {
6312 .eraseblocks = { {16 * 1024 * 1024, 1} },
6313 .block_erase = spi_block_erase_c7,
6314 }
6315 },
Alan Green6b94e402019-09-16 16:30:59 +10006316 .printlock = spi_prettyprint_status_register_bp4_srwd,
6317 .unlock = spi_disable_blockprotect_bp4_srwd,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006318 .write = spi_chip_write_256,
6319 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006320 .voltage = {2700, 3600},
Martin Roth95785bd2017-05-09 23:47:20 -06006321 .wp = &wp_w25,
Shawn Nematbakhsh9e8ef492012-09-01 21:58:03 -07006322 },
6323
6324 {
Duncan Laurie0c383552019-03-16 12:35:16 -07006325 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006326 .name = "GD25Q16(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006327 .bustype = BUS_SPI,
6328 .manufacture_id = GIGADEVICE_ID,
6329 .model_id = GIGADEVICE_GD25Q16,
6330 .total_size = 2048,
6331 .page_size = 256,
6332 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green6b94e402019-09-16 16:30:59 +10006334 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006335 .probe = probe_spi_rdid,
6336 .probe_timing = TIMING_ZERO,
6337 .block_erasers =
6338 {
6339 {
6340 .eraseblocks = { {4 * 1024, 512} },
6341 .block_erase = spi_block_erase_20,
6342 }, {
6343 .eraseblocks = { {32 * 1024, 64} },
6344 .block_erase = spi_block_erase_52,
6345 }, {
6346 .eraseblocks = { {64 * 1024, 32} },
6347 .block_erase = spi_block_erase_d8,
6348 }, {
6349 .eraseblocks = { {2 * 1024 * 1024, 1} },
6350 .block_erase = spi_block_erase_60,
6351 }, {
6352 .eraseblocks = { {2 * 1024 * 1024, 1} },
6353 .block_erase = spi_block_erase_c7,
6354 }
6355 },
Alan Green6b94e402019-09-16 16:30:59 +10006356 .printlock = spi_prettyprint_status_register_bp4_srwd,
6357 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006358 .write = spi_chip_write_256,
6359 .read = spi_chip_read,
6360 .voltage = {2700, 3600},
6361 },
6362
6363 {
6364 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006365 .name = "GD25Q20(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006366 .bustype = BUS_SPI,
6367 .manufacture_id = GIGADEVICE_ID,
6368 .model_id = GIGADEVICE_GD25Q20,
6369 .total_size = 256,
6370 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006371 .feature_bits = FEATURE_WRSR_WREN,
Alan Green6b94e402019-09-16 16:30:59 +10006372 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10006373 .probe = probe_spi_rdid,
6374 .probe_timing = TIMING_ZERO,
6375 .block_erasers =
6376 {
6377 {
6378 .eraseblocks = { {4 * 1024, 64} },
6379 .block_erase = spi_block_erase_20,
6380 }, {
6381 .eraseblocks = { {32 * 1024, 8} },
6382 .block_erase = spi_block_erase_52,
6383 }, {
6384 .eraseblocks = { {64 * 1024, 4} },
6385 .block_erase = spi_block_erase_d8,
6386 }, {
6387 .eraseblocks = { {256 * 1024, 1} },
6388 .block_erase = spi_block_erase_60,
6389 }, {
6390 .eraseblocks = { {256 * 1024, 1} },
6391 .block_erase = spi_block_erase_c7,
6392 }
6393 },
Alan Green6b94e402019-09-16 16:30:59 +10006394 .printlock = spi_prettyprint_status_register_bp4_srwd,
6395 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006396 .write = spi_chip_write_256,
6397 .read = spi_chip_read,
6398 .voltage = {2700, 3600},
6399 },
6400
6401 {
6402 .vendor = "GigaDevice",
Duncan Laurie0c383552019-03-16 12:35:16 -07006403 .name = "GD25Q256D",
6404 .bustype = BUS_SPI,
6405 .manufacture_id = GIGADEVICE_ID,
6406 .model_id = GIGADEVICE_GD25Q256D,
6407 .total_size = 32768,
6408 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006409 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +10006410 .tested = TEST_OK_PREW,
Duncan Laurie0c383552019-03-16 12:35:16 -07006411 .probe = probe_spi_rdid,
6412 .probe_timing = TIMING_ZERO,
6413 .block_erasers =
6414 {
6415 {
6416 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006417 .block_erase = spi_block_erase_21,
6418 }, {
6419 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006420 .block_erase = spi_block_erase_20,
Duncan Laurie0c383552019-03-16 12:35:16 -07006421 }, {
6422 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006423 .block_erase = spi_block_erase_5c,
6424 }, {
6425 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006426 .block_erase = spi_block_erase_52,
Duncan Laurie0c383552019-03-16 12:35:16 -07006427 }, {
6428 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghanfadf15b2019-10-10 13:46:39 +11006429 .block_erase = spi_block_erase_dc,
6430 }, {
6431 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006432 .block_erase = spi_block_erase_d8,
Duncan Laurie0c383552019-03-16 12:35:16 -07006433 }, {
6434 .eraseblocks = { {32 * 1024 * 1024, 1} },
6435 .block_erase = spi_block_erase_60,
6436 }, {
6437 .eraseblocks = { {32 * 1024 * 1024, 1} },
6438 .block_erase = spi_block_erase_c7,
6439 }
6440 },
6441 .unlock = spi_disable_blockprotect,
6442 .write = spi_chip_write_256,
6443 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +10006444 .set_4ba = spi_enter_4ba_b7_we,
Duncan Laurie0c383552019-03-16 12:35:16 -07006445 .voltage = {2700, 3600},
6446 .wp = &wp_w25q_large,
6447 },
6448
6449 {
Bryan Freed9a0051f2012-05-22 16:06:09 -07006450 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006451 .name = "GD25Q32(B)",
Bryan Freed9a0051f2012-05-22 16:06:09 -07006452 .bustype = BUS_SPI,
6453 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006454 .model_id = GIGADEVICE_GD25Q32,
Bryan Freed9a0051f2012-05-22 16:06:09 -07006455 .total_size = 4096,
6456 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10006457 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006458 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006459 .tested = TEST_OK_PREW,
Bryan Freed9a0051f2012-05-22 16:06:09 -07006460 .probe = probe_spi_rdid,
6461 .probe_timing = TIMING_ZERO,
6462 .block_erasers =
6463 {
6464 {
6465 .eraseblocks = { {4 * 1024, 1024} },
6466 .block_erase = spi_block_erase_20,
6467 }, {
6468 .eraseblocks = { {32 * 1024, 128} },
6469 .block_erase = spi_block_erase_52,
6470 }, {
6471 .eraseblocks = { {64 * 1024, 64} },
6472 .block_erase = spi_block_erase_d8,
6473 }, {
6474 .eraseblocks = { {4 * 1024 * 1024, 1} },
6475 .block_erase = spi_block_erase_60,
6476 }, {
6477 .eraseblocks = { {4 * 1024 * 1024, 1} },
6478 .block_erase = spi_block_erase_c7,
6479 }
6480 },
Alan Green6b94e402019-09-16 16:30:59 +10006481 .printlock = spi_prettyprint_status_register_bp4_srwd,
6482 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Bryan Freed9a0051f2012-05-22 16:06:09 -07006483 .write = spi_chip_write_256,
6484 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10006485 .voltage = {2700, 3600},
6486 .wp = &wp_generic,
Bryan Freed9a0051f2012-05-22 16:06:09 -07006487 },
6488
6489 {
Alan Green753a38e2019-06-07 14:44:32 +10006490 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006491 .name = "GD25Q40(B)",
Alan Green753a38e2019-06-07 14:44:32 +10006492 .bustype = BUS_SPI,
6493 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006494 .model_id = GIGADEVICE_GD25Q40,
6495 .total_size = 512,
6496 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10006497 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10006498 .tested = TEST_UNTESTED,
6499 .probe = probe_spi_rdid,
6500 .probe_timing = TIMING_ZERO,
6501 .block_erasers =
6502 {
6503 {
6504 .eraseblocks = { {4 * 1024, 128} },
6505 .block_erase = spi_block_erase_20,
6506 }, {
6507 .eraseblocks = { {32 * 1024, 16} },
6508 .block_erase = spi_block_erase_52,
6509 }, {
6510 .eraseblocks = { {64 * 1024, 8} },
6511 .block_erase = spi_block_erase_d8,
6512 }, {
6513 .eraseblocks = { {512 * 1024, 1} },
6514 .block_erase = spi_block_erase_60,
6515 }, {
6516 .eraseblocks = { {512 * 1024, 1} },
6517 .block_erase = spi_block_erase_c7,
6518 }
6519 },
Alan Green6b94e402019-09-16 16:30:59 +10006520 .printlock = spi_prettyprint_status_register_bp4_srwd,
6521 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Greend76dc1f2019-06-26 15:38:19 +10006522 .write = spi_chip_write_256,
6523 .read = spi_chip_read,
6524 .voltage = {2700, 3600},
6525 },
6526
6527 {
6528 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006529 .name = "GD25Q512",
6530 .bustype = BUS_SPI,
6531 .manufacture_id = GIGADEVICE_ID,
6532 .model_id = GIGADEVICE_GD25Q512,
6533 .total_size = 64,
6534 .page_size = 256,
6535 .feature_bits = FEATURE_WRSR_WREN,
6536 .tested = TEST_OK_PREW,
6537 .probe = probe_spi_rdid,
6538 .probe_timing = TIMING_ZERO,
6539 .block_erasers =
6540 {
6541 {
6542 .eraseblocks = { {4 * 1024, 16} },
6543 .block_erase = spi_block_erase_20,
6544 }, {
6545 .eraseblocks = { {32 * 1024, 2} },
6546 .block_erase = spi_block_erase_52,
6547 }, {
6548 .eraseblocks = { {64 * 1024, 1} },
6549 .block_erase = spi_block_erase_60,
6550 }, {
6551 .eraseblocks = { {64 * 1024, 1} },
6552 .block_erase = spi_block_erase_c7,
6553 }
6554 },
6555 .printlock = spi_prettyprint_status_register_bp4_srwd,
6556 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6557 .write = spi_chip_write_256,
6558 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6559 .voltage = {2700, 3600},
6560 },
6561
6562 {
6563 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006564 .name = "GD25Q64(B)",
Alan Greend76dc1f2019-06-26 15:38:19 +10006565 .bustype = BUS_SPI,
6566 .manufacture_id = GIGADEVICE_ID,
6567 .model_id = GIGADEVICE_GD25Q64,
Alan Green753a38e2019-06-07 14:44:32 +10006568 .total_size = 8192,
6569 .page_size = 256,
6570 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006571 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006572 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10006573 .probe = probe_spi_rdid,
6574 .probe_timing = TIMING_ZERO,
6575 .block_erasers =
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006576 {
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006577 {
Alan Green753a38e2019-06-07 14:44:32 +10006578 .eraseblocks = { {4 * 1024, 2048} },
6579 .block_erase = spi_block_erase_20,
6580 }, {
6581 .eraseblocks = { {32 * 1024, 256} },
6582 .block_erase = spi_block_erase_52,
6583 }, {
6584 .eraseblocks = { {64 * 1024, 128} },
6585 .block_erase = spi_block_erase_d8,
6586 }, {
6587 .eraseblocks = { {8 * 1024 * 1024, 1} },
6588 .block_erase = spi_block_erase_60,
6589 }, {
6590 .eraseblocks = { {8 * 1024 * 1024, 1} },
6591 .block_erase = spi_block_erase_c7,
6592 }
Furquan Shaikh62cd8102016-07-17 23:04:06 -07006593 },
Alan Green6b94e402019-09-16 16:30:59 +10006594 .printlock = spi_prettyprint_status_register_bp4_srwd,
6595 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Green753a38e2019-06-07 14:44:32 +10006596 .write = spi_chip_write_256,
6597 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +10006598 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +10006599 .wp = &wp_w25,
6600 },
6601
6602 {
6603 .vendor = "GigaDevice",
Alan Greenb40ec892019-08-26 11:43:40 +10006604 .name = "GD25Q80(B)",
Alan Green753a38e2019-06-07 14:44:32 +10006605 .bustype = BUS_SPI,
6606 .manufacture_id = GIGADEVICE_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10006607 .model_id = GIGADEVICE_GD25Q80,
6608 .total_size = 1024,
Alan Green753a38e2019-06-07 14:44:32 +10006609 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +10006610 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +10006611 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10006612 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +10006613 .probe = probe_spi_rdid,
6614 .probe_timing = TIMING_ZERO,
6615 .block_erasers =
6616 {
6617 {
Alan Greend76dc1f2019-06-26 15:38:19 +10006618 .eraseblocks = { {4 * 1024, 256} },
Alan Green753a38e2019-06-07 14:44:32 +10006619 .block_erase = spi_block_erase_20,
6620 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006621 .eraseblocks = { {32 * 1024, 32} },
Alan Green753a38e2019-06-07 14:44:32 +10006622 .block_erase = spi_block_erase_52,
6623 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006624 .eraseblocks = { {64 * 1024, 16} },
Alan Green753a38e2019-06-07 14:44:32 +10006625 .block_erase = spi_block_erase_d8,
6626 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006627 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10006628 .block_erase = spi_block_erase_60,
6629 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10006630 .eraseblocks = { {1024 * 1024, 1} },
Alan Green753a38e2019-06-07 14:44:32 +10006631 .block_erase = spi_block_erase_c7,
6632 }
6633 },
Alan Green6b94e402019-09-16 16:30:59 +10006634 .printlock = spi_prettyprint_status_register_bp4_srwd,
6635 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
Alan Green753a38e2019-06-07 14:44:32 +10006636 .write = spi_chip_write_256,
6637 .read = spi_chip_read,
Alan Greend76dc1f2019-06-26 15:38:19 +10006638 .voltage = {2700, 3600},
hailfingerc6950ad2010-06-21 16:12:22 +00006639 },
6640
6641 {
Dino Lic228b322020-03-26 14:26:54 +08006642 .vendor = "GigaDevice",
Nikolai Artemiev6eea8612020-08-31 17:39:06 +10006643 .name = "GD25T80",
6644 .bustype = BUS_SPI,
6645 .manufacture_id = GIGADEVICE_ID,
6646 .model_id = GIGADEVICE_GD25T80,
6647 .total_size = 1024,
6648 .page_size = 256,
6649 /* OTP: 256B total; enter 0x3A */
6650 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6651 .tested = TEST_UNTESTED,
6652 .probe = probe_spi_rdid,
6653 .probe_timing = TIMING_ZERO,
6654 .block_erasers =
6655 {
6656 {
6657 .eraseblocks = { {4 * 1024, 256} },
6658 .block_erase = spi_block_erase_20,
6659 }, {
6660 .eraseblocks = { {64 * 1024, 16} },
6661 .block_erase = spi_block_erase_52,
6662 }, {
6663 .eraseblocks = { {64 * 1024, 16} },
6664 .block_erase = spi_block_erase_d8,
6665 }, {
6666 .eraseblocks = { {1024 * 1024, 1} },
6667 .block_erase = spi_block_erase_60,
6668 }, {
6669 .eraseblocks = { {1024 * 1024, 1} },
6670 .block_erase = spi_block_erase_c7,
6671 }
6672 },
6673 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
6674 .unlock = spi_disable_blockprotect,
6675 .write = spi_chip_write_256,
6676 .read = spi_chip_read,
6677 .voltage = {2700, 3600},
6678 },
6679
6680 {
6681 .vendor = "GigaDevice",
6682 .name = "GD25VQ16C",
6683 .bustype = BUS_SPI,
6684 .manufacture_id = GIGADEVICE_ID,
6685 .model_id = GIGADEVICE_GD25VQ16C,
6686 .total_size = 2 * 1024,
6687 .page_size = 256,
6688 /* Supports SFDP */
6689 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6690 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6691 .tested = TEST_UNTESTED,
6692 .probe = probe_spi_rdid,
6693 .probe_timing = TIMING_ZERO,
6694 .block_erasers =
6695 {
6696 {
6697 .eraseblocks = { { 4 * 1024, 512} },
6698 .block_erase = spi_block_erase_20,
6699 }, {
6700 .eraseblocks = { { 32 * 1024, 64} },
6701 .block_erase = spi_block_erase_52,
6702 }, {
6703 .eraseblocks = { { 64 * 1024, 32} },
6704 .block_erase = spi_block_erase_d8,
6705 }, {
6706 .eraseblocks = { {2 * 1024 * 1024, 1} },
6707 .block_erase = spi_block_erase_60,
6708 }, {
6709 .eraseblocks = { {2 * 1024 * 1024, 1} },
6710 .block_erase = spi_block_erase_c7,
6711 }
6712 },
6713 .printlock = spi_prettyprint_status_register_bp4_srwd,
6714 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6715 .write = spi_chip_write_256,
6716 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6717 .voltage = {2300, 3600},
6718 },
6719
6720 {
6721 .vendor = "GigaDevice",
6722 .name = "GD25VQ21B",
6723 .bustype = BUS_SPI,
6724 .manufacture_id = GIGADEVICE_ID,
6725 .model_id = GIGADEVICE_GD25VQ21B,
6726 .total_size = 256,
6727 .page_size = 256,
6728 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6729 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6730 .tested = TEST_UNTESTED,
6731 .probe = probe_spi_rdid,
6732 .probe_timing = TIMING_ZERO,
6733 .block_erasers =
6734 {
6735 {
6736 .eraseblocks = { { 4 * 1024, 64} },
6737 .block_erase = spi_block_erase_20,
6738 }, {
6739 .eraseblocks = { { 32 * 1024, 8} },
6740 .block_erase = spi_block_erase_52,
6741 }, {
6742 .eraseblocks = { { 64 * 1024, 4} },
6743 .block_erase = spi_block_erase_d8,
6744 }, {
6745 .eraseblocks = { {256 * 1024, 1} },
6746 .block_erase = spi_block_erase_60,
6747 }, {
6748 .eraseblocks = { {256 * 1024, 1} },
6749 .block_erase = spi_block_erase_c7,
6750 }
6751 },
6752 .printlock = spi_prettyprint_status_register_bp4_srwd,
6753 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6754 .write = spi_chip_write_256,
6755 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6756 .voltage = {2300, 3600},
6757 },
6758
6759 {
6760 .vendor = "GigaDevice",
6761 .name = "GD25VQ40C",
6762 .bustype = BUS_SPI,
6763 .manufacture_id = GIGADEVICE_ID,
6764 .model_id = GIGADEVICE_GD25VQ41B,
6765 .total_size = 512,
6766 .page_size = 256,
6767 /* Supports SFDP */
6768 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6769 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6770 .tested = TEST_UNTESTED,
6771 .probe = probe_spi_rdid,
6772 .probe_timing = TIMING_ZERO,
6773 .block_erasers =
6774 {
6775 {
6776 .eraseblocks = { { 4 * 1024, 128} },
6777 .block_erase = spi_block_erase_20,
6778 }, {
6779 .eraseblocks = { { 32 * 1024, 16} },
6780 .block_erase = spi_block_erase_52,
6781 }, {
6782 .eraseblocks = { { 64 * 1024, 8} },
6783 .block_erase = spi_block_erase_d8,
6784 }, {
6785 .eraseblocks = { {512 * 1024, 1} },
6786 .block_erase = spi_block_erase_60,
6787 }, {
6788 .eraseblocks = { {512 * 1024, 1} },
6789 .block_erase = spi_block_erase_c7,
6790 }
6791 },
6792 .printlock = spi_prettyprint_status_register_bp4_srwd,
6793 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6794 .write = spi_chip_write_256,
6795 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6796 .voltage = {2300, 3600},
6797 },
6798
6799 {
6800 .vendor = "GigaDevice",
Nikolai Artemiev7744f962020-08-31 17:41:20 +10006801 .name = "GD25VQ41B",
6802 .bustype = BUS_SPI,
6803 .manufacture_id = GIGADEVICE_ID,
6804 .model_id = GIGADEVICE_GD25VQ41B,
6805 .total_size = 512,
6806 .page_size = 256,
6807 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
6808 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6809 .tested = TEST_OK_PREW,
6810 .probe = probe_spi_rdid,
6811 .probe_timing = TIMING_ZERO,
6812 .block_erasers =
6813 {
6814 {
6815 .eraseblocks = { { 4 * 1024, 128} },
6816 .block_erase = spi_block_erase_20,
6817 }, {
6818 .eraseblocks = { { 32 * 1024, 16} },
6819 .block_erase = spi_block_erase_52,
6820 }, {
6821 .eraseblocks = { { 64 * 1024, 8} },
6822 .block_erase = spi_block_erase_d8,
6823 }, {
6824 .eraseblocks = { {512 * 1024, 1} },
6825 .block_erase = spi_block_erase_60,
6826 }, {
6827 .eraseblocks = { {512 * 1024, 1} },
6828 .block_erase = spi_block_erase_c7,
6829 }
6830 },
6831 .printlock = spi_prettyprint_status_register_bp4_srwd,
6832 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6833 .write = spi_chip_write_256,
6834 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6835 .voltage = {2300, 3600},
6836 },
6837
6838 {
6839 .vendor = "GigaDevice",
6840 .name = "GD25VQ80C",
6841 .bustype = BUS_SPI,
6842 .manufacture_id = GIGADEVICE_ID,
6843 .model_id = GIGADEVICE_GD25VQ80C,
6844 .total_size = 1024,
6845 .page_size = 256,
6846 /* Supports SFDP */
6847 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
6848 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
6849 .tested = TEST_UNTESTED,
6850 .probe = probe_spi_rdid,
6851 .probe_timing = TIMING_ZERO,
6852 .block_erasers =
6853 {
6854 {
6855 .eraseblocks = { { 4 * 1024, 256} },
6856 .block_erase = spi_block_erase_20,
6857 }, {
6858 .eraseblocks = { { 32 * 1024, 32} },
6859 .block_erase = spi_block_erase_52,
6860 }, {
6861 .eraseblocks = { { 64 * 1024, 16} },
6862 .block_erase = spi_block_erase_d8,
6863 }, {
6864 .eraseblocks = { {1024 * 1024, 1} },
6865 .block_erase = spi_block_erase_60,
6866 }, {
6867 .eraseblocks = { {1024 * 1024, 1} },
6868 .block_erase = spi_block_erase_c7,
6869 }
6870 },
6871 .printlock = spi_prettyprint_status_register_bp4_srwd,
6872 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6873 .write = spi_chip_write_256,
6874 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6875 .voltage = {2300, 3600},
6876 },
6877
6878 {
6879 .vendor = "GigaDevice",
Dino Lic228b322020-03-26 14:26:54 +08006880 .name = "GD25WQ80E",
6881 .bustype = BUS_SPI,
6882 .manufacture_id = GIGADEVICE_ID,
6883 .model_id = GIGADEVICE_GD25WQ80E,
6884 .total_size = 1024,
6885 .page_size = 256,
6886 .feature_bits = FEATURE_WRSR_WREN,
6887 .tested = TEST_OK_PREW,
6888 .probe = probe_spi_rdid,
6889 .probe_timing = TIMING_ZERO,
6890 .block_erasers =
6891 {
6892 {
6893 .eraseblocks = { {4 * 1024, 256} },
6894 .block_erase = spi_block_erase_20,
6895 }, {
6896 .eraseblocks = { {32 * 1024, 32} },
6897 .block_erase = spi_block_erase_52,
6898 }, {
6899 .eraseblocks = { {64 * 1024, 16} },
6900 .block_erase = spi_block_erase_d8,
6901 }, {
6902 .eraseblocks = { {1 * 1024 * 1024, 1} },
6903 .block_erase = spi_block_erase_60,
6904 }, {
6905 .eraseblocks = { {1 * 1024 * 1024, 1} },
6906 .block_erase = spi_block_erase_c7,
6907 }
6908 },
6909 .printlock = spi_prettyprint_status_register_bp4_srwd,
6910 .unlock = spi_disable_blockprotect_bp4_srwd,
6911 .write = spi_chip_write_256,
6912 .read = spi_chip_read,
6913 .voltage = {1650, 3600},
6914 },
6915
6916 {
hailfingerc6950ad2010-06-21 16:12:22 +00006917 .vendor = "Hyundai",
6918 .name = "HY29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +00006919 .bustype = BUS_PARALLEL,
hailfingerc6950ad2010-06-21 16:12:22 +00006920 .manufacture_id = HYUNDAI_ID,
mhmd3c80cd2010-09-15 23:31:03 +00006921 .model_id = HYUNDAI_HY29F002B,
hailfingerc6950ad2010-06-21 16:12:22 +00006922 .total_size = 256,
6923 .page_size = 256 * 1024,
6924 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6925 .tested = TEST_UNTESTED,
6926 .probe = probe_jedec,
6927 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6928 .block_erasers =
6929 {
6930 {
6931 .eraseblocks = {
6932 {16 * 1024, 1},
6933 {8 * 1024, 2},
6934 {32 * 1024, 1},
6935 {64 * 1024, 3},
6936 },
6937 .block_erase = erase_sector_jedec,
6938 }, {
6939 .eraseblocks = { {256 * 1024, 1} },
6940 .block_erase = erase_chip_block_jedec,
6941 },
6942 },
6943 .write = write_jedec_1,
6944 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00006945 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
hailfingerc6950ad2010-06-21 16:12:22 +00006946 },
6947
6948 {
mhme8e87912010-09-16 00:51:51 +00006949 .vendor = "Hyundai",
Alan Greend76dc1f2019-06-26 15:38:19 +10006950 .name = "HY29F002T",
6951 .bustype = BUS_PARALLEL,
6952 .manufacture_id = HYUNDAI_ID,
6953 .model_id = HYUNDAI_HY29F002T,
6954 .total_size = 256,
6955 .page_size = 256 * 1024,
6956 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
6957 .tested = TEST_OK_PRE,
6958 .probe = probe_jedec,
6959 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
6960 .block_erasers =
6961 {
6962 {
6963 .eraseblocks = {
6964 {64 * 1024, 3},
6965 {32 * 1024, 1},
6966 {8 * 1024, 2},
6967 {16 * 1024, 1},
6968 },
6969 .block_erase = erase_sector_jedec,
6970 }, {
6971 .eraseblocks = { {256 * 1024, 1} },
6972 .block_erase = erase_chip_block_jedec,
6973 },
6974 },
6975 .write = write_jedec_1,
6976 .read = read_memmapped,
6977 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
6978 },
6979
6980 {
6981 .vendor = "Hyundai",
mhme8e87912010-09-16 00:51:51 +00006982 .name = "HY29F040A",
hailfingere1e41ea2011-07-27 07:13:06 +00006983 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00006984 .manufacture_id = HYUNDAI_ID,
6985 .model_id = HYUNDAI_HY29F040A,
6986 .total_size = 512,
6987 .page_size = 64 * 1024,
6988 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
6989 .tested = TEST_UNTESTED,
6990 .probe = probe_jedec,
6991 .probe_timing = TIMING_ZERO,
6992 .block_erasers =
6993 {
6994 {
6995 .eraseblocks = { {64 * 1024, 8} },
6996 .block_erase = erase_sector_jedec,
6997 }, {
6998 .eraseblocks = { {512 * 1024, 1} },
6999 .block_erase = erase_chip_block_jedec,
7000 },
7001 },
7002 .write = write_jedec_1,
7003 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00007004 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00007005 },
7006
7007 {
Nikolai Artemiev7744f962020-08-31 17:41:20 +10007008 .vendor = "ISSI",
7009 .name = "IS25LP064",
7010 .bustype = BUS_SPI,
7011 .manufacture_id = ISSI_ID_SPI,
7012 .model_id = ISSI_IS25LP064,
7013 .total_size = 8192,
7014 .page_size = 256,
7015 /* OTP: 1024B total; read 0x48; write 0x42 */
7016 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7017 .tested = TEST_UNTESTED,
7018 .probe = probe_spi_rdid,
7019 .probe_timing = TIMING_ZERO,
7020 .block_erasers =
7021 {
7022 {
7023 .eraseblocks = { {4 * 1024, 2048} },
7024 .block_erase = spi_block_erase_20,
7025 }, {
7026 .eraseblocks = { {4 * 1024, 2048} },
7027 .block_erase = spi_block_erase_d7,
7028 }, {
7029 .eraseblocks = { {32 * 1024, 256} },
7030 .block_erase = spi_block_erase_52,
7031 }, {
7032 .eraseblocks = { {64 * 1024, 128} },
7033 .block_erase = spi_block_erase_d8,
7034 }, {
7035 .eraseblocks = { {8 * 1024 * 1024, 1} },
7036 .block_erase = spi_block_erase_60,
7037 }, {
7038 .eraseblocks = { {8 * 1024 * 1024, 1} },
7039 .block_erase = spi_block_erase_c7,
7040 }
7041 },
7042 .unlock = spi_disable_blockprotect,
7043 .write = spi_chip_write_256,
7044 .read = spi_chip_read,
7045 .voltage = {2300, 3600},
7046 },
7047
7048 {
7049 .vendor = "ISSI",
7050 .name = "IS25LP128",
7051 .bustype = BUS_SPI,
7052 .manufacture_id = ISSI_ID_SPI,
7053 .model_id = ISSI_IS25LP128,
7054 .total_size = 16384,
7055 .page_size = 256,
7056 /* OTP: 1024B total; read 0x48; write 0x42 */
7057 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7058 .tested = TEST_OK_PREW,
7059 .probe = probe_spi_rdid,
7060 .probe_timing = TIMING_ZERO,
7061 .block_erasers =
7062 {
7063 {
7064 .eraseblocks = { {4 * 1024, 4096} },
7065 .block_erase = spi_block_erase_20,
7066 }, {
7067 .eraseblocks = { {4 * 1024, 4096} },
7068 .block_erase = spi_block_erase_d7,
7069 }, {
7070 .eraseblocks = { {32 * 1024, 512} },
7071 .block_erase = spi_block_erase_52,
7072 }, {
7073 .eraseblocks = { {64 * 1024, 256} },
7074 .block_erase = spi_block_erase_d8,
7075 }, {
7076 .eraseblocks = { {16 * 1024 * 1024, 1} },
7077 .block_erase = spi_block_erase_60,
7078 }, {
7079 .eraseblocks = { {16 * 1024 * 1024, 1} },
7080 .block_erase = spi_block_erase_c7,
7081 }
7082 },
7083 .unlock = spi_disable_blockprotect,
7084 .write = spi_chip_write_256,
7085 .read = spi_chip_read,
7086 .voltage = {2300, 3600},
7087 },
7088
7089 {
7090 .vendor = "ISSI",
7091 .name = "IS25LP256",
7092 .bustype = BUS_SPI,
7093 .manufacture_id = ISSI_ID_SPI,
7094 .model_id = ISSI_IS25LP256,
7095 .total_size = 32768,
7096 .page_size = 256,
7097 /* supports SFDP */
7098 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7099 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7100 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7101 .tested = TEST_OK_PREW,
7102 .probe = probe_spi_rdid,
7103 .probe_timing = TIMING_ZERO,
7104 .block_erasers =
7105 {
7106 {
7107 .eraseblocks = { {4 * 1024, 8192} },
7108 .block_erase = spi_block_erase_21,
7109 }, {
7110 .eraseblocks = { {4 * 1024, 8192} },
7111 .block_erase = spi_block_erase_20,
7112 /* could also use spi_block_erase_d7 */
7113 }, {
7114 .eraseblocks = { {32 * 1024, 1024} },
7115 .block_erase = spi_block_erase_5c,
7116 }, {
7117 .eraseblocks = { {32 * 1024, 1024} },
7118 .block_erase = spi_block_erase_52,
7119 }, {
7120 .eraseblocks = { {64 * 1024, 512} },
7121 .block_erase = spi_block_erase_dc,
7122 }, {
7123 .eraseblocks = { {64 * 1024, 512} },
7124 .block_erase = spi_block_erase_d8,
7125 }, {
7126 .eraseblocks = { {32 * 1024 * 1024, 1} },
7127 .block_erase = spi_block_erase_60,
7128 }, {
7129 .eraseblocks = { {32 * 1024 * 1024, 1} },
7130 .block_erase = spi_block_erase_c7,
7131 }
7132 },
7133 .unlock = spi_disable_blockprotect,
7134 .write = spi_chip_write_256,
7135 .read = spi_chip_read,
7136 .voltage = {2300, 3600},
7137 },
7138
7139 {
7140 .vendor = "ISSI",
7141 .name = "IS25WP032",
7142 .bustype = BUS_SPI,
7143 .manufacture_id = ISSI_ID_SPI,
7144 .model_id = ISSI_IS25WP032,
7145 .total_size = 4096,
7146 .page_size = 256,
7147 /* OTP: 1024B total; read 0x48; write 0x42 */
7148 /* QPI enable 0x35, disable 0xF5 */
7149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7150 .tested = TEST_UNTESTED,
7151 .probe = probe_spi_rdid,
7152 .probe_timing = TIMING_ZERO,
7153 .block_erasers =
7154 {
7155 {
7156 .eraseblocks = { {4 * 1024, 1024} },
7157 .block_erase = spi_block_erase_20,
7158 }, {
7159 .eraseblocks = { {4 * 1024, 1024} },
7160 .block_erase = spi_block_erase_d7,
7161 }, {
7162 .eraseblocks = { {32 * 1024, 128} },
7163 .block_erase = spi_block_erase_52,
7164 }, {
7165 .eraseblocks = { {64 * 1024, 64} },
7166 .block_erase = spi_block_erase_d8,
7167 }, {
7168 .eraseblocks = { {4 * 1024 * 1024, 1} },
7169 .block_erase = spi_block_erase_60,
7170 }, {
7171 .eraseblocks = { {4 * 1024 * 1024, 1} },
7172 .block_erase = spi_block_erase_c7,
7173 }
7174 },
7175 .unlock = spi_disable_blockprotect,
7176 .write = spi_chip_write_256,
7177 .read = spi_chip_read,
7178 .voltage = {1650, 1950},
7179 },
7180
7181 {
7182 .vendor = "ISSI",
7183 .name = "IS25WP064",
7184 .bustype = BUS_SPI,
7185 .manufacture_id = ISSI_ID_SPI,
7186 .model_id = ISSI_IS25WP064,
7187 .total_size = 8192,
7188 .page_size = 256,
7189 /* OTP: 1024B total; read 0x48; write 0x42 */
7190 /* QPI enable 0x35, disable 0xF5 */
7191 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7192 .tested = TEST_OK_PREW,
7193 .probe = probe_spi_rdid,
7194 .probe_timing = TIMING_ZERO,
7195 .block_erasers =
7196 {
7197 {
7198 .eraseblocks = { {4 * 1024, 2048} },
7199 .block_erase = spi_block_erase_20,
7200 }, {
7201 .eraseblocks = { {4 * 1024, 2048} },
7202 .block_erase = spi_block_erase_d7,
7203 }, {
7204 .eraseblocks = { {32 * 1024, 256} },
7205 .block_erase = spi_block_erase_52,
7206 }, {
7207 .eraseblocks = { {64 * 1024, 128} },
7208 .block_erase = spi_block_erase_d8,
7209 }, {
7210 .eraseblocks = { {8 * 1024 * 1024, 1} },
7211 .block_erase = spi_block_erase_60,
7212 }, {
7213 .eraseblocks = { {8 * 1024 * 1024, 1} },
7214 .block_erase = spi_block_erase_c7,
7215 }
7216 },
7217 .unlock = spi_disable_blockprotect,
7218 .write = spi_chip_write_256,
7219 .read = spi_chip_read,
7220 .voltage = {1650, 1950},
7221 },
7222
7223 {
7224 .vendor = "ISSI",
7225 .name = "IS25WP128",
7226 .bustype = BUS_SPI,
7227 .manufacture_id = ISSI_ID_SPI,
7228 .model_id = ISSI_IS25WP128,
7229 .total_size = 16384,
7230 .page_size = 256,
7231 /* OTP: 1024B total; read 0x48; write 0x42 */
7232 /* QPI enable 0x35, disable 0xF5 */
7233 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
7234 .tested = TEST_OK_PREW,
7235 .probe = probe_spi_rdid,
7236 .probe_timing = TIMING_ZERO,
7237 .block_erasers =
7238 {
7239 {
7240 .eraseblocks = { {4 * 1024, 4096} },
7241 .block_erase = spi_block_erase_20,
7242 }, {
7243 .eraseblocks = { {4 * 1024, 4096} },
7244 .block_erase = spi_block_erase_d7,
7245 }, {
7246 .eraseblocks = { {32 * 1024, 512} },
7247 .block_erase = spi_block_erase_52,
7248 }, {
7249 .eraseblocks = { {64 * 1024, 256} },
7250 .block_erase = spi_block_erase_d8,
7251 }, {
7252 .eraseblocks = { {16 * 1024 * 1024, 1} },
7253 .block_erase = spi_block_erase_60,
7254 }, {
7255 .eraseblocks = { {16 * 1024 * 1024, 1} },
7256 .block_erase = spi_block_erase_c7,
7257 }
7258 },
7259 .unlock = spi_disable_blockprotect,
7260 .write = spi_chip_write_256,
7261 .read = spi_chip_read,
7262 .voltage = {1650, 1950},
7263 },
7264
7265 {
7266 .vendor = "ISSI",
7267 .name = "IS25WP256",
7268 .bustype = BUS_SPI,
7269 .manufacture_id = ISSI_ID_SPI,
7270 .model_id = ISSI_IS25WP256,
7271 .total_size = 32768,
7272 .page_size = 256,
7273 /* supports SFDP */
7274 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
7275 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
7276 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA | FEATURE_4BA_ENTER_EAR7,
7277 .tested = TEST_OK_PREW,
7278 .probe = probe_spi_rdid,
7279 .probe_timing = TIMING_ZERO,
7280 .block_erasers =
7281 {
7282 {
7283 .eraseblocks = { {4 * 1024, 8192} },
7284 .block_erase = spi_block_erase_21,
7285 }, {
7286 .eraseblocks = { {4 * 1024, 8192} },
7287 .block_erase = spi_block_erase_20,
7288 /* could also use spi_block_erase_d7 */
7289 }, {
7290 .eraseblocks = { {32 * 1024, 1024} },
7291 .block_erase = spi_block_erase_5c,
7292 }, {
7293 .eraseblocks = { {32 * 1024, 1024} },
7294 .block_erase = spi_block_erase_52,
7295 }, {
7296 .eraseblocks = { {64 * 1024, 512} },
7297 .block_erase = spi_block_erase_dc,
7298 }, {
7299 .eraseblocks = { {64 * 1024, 512} },
7300 .block_erase = spi_block_erase_d8,
7301 }, {
7302 .eraseblocks = { {32 * 1024 * 1024, 1} },
7303 .block_erase = spi_block_erase_60,
7304 }, {
7305 .eraseblocks = { {32 * 1024 * 1024, 1} },
7306 .block_erase = spi_block_erase_c7,
7307 }
7308 },
7309 .unlock = spi_disable_blockprotect,
7310 .write = spi_chip_write_256,
7311 .read = spi_chip_read,
7312 .voltage = {1650, 1950},
7313 },
7314
7315 {
7316 .vendor = "ISSI",
7317 .name = "IS29GL064B",
7318 .bustype = BUS_PARALLEL,
7319 .manufacture_id = ISSI_ID,
7320 .model_id = ISSI_PMC_IS29GL064B,
7321 .total_size = 8192,
7322 .page_size = 128 * 1024, /* actual page size is 16 */
7323 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7324 .tested = TEST_UNTESTED,
7325 .probe = probe_jedec_29gl,
7326 .probe_timing = TIMING_ZERO,
7327 .block_erasers =
7328 {
7329 {
7330 .eraseblocks = {
7331 {8 * 1024, 8},
7332 {64 * 1024, 127},
7333 },
7334 .block_erase = erase_sector_jedec,
7335 }, {
7336 .eraseblocks = { {8 * 1024 * 1024, 1} },
7337 .block_erase = erase_chip_block_jedec,
7338 },
7339 },
7340 .write = write_jedec_1,
7341 .read = read_memmapped,
7342 .voltage = {2700, 3600},
7343 },
7344
7345 {
Nikolai Artemievfbefd752020-08-31 17:41:56 +10007346 .vendor = "ISSI",
7347 .name = "IS29GL064H/L",
7348 .bustype = BUS_PARALLEL,
7349 .manufacture_id = ISSI_ID,
7350 .model_id = ISSI_PMC_IS29GL064HL,
7351 .total_size = 8192,
7352 .page_size = 128 * 1024, /* actual page size is 16 */
7353 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7354 .tested = TEST_UNTESTED,
7355 .probe = probe_jedec_29gl,
7356 .probe_timing = TIMING_ZERO,
7357 .block_erasers =
7358 {
7359 {
7360 .eraseblocks = { {64 * 1024, 128} },
7361 .block_erase = erase_sector_jedec,
7362 }, {
7363 .eraseblocks = { {8 * 1024 * 1024, 1} },
7364 .block_erase = erase_chip_block_jedec,
7365 },
7366 },
7367 .write = write_jedec_1,
7368 .read = read_memmapped,
7369 .voltage = {2700, 3600},
7370 },
7371
7372 {
7373 .vendor = "ISSI",
7374 .name = "IS29GL064T",
7375 .bustype = BUS_PARALLEL,
7376 .manufacture_id = ISSI_ID,
7377 .model_id = ISSI_PMC_IS29GL064T,
7378 .total_size = 8192,
7379 .page_size = 128 * 1024, /* actual page size is 16 */
7380 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7381 .tested = TEST_UNTESTED,
7382 .probe = probe_jedec_29gl,
7383 .probe_timing = TIMING_ZERO,
7384 .block_erasers =
7385 {
7386 {
7387 .eraseblocks = {
7388 {64 * 1024, 127},
7389 {8 * 1024, 8},
7390 },
7391 .block_erase = erase_sector_jedec,
7392 }, {
7393 .eraseblocks = { {8 * 1024 * 1024, 1} },
7394 .block_erase = erase_chip_block_jedec,
7395 },
7396 },
7397 .write = write_jedec_1,
7398 .read = read_memmapped,
7399 .voltage = {2700, 3600},
7400 },
7401
7402 {
7403 .vendor = "ISSI",
7404 .name = "IS29GL128H/L",
7405 .bustype = BUS_PARALLEL,
7406 .manufacture_id = ISSI_ID,
7407 .model_id = ISSI_PMC_IS29GL128HL,
7408 .total_size = 16384,
7409 .page_size = 128 * 1024, /* actual page size is 16 */
7410 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
7411 .tested = TEST_UNTESTED,
7412 .probe = probe_jedec_29gl,
7413 .probe_timing = TIMING_ZERO,
7414 .block_erasers =
7415 {
7416 {
7417 .eraseblocks = { {128 * 1024, 128} },
7418 .block_erase = erase_sector_jedec,
7419 }, {
7420 .eraseblocks = { {16 * 1024 * 1024, 1} },
7421 .block_erase = erase_chip_block_jedec,
7422 },
7423 },
7424 .write = write_jedec_1,
7425 .read = read_memmapped,
7426 .voltage = {2700, 3600},
7427 },
7428
7429 {
7430 .vendor = "Intel",
7431 .name = "25F160S33B8",
7432 .bustype = BUS_SPI,
7433 .manufacture_id = INTEL_ID,
7434 .model_id = INTEL_25F160S33B8,
7435 .total_size = 2048,
7436 .page_size = 256,
7437 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7438 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7439 .tested = TEST_UNTESTED,
7440 .probe = probe_spi_rdid,
7441 .probe_timing = TIMING_ZERO,
7442 .block_erasers =
7443 {
7444 {
7445 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7446 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7447 * have no effect on the memory contents, but sets a flag in the SR.
7448 .eraseblocks = {
7449 {8 * 1024, 8},
7450 {64 * 1024, 31} // inaccessible
7451 },
7452 .block_erase = spi_block_erase_40,
7453 }, { */
7454 .eraseblocks = { {64 * 1024, 32} },
7455 .block_erase = spi_block_erase_d8,
7456 }, {
7457 .eraseblocks = { {2 * 1024 * 1024, 1} },
7458 .block_erase = spi_block_erase_c7,
7459 }
7460 },
7461 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7462 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7463 .write = spi_chip_write_256,
7464 .read = spi_chip_read, /* also fast read 0x0B */
7465 .voltage = {2700, 3600},
7466 },
7467
7468 {
7469 .vendor = "Intel",
7470 .name = "25F160S33T8",
7471 .bustype = BUS_SPI,
7472 .manufacture_id = INTEL_ID,
7473 .model_id = INTEL_25F160S33T8,
7474 .total_size = 2048,
7475 .page_size = 256,
7476 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7477 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7478 .tested = TEST_UNTESTED,
7479 .probe = probe_spi_rdid,
7480 .probe_timing = TIMING_ZERO,
7481 .block_erasers =
7482 {
7483 {
7484 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7485 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7486 * have no effect on the memory contents, but sets a flag in the SR.
7487 .eraseblocks = {
7488 {64 * 1024, 31}, // inaccessible
7489 {8 * 1024, 8}
7490 },
7491 .block_erase = spi_block_erase_40,
7492 }, { */
7493 .eraseblocks = { {64 * 1024, 32} },
7494 .block_erase = spi_block_erase_d8,
7495 }, {
7496 .eraseblocks = { {2 * 1024 * 1024, 1} },
7497 .block_erase = spi_block_erase_c7,
7498 }
7499 },
7500 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7501 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7502 .write = spi_chip_write_256,
7503 .read = spi_chip_read, /* also fast read 0x0B */
7504 .voltage = {2700, 3600},
7505 },
7506
7507 {
7508 .vendor = "Intel",
7509 .name = "25F320S33B8",
7510 .bustype = BUS_SPI,
7511 .manufacture_id = INTEL_ID,
7512 .model_id = INTEL_25F320S33B8,
7513 .total_size = 4096,
7514 .page_size = 256,
7515 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7516 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7517 .tested = TEST_UNTESTED,
7518 .probe = probe_spi_rdid,
7519 .probe_timing = TIMING_ZERO,
7520 .block_erasers =
7521 {
7522 {
7523 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7524 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7525 * have no effect on the memory contents, but sets a flag in the SR.
7526 .eraseblocks = {
7527 {8 * 1024, 8},
7528 {64 * 1024, 63} // inaccessible
7529 },
7530 .block_erase = spi_block_erase_40,
7531 }, { */
7532 .eraseblocks = { {64 * 1024, 64} },
7533 .block_erase = spi_block_erase_d8,
7534 }, {
7535 .eraseblocks = { {4 * 1024 * 1024, 1} },
7536 .block_erase = spi_block_erase_c7,
7537 }
7538 },
7539 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7540 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7541 .write = spi_chip_write_256,
7542 .read = spi_chip_read, /* also fast read 0x0B */
7543 .voltage = {2700, 3600},
7544 },
7545
7546 {
7547 .vendor = "Intel",
7548 .name = "25F320S33T8",
7549 .bustype = BUS_SPI,
7550 .manufacture_id = INTEL_ID,
7551 .model_id = INTEL_25F320S33T8,
7552 .total_size = 4096,
7553 .page_size = 256,
7554 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7555 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7556 .tested = TEST_UNTESTED,
7557 .probe = probe_spi_rdid,
7558 .probe_timing = TIMING_ZERO,
7559 .block_erasers =
7560 {
7561 {
7562 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7563 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7564 * have no effect on the memory contents, but sets a flag in the SR.
7565 .eraseblocks = {
7566 {64 * 1024, 63}, // inaccessible
7567 {8 * 1024, 8}
7568 },
7569 .block_erase = spi_block_erase_40,
7570 }, { */
7571 .eraseblocks = { {64 * 1024, 64} },
7572 .block_erase = spi_block_erase_d8,
7573 }, {
7574 .eraseblocks = { {4 * 1024 * 1024, 1} },
7575 .block_erase = spi_block_erase_c7,
7576 }
7577 },
7578 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7579 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7580 .write = spi_chip_write_256,
7581 .read = spi_chip_read, /* also fast read 0x0B */
7582 .voltage = {2700, 3600},
7583 },
7584
7585 {
7586 .vendor = "Intel",
7587 .name = "25F640S33B8",
7588 .bustype = BUS_SPI,
7589 .manufacture_id = INTEL_ID,
7590 .model_id = INTEL_25F640S33B8,
7591 .total_size = 8192,
7592 .page_size = 256,
7593 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7594 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7595 .tested = TEST_UNTESTED,
7596 .probe = probe_spi_rdid,
7597 .probe_timing = TIMING_ZERO,
7598 .block_erasers =
7599 {
7600 {
7601 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7602 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7603 * have no effect on the memory contents, but sets a flag in the SR.
7604 .eraseblocks = {
7605 {8 * 1024, 8},
7606 {64 * 1024, 127} // inaccessible
7607 },
7608 .block_erase = spi_block_erase_40,
7609 }, { */
7610 .eraseblocks = { {64 * 1024, 128} },
7611 .block_erase = spi_block_erase_d8,
7612 }, {
7613 .eraseblocks = { {8 * 1024 * 1024, 1} },
7614 .block_erase = spi_block_erase_c7,
7615 }
7616 },
7617 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7618 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7619 .write = spi_chip_write_256,
7620 .read = spi_chip_read, /* also fast read 0x0B */
7621 .voltage = {2700, 3600},
7622 },
7623
7624 {
7625 .vendor = "Intel",
7626 .name = "25F640S33T8",
7627 .bustype = BUS_SPI,
7628 .manufacture_id = INTEL_ID,
7629 .model_id = INTEL_25F640S33T8,
7630 .total_size = 8192,
7631 .page_size = 256,
7632 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
7633 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7634 .tested = TEST_UNTESTED,
7635 .probe = probe_spi_rdid,
7636 .probe_timing = TIMING_ZERO,
7637 .block_erasers =
7638 {
7639 {
7640 /* This chip supports erasing of the 8 so-called "parameter blocks" with
7641 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
7642 * have no effect on the memory contents, but sets a flag in the SR.
7643 .eraseblocks = {
7644 {64 * 1024, 127}, // inaccessible
7645 {8 * 1024, 8}
7646 },
7647 .block_erase = spi_block_erase_40,
7648 }, { */
7649 .eraseblocks = { {64 * 1024, 128} },
7650 .block_erase = spi_block_erase_d8,
7651 }, {
7652 .eraseblocks = { {8 * 1024 * 1024, 1} },
7653 .block_erase = spi_block_erase_c7,
7654 }
7655 },
7656 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
7657 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
7658 .write = spi_chip_write_256,
7659 .read = spi_chip_read, /* also fast read 0x0B */
7660 .voltage = {2700, 3600},
7661 },
7662
7663 {
hailfinger286829b2009-01-08 03:40:17 +00007664 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007665 .name = "28F001BN/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00007666 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00007667 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007668 .model_id = INTEL_28F001B,
hailfingerd4d97b92009-05-29 12:55:31 +00007669 .total_size = 128,
7670 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
snelsona013bf62010-03-22 04:39:31 +00007671 .tested = TEST_UNTESTED,
hailfingerd4d97b92009-05-29 12:55:31 +00007672 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007673 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00007674 .block_erasers =
7675 {
7676 {
Simon Glass8dc82732013-07-16 10:13:51 -06007677 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00007678 {8 * 1024, 1},
7679 {4 * 1024, 2},
7680 {112 * 1024, 1},
7681 },
snelsonc0acbeb2010-03-19 18:47:06 +00007682 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007683 },
7684 },
snelsona013bf62010-03-22 04:39:31 +00007685 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00007686 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007687 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00007688 },
7689
7690 {
7691 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007692 .name = "28F001BN/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007693 .bustype = BUS_PARALLEL,
hailfingerd4d97b92009-05-29 12:55:31 +00007694 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007695 .model_id = INTEL_28F001T,
hailfingerd4d97b92009-05-29 12:55:31 +00007696 .total_size = 128,
7697 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
Alan Greenf5424a22019-07-26 14:32:32 +10007698 .tested = TEST_OK_PREW,
hailfingerd4d97b92009-05-29 12:55:31 +00007699 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +00007700 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson2d471072010-01-09 05:30:14 +00007701 .block_erasers =
7702 {
7703 {
stefanctd6efe1a2011-09-03 11:22:27 +00007704 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00007705 {112 * 1024, 1},
7706 {4 * 1024, 2},
7707 {8 * 1024, 1},
7708 },
snelsonc0acbeb2010-03-19 18:47:06 +00007709 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007710 },
7711 },
snelsona013bf62010-03-22 04:39:31 +00007712 .write = write_82802ab,
hailfingerd4d97b92009-05-29 12:55:31 +00007713 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007714 .voltage = {4500, 5500},
hailfingerd4d97b92009-05-29 12:55:31 +00007715 },
7716
7717 {
7718 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007719 .name = "28F002BC/BL/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007720 .bustype = BUS_PARALLEL,
hailfingerf1f559e2010-07-22 15:20:43 +00007721 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007722 .model_id = INTEL_28F002T,
hailfingerf1f559e2010-07-22 15:20:43 +00007723 .total_size = 256,
7724 .page_size = 256 * 1024,
hailfingerd217d122010-10-08 18:52:29 +00007725 .tested = TEST_OK_PRE,
hailfingerf1f559e2010-07-22 15:20:43 +00007726 .probe = probe_82802ab,
7727 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7728 .block_erasers =
7729 {
7730 {
7731 .eraseblocks = {
7732 {128 * 1024, 1},
7733 {96 * 1024, 1},
7734 {8 * 1024, 2},
7735 {16 * 1024, 1},
7736 },
7737 .block_erase = erase_block_82802ab,
7738 },
7739 },
7740 .write = write_82802ab,
7741 .read = read_memmapped,
7742 },
7743
7744 {
7745 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007746 .name = "28F004B5/BE/BV/BX-B",
hailfingere1e41ea2011-07-27 07:13:06 +00007747 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00007748 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007749 .model_id = INTEL_28F004B,
mkarcher9ded5fe2010-04-03 10:27:08 +00007750 .total_size = 512,
7751 .page_size = 128 * 1024, /* maximal block size */
7752 .tested = TEST_UNTESTED,
7753 .probe = probe_82802ab,
7754 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7755 .block_erasers =
7756 {
7757 {
Simon Glass8dc82732013-07-16 10:13:51 -06007758 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00007759 {16 * 1024, 1},
7760 {8 * 1024, 2},
7761 {96 * 1024, 1},
7762 {128 * 1024, 3},
7763 },
7764 .block_erase = erase_block_82802ab,
7765 },
7766 },
7767 .write = write_82802ab,
7768 .read = read_memmapped,
7769 },
7770
7771 {
7772 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007773 .name = "28F004B5/BE/BV/BX-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007774 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00007775 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007776 .model_id = INTEL_28F004T,
mkarcher9ded5fe2010-04-03 10:27:08 +00007777 .total_size = 512,
7778 .page_size = 128 * 1024, /* maximal block size */
7779 .tested = TEST_UNTESTED,
7780 .probe = probe_82802ab,
7781 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7782 .block_erasers =
7783 {
7784 {
Simon Glass8dc82732013-07-16 10:13:51 -06007785 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00007786 {128 * 1024, 3},
7787 {96 * 1024, 1},
7788 {8 * 1024, 2},
7789 {16 * 1024, 1},
7790 },
7791 .block_erase = erase_block_82802ab,
7792 },
7793 },
7794 .write = write_82802ab,
7795 .read = read_memmapped,
7796 },
7797
7798 {
7799 .vendor = "Intel",
Alan Greend76dc1f2019-06-26 15:38:19 +10007800 .name = "28F008S3/S5/SC",
7801 .bustype = BUS_PARALLEL,
7802 .manufacture_id = INTEL_ID,
7803 .model_id = INTEL_28F004S3,
7804 .total_size = 512,
7805 .page_size = 256,
7806 .tested = TEST_UNTESTED,
7807 .probe = probe_82802ab,
7808 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7809 .block_erasers =
7810 {
7811 {
7812 .eraseblocks = { {64 * 1024, 8} },
7813 .block_erase = erase_block_82802ab,
7814 },
7815 },
7816 .unlock = unlock_28f004s5,
7817 .write = write_82802ab,
7818 .read = read_memmapped,
7819 },
7820
7821 {
7822 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007823 .name = "28F400BV/BX/CE/CV-B",
hailfingere1e41ea2011-07-27 07:13:06 +00007824 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00007825 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007826 .model_id = INTEL_28F400B,
mkarcher9ded5fe2010-04-03 10:27:08 +00007827 .total_size = 512,
7828 .page_size = 128 * 1024, /* maximal block size */
7829 .feature_bits = FEATURE_ADDR_SHIFTED,
7830 .tested = TEST_UNTESTED,
7831 .probe = probe_82802ab,
7832 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7833 .block_erasers =
7834 {
7835 {
Simon Glass8dc82732013-07-16 10:13:51 -06007836 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00007837 {16 * 1024, 1},
7838 {8 * 1024, 2},
7839 {96 * 1024, 1},
7840 {128 * 1024, 3},
7841 },
7842 .block_erase = erase_block_82802ab,
7843 },
7844 },
7845 .write = write_82802ab,
7846 .read = read_memmapped,
7847 },
7848
7849 {
7850 .vendor = "Intel",
mhm54b83562010-10-05 20:28:36 +00007851 .name = "28F400BV/BX/CE/CV-T",
hailfingere1e41ea2011-07-27 07:13:06 +00007852 .bustype = BUS_PARALLEL,
mkarcher9ded5fe2010-04-03 10:27:08 +00007853 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007854 .model_id = INTEL_28F400T,
mkarcher9ded5fe2010-04-03 10:27:08 +00007855 .total_size = 512,
7856 .page_size = 128 * 1024, /* maximal block size */
7857 .feature_bits = FEATURE_ADDR_SHIFTED,
7858 .tested = TEST_UNTESTED,
7859 .probe = probe_82802ab,
7860 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7861 .block_erasers =
7862 {
7863 {
Simon Glass8dc82732013-07-16 10:13:51 -06007864 .eraseblocks = {
mkarcher9ded5fe2010-04-03 10:27:08 +00007865 {128 * 1024, 3},
7866 {96 * 1024, 1},
7867 {8 * 1024, 2},
7868 {16 * 1024, 1},
7869 },
7870 .block_erase = erase_block_82802ab,
7871 },
7872 },
7873 .write = write_82802ab,
7874 .read = read_memmapped,
7875 },
7876
7877 {
7878 .vendor = "Intel",
hailfinger286829b2009-01-08 03:40:17 +00007879 .name = "82802AB",
hailfingere1e41ea2011-07-27 07:13:06 +00007880 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007881 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007882 .model_id = INTEL_82802AB,
hailfinger286829b2009-01-08 03:40:17 +00007883 .total_size = 512,
7884 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007885 .feature_bits = FEATURE_REGISTERMAP,
stefanct312d9ff2011-06-12 19:47:55 +00007886 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00007887 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00007888 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00007889 .block_erasers =
7890 {
7891 {
7892 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +00007893 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007894 },
7895 },
Alan Greena59b2ae2019-09-02 17:26:10 +10007896 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00007897 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007898 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007899 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007900 },
7901
hailfinger286829b2009-01-08 03:40:17 +00007902 {
7903 .vendor = "Intel",
7904 .name = "82802AC",
hailfingere1e41ea2011-07-27 07:13:06 +00007905 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +00007906 .manufacture_id = INTEL_ID,
mhm54b83562010-10-05 20:28:36 +00007907 .model_id = INTEL_82802AC,
hailfinger286829b2009-01-08 03:40:17 +00007908 .total_size = 1024,
7909 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +00007910 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +00007911 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +00007912 .probe = probe_82802ab,
hailfingere3095d92009-06-05 13:46:17 +00007913 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
snelson2d471072010-01-09 05:30:14 +00007914 .block_erasers =
7915 {
7916 {
7917 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +00007918 .block_erase = erase_block_82802ab,
snelson2d471072010-01-09 05:30:14 +00007919 },
7920 },
Alan Greena59b2ae2019-09-02 17:26:10 +10007921 .unlock = unlock_regspace2_uniform_64k,
hailfinger286829b2009-01-08 03:40:17 +00007922 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +00007923 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00007924 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00007925 },
7926
hailfinger286829b2009-01-08 03:40:17 +00007927 {
7928 .vendor = "Macronix",
Nikolai Artemievfbefd752020-08-31 17:41:56 +10007929 .name = "MX23L12854",
7930 .bustype = BUS_SPI,
7931 .manufacture_id = MACRONIX_ID,
7932 .model_id = MACRONIX_MX23L12854,
7933 .total_size = 16384,
7934 .page_size = 256,
7935 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7936 .probe = probe_spi_rdid,
7937 .probe_timing = TIMING_ZERO,
7938 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
7939 .read = spi_chip_read, /* Fast read (0x0B) supported */
7940 .voltage = {3000, 3600},
7941 },
7942
7943 {
7944 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10007945 .name = "MX23L1654",
7946 .bustype = BUS_SPI,
7947 .manufacture_id = MACRONIX_ID,
7948 .model_id = MACRONIX_MX23L1654,
7949 .total_size = 2048,
7950 .page_size = 256,
7951 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
7952 .probe = probe_spi_rdid,
7953 .probe_timing = TIMING_ZERO,
7954 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
7955 .read = spi_chip_read, /* Fast read (0x0B) supported */
7956 .voltage = {3000, 3600},
7957 },
7958
7959 {
7960 .vendor = "Macronix",
7961 .name = "MX23L3254",
7962 .bustype = BUS_SPI,
7963 .manufacture_id = MACRONIX_ID,
7964 .model_id = MACRONIX_MX23L3254,
7965 .total_size = 4096,
7966 .page_size = 256,
7967 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
7968 .probe = probe_spi_rdid,
7969 .probe_timing = TIMING_ZERO,
7970 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
7971 .read = spi_chip_read, /* Fast read (0x0B) supported */
7972 .voltage = {3000, 3600},
7973 },
7974
7975 {
7976 .vendor = "Macronix",
7977 .name = "MX23L6454",
7978 .bustype = BUS_SPI,
7979 .manufacture_id = MACRONIX_ID,
7980 .model_id = MACRONIX_MX23L6454,
7981 .total_size = 8192,
7982 .page_size = 256,
7983 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
7984 .probe = probe_spi_rdid,
7985 .probe_timing = TIMING_ZERO,
7986 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
7987 .read = spi_chip_read, /* Fast read (0x0B) supported */
7988 .voltage = {3000, 3600},
7989 },
7990
7991 {
7992 .vendor = "Macronix",
Vincent Palatina699d262013-02-28 14:31:12 -08007993 .name = "MX25L1005(C)/MX25L1006E",
hailfingere1e41ea2011-07-27 07:13:06 +00007994 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00007995 .manufacture_id = MACRONIX_ID,
7996 .model_id = MACRONIX_MX25L1005,
hailfinger286829b2009-01-08 03:40:17 +00007997 .total_size = 128,
7998 .page_size = 256,
Vincent Palatina699d262013-02-28 14:31:12 -08007999 /* MX25L1006E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10008000 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008001 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008002 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008003 .probe_timing = TIMING_ZERO,
hailfinger7df21362009-09-05 02:30:58 +00008004 .block_erasers =
8005 {
8006 {
8007 .eraseblocks = { {4 * 1024, 32} },
8008 .block_erase = spi_block_erase_20,
hailfinger91cf1032009-10-01 13:15:01 +00008009 }, {
hailfinger7df21362009-09-05 02:30:58 +00008010 .eraseblocks = { {64 * 1024, 2} },
8011 .block_erase = spi_block_erase_d8,
hailfinger91cf1032009-10-01 13:15:01 +00008012 }, {
hailfinger7df21362009-09-05 02:30:58 +00008013 .eraseblocks = { {128 * 1024, 1} },
8014 .block_erase = spi_block_erase_60,
hailfinger91cf1032009-10-01 13:15:01 +00008015 }, {
hailfinger7df21362009-09-05 02:30:58 +00008016 .eraseblocks = { {128 * 1024, 1} },
8017 .block_erase = spi_block_erase_c7,
8018 },
8019 },
Alan Greena514de82019-09-09 16:40:10 +10008020 .printlock = spi_prettyprint_status_register_bp1_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +00008021 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008022 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08008023 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L1006E supports dual I/O */
stefanct7e00e222011-06-03 07:26:31 +00008024 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08008025 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00008026 },
8027
hailfinger286829b2009-01-08 03:40:17 +00008028 {
8029 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008030 .name = "MX25L12805D",
hailfingere1e41ea2011-07-27 07:13:06 +00008031 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008032 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10008033 .model_id = MACRONIX_MX25L12805,
8034 .total_size = 16384,
hailfinger286829b2009-01-08 03:40:17 +00008035 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008036 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +00008037 .tested = TEST_UNTESTED,
8038 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008039 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00008040 .block_erasers =
8041 {
8042 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008043 .eraseblocks = { {4 * 1024, 4096} },
hailfinger91cf1032009-10-01 13:15:01 +00008044 .block_erase = spi_block_erase_20,
8045 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008046 .eraseblocks = { {64 * 1024, 256} },
hailfinger91cf1032009-10-01 13:15:01 +00008047 .block_erase = spi_block_erase_d8,
8048 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008049 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00008050 .block_erase = spi_block_erase_60,
8051 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008052 .eraseblocks = { {16 * 1024 * 1024, 1} },
hailfinger91cf1032009-10-01 13:15:01 +00008053 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10008054 }
hailfinger91cf1032009-10-01 13:15:01 +00008055 },
hailfingerb9560ee2010-07-14 20:21:22 +00008056 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008057 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008058 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008059 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +00008060 },
8061
hailfinger286829b2009-01-08 03:40:17 +00008062 {
8063 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008064 .name = "MX25L12835F/MX25L12845E/MX25L12865E",
8065 .bustype = BUS_SPI,
8066 .manufacture_id = MACRONIX_ID,
8067 .model_id = MACRONIX_MX25L12805D,
8068 .total_size = 16384,
8069 .page_size = 256,
8070 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8071 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8072 .tested = TEST_OK_PREW,
8073 .probe = probe_spi_rdid,
8074 .probe_timing = TIMING_ZERO,
8075 .block_erasers =
8076 {
8077 {
8078 .eraseblocks = { {4 * 1024, 4096} },
8079 .block_erase = spi_block_erase_20,
8080 }, {
8081 .eraseblocks = { {32 * 1024, 512} },
8082 .block_erase = spi_block_erase_52,
8083 }, {
8084 .eraseblocks = { {64 * 1024, 256} },
8085 .block_erase = spi_block_erase_d8,
8086 }, {
8087 .eraseblocks = { {16 * 1024 * 1024, 1} },
8088 .block_erase = spi_block_erase_60,
8089 }, {
8090 .eraseblocks = { {16 * 1024 * 1024, 1} },
8091 .block_erase = spi_block_erase_c7,
8092 }
8093 },
8094 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
8095 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8096 .unlock = spi_disable_blockprotect_bp3_srwd,
8097 .write = spi_chip_write_256,
8098 .read = spi_chip_read, /* Fast read (0x0B) supported */
8099 .voltage = {2700, 3600},
8100 },
8101
8102 {
8103 .vendor = "Macronix",
hailfinger286829b2009-01-08 03:40:17 +00008104 .name = "MX25L1605",
hailfingere1e41ea2011-07-27 07:13:06 +00008105 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008106 .manufacture_id = MACRONIX_ID,
8107 .model_id = MACRONIX_MX25L1605,
hailfinger286829b2009-01-08 03:40:17 +00008108 .total_size = 2048,
8109 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008110 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008111 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008112 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008113 .probe_timing = TIMING_ZERO,
hailfinger91cf1032009-10-01 13:15:01 +00008114 .block_erasers =
8115 {
8116 {
8117 .eraseblocks = { {4 * 1024, 512} },
8118 .block_erase = spi_block_erase_20, /* This erase function has 64k blocksize for eLiteFlash */
8119 }, {
8120 .eraseblocks = { {64 * 1024, 32} }, /* Not supported in MX25L1605 (eLiteFlash) and MX25L1605D */
8121 .block_erase = spi_block_erase_52,
8122 }, {
8123 .eraseblocks = { {64 * 1024, 32} },
8124 .block_erase = spi_block_erase_d8,
8125 }, {
8126 .eraseblocks = { {2 * 1024 * 1024, 1} },
8127 .block_erase = spi_block_erase_60,
8128 }, {
8129 .eraseblocks = { {2 * 1024 * 1024, 1} },
8130 .block_erase = spi_block_erase_c7,
8131 },
8132 },
hailfingerb9560ee2010-07-14 20:21:22 +00008133 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008134 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008135 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008136 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08008137 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00008138 },
8139
hailfinger286829b2009-01-08 03:40:17 +00008140 {
8141 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008142 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
8143 .bustype = BUS_SPI,
8144 .manufacture_id = MACRONIX_ID,
8145 .model_id = MACRONIX_MX25L1605,
8146 .total_size = 2048,
8147 .page_size = 256,
8148 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
8149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8150 .tested = TEST_OK_PREW,
8151 .probe = probe_spi_rdid,
8152 .probe_timing = TIMING_ZERO,
8153 .block_erasers =
8154 {
8155 {
8156 .eraseblocks = { {4 * 1024, 512} },
8157 .block_erase = spi_block_erase_20,
8158 }, {
8159 .eraseblocks = { {64 * 1024, 32} },
8160 .block_erase = spi_block_erase_52,
8161 }, {
8162 .eraseblocks = { {64 * 1024, 32} },
8163 .block_erase = spi_block_erase_d8,
8164 }, {
8165 .eraseblocks = { {2 * 1024 * 1024, 1} },
8166 .block_erase = spi_block_erase_60,
8167 }, {
8168 .eraseblocks = { {2 * 1024 * 1024, 1} },
8169 .block_erase = spi_block_erase_c7,
8170 },
8171 },
8172 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
8173 .unlock = spi_disable_blockprotect_bp3_srwd,
8174 .write = spi_chip_write_256,
8175 .read = spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
8176 .voltage = {2700, 3600},
8177 },
8178
8179 {
8180 .vendor = "Macronix",
8181 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
8182 .bustype = BUS_SPI,
8183 .manufacture_id = MACRONIX_ID,
8184 .model_id = MACRONIX_MX25L1605,
8185 .total_size = 2048,
8186 .page_size = 256,
8187 .feature_bits = FEATURE_WRSR_WREN,
8188 .tested = TEST_OK_PREW,
8189 .probe = probe_spi_rdid,
8190 .probe_timing = TIMING_ZERO,
8191 .block_erasers =
8192 {
8193 {
8194 .eraseblocks = { {4 * 1024, 512} },
8195 .block_erase = spi_block_erase_20,
8196 }, {
8197 .eraseblocks = { {64 * 1024, 32} },
8198 .block_erase = spi_block_erase_d8,
8199 }, {
8200 .eraseblocks = { {2 * 1024 * 1024, 1} },
8201 .block_erase = spi_block_erase_60,
8202 }, {
8203 .eraseblocks = { {2 * 1024 * 1024, 1} },
8204 .block_erase = spi_block_erase_c7,
8205 },
8206 },
8207 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
8208 .unlock = spi_disable_blockprotect_bp3_srwd,
8209 .write = spi_chip_write_256,
8210 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
8211 .voltage = {2700, 3600},
8212 },
8213
8214 {
8215 .vendor = "Macronix",
hailfinger0a2fef02009-04-19 23:04:00 +00008216 .name = "MX25L1635D",
hailfingere1e41ea2011-07-27 07:13:06 +00008217 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008218 .manufacture_id = MACRONIX_ID,
8219 .model_id = MACRONIX_MX25L1635D,
hailfinger0a2fef02009-04-19 23:04:00 +00008220 .total_size = 2048,
8221 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008222 .feature_bits = FEATURE_WRSR_WREN,
hailfinger0a2fef02009-04-19 23:04:00 +00008223 .tested = TEST_UNTESTED,
8224 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008225 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00008226 .block_erasers =
8227 {
8228 {
8229 .eraseblocks = { {4 * 1024, 512} },
8230 .block_erase = spi_block_erase_20,
8231 }, {
8232 .eraseblocks = { {64 * 1024, 32} },
8233 .block_erase = spi_block_erase_d8,
8234 }, {
8235 .eraseblocks = { {2 * 1024 * 1024, 1} },
8236 .block_erase = spi_block_erase_60,
8237 }, {
8238 .eraseblocks = { {2 * 1024 * 1024, 1} },
8239 .block_erase = spi_block_erase_c7,
8240 }
8241 },
hailfingerb9560ee2010-07-14 20:21:22 +00008242 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008243 .write = spi_chip_write_256,
hailfinger0a2fef02009-04-19 23:04:00 +00008244 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008245 .voltage = {2700, 3600},
hailfinger0a2fef02009-04-19 23:04:00 +00008246 },
hailfingerf1255892009-04-20 22:54:13 +00008247
hailfinger0a2fef02009-04-19 23:04:00 +00008248 {
8249 .vendor = "Macronix",
uwef926ca22010-09-13 19:59:28 +00008250 .name = "MX25L1635E",
hailfingere1e41ea2011-07-27 07:13:06 +00008251 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008252 .manufacture_id = MACRONIX_ID,
8253 .model_id = MACRONIX_MX25L1635E,
uwef926ca22010-09-13 19:59:28 +00008254 .total_size = 2048,
8255 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008256 .feature_bits = FEATURE_WRSR_WREN,
uwef926ca22010-09-13 19:59:28 +00008257 .tested = TEST_UNTESTED,
8258 .probe = probe_spi_rdid,
8259 .probe_timing = TIMING_ZERO,
8260 .block_erasers =
8261 {
8262 {
8263 .eraseblocks = { {4 * 1024, 512} },
8264 .block_erase = spi_block_erase_20,
8265 }, {
8266 .eraseblocks = { {64 * 1024, 32} },
8267 .block_erase = spi_block_erase_d8,
8268 }, {
8269 .eraseblocks = { {2 * 1024 * 1024, 1} },
8270 .block_erase = spi_block_erase_60,
8271 }, {
8272 .eraseblocks = { {2 * 1024 * 1024, 1} },
8273 .block_erase = spi_block_erase_c7,
8274 }
8275 },
8276 .unlock = spi_disable_blockprotect,
8277 .write = spi_chip_write_256,
8278 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +00008279 .voltage = {2700, 3600},
uwef926ca22010-09-13 19:59:28 +00008280 },
8281
8282 {
8283 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008284 .name = "MX25L2005(C)/MX25L2006E",
Alan Greend76dc1f2019-06-26 15:38:19 +10008285 .bustype = BUS_SPI,
8286 .manufacture_id = MACRONIX_ID,
8287 .model_id = MACRONIX_MX25L2005,
8288 .total_size = 256,
8289 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008290 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10008291 .tested = TEST_UNTESTED,
8292 .probe = probe_spi_rdid,
8293 .probe_timing = TIMING_ZERO,
8294 .block_erasers =
8295 {
8296 {
8297 .eraseblocks = { {4 * 1024, 64} },
8298 .block_erase = spi_block_erase_20,
8299 }, {
8300 .eraseblocks = { {64 * 1024, 4} },
8301 .block_erase = spi_block_erase_52,
8302 }, {
8303 .eraseblocks = { {64 * 1024, 4} },
8304 .block_erase = spi_block_erase_d8,
8305 }, {
8306 .eraseblocks = { {256 * 1024, 1} },
8307 .block_erase = spi_block_erase_60,
8308 }, {
8309 .eraseblocks = { {256 * 1024, 1} },
8310 .block_erase = spi_block_erase_c7,
8311 },
8312 },
8313 .unlock = spi_disable_blockprotect,
8314 .write = spi_chip_write_256,
8315 .read = spi_chip_read, /* Fast read (0x0B) supported */
8316 .voltage = {2700, 3600},
8317 .wp = &wp_w25,
8318 },
8319
8320 {
8321 .vendor = "Macronix",
8322 .name = "MX25L25635F/MX25L25645G",
8323 .bustype = BUS_SPI,
8324 .manufacture_id = MACRONIX_ID,
8325 .model_id = MACRONIX_MX25L25635F,
8326 .total_size = 32768,
8327 .page_size = 256,
8328 .feature_bits =
Edward O'Callaghan27486212019-07-26 21:59:55 +10008329 FEATURE_WRSR_WREN | FEATURE_4BA_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +10008330 .tested = TEST_UNTESTED,
8331 .probe = probe_spi_rdid,
8332 .probe_timing = TIMING_ZERO,
8333 .block_erasers =
8334 {
8335 {
8336 .eraseblocks = { {4 * 1024, 8192} },
8337 .block_erase = spi_block_erase_21,
8338 }, {
8339 .eraseblocks = { {32 * 1024, 1024} },
8340 .block_erase = spi_block_erase_5c,
8341 }, {
8342 .eraseblocks = { {64 * 1024, 512} },
8343 .block_erase = spi_block_erase_dc,
8344 }, {
8345 .eraseblocks = { {32768 * 1024, 1} },
8346 .block_erase = spi_block_erase_60,
8347 }, {
8348 .eraseblocks = { {32768 * 1024, 1} },
8349 .block_erase = spi_block_erase_c7,
8350 },
8351 },
8352 .unlock = spi_disable_blockprotect,
8353 .write = spi_chip_write_256,
8354 .read = spi_chip_read,
8355 .set_4ba = spi_enter_4ba_b7,
8356 .voltage = {2700, 3600},
8357 .wp = &wp_generic,
8358 },
8359
8360 {
8361 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008362 .name = "MX25L3205(A)",
hailfingere1e41ea2011-07-27 07:13:06 +00008363 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008364 .manufacture_id = MACRONIX_ID,
8365 .model_id = MACRONIX_MX25L3205,
hailfinger286829b2009-01-08 03:40:17 +00008366 .total_size = 4096,
8367 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008368 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008369 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +00008370 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008371 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00008372 .block_erasers =
8373 {
8374 {
8375 .eraseblocks = { {4 * 1024, 1024} },
8376 .block_erase = spi_block_erase_20,
8377 }, {
8378 .eraseblocks = { {4 * 1024, 1024} },
8379 .block_erase = spi_block_erase_d8,
8380 }, {
8381 .eraseblocks = { {4 * 1024 * 1024, 1} },
8382 .block_erase = spi_block_erase_60,
8383 }, {
8384 .eraseblocks = { {4 * 1024 * 1024, 1} },
8385 .block_erase = spi_block_erase_c7,
8386 },
8387 },
hailfingerb9560ee2010-07-14 20:21:22 +00008388 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008389 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +00008390 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008391 .voltage = {2700, 3600},
David Hendricksf8f00c72011-02-01 12:39:46 -08008392 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +00008393 },
8394
hailfinger286829b2009-01-08 03:40:17 +00008395 {
8396 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008397 .name = "MX25L3205D/MX25L3208D",
8398 .bustype = BUS_SPI,
8399 .manufacture_id = MACRONIX_ID,
8400 .model_id = MACRONIX_MX25L3205,
8401 .total_size = 4096,
8402 .page_size = 256,
8403 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8404 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8405 .tested = TEST_OK_PREW,
8406 .probe = probe_spi_rdid,
8407 .probe_timing = TIMING_ZERO,
8408 .block_erasers =
8409 {
8410 {
8411 .eraseblocks = { {4 * 1024, 1024} },
8412 .block_erase = spi_block_erase_20,
8413 }, {
8414 .eraseblocks = { {64 * 1024, 64} },
8415 .block_erase = spi_block_erase_d8,
8416 }, {
8417 .eraseblocks = { {4 * 1024 * 1024, 1} },
8418 .block_erase = spi_block_erase_60,
8419 }, {
8420 .eraseblocks = { {4 * 1024 * 1024, 1} },
8421 .block_erase = spi_block_erase_c7,
8422 },
8423 },
8424 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8425 .unlock = spi_disable_blockprotect_bp3_srwd,
8426 .write = spi_chip_write_256,
8427 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8428 .voltage = {2700, 3600},
8429 },
8430
8431 {
8432 .vendor = "Macronix",
8433 .name = "MX25L3206E/MX25L3208E",
8434 .bustype = BUS_SPI,
8435 .manufacture_id = MACRONIX_ID,
8436 .model_id = MACRONIX_MX25L3205,
8437 .total_size = 4096,
8438 .page_size = 256,
8439 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8440 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8441 .tested = TEST_OK_PREW,
8442 .probe = probe_spi_rdid,
8443 .probe_timing = TIMING_ZERO,
8444 .block_erasers =
8445 {
8446 {
8447 .eraseblocks = { {4 * 1024, 1024} },
8448 .block_erase = spi_block_erase_20,
8449 }, {
8450 .eraseblocks = { {64 * 1024, 64} },
8451 .block_erase = spi_block_erase_d8,
8452 }, {
8453 .eraseblocks = { {64 * 1024, 64} },
8454 .block_erase = spi_block_erase_52,
8455 }, {
8456 .eraseblocks = { {4 * 1024 * 1024, 1} },
8457 .block_erase = spi_block_erase_60,
8458 }, {
8459 .eraseblocks = { {4 * 1024 * 1024, 1} },
8460 .block_erase = spi_block_erase_c7,
8461 },
8462 },
8463 .printlock = spi_prettyprint_status_register_bp3_srwd,
8464 .unlock = spi_disable_blockprotect_bp3_srwd,
8465 .write = spi_chip_write_256,
8466 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8467 .voltage = {2700, 3600},
8468 },
8469
8470 {
8471 .vendor = "Macronix",
stuge38d77d22009-04-23 22:51:56 +00008472 .name = "MX25L3235D",
hailfingere1e41ea2011-07-27 07:13:06 +00008473 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00008474 .manufacture_id = MACRONIX_ID,
8475 .model_id = MACRONIX_MX25L3235D,
stuge38d77d22009-04-23 22:51:56 +00008476 .total_size = 4096,
8477 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008478 .feature_bits = FEATURE_WRSR_WREN,
stuge38d77d22009-04-23 22:51:56 +00008479 .tested = TEST_UNTESTED,
8480 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00008481 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00008482 .block_erasers =
8483 {
8484 {
8485 .eraseblocks = { {4 * 1024, 1024} },
8486 .block_erase = spi_block_erase_20,
8487 }, {
8488 .eraseblocks = { {64 * 1024, 64} },
8489 .block_erase = spi_block_erase_d8,
8490 }, {
8491 .eraseblocks = { {4 * 1024 * 1024, 1} },
8492 .block_erase = spi_block_erase_60,
8493 }, {
8494 .eraseblocks = { {4 * 1024 * 1024, 1} },
8495 .block_erase = spi_block_erase_c7,
8496 }
8497 },
hailfingerb9560ee2010-07-14 20:21:22 +00008498 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00008499 .write = spi_chip_write_256,
stuge38d77d22009-04-23 22:51:56 +00008500 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +00008501 .voltage = {2700, 3600},
stuge38d77d22009-04-23 22:51:56 +00008502 },
8503
Vincent Palatin87e092a2013-02-28 15:46:14 -08008504 {
8505 .vendor = "Macronix",
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008506 .name = "MX25L3273E",
8507 .bustype = BUS_SPI,
8508 .manufacture_id = MACRONIX_ID,
8509 .model_id = MACRONIX_MX25L3205,
8510 .total_size = 4096,
8511 .page_size = 256,
8512 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8513 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8514 .tested = TEST_OK_PREW,
8515 .probe = probe_spi_rdid,
8516 .probe_timing = TIMING_ZERO,
8517 .block_erasers =
8518 {
8519 {
8520 .eraseblocks = { {4 * 1024, 1024} },
8521 .block_erase = spi_block_erase_20,
8522 }, {
8523 .eraseblocks = { {32 * 1024, 128} },
8524 .block_erase = spi_block_erase_52,
8525 }, {
8526 .eraseblocks = { {64 * 1024, 64} },
8527 .block_erase = spi_block_erase_d8,
8528 }, {
8529 .eraseblocks = { {4 * 1024 * 1024, 1} },
8530 .block_erase = spi_block_erase_60,
8531 }, {
8532 .eraseblocks = { {4 * 1024 * 1024, 1} },
8533 .block_erase = spi_block_erase_c7,
8534 },
8535 },
8536 .printlock = spi_prettyprint_status_register_bp3_srwd,
8537 .unlock = spi_disable_blockprotect_bp3_srwd,
8538 .write = spi_chip_write_256,
8539 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
8540 .voltage = {2700, 3600},
8541 },
8542
8543 {
8544 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008545 .name = "MX25L4005(A/C)/MX25L4006E",
Vincent Palatin87e092a2013-02-28 15:46:14 -08008546 .bustype = BUS_SPI,
8547 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10008548 .model_id = MACRONIX_MX25L4005,
8549 .total_size = 512,
Vincent Palatin87e092a2013-02-28 15:46:14 -08008550 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008551 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008552 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10008553 .probe = probe_spi_rdid,
8554 .probe_timing = TIMING_ZERO,
8555 .block_erasers =
8556 {
8557 {
8558 .eraseblocks = { {4 * 1024, 128} },
8559 .block_erase = spi_block_erase_20,
8560 }, {
8561 .eraseblocks = { {64 * 1024, 8} },
8562 .block_erase = spi_block_erase_52,
8563 }, {
8564 .eraseblocks = { {64 * 1024, 8} },
8565 .block_erase = spi_block_erase_d8,
8566 }, {
8567 .eraseblocks = { {512 * 1024, 1} },
8568 .block_erase = spi_block_erase_60,
8569 }, {
8570 .eraseblocks = { {512 * 1024, 1} },
8571 .block_erase = spi_block_erase_c7,
8572 },
8573 },
Alan Greena514de82019-09-09 16:40:10 +10008574 .printlock = spi_prettyprint_status_register_bp2_srwd,
Alan Greend76dc1f2019-06-26 15:38:19 +10008575 .unlock = spi_disable_blockprotect,
8576 .write = spi_chip_write_256,
8577 .read = spi_chip_read, /* Fast read (0x0B) supported */
8578 .voltage = {2700, 3600},
8579 .wp = &wp_w25,
8580 },
8581
8582 {
8583 .vendor = "Macronix",
8584 .name = "MX25L512(E)/MX25V512(C)",
8585 .bustype = BUS_SPI,
8586 .manufacture_id = MACRONIX_ID,
8587 .model_id = MACRONIX_MX25L512,
8588 .total_size = 64,
8589 .page_size = 256,
8590 /* MX25L512E supports SFDP */
Edward O'Callaghan27486212019-07-26 21:59:55 +10008591 .feature_bits = FEATURE_WRSR_WREN,
Vincent Palatin87e092a2013-02-28 15:46:14 -08008592 .tested = TEST_UNTESTED,
8593 .probe = probe_spi_rdid,
8594 .probe_timing = TIMING_ZERO,
8595 .block_erasers =
8596 {
8597 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008598 .eraseblocks = { {4 * 1024, 16} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008599 .block_erase = spi_block_erase_20,
8600 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008601 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008602 .block_erase = spi_block_erase_52,
8603 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008604 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008605 .block_erase = spi_block_erase_d8,
8606 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008607 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008608 .block_erase = spi_block_erase_60,
8609 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008610 .eraseblocks = { {64 * 1024, 1} },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008611 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10008612 },
Vincent Palatin87e092a2013-02-28 15:46:14 -08008613 },
8614 .unlock = spi_disable_blockprotect,
8615 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10008616 .read = spi_chip_read, /* Fast read (0x0B) supported, MX25L512E supports dual I/O */
8617 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
Vincent Palatin87e092a2013-02-28 15:46:14 -08008618 },
8619
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008620 {
Nikolai Artemievc6a62bf2020-08-31 17:44:01 +10008621 .vendor = "Macronix",
8622 .name = "MX25L5121E",
8623 .bustype = BUS_SPI,
8624 .manufacture_id = MACRONIX_ID,
8625 .model_id = MACRONIX_MX25L5121E,
8626 .total_size = 64,
8627 .page_size = 32,
8628 .feature_bits = FEATURE_WRSR_WREN,
8629 .tested = TEST_OK_PREW,
8630 .probe = probe_spi_rdid,
8631 .probe_timing = TIMING_ZERO,
8632 .block_erasers =
8633 {
8634 {
8635 .eraseblocks = { {4 * 1024, 16} },
8636 .block_erase = spi_block_erase_20,
8637 }, {
8638 .eraseblocks = { {64 * 1024, 1} },
8639 .block_erase = spi_block_erase_52,
8640 }, {
8641 .eraseblocks = { {64 * 1024, 1} },
8642 .block_erase = spi_block_erase_d8,
8643 }, {
8644 .eraseblocks = { {64 * 1024, 1} },
8645 .block_erase = spi_block_erase_60,
8646 }, {
8647 .eraseblocks = { {64 * 1024, 1} },
8648 .block_erase = spi_block_erase_c7,
8649 },
8650 },
8651 .printlock = spi_prettyprint_status_register_bp1_srwd,
8652 .unlock = spi_disable_blockprotect,
8653 .write = spi_chip_write_256,
8654 .read = spi_chip_read, /* Fast read (0x0B) supported */
8655 .voltage = {2700, 3600},
8656 },
8657
8658 {
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10008659 .vendor = "Macronix",
8660 .name = "MX25L6405",
8661 .bustype = BUS_SPI,
8662 .manufacture_id = MACRONIX_ID,
8663 .model_id = MACRONIX_MX25L6405,
8664 .total_size = 8192,
8665 .page_size = 256,
8666 /* Has an additional 512B EEPROM sector */
8667 .feature_bits = FEATURE_WRSR_WREN,
8668 .tested = TEST_OK_PREW,
8669 .probe = probe_spi_rdid,
8670 .probe_timing = TIMING_ZERO,
8671 .block_erasers =
8672 {
8673 {
8674 .eraseblocks = { {64 * 1024, 128} },
8675 .block_erase = spi_block_erase_20,
8676 }, {
8677 .eraseblocks = { {64 * 1024, 128} },
8678 .block_erase = spi_block_erase_d8,
8679 }, {
8680 .eraseblocks = { {8 * 1024 * 1024, 1} },
8681 .block_erase = spi_block_erase_60,
8682 }, {
8683 .eraseblocks = { {8 * 1024 * 1024, 1} },
8684 .block_erase = spi_block_erase_c7,
8685 }
8686 },
8687 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
8688 .unlock = spi_disable_blockprotect_bp3_srwd,
8689 .write = spi_chip_write_256,
8690 .read = spi_chip_read, /* Fast read (0x0B) supported */
8691 .voltage = {2700, 3600},
8692 },
8693
8694 {
8695 .vendor = "Macronix",
8696 .name = "MX25L6405D",
8697 .bustype = BUS_SPI,
8698 .manufacture_id = MACRONIX_ID,
8699 .model_id = MACRONIX_MX25L6405,
8700 .total_size = 8192,
8701 .page_size = 256,
8702 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
8703 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8704 .tested = TEST_OK_PREW,
8705 .probe = probe_spi_rdid,
8706 .probe_timing = TIMING_ZERO,
8707 .block_erasers =
8708 {
8709 {
8710 .eraseblocks = { {4 * 1024, 2048} },
8711 .block_erase = spi_block_erase_20,
8712 }, {
8713 .eraseblocks = { {64 * 1024, 128} },
8714 .block_erase = spi_block_erase_d8,
8715 }, {
8716 .eraseblocks = { {8 * 1024 * 1024, 1} },
8717 .block_erase = spi_block_erase_60,
8718 }, {
8719 .eraseblocks = { {8 * 1024 * 1024, 1} },
8720 .block_erase = spi_block_erase_c7,
8721 }
8722 },
8723 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
8724 .unlock = spi_disable_blockprotect_bp3_srwd,
8725 .write = spi_chip_write_256,
8726 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0xBB) supported */
8727 .voltage = {2700, 3600},
8728 },
8729
8730 {
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008731 /* FIXME: This is an evil twin of the MX25L6405, with the same
8732 * ID bytes but different block erase capabilities */
8733 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008734 .name = "MX25L6406E/MX25L6408E",
hailfingere1e41ea2011-07-27 07:13:06 +00008735 .bustype = BUS_SPI,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008736 .manufacture_id = MACRONIX_ID,
8737 .model_id = MACRONIX_MX25L6405,
8738 .total_size = 8192,
8739 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008740 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008741 .tested = TEST_OK_PREW,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008742 .probe = probe_spi_rdid,
8743 .probe_timing = TIMING_ZERO,
8744 .block_erasers =
8745 {
8746 {
8747 .eraseblocks = { {4 * 1024, 2048} },
8748 .block_erase = spi_block_erase_20,
8749 }, {
8750 .eraseblocks = { {64 * 1024, 128} },
8751 .block_erase = spi_block_erase_d8,
8752 }, {
8753 .eraseblocks = { {64 * 1024, 128} },
8754 .block_erase = spi_block_erase_52,
8755 }, {
8756 .eraseblocks = { {8 * 1024 * 1024, 1} },
8757 .block_erase = spi_block_erase_60,
8758 }, {
8759 .eraseblocks = { {8 * 1024 * 1024, 1} },
8760 .block_erase = spi_block_erase_c7,
8761 }
8762 },
8763 .unlock = spi_disable_blockprotect,
8764 .write = spi_chip_write_256,
Vincent Palatina699d262013-02-28 14:31:12 -08008765 .read = spi_chip_read, /* Fast read (0x0B) supported */
8766 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
David Hendricks83541d32014-07-15 20:58:21 -07008767 .wp = &wp_generic,
David Hendricks1c9bc9c2011-07-20 15:25:44 -07008768 },
stepanaa1b6a22008-12-08 18:15:10 +00008769
hailfinger286829b2009-01-08 03:40:17 +00008770 {
8771 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10008772 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
8773 .bustype = BUS_SPI,
8774 .manufacture_id = MACRONIX_ID,
8775 .model_id = MACRONIX_MX25L6405,
8776 .total_size = 8192,
8777 .page_size = 256,
8778 /* supports SFDP */
8779 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
8780 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8781 .tested = TEST_OK_PREW,
8782 .probe = probe_spi_rdid,
8783 .probe_timing = TIMING_ZERO,
8784 .block_erasers =
8785 {
8786 {
8787 .eraseblocks = { {4 * 1024, 2048} },
8788 .block_erase = spi_block_erase_20,
8789 }, {
8790 .eraseblocks = { {32 * 1024, 256} },
8791 .block_erase = spi_block_erase_52,
8792 }, {
8793 .eraseblocks = { {64 * 1024, 128} },
8794 .block_erase = spi_block_erase_d8,
8795 }, {
8796 .eraseblocks = { {8 * 1024 * 1024, 1} },
8797 .block_erase = spi_block_erase_60,
8798 }, {
8799 .eraseblocks = { {8 * 1024 * 1024, 1} },
8800 .block_erase = spi_block_erase_c7,
8801 }
8802 },
8803 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8804 .unlock = spi_disable_blockprotect_bp3_srwd,
8805 .write = spi_chip_write_256,
8806 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8807 .voltage = {2700, 3600},
8808 },
8809
8810 {
8811 .vendor = "Macronix",
David Hendricksc3496092014-11-13 17:20:55 -08008812 .name = "MX25L6495F",
8813 .bustype = BUS_SPI,
8814 .manufacture_id = MACRONIX_ID,
8815 .model_id = MACRONIX_MX25L6495F,
8816 .total_size = 8192,
8817 .page_size = 256,
Alan Green378747b2019-09-09 16:38:43 +10008818 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +10008819 .tested = TEST_OK_PREW,
David Hendricksc3496092014-11-13 17:20:55 -08008820 .probe = probe_spi_rdid,
8821 .probe_timing = TIMING_ZERO,
8822 .block_erasers =
8823 {
8824 {
8825 .eraseblocks = { {4 * 1024, 2048} },
8826 .block_erase = spi_block_erase_20,
8827 }, {
8828 .eraseblocks = { {64 * 1024, 128} },
8829 .block_erase = spi_block_erase_d8,
8830 }, {
8831 .eraseblocks = { {32 * 1024, 256} },
8832 .block_erase = spi_block_erase_52,
8833 }, {
8834 .eraseblocks = { {8 * 1024 * 1024, 1} },
8835 .block_erase = spi_block_erase_60,
8836 }, {
8837 .eraseblocks = { {8 * 1024 * 1024, 1} },
8838 .block_erase = spi_block_erase_c7,
8839 }
8840 },
8841 .unlock = spi_disable_blockprotect,
8842 .write = spi_chip_write_256,
8843 .read = spi_chip_read, /* Fast read (0x0B) supported */
8844 .voltage = {2700, 3600},
8845 .wp = &wp_generic,
8846 },
8847
8848 {
8849 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10008850 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
8851 .bustype = BUS_SPI,
8852 .manufacture_id = MACRONIX_ID,
8853 .model_id = MACRONIX_MX25L8005,
8854 .total_size = 1024,
8855 .page_size = 256,
8856 /* MX25L8006E, MX25L8008E support SFDP */
8857 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
8858 .feature_bits = FEATURE_WRSR_WREN,
8859 .tested = TEST_OK_PREW,
8860 .probe = probe_spi_rdid,
8861 .probe_timing = TIMING_ZERO,
8862 .block_erasers =
8863 {
8864 {
8865 .eraseblocks = { {4 * 1024, 256} },
8866 .block_erase = spi_block_erase_20,
8867 }, {
8868 .eraseblocks = { {64 * 1024, 16} },
8869 .block_erase = spi_block_erase_52,
8870 }, {
8871 .eraseblocks = { {64 * 1024, 16} },
8872 .block_erase = spi_block_erase_d8,
8873 }, {
8874 .eraseblocks = { {1024 * 1024, 1} },
8875 .block_erase = spi_block_erase_60,
8876 }, {
8877 .eraseblocks = { {1024 * 1024, 1} },
8878 .block_erase = spi_block_erase_c7,
8879 },
8880 },
8881 .printlock = spi_prettyprint_status_register_bp2_srwd,
8882 .unlock = spi_disable_blockprotect,
8883 .write = spi_chip_write_256,
8884 .read = spi_chip_read, /* Fast read (0x0B) supported */
8885 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
8886 },
8887
8888 {
8889 .vendor = "Macronix",
sibradzic924de632020-03-14 17:21:34 +09008890 .name = "MX25R3235F",
8891 .bustype = BUS_SPI,
8892 .manufacture_id = MACRONIX_ID,
8893 .model_id = MACRONIX_MX25R3235F,
8894 .total_size = 4096,
8895 .page_size = 256,
8896 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8897 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8898 .tested = TEST_OK_PREW,
8899 .probe = probe_spi_rdid,
8900 .probe_timing = TIMING_ZERO,
8901 .block_erasers =
8902 {
8903 {
8904 .eraseblocks = { {4 * 1024, 1024} },
8905 .block_erase = spi_block_erase_20,
8906 }, {
8907 .eraseblocks = { {64 * 1024, 64} },
8908 .block_erase = spi_block_erase_d8,
8909 }, {
8910 .eraseblocks = { {32 * 1024, 128} },
8911 .block_erase = spi_block_erase_52,
8912 }, {
8913 .eraseblocks = { {4 * 1024 * 1024, 1} },
8914 .block_erase = spi_block_erase_60,
8915 }, {
8916 .eraseblocks = { {4 * 1024 * 1024, 1} },
8917 .block_erase = spi_block_erase_c7,
8918 }
8919 },
8920 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit 6 is quad enable */
8921 .unlock = spi_disable_blockprotect_bp3_srwd,
8922 .write = spi_chip_write_256,
8923 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
8924 .voltage = {1650, 3600},
8925 },
8926
8927 {
8928 .vendor = "Macronix",
Alan Greenb40ec892019-08-26 11:43:40 +10008929 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Jongpil66a96492014-08-14 17:59:06 +09008930 .bustype = BUS_SPI,
8931 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10008932 .model_id = MACRONIX_MX25L8005,
8933 .total_size = 1024,
Jongpil66a96492014-08-14 17:59:06 +09008934 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10008935 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10008936 .tested = TEST_OK_PREW,
Jongpil66a96492014-08-14 17:59:06 +09008937 .probe = probe_spi_rdid,
8938 .probe_timing = TIMING_ZERO,
8939 .block_erasers =
8940 {
8941 {
Alan Greend76dc1f2019-06-26 15:38:19 +10008942 .eraseblocks = { {4 * 1024, 256} },
Jongpil66a96492014-08-14 17:59:06 +09008943 .block_erase = spi_block_erase_20,
8944 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008945 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09008946 .block_erase = spi_block_erase_52,
8947 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008948 .eraseblocks = { {64 * 1024, 16} },
Jongpil66a96492014-08-14 17:59:06 +09008949 .block_erase = spi_block_erase_d8,
8950 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008951 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09008952 .block_erase = spi_block_erase_60,
8953 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10008954 .eraseblocks = { {1024 * 1024, 1} },
Jongpil66a96492014-08-14 17:59:06 +09008955 .block_erase = spi_block_erase_c7,
Alan Greend76dc1f2019-06-26 15:38:19 +10008956 },
Jongpil66a96492014-08-14 17:59:06 +09008957 },
Alan Greena514de82019-09-09 16:40:10 +10008958 .printlock = spi_prettyprint_status_register_bp2_srwd,
Jongpil66a96492014-08-14 17:59:06 +09008959 .unlock = spi_disable_blockprotect,
8960 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10008961 .read = spi_chip_read,
8962 .voltage = {2700, 3600},
Jongpil66a96492014-08-14 17:59:06 +09008963 .wp = &wp_w25,
8964 },
8965
Alex Lu831c6092017-11-02 23:19:34 -07008966 {
8967 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10008968 .name = "MX25R6435F",
8969 .bustype = BUS_SPI,
8970 .manufacture_id = MACRONIX_ID,
8971 .model_id = MACRONIX_MX25R6435F,
8972 .total_size = 8192,
8973 .page_size = 256,
8974 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
8975 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8976 .tested = TEST_OK_PREW,
8977 .probe = probe_spi_rdid,
8978 .probe_timing = TIMING_ZERO,
8979 .block_erasers =
8980 {
8981 {
8982 .eraseblocks = { {4 * 1024, 2048} },
8983 .block_erase = spi_block_erase_20,
8984 }, {
8985 .eraseblocks = { {64 * 1024, 128} },
8986 .block_erase = spi_block_erase_d8,
8987 }, {
8988 .eraseblocks = { {32 * 1024, 256} },
8989 .block_erase = spi_block_erase_52,
8990 }, {
8991 .eraseblocks = { {8 * 1024 * 1024, 1} },
8992 .block_erase = spi_block_erase_60,
8993 }, {
8994 .eraseblocks = { {8 * 1024 * 1024, 1} },
8995 .block_erase = spi_block_erase_c7,
8996 }
8997 },
8998 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
8999 .unlock = spi_disable_blockprotect_bp3_srwd,
9000 .write = spi_chip_write_256,
9001 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9002 .voltage = {1650, 3600},
9003 },
9004
9005 {
9006 .vendor = "Macronix",
Alex Lu831c6092017-11-02 23:19:34 -07009007 .name = "MX25U12835F",
9008 .bustype = BUS_SPI,
9009 .manufacture_id = MACRONIX_ID,
Alan Greendc0792e2019-07-01 15:01:34 +10009010 .model_id = MACRONIX_MX25U12835E,
Alex Lu831c6092017-11-02 23:19:34 -07009011 .total_size = 16384,
9012 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009013 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009014 .tested = TEST_OK_PREW,
Alex Lu831c6092017-11-02 23:19:34 -07009015 .probe = probe_spi_rdid,
9016 .probe_timing = TIMING_ZERO,
9017 .block_erasers =
9018 {
9019 {
9020 .eraseblocks = { {4 * 1024, 4096} },
9021 .block_erase = spi_block_erase_20,
9022 }, {
9023 .eraseblocks = { {32 * 1024, 512} },
9024 .block_erase = spi_block_erase_52,
9025 }, {
9026 .eraseblocks = { {64 * 1024, 256} },
9027 .block_erase = spi_block_erase_d8,
9028 }, {
9029 .eraseblocks = { {8 * 1024 * 2048, 1} },
9030 .block_erase = spi_block_erase_60,
9031 }, {
9032 .eraseblocks = { {8 * 1024 * 2048, 1} },
9033 .block_erase = spi_block_erase_c7,
9034 }
9035 },
9036 .unlock = spi_disable_blockprotect,
9037 .write = spi_chip_write_256,
9038 .read = spi_chip_read, /* Fast read (0x0B) supported */
9039 .voltage = {1650, 2000},
Paul Fagerburg50a120d2019-05-17 09:47:36 -06009040 .wp = &wp_w25q_large,
Alex Lu831c6092017-11-02 23:19:34 -07009041 },
9042
Jongpil66a96492014-08-14 17:59:06 +09009043 {
9044 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009045 .name = "MX25U1635E",
9046 .bustype = BUS_SPI,
9047 .manufacture_id = MACRONIX_ID,
9048 .model_id = MACRONIX_MX25U1635E,
9049 .total_size = 2048,
9050 .page_size = 256,
9051 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9052 /* QPI enable 0x35, disable 0xF5 (0xFF et al. work too) */
9053 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
9054 .tested = TEST_OK_PR,
9055 .probe = probe_spi_rdid,
9056 .probe_timing = TIMING_ZERO,
9057 .block_erasers =
9058 {
9059 {
9060 .eraseblocks = { {4 * 1024, 512} },
9061 .block_erase = spi_block_erase_20,
9062 }, {
9063 .eraseblocks = { {32 * 1024, 64} },
9064 .block_erase = spi_block_erase_52,
9065 }, {
9066 .eraseblocks = { {64 * 1024, 32} },
9067 .block_erase = spi_block_erase_d8,
9068 }, {
9069 .eraseblocks = { {2 * 1024 * 1024, 1} },
9070 .block_erase = spi_block_erase_60,
9071 }, {
9072 .eraseblocks = { {2 * 1024 * 1024, 1} },
9073 .block_erase = spi_block_erase_c7,
9074 }
9075 },
9076 /* TODO: security register */
9077 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9078 .unlock = spi_disable_blockprotect_bp3_srwd,
9079 .write = spi_chip_write_256,
9080 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9081 .voltage = {1650, 2000},
9082 },
9083
9084 {
9085 .vendor = "Macronix",
David Hendricks419e32a2015-04-07 17:25:14 -07009086 .name = "MX25U25635F",
9087 .bustype = BUS_SPI,
9088 .manufacture_id = MACRONIX_ID,
9089 .model_id = MACRONIX_MX25U25635F,
9090 /* FIXME(dhendrix): support 32-bit addressing */
9091 .total_size = 32768/2,
9092 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009093 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009094 .tested = TEST_OK_PREW,
David Hendricks419e32a2015-04-07 17:25:14 -07009095 .probe = probe_spi_rdid,
9096 .probe_timing = TIMING_ZERO,
9097 .block_erasers =
9098 {
9099 /* FIXME(dhendrix): support 32-bit addressing */
9100 {
9101 .eraseblocks = { {4 * 1024, 8192/2} },
9102 .block_erase = spi_block_erase_20,
9103 }, {
9104 .eraseblocks = { {32 * 1024, 1024/2} },
9105 .block_erase = spi_block_erase_52,
9106 }, {
9107 .eraseblocks = { {64 * 1024, 512/2} },
9108 .block_erase = spi_block_erase_d8,
9109 }, {
9110 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
9111 .block_erase = spi_block_erase_60,
9112 }, {
9113 .eraseblocks = { {32/2 * 1024 * 1024, 1} },
9114 .block_erase = spi_block_erase_c7,
9115 }
9116 },
9117 .unlock = spi_disable_blockprotect,
9118 .write = spi_chip_write_256,
9119 .read = spi_chip_read, /* Fast read (0x0B) supported */
9120 .voltage = {1650, 2000},
9121 /* FIXME(dhendrix): write-protect support */
Alan Greena7cfa332019-06-24 15:48:14 +10009122 /* .wp = &wp_generic, */
David Hendricks419e32a2015-04-07 17:25:14 -07009123 },
9124
9125 {
9126 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10009127 .name = "MX25U3235E/F",
hailfingere1e41ea2011-07-27 07:13:06 +00009128 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +00009129 .manufacture_id = MACRONIX_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +10009130 .model_id = MACRONIX_MX25U3235E,
9131 .total_size = 4096,
stuged8f34912009-04-21 01:47:16 +00009132 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009133 .feature_bits = FEATURE_WRSR_WREN,
stuged8f34912009-04-21 01:47:16 +00009134 .tested = TEST_UNTESTED,
9135 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +00009136 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009137 .block_erasers =
9138 {
9139 {
Alan Greend76dc1f2019-06-26 15:38:19 +10009140 .eraseblocks = { {4 * 1024, 1024} },
snelson2d471072010-01-09 05:30:14 +00009141 .block_erase = spi_block_erase_20,
9142 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009143 .eraseblocks = { {32 * 1024, 128} },
9144 .block_erase = spi_block_erase_52,
9145 }, {
9146 .eraseblocks = { {64 * 1024, 64} },
snelson2d471072010-01-09 05:30:14 +00009147 .block_erase = spi_block_erase_d8,
9148 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009149 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00009150 .block_erase = spi_block_erase_60,
9151 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +10009152 .eraseblocks = { {4 * 1024 * 1024, 1} },
snelson2d471072010-01-09 05:30:14 +00009153 .block_erase = spi_block_erase_c7,
9154 }
9155 },
hailfingerb9560ee2010-07-14 20:21:22 +00009156 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +00009157 .write = spi_chip_write_256,
Alan Greend76dc1f2019-06-26 15:38:19 +10009158 .read = spi_chip_read, /* Fast read (0x0B) supported */
9159 .voltage = {1650, 2000},
9160 .wp = &wp_w25,
9161 },
9162
9163 {
9164 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009165 .name = "MX25U51245G",
9166 .bustype = BUS_SPI,
9167 .manufacture_id = MACRONIX_ID,
9168 .model_id = MACRONIX_MX25U51245G,
9169 .total_size = 65536,
9170 .page_size = 256,
9171 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
9172 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI | FEATURE_4BA,
9173 .tested = TEST_OK_PREW,
9174 .probe = probe_spi_rdid,
9175 .probe_timing = TIMING_ZERO,
9176 .block_erasers =
9177 {
9178 {
9179 .eraseblocks = { {4 * 1024, 16384} },
9180 .block_erase = spi_block_erase_21,
9181 }, {
9182 .eraseblocks = { {4 * 1024, 16384} },
9183 .block_erase = spi_block_erase_20,
9184 }, {
9185 .eraseblocks = { {32 * 1024, 2048} },
9186 .block_erase = spi_block_erase_5c,
9187 }, {
9188 .eraseblocks = { {32 * 1024, 2048} },
9189 .block_erase = spi_block_erase_52,
9190 }, {
9191 .eraseblocks = { {64 * 1024, 1024} },
9192 .block_erase = spi_block_erase_dc,
9193 }, {
9194 .eraseblocks = { {64 * 1024, 1024} },
9195 .block_erase = spi_block_erase_d8,
9196 }, {
9197 .eraseblocks = { {64 * 1024 * 1024, 1} },
9198 .block_erase = spi_block_erase_60,
9199 }, {
9200 .eraseblocks = { {64 * 1024 * 1024, 1} },
9201 .block_erase = spi_block_erase_c7,
9202 }
9203 },
9204 /* TODO: security register */
9205 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9206 .unlock = spi_disable_blockprotect_bp3_srwd,
9207 .write = spi_chip_write_256, /* Multi I/O supported */
9208 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9209 .voltage = {1650, 2000},
9210 },
9211
9212 {
9213 .vendor = "Macronix",
Alan Greend76dc1f2019-06-26 15:38:19 +10009214 .name = "MX25U6435E/F",
9215 .bustype = BUS_SPI,
9216 .manufacture_id = MACRONIX_ID,
9217 .model_id = MACRONIX_MX25U6435E,
9218 .total_size = 8192,
9219 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +10009220 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +10009221 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +10009222 .probe = probe_spi_rdid,
9223 .probe_timing = TIMING_ZERO,
9224 .block_erasers =
9225 {
9226 {
9227 .eraseblocks = { {4 * 1024, 2048} },
9228 .block_erase = spi_block_erase_20,
9229 }, {
9230 .eraseblocks = { {32 * 1024, 256} },
9231 .block_erase = spi_block_erase_52,
9232 }, {
9233 .eraseblocks = { {64 * 1024, 128} },
9234 .block_erase = spi_block_erase_d8,
9235 }, {
9236 .eraseblocks = { {8 * 1024 * 1024, 1} },
9237 .block_erase = spi_block_erase_60,
9238 }, {
9239 .eraseblocks = { {8 * 1024 * 1024, 1} },
9240 .block_erase = spi_block_erase_c7,
9241 }
9242 },
9243 .unlock = spi_disable_blockprotect,
9244 .write = spi_chip_write_256,
9245 .read = spi_chip_read, /* Fast read (0x0B) supported */
9246 .voltage = {1650, 2000},
9247 .wp = &wp_w25,
stuged8f34912009-04-21 01:47:16 +00009248 },
9249
9250 {
9251 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009252 .name = "MX25U8032E",
9253 .bustype = BUS_SPI,
9254 .manufacture_id = MACRONIX_ID,
9255 .model_id = MACRONIX_MX25U8032E,
9256 .total_size = 1024,
9257 .page_size = 256,
9258 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9259 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
9260 .tested = TEST_OK_PREW,
9261 .probe = probe_spi_rdid,
9262 .probe_timing = TIMING_ZERO,
9263 .block_erasers =
9264 {
9265 {
9266 .eraseblocks = { {4 * 1024, 256} },
9267 .block_erase = spi_block_erase_20,
9268 }, {
9269 .eraseblocks = { {32 * 1024, 32} },
9270 .block_erase = spi_block_erase_52,
9271 }, {
9272 .eraseblocks = { {64 * 1024, 16} },
9273 .block_erase = spi_block_erase_d8,
9274 }, {
9275 .eraseblocks = { {1024 * 1024, 1} },
9276 .block_erase = spi_block_erase_60,
9277 }, {
9278 .eraseblocks = { {1024 * 1024, 1} },
9279 .block_erase = spi_block_erase_c7,
9280 }
9281 },
9282 /* TODO: security register */
9283 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9284 .unlock = spi_disable_blockprotect_bp3_srwd,
9285 .write = spi_chip_write_256,
9286 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
9287 .voltage = {1650, 2000},
9288 },
9289
9290 {
9291 .vendor = "Macronix",
hailfinger377ee962009-08-24 01:42:24 +00009292 .name = "MX29F001B",
hailfingere1e41ea2011-07-27 07:13:06 +00009293 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009294 .manufacture_id = MACRONIX_ID,
9295 .model_id = MACRONIX_MX29F001B,
hailfinger377ee962009-08-24 01:42:24 +00009296 .total_size = 128,
9297 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009298 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9299 .tested = TEST_UNTESTED,
9300 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009301 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009302 .block_erasers =
9303 {
9304 {
Simon Glass8dc82732013-07-16 10:13:51 -06009305 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00009306 {8 * 1024, 1},
9307 {4 * 1024, 2},
9308 {8 * 1024, 2},
9309 {32 * 1024, 1},
9310 {64 * 1024, 1},
9311 },
snelsonc6855342010-01-28 23:55:12 +00009312 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009313 }, {
9314 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009315 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009316 }
9317 },
hailfingerfff99532009-11-27 17:49:42 +00009318 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00009319 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009320 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00009321 },
9322
9323 {
9324 .vendor = "Macronix",
9325 .name = "MX29F001T",
hailfingere1e41ea2011-07-27 07:13:06 +00009326 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009327 .manufacture_id = MACRONIX_ID,
9328 .model_id = MACRONIX_MX29F001T,
hailfinger377ee962009-08-24 01:42:24 +00009329 .total_size = 128,
9330 .page_size = 32 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009331 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct4cc44652011-05-18 01:31:46 +00009332 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00009333 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009334 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009335 .block_erasers =
9336 {
9337 {
Simon Glass8dc82732013-07-16 10:13:51 -06009338 .eraseblocks = {
snelson2d471072010-01-09 05:30:14 +00009339 {64 * 1024, 1},
9340 {32 * 1024, 1},
9341 {8 * 1024, 2},
9342 {4 * 1024, 2},
9343 {8 * 1024, 1},
9344 },
snelsonc6855342010-01-28 23:55:12 +00009345 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009346 }, {
9347 .eraseblocks = { {128 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009348 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009349 }
9350 },
hailfingerfff99532009-11-27 17:49:42 +00009351 .write = write_jedec_1,
hailfinger377ee962009-08-24 01:42:24 +00009352 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009353 .voltage = {4500, 5500},
hailfinger377ee962009-08-24 01:42:24 +00009354 },
9355
9356 {
9357 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00009358 .name = "MX29F002(N)B",
hailfingere1e41ea2011-07-27 07:13:06 +00009359 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009360 .manufacture_id = MACRONIX_ID,
9361 .model_id = MACRONIX_MX29F002B,
hailfinger286829b2009-01-08 03:40:17 +00009362 .total_size = 256,
9363 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009364 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
hailfinger286829b2009-01-08 03:40:17 +00009365 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +00009366 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009367 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00009368 .block_erasers =
9369 {
9370 {
9371 .eraseblocks = {
9372 {16 * 1024, 1},
9373 {8 * 1024, 2},
9374 {32 * 1024, 1},
9375 {64 * 1024, 3},
9376 },
snelsonc6855342010-01-28 23:55:12 +00009377 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009378 }, {
9379 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009380 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009381 },
9382 },
hailfingerfff99532009-11-27 17:49:42 +00009383 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009384 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009385 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009386 },
9387
hailfinger286829b2009-01-08 03:40:17 +00009388 {
9389 .vendor = "Macronix",
stefanctd6efe1a2011-09-03 11:22:27 +00009390 .name = "MX29F002(N)T",
hailfingere1e41ea2011-07-27 07:13:06 +00009391 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009392 .manufacture_id = MACRONIX_ID,
9393 .model_id = MACRONIX_MX29F002T,
hailfinger286829b2009-01-08 03:40:17 +00009394 .total_size = 256,
9395 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009396 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
stefanct98d917c2011-10-21 12:33:07 +00009397 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +00009398 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009399 .probe_timing = TIMING_ZERO,
snelson1c03aa12009-12-23 17:05:59 +00009400 .block_erasers =
9401 {
9402 {
9403 .eraseblocks = {
9404 {64 * 1024, 3},
9405 {32 * 1024, 1},
9406 {8 * 1024, 2},
9407 {16 * 1024, 1},
9408 },
snelsonc6855342010-01-28 23:55:12 +00009409 .block_erase = erase_sector_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009410 }, {
9411 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009412 .block_erase = erase_chip_block_jedec,
snelson1c03aa12009-12-23 17:05:59 +00009413 },
9414 },
hailfingerfff99532009-11-27 17:49:42 +00009415 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009416 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009417 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +00009418 },
9419
hailfinger286829b2009-01-08 03:40:17 +00009420 {
9421 .vendor = "Macronix",
Nikolai Artemievd7f97ad2020-08-31 17:44:41 +10009422 .name = "MX29F022(N)B",
9423 .bustype = BUS_PARALLEL,
9424 .manufacture_id = MACRONIX_ID,
9425 .model_id = MACRONIX_MX29F022B,
9426 .total_size = 256,
9427 .page_size = 0, /* unused */
9428 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9429 .tested = TEST_UNTESTED,
9430 .probe = probe_jedec,
9431 .probe_timing = TIMING_ZERO,
9432 .block_erasers =
9433 {
9434 {
9435 .eraseblocks = {
9436 {16 * 1024, 1},
9437 {8 * 1024, 2},
9438 {32 * 1024, 1},
9439 {64 * 1024, 3},
9440 },
9441 .block_erase = erase_sector_jedec,
9442 }, {
9443 .eraseblocks = { {256 * 1024, 1} },
9444 .block_erase = erase_chip_block_jedec,
9445 }
9446 },
9447 .write = write_jedec_1,
9448 .read = read_memmapped,
9449 .voltage = {4500, 5500},
9450 },
9451
9452 {
9453 .vendor = "Macronix",
9454 .name = "MX29F022(N)T",
9455 .bustype = BUS_PARALLEL,
9456 .manufacture_id = MACRONIX_ID,
9457 .model_id = MACRONIX_MX29F022T,
9458 .total_size = 256,
9459 .page_size = 0, /* unused */
9460 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9461 .tested = TEST_OK_PREW,
9462 .probe = probe_jedec,
9463 .probe_timing = TIMING_ZERO,
9464 .block_erasers =
9465 {
9466 {
9467 .eraseblocks = {
9468 {64 * 1024, 3},
9469 {32 * 1024, 1},
9470 {8 * 1024, 2},
9471 {16 * 1024, 1},
9472 },
9473 .block_erase = erase_sector_jedec,
9474 }, {
9475 .eraseblocks = { {256 * 1024, 1} },
9476 .block_erase = erase_chip_block_jedec,
9477 }
9478 },
9479 .write = write_jedec_1,
9480 .read = read_memmapped,
9481 .voltage = {4500, 5500},
9482 },
9483
9484 {
9485 .vendor = "Macronix",
mhme8e87912010-09-16 00:51:51 +00009486 .name = "MX29F040",
hailfingere1e41ea2011-07-27 07:13:06 +00009487 .bustype = BUS_PARALLEL,
mhme8e87912010-09-16 00:51:51 +00009488 .manufacture_id = MACRONIX_ID,
9489 .model_id = MACRONIX_MX29F040,
9490 .total_size = 512,
9491 .page_size = 64 * 1024,
9492 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9493 .tested = TEST_UNTESTED,
9494 .probe = probe_jedec,
9495 .probe_timing = TIMING_ZERO,
9496 .block_erasers =
9497 {
9498 {
9499 .eraseblocks = { {64 * 1024, 8} },
9500 .block_erase = erase_sector_jedec,
9501 }, {
9502 .eraseblocks = { {512 * 1024, 1} },
9503 .block_erase = erase_chip_block_jedec,
9504 },
9505 },
9506 .write = write_jedec_1,
9507 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +00009508 .voltage = {4500, 5500},
mhme8e87912010-09-16 00:51:51 +00009509 },
9510
9511 {
9512 .vendor = "Macronix",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +10009513 .name = "MX29GL128F",
9514 .bustype = BUS_PARALLEL,
9515 .manufacture_id = MACRONIX_ID,
9516 .model_id = MACRONIX_MX29GL128F,
9517 .total_size = 16384,
9518 .page_size = 128 * 1024, /* actual page size is 16 */
9519 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9520 .tested = TEST_UNTESTED,
9521 .probe = probe_jedec_29gl,
9522 .probe_timing = TIMING_ZERO,
9523 .block_erasers =
9524 {
9525 {
9526 .eraseblocks = { {128 * 1024, 128} },
9527 .block_erase = erase_sector_jedec,
9528 }, {
9529 .eraseblocks = { {16 * 1024 * 1024, 1} },
9530 .block_erase = erase_chip_block_jedec,
9531 },
9532 },
9533 .write = write_jedec_1,
9534 .read = read_memmapped,
9535 .voltage = {2700, 3600},
9536 },
9537
9538 {
9539 .vendor = "Macronix",
9540 .name = "MX29GL320EB",
9541 .bustype = BUS_PARALLEL,
9542 .manufacture_id = MACRONIX_ID,
9543 .model_id = MACRONIX_MX29GL320EB,
9544 .total_size = 4096,
9545 .page_size = 128 * 1024, /* actual page size is 16 */
9546 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9547 .tested = TEST_UNTESTED,
9548 .probe = probe_jedec_29gl,
9549 .probe_timing = TIMING_ZERO,
9550 .block_erasers =
9551 {
9552 {
9553 .eraseblocks = {
9554 {8 * 1024, 8},
9555 {64 * 1024, 63},
9556 },
9557 .block_erase = erase_sector_jedec,
9558 }, {
9559 .eraseblocks = { {4 * 1024 * 1024, 1} },
9560 .block_erase = erase_chip_block_jedec,
9561 },
9562 },
9563 .write = write_jedec_1,
9564 .read = read_memmapped,
9565 .voltage = {2700, 3600},
9566 },
9567
9568 {
9569 .vendor = "Macronix",
9570 .name = "MX29GL320EH/L",
9571 .bustype = BUS_PARALLEL,
9572 .manufacture_id = MACRONIX_ID,
9573 .model_id = MACRONIX_MX29GL320EHL,
9574 .total_size = 4096,
9575 .page_size = 128 * 1024, /* actual page size is 16 */
9576 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9577 .tested = TEST_UNTESTED,
9578 .probe = probe_jedec_29gl,
9579 .probe_timing = TIMING_ZERO,
9580 .block_erasers =
9581 {
9582 {
9583 .eraseblocks = { {64 * 1024, 64} },
9584 .block_erase = erase_sector_jedec,
9585 }, {
9586 .eraseblocks = { {4 * 1024 * 1024, 1} },
9587 .block_erase = erase_chip_block_jedec,
9588 },
9589 },
9590 .write = write_jedec_1,
9591 .read = read_memmapped,
9592 .voltage = {2700, 3600},
9593 },
9594
9595 {
9596 .vendor = "Macronix",
9597 .name = "MX29GL320ET",
9598 .bustype = BUS_PARALLEL,
9599 .manufacture_id = MACRONIX_ID,
9600 .model_id = MACRONIX_MX29GL320ET,
9601 .total_size = 4096,
9602 .page_size = 128 * 1024, /* actual page size is 16 */
9603 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9604 .tested = TEST_UNTESTED,
9605 .probe = probe_jedec_29gl,
9606 .probe_timing = TIMING_ZERO,
9607 .block_erasers =
9608 {
9609 {
9610 .eraseblocks = {
9611 {64 * 1024, 63},
9612 {8 * 1024, 8},
9613 },
9614 .block_erase = erase_sector_jedec,
9615 }, {
9616 .eraseblocks = { {4 * 1024 * 1024, 1} },
9617 .block_erase = erase_chip_block_jedec,
9618 },
9619 },
9620 .write = write_jedec_1,
9621 .read = read_memmapped,
9622 .voltage = {2700, 3600},
9623 },
9624
9625 {
9626 .vendor = "Macronix",
9627 .name = "MX29GL640EB",
9628 .bustype = BUS_PARALLEL,
9629 .manufacture_id = MACRONIX_ID,
9630 .model_id = MACRONIX_MX29GL640EB,
9631 .total_size = 8192,
9632 .page_size = 128 * 1024, /* actual page size is 16 */
9633 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9634 .tested = TEST_UNTESTED,
9635 .probe = probe_jedec_29gl,
9636 .probe_timing = TIMING_ZERO,
9637 .block_erasers =
9638 {
9639 {
9640 .eraseblocks = {
9641 {8 * 1024, 8},
9642 {64 * 1024, 127},
9643 },
9644 .block_erase = erase_sector_jedec,
9645 }, {
9646 .eraseblocks = { {8 * 1024 * 1024, 1} },
9647 .block_erase = erase_chip_block_jedec,
9648 },
9649 },
9650 .write = write_jedec_1,
9651 .read = read_memmapped,
9652 .voltage = {2700, 3600},
9653 },
9654
9655 {
9656 .vendor = "Macronix",
9657 .name = "MX29GL640EH/L",
9658 .bustype = BUS_PARALLEL,
9659 .manufacture_id = MACRONIX_ID,
9660 .model_id = MACRONIX_MX29GL640EHL,
9661 .total_size = 8192,
9662 .page_size = 128 * 1024, /* actual page size is 16 */
9663 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9664 .tested = TEST_UNTESTED,
9665 .probe = probe_jedec_29gl,
9666 .probe_timing = TIMING_ZERO,
9667 .block_erasers =
9668 {
9669 {
9670 .eraseblocks = { {64 * 1024, 128} },
9671 .block_erase = erase_sector_jedec,
9672 }, {
9673 .eraseblocks = { {8 * 1024 * 1024, 1} },
9674 .block_erase = erase_chip_block_jedec,
9675 },
9676 },
9677 .write = write_jedec_1,
9678 .read = read_memmapped,
9679 .voltage = {2700, 3600},
9680 },
9681
9682 {
9683 .vendor = "Macronix",
9684 .name = "MX29GL640ET",
9685 .bustype = BUS_PARALLEL,
9686 .manufacture_id = MACRONIX_ID,
9687 .model_id = MACRONIX_MX29GL640ET,
9688 .total_size = 8192,
9689 .page_size = 128 * 1024, /* actual page size is 16 */
9690 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9691 .tested = TEST_UNTESTED,
9692 .probe = probe_jedec_29gl,
9693 .probe_timing = TIMING_ZERO,
9694 .block_erasers =
9695 {
9696 {
9697 .eraseblocks = {
9698 {64 * 1024, 127},
9699 {8 * 1024, 8},
9700 },
9701 .block_erase = erase_sector_jedec,
9702 }, {
9703 .eraseblocks = { {8 * 1024 * 1024, 1} },
9704 .block_erase = erase_chip_block_jedec,
9705 },
9706 },
9707 .write = write_jedec_1,
9708 .read = read_memmapped,
9709 .voltage = {2700, 3600},
9710 },
9711
9712 {
9713 .vendor = "Macronix",
hailfinger94c758e2009-07-24 13:59:27 +00009714 .name = "MX29LV040",
hailfingere1e41ea2011-07-27 07:13:06 +00009715 .bustype = BUS_PARALLEL,
mhmd3c80cd2010-09-15 23:31:03 +00009716 .manufacture_id = MACRONIX_ID,
9717 .model_id = MACRONIX_MX29LV040,
hailfinger286829b2009-01-08 03:40:17 +00009718 .total_size = 512,
9719 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +00009720 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
9721 .tested = TEST_UNTESTED,
9722 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +00009723 .probe_timing = TIMING_ZERO,
snelson2d471072010-01-09 05:30:14 +00009724 .block_erasers =
9725 {
9726 {
Alan Green0d97b472019-07-26 10:33:25 +10009727 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +00009728 .block_erase = erase_sector_jedec,
snelson2d471072010-01-09 05:30:14 +00009729 }, {
9730 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +00009731 .block_erase = erase_chip_block_jedec,
snelson2d471072010-01-09 05:30:14 +00009732 },
9733 },
hailfingerfff99532009-11-27 17:49:42 +00009734 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +00009735 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +00009736 .voltage = {2700, 3600},
hailfinger033cdf02008-12-10 10:32:05 +00009737 },
9738
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +10009739 {
9740 .vendor = "Macronix",
9741 .name = "MX66L51235F/MX25L51245G",
9742 .bustype = BUS_SPI,
9743 .manufacture_id = MACRONIX_ID,
9744 .model_id = MACRONIX_MX66L51235F,
9745 .total_size = 65536,
9746 .page_size = 256,
9747 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
9748 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
9749 .tested = TEST_OK_PREW,
9750 .probe = probe_spi_rdid,
9751 .probe_timing = TIMING_ZERO,
9752 .block_erasers =
9753 {
9754 {
9755 .eraseblocks = { {4 * 1024, 16384} },
9756 .block_erase = spi_block_erase_21,
9757 }, {
9758 .eraseblocks = { {4 * 1024, 16384} },
9759 .block_erase = spi_block_erase_20,
9760 }, {
9761 .eraseblocks = { {32 * 1024, 2048} },
9762 .block_erase = spi_block_erase_5c,
9763 }, {
9764 .eraseblocks = { {32 * 1024, 2048} },
9765 .block_erase = spi_block_erase_52,
9766 }, {
9767 .eraseblocks = { {64 * 1024, 1024} },
9768 .block_erase = spi_block_erase_dc,
9769 }, {
9770 .eraseblocks = { {64 * 1024, 1024} },
9771 .block_erase = spi_block_erase_d8,
9772 }, {
9773 .eraseblocks = { {64 * 1024 * 1024, 1} },
9774 .block_erase = spi_block_erase_60,
9775 }, {
9776 .eraseblocks = { {64 * 1024 * 1024, 1} },
9777 .block_erase = spi_block_erase_c7,
9778 }
9779 },
9780 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
9781 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
9782 .unlock = spi_disable_blockprotect_bp3_srwd,
9783 .write = spi_chip_write_256,
9784 .read = spi_chip_read, /* Fast read (0x0B) supported */
9785 .voltage = {2700, 3600},
9786 },
9787
Alan Green82e27422019-08-26 12:18:10 +10009788 /* The ST M25P05 is a bit of a problem. It has the same ID as the
9789 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
9790 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
9791 * only is successful if RDID does not work.
9792 */
hailfinger286829b2009-01-08 03:40:17 +00009793 {
Alan Green82e27422019-08-26 12:18:10 +10009794 .vendor = "Micron/Numonyx/ST",
9795 .name = "M25P05",
9796 .bustype = BUS_SPI,
9797 .manufacture_id = 0, /* Not used. */
9798 .model_id = ST_M25P05_RES,
9799 .total_size = 64,
9800 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009801 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10009802 .tested = TEST_UNTESTED,
9803 .probe = probe_spi_res1,
9804 .probe_timing = TIMING_ZERO,
9805 .block_erasers =
9806 {
9807 {
9808 .eraseblocks = { {32 * 1024, 2} },
9809 .block_erase = spi_block_erase_d8,
9810 }, {
9811 .eraseblocks = { {64 * 1024, 1} },
9812 .block_erase = spi_block_erase_c7,
9813 }
9814 },
Alan Green197c7432019-09-09 17:24:41 +10009815 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9816 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009817 .write = spi_chip_write_1, /* 128 */
9818 .read = spi_chip_read,
9819 .voltage = {2700, 3600},
9820 },
9821
9822 {
9823 .vendor = "Micron/Numonyx/ST",
9824 .name = "M25P05-A",
9825 .bustype = BUS_SPI,
9826 .manufacture_id = ST_ID,
9827 .model_id = ST_M25P05A,
9828 .total_size = 64,
9829 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009830 .feature_bits = FEATURE_WRSR_WREN,
9831 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10009832 .probe = probe_spi_rdid,
9833 .probe_timing = TIMING_ZERO,
9834 .block_erasers =
9835 {
9836 {
9837 .eraseblocks = { {32 * 1024, 2} },
9838 .block_erase = spi_block_erase_d8,
9839 }, {
9840 .eraseblocks = { {64 * 1024, 1} },
9841 .block_erase = spi_block_erase_c7,
9842 }
9843 },
Alan Green197c7432019-09-09 17:24:41 +10009844 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9845 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009846 .write = spi_chip_write_256,
9847 .read = spi_chip_read,
9848 .voltage = {2700, 3600},
9849 },
9850
9851 /* The ST M25P10 has the same problem as the M25P05. */
9852 {
9853 .vendor = "Micron/Numonyx/ST",
9854 .name = "M25P10",
9855 .bustype = BUS_SPI,
9856 .manufacture_id = 0, /* Not used. */
9857 .model_id = ST_M25P10_RES,
9858 .total_size = 128,
9859 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009860 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10009861 .tested = TEST_UNTESTED,
9862 .probe = probe_spi_res1,
9863 .probe_timing = TIMING_ZERO,
9864 .block_erasers =
9865 {
9866 {
9867 .eraseblocks = { {32 * 1024, 4} },
9868 .block_erase = spi_block_erase_d8,
9869 }, {
9870 .eraseblocks = { {128 * 1024, 1} },
9871 .block_erase = spi_block_erase_c7,
9872 }
9873 },
Alan Green197c7432019-09-09 17:24:41 +10009874 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9875 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009876 .write = spi_chip_write_1, /* 128 */
9877 .read = spi_chip_read,
9878 .voltage = {2700, 3600},
9879 },
9880
9881 {
9882 .vendor = "Micron/Numonyx/ST",
9883 .name = "M25P10-A",
9884 .bustype = BUS_SPI,
9885 .manufacture_id = ST_ID,
9886 .model_id = ST_M25P10A,
9887 .total_size = 128,
9888 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009889 .feature_bits = FEATURE_WRSR_WREN,
9890 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10009891 .probe = probe_spi_rdid,
9892 .probe_timing = TIMING_ZERO,
9893 .block_erasers =
9894 {
9895 {
9896 .eraseblocks = { {32 * 1024, 4} },
9897 .block_erase = spi_block_erase_d8,
9898 }, {
9899 .eraseblocks = { {128 * 1024, 1} },
9900 .block_erase = spi_block_erase_c7,
9901 }
9902 },
Alan Green197c7432019-09-09 17:24:41 +10009903 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9904 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009905 .write = spi_chip_write_256,
9906 .read = spi_chip_read,
9907 .voltage = {2700, 3600},
9908 },
9909
9910 {
9911 .vendor = "Micron/Numonyx/ST",
9912 .name = "M25P128",
9913 .bustype = BUS_SPI,
9914 .manufacture_id = ST_ID,
9915 .model_id = ST_M25P128,
9916 .total_size = 16384,
9917 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009918 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10009919 .tested = TEST_OK_PREW,
9920 .probe = probe_spi_rdid,
9921 .probe_timing = TIMING_ZERO,
9922 .block_erasers =
9923 {
9924 {
9925 .eraseblocks = { {256 * 1024, 64} },
9926 .block_erase = spi_block_erase_d8,
9927 }, {
9928 .eraseblocks = { {16 * 1024 * 1024, 1} },
9929 .block_erase = spi_block_erase_c7,
9930 }
9931 },
Alan Green197c7432019-09-09 17:24:41 +10009932 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9933 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009934 .write = spi_chip_write_256,
9935 .read = spi_chip_read,
9936 .voltage = {2700, 3600},
9937 },
9938
9939 {
9940 .vendor = "Micron/Numonyx/ST",
9941 .name = "M25P16",
9942 .bustype = BUS_SPI,
9943 .manufacture_id = ST_ID,
9944 .model_id = ST_M25P16,
9945 .total_size = 2048,
9946 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009947 .feature_bits = FEATURE_WRSR_WREN,
9948 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +10009949 .probe = probe_spi_rdid,
9950 .probe_timing = TIMING_ZERO,
9951 .block_erasers =
9952 {
9953 {
9954 .eraseblocks = { {64 * 1024, 32} },
9955 .block_erase = spi_block_erase_d8,
9956 }, {
9957 .eraseblocks = { {2 * 1024 * 1024, 1} },
9958 .block_erase = spi_block_erase_c7,
9959 }
9960 },
Alan Green197c7432019-09-09 17:24:41 +10009961 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
9962 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009963 .write = spi_chip_write_256,
9964 .read = spi_chip_read,
9965 .voltage = {2700, 3600},
9966 },
9967
9968 {
9969 .vendor = "Micron/Numonyx/ST", /* Numonyx */
9970 .name = "M25P20",
9971 .bustype = BUS_SPI,
9972 .manufacture_id = ST_ID,
9973 .model_id = ST_M25P20,
9974 .total_size = 256,
9975 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +10009976 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +10009977 .tested = TEST_UNTESTED,
9978 .probe = probe_spi_rdid,
9979 .probe_timing = TIMING_ZERO,
9980 .block_erasers =
9981 {
9982 {
9983 .eraseblocks = { {64 * 1024, 4} },
9984 .block_erase = spi_block_erase_d8,
9985 }, {
9986 .eraseblocks = { {256 * 1024, 1} },
9987 .block_erase = spi_block_erase_c7,
9988 }
9989 },
Alan Green197c7432019-09-09 17:24:41 +10009990 .printlock = spi_prettyprint_status_register_bp1_srwd,
Alan Green82e27422019-08-26 12:18:10 +10009991 .unlock = spi_disable_blockprotect,
9992 .write = spi_chip_write_256,
9993 .read = spi_chip_read, /* Fast read (0x0B) supported */
9994 .voltage = {2700, 3600},
9995 },
9996
9997 {
9998 .vendor = "Micron/Numonyx/ST",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +10009999 .name = "M25P20-old",
10000 .bustype = BUS_SPI,
10001 .manufacture_id = 0, /* Not used. */
10002 .model_id = ST_M25P20_RES,
10003 .total_size = 256,
10004 .page_size = 256,
10005 .feature_bits = FEATURE_WRSR_WREN,
10006 .tested = TEST_OK_PREW,
10007 .probe = probe_spi_res1,
10008 .probe_timing = TIMING_ZERO,
10009 .block_erasers =
10010 {
10011 {
10012 .eraseblocks = { {64 * 1024, 4} },
10013 .block_erase = spi_block_erase_d8,
10014 }, {
10015 .eraseblocks = { {256 * 1024, 1} },
10016 .block_erase = spi_block_erase_c7,
10017 }
10018 },
10019 .printlock = spi_prettyprint_status_register_bp1_srwd,
10020 .unlock = spi_disable_blockprotect,
10021 .write = spi_chip_write_256,
10022 .read = spi_chip_read, /* Fast read (0x0B) supported */
10023 .voltage = {2700, 3600},
10024 },
10025
10026 {
10027 .vendor = "Micron/Numonyx/ST",
Alan Green82e27422019-08-26 12:18:10 +100010028 .name = "M25P32",
10029 .bustype = BUS_SPI,
10030 .manufacture_id = ST_ID,
10031 .model_id = ST_M25P32,
10032 .total_size = 4096,
10033 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010034 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010035 .tested = TEST_OK_PREW,
10036 .probe = probe_spi_rdid,
10037 .probe_timing = TIMING_ZERO,
10038 .block_erasers =
10039 {
10040 {
10041 .eraseblocks = { {64 * 1024, 64} },
10042 .block_erase = spi_block_erase_d8,
10043 }, {
10044 .eraseblocks = { {4 * 1024 * 1024, 1} },
10045 .block_erase = spi_block_erase_c7,
10046 }
10047 },
Alan Green197c7432019-09-09 17:24:41 +100010048 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10049 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010050 .write = spi_chip_write_256,
10051 .read = spi_chip_read,
10052 .voltage = {2700, 3600},
10053 },
10054
10055 {
10056 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10057 .name = "M25P40",
10058 .bustype = BUS_SPI,
10059 .manufacture_id = ST_ID,
10060 .model_id = ST_M25P40,
10061 .total_size = 512,
10062 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010063 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010064 .tested = TEST_OK_PREW,
10065 .probe = probe_spi_rdid,
10066 .probe_timing = TIMING_ZERO,
10067 .block_erasers =
10068 {
10069 {
10070 .eraseblocks = { {64 * 1024, 8} },
10071 .block_erase = spi_block_erase_d8,
10072 }, {
10073 .eraseblocks = { {512 * 1024, 1} },
10074 .block_erase = spi_block_erase_c7,
10075 }
10076 },
Alan Green197c7432019-09-09 17:24:41 +100010077 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10078 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010079 .write = spi_chip_write_256,
10080 .read = spi_chip_read,
10081 .voltage = {2700, 3600},
10082 },
10083
10084 {
10085 .vendor = "Micron/Numonyx/ST",
10086 .name = "M25P40-old",
10087 .bustype = BUS_SPI,
10088 .manufacture_id = 0, /* Not used. */
10089 .model_id = ST_M25P40_RES,
10090 .total_size = 512,
10091 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010092 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010093 .tested = TEST_UNTESTED,
10094 .probe = probe_spi_res1,
10095 .probe_timing = TIMING_ZERO,
10096 .block_erasers =
10097 {
10098 {
10099 .eraseblocks = { {64 * 1024, 8} },
10100 .block_erase = spi_block_erase_d8,
10101 }, {
10102 .eraseblocks = { {512 * 1024, 1} },
10103 .block_erase = spi_block_erase_c7,
10104 }
10105 },
Alan Green197c7432019-09-09 17:24:41 +100010106 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10107 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010108 .write = spi_chip_write_256,
10109 .read = spi_chip_read,
10110 },
10111
10112 {
10113 .vendor = "Micron/Numonyx/ST",
10114 .name = "M25P64",
10115 .bustype = BUS_SPI,
10116 .manufacture_id = ST_ID,
10117 .model_id = ST_M25P64,
10118 .total_size = 8192,
10119 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010120 .feature_bits = FEATURE_WRSR_WREN,
10121 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010122 .probe = probe_spi_rdid,
10123 .probe_timing = TIMING_ZERO,
10124 .block_erasers =
10125 {
10126 {
10127 .eraseblocks = { {64 * 1024, 128} },
10128 .block_erase = spi_block_erase_d8,
10129 }, {
10130 .eraseblocks = { {8 * 1024 * 1024, 1} },
10131 .block_erase = spi_block_erase_c7,
10132 }
10133 },
Alan Green197c7432019-09-09 17:24:41 +100010134 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10135 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010136 .write = spi_chip_write_256,
10137 .read = spi_chip_read,
10138 .voltage = {2700, 3600},
10139 },
10140
10141 {
10142 .vendor = "Micron/Numonyx/ST",
10143 .name = "M25P80",
10144 .bustype = BUS_SPI,
10145 .manufacture_id = ST_ID,
10146 .model_id = ST_M25P80,
10147 .total_size = 1024,
10148 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010149 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010150 .tested = TEST_OK_PREW,
10151 .probe = probe_spi_rdid,
10152 .probe_timing = TIMING_ZERO,
10153 .block_erasers =
10154 {
10155 {
10156 .eraseblocks = { {64 * 1024, 16} },
10157 .block_erase = spi_block_erase_d8,
10158 }, {
10159 .eraseblocks = { {1024 * 1024, 1} },
10160 .block_erase = spi_block_erase_c7,
10161 }
10162 },
Alan Green197c7432019-09-09 17:24:41 +100010163 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10164 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green82e27422019-08-26 12:18:10 +100010165 .write = spi_chip_write_256,
10166 .read = spi_chip_read,
10167 .voltage = {2700, 3600},
10168 },
10169
10170 {
10171 .vendor = "Micron/Numonyx/ST",
10172 .name = "M25PE10",
10173 .bustype = BUS_SPI,
10174 .manufacture_id = ST_ID,
10175 .model_id = ST_M25PE10,
10176 .total_size = 128,
10177 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010178 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010179 .tested = TEST_UNTESTED,
10180 .probe = probe_spi_rdid,
10181 .probe_timing = TIMING_ZERO,
10182 .block_erasers =
10183 {
10184 {
10185 .eraseblocks = { {4 * 1024, 32} },
10186 .block_erase = spi_block_erase_20,
10187 }, {
10188 .eraseblocks = { {64 * 1024, 2} },
10189 .block_erase = spi_block_erase_d8,
10190 }, {
10191 .eraseblocks = { {128 * 1024, 1} },
10192 .block_erase = spi_block_erase_c7,
10193 }
10194 },
Alan Green197c7432019-09-09 17:24:41 +100010195 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010196 .unlock = spi_disable_blockprotect,
10197 .write = spi_chip_write_256,
10198 .read = spi_chip_read,
10199 .voltage = {2700, 3600},
10200 },
10201
10202 {
10203 .vendor = "Micron/Numonyx/ST",
10204 .name = "M25PE16",
10205 .bustype = BUS_SPI,
10206 .manufacture_id = ST_ID,
10207 .model_id = ST_M25PE16,
10208 .total_size = 2048,
10209 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010210 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010211 .tested = TEST_UNTESTED,
10212 .probe = probe_spi_rdid,
10213 .probe_timing = TIMING_ZERO,
10214 .block_erasers =
10215 {
10216 {
10217 .eraseblocks = { {4 * 1024, 512} },
10218 .block_erase = spi_block_erase_20,
10219 }, {
10220 .eraseblocks = { {64 * 1024, 32} },
10221 .block_erase = spi_block_erase_d8,
10222 }, {
10223 .eraseblocks = { {2 * 1024 * 1024, 1} },
10224 .block_erase = spi_block_erase_c7,
10225 }
10226 },
Alan Green197c7432019-09-09 17:24:41 +100010227 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010228 .unlock = spi_disable_blockprotect,
10229 .write = spi_chip_write_256,
10230 .read = spi_chip_read,
10231 .voltage = {2700, 3600},
10232 },
10233
10234 {
10235 .vendor = "Micron/Numonyx/ST",
10236 .name = "M25PE20",
10237 .bustype = BUS_SPI,
10238 .manufacture_id = ST_ID,
10239 .model_id = ST_M25PE20,
10240 .total_size = 256,
10241 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010242 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010243 .tested = TEST_UNTESTED,
10244 .probe = probe_spi_rdid,
10245 .probe_timing = TIMING_ZERO,
10246 .block_erasers =
10247 {
10248 {
10249 .eraseblocks = { {4 * 1024, 64} },
10250 .block_erase = spi_block_erase_20,
10251 }, {
10252 .eraseblocks = { {64 * 1024, 4} },
10253 .block_erase = spi_block_erase_d8,
10254 }, {
10255 .eraseblocks = { {256 * 1024, 1} },
10256 .block_erase = spi_block_erase_c7,
10257 }
10258 },
Alan Green197c7432019-09-09 17:24:41 +100010259 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010260 .unlock = spi_disable_blockprotect,
10261 .write = spi_chip_write_256,
10262 .read = spi_chip_read,
10263 .voltage = {2700, 3600},
10264 },
10265
10266 {
10267 .vendor = "Micron/Numonyx/ST",
10268 .name = "M25PE40",
10269 .bustype = BUS_SPI,
10270 .manufacture_id = ST_ID,
10271 .model_id = ST_M25PE40,
10272 .total_size = 512,
10273 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010274 .feature_bits = FEATURE_WRSR_WREN,
10275 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010276 .probe = probe_spi_rdid,
10277 .probe_timing = TIMING_ZERO,
10278 .block_erasers =
10279 {
10280 {
10281 .eraseblocks = { {4 * 1024, 128} },
10282 .block_erase = spi_block_erase_20,
10283 }, {
10284 .eraseblocks = { {64 * 1024, 8} },
10285 .block_erase = spi_block_erase_d8,
10286 }, {
10287 .eraseblocks = { {512 * 1024, 1} },
10288 .block_erase = spi_block_erase_c7,
10289 }
10290 },
Alan Green197c7432019-09-09 17:24:41 +100010291 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010292 .unlock = spi_disable_blockprotect,
10293 .write = spi_chip_write_256,
10294 .read = spi_chip_read,
10295 .voltage = {2700, 3600},
10296 },
10297
10298 {
10299 .vendor = "Micron/Numonyx/ST",
10300 .name = "M25PE80",
10301 .bustype = BUS_SPI,
10302 .manufacture_id = ST_ID,
10303 .model_id = ST_M25PE80,
10304 .total_size = 1024,
10305 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010306 .feature_bits = FEATURE_WRSR_WREN,
Alan Green82e27422019-08-26 12:18:10 +100010307 .tested = TEST_OK_PREW,
10308 .probe = probe_spi_rdid,
10309 .probe_timing = TIMING_ZERO,
10310 .block_erasers =
10311 {
10312 {
10313 .eraseblocks = { {4 * 1024, 256} },
10314 .block_erase = spi_block_erase_20,
10315 }, {
10316 .eraseblocks = { {64 * 1024, 16} },
10317 .block_erase = spi_block_erase_d8,
10318 }, {
10319 .eraseblocks = { {1024 * 1024, 1} },
10320 .block_erase = spi_block_erase_c7,
10321 }
10322 },
Alan Green197c7432019-09-09 17:24:41 +100010323 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Green82e27422019-08-26 12:18:10 +100010324 .unlock = spi_disable_blockprotect,
10325 .write = spi_chip_write_256,
10326 .read = spi_chip_read,
10327 .voltage = {2700, 3600},
10328 },
10329
10330 {
10331 .vendor = "Micron/Numonyx/ST",
10332 .name = "M25PX16",
10333 .bustype = BUS_SPI,
10334 .manufacture_id = ST_ID,
10335 .model_id = ST_M25PX16,
10336 .total_size = 2048,
10337 .page_size = 256,
10338 /* OTP: 64B total; read 0x4B; write 0x42 */
Alan Green197c7432019-09-09 17:24:41 +100010339 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +100010340 .tested = TEST_OK_PREW,
10341 .probe = probe_spi_rdid,
10342 .probe_timing = TIMING_ZERO,
10343 .block_erasers =
10344 {
10345 {
10346 .eraseblocks = { { 4 * 1024, 512 } },
10347 .block_erase = spi_block_erase_20,
10348 }, {
10349 .eraseblocks = { {64 * 1024, 32} },
10350 .block_erase = spi_block_erase_d8,
10351 }, {
10352 .eraseblocks = { {2 * 1024 * 1024, 1} },
10353 .block_erase = spi_block_erase_c7,
10354 }
10355 },
Alan Green197c7432019-09-09 17:24:41 +100010356 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10357 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010358 .write = spi_chip_write_256,
10359 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100010360 .voltage = {2300, 3600},
Alan Green82e27422019-08-26 12:18:10 +100010361 },
10362
10363 {
10364 .vendor = "Micron/Numonyx/ST",
10365 .name = "M25PX32",
10366 .bustype = BUS_SPI,
10367 .manufacture_id = ST_ID,
10368 .model_id = ST_M25PX32,
10369 .total_size = 4096,
10370 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010371 /* OTP: 64B total; read 0x4B; write 0x42 */
10372 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green82e27422019-08-26 12:18:10 +100010373 .tested = TEST_OK_PRE,
10374 .probe = probe_spi_rdid,
10375 .probe_timing = TIMING_ZERO,
10376 .block_erasers =
10377 {
10378 {
10379 .eraseblocks = { { 4 * 1024, 1024 } },
10380 .block_erase = spi_block_erase_20,
10381 }, {
10382 .eraseblocks = { {64 * 1024, 64} },
10383 .block_erase = spi_block_erase_d8,
10384 }, {
10385 .eraseblocks = { {4 * 1024 * 1024, 1} },
10386 .block_erase = spi_block_erase_c7,
10387 }
10388 },
Alan Green197c7432019-09-09 17:24:41 +100010389 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10390 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010391 .write = spi_chip_write_256,
10392 .read = spi_chip_read,
10393 .voltage = {2700, 3600},
10394 },
10395
10396 {
10397 .vendor = "Micron/Numonyx/ST",
10398 .name = "M25PX64",
10399 .bustype = BUS_SPI,
10400 .manufacture_id = ST_ID,
10401 .model_id = ST_M25PX64,
10402 .total_size = 8192,
10403 .page_size = 256,
Alan Green197c7432019-09-09 17:24:41 +100010404 /* OTP: 64B total; read 0x4B; write 0x42 */
10405 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10406 .tested = TEST_OK_PREW,
Alan Green82e27422019-08-26 12:18:10 +100010407 .probe = probe_spi_rdid,
10408 .probe_timing = TIMING_ZERO,
10409 .block_erasers =
10410 {
10411 {
10412 .eraseblocks = { { 4 * 1024, 2048 } },
10413 .block_erase = spi_block_erase_20,
10414 }, {
10415 .eraseblocks = { {64 * 1024, 128} },
10416 .block_erase = spi_block_erase_d8,
10417 }, {
10418 .eraseblocks = { {8 * 1024 * 1024, 1} },
10419 .block_erase = spi_block_erase_c7,
10420 }
10421 },
Alan Green197c7432019-09-09 17:24:41 +100010422 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10423 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
Alan Green82e27422019-08-26 12:18:10 +100010424 .write = spi_chip_write_256,
10425 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100010426 .voltage = {2700, 3600},
Alan Green82e27422019-08-26 12:18:10 +100010427 },
10428
10429 {
10430 .vendor = "Micron/Numonyx/ST",
Nikolai Artemievd54fb2b2020-08-31 17:45:09 +100010431 .name = "M25PX80",
10432 .bustype = BUS_SPI,
10433 .manufacture_id = ST_ID,
10434 .model_id = ST_M25PX80,
10435 .total_size = 1024,
10436 .page_size = 256,
10437 /* OTP: 64B total; read 0x4B, write 0x42 */
10438 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10439 .tested = TEST_OK_PREW,
10440 .probe = probe_spi_rdid,
10441 .probe_timing = TIMING_ZERO,
10442 .block_erasers =
10443 {
10444 {
10445 .eraseblocks = { { 4 * 1024, 256 } },
10446 .block_erase = spi_block_erase_20,
10447 }, {
10448 .eraseblocks = { {64 * 1024, 16} },
10449 .block_erase = spi_block_erase_d8,
10450 }, {
10451 .eraseblocks = { {1024 * 1024, 1} },
10452 .block_erase = spi_block_erase_c7,
10453 }
10454 },
10455 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
10456 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
10457 .write = spi_chip_write_256,
10458 .read = spi_chip_read,
10459 .voltage = {2700, 3600},
10460 },
10461
10462 {
10463 .vendor = "Micron/Numonyx/ST",
Nikolai Artemieve51e5302020-08-31 17:46:48 +100010464 .name = "M45PE10",
10465 .bustype = BUS_SPI,
10466 .manufacture_id = ST_ID,
10467 .model_id = ST_M45PE10,
10468 .total_size = 128,
10469 .page_size = 256,
10470 .tested = TEST_UNTESTED,
10471 .probe = probe_spi_rdid,
10472 .probe_timing = TIMING_ZERO,
10473 .block_erasers =
10474 {
10475 {
10476 .eraseblocks = { {256, 512} },
10477 .block_erase = spi_block_erase_db,
10478 }, {
10479 .eraseblocks = { {64 * 1024, 2} },
10480 .block_erase = spi_block_erase_d8,
10481 }
10482 },
10483 .printlock = spi_prettyprint_status_register_default_welwip,
10484 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10485 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10486 .read = spi_chip_read, /* Fast read (0x0B) supported */
10487 .voltage = {2700, 3600},
10488 },
10489
10490 {
10491 .vendor = "Micron/Numonyx/ST",
10492 .name = "M45PE16",
10493 .bustype = BUS_SPI,
10494 .manufacture_id = ST_ID,
10495 .model_id = ST_M45PE16,
10496 .total_size = 2048,
10497 .page_size = 256,
10498 .tested = TEST_UNTESTED,
10499 .probe = probe_spi_rdid,
10500 .probe_timing = TIMING_ZERO,
10501 .block_erasers =
10502 {
10503 {
10504 .eraseblocks = { {256, 8192} },
10505 .block_erase = spi_block_erase_db,
10506 }, {
10507 .eraseblocks = { {64 * 1024, 32} },
10508 .block_erase = spi_block_erase_d8,
10509 }
10510 },
10511 .printlock = spi_prettyprint_status_register_default_welwip,
10512 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10513 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10514 .read = spi_chip_read, /* Fast read (0x0B) supported */
10515 .voltage = {2700, 3600},
10516 },
10517
10518 {
10519 .vendor = "Micron/Numonyx/ST",
10520 .name = "M45PE20",
10521 .bustype = BUS_SPI,
10522 .manufacture_id = ST_ID,
10523 .model_id = ST_M45PE20,
10524 .total_size = 256,
10525 .page_size = 256,
10526 .tested = TEST_UNTESTED,
10527 .probe = probe_spi_rdid,
10528 .probe_timing = TIMING_ZERO,
10529 .block_erasers =
10530 {
10531 {
10532 .eraseblocks = { {256, 1024} },
10533 .block_erase = spi_block_erase_db,
10534 }, {
10535 .eraseblocks = { {64 * 1024, 4} },
10536 .block_erase = spi_block_erase_d8,
10537 }
10538 },
10539 .printlock = spi_prettyprint_status_register_default_welwip,
10540 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10541 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10542 .read = spi_chip_read, /* Fast read (0x0B) supported */
10543 .voltage = {2700, 3600},
10544 },
10545
10546 {
10547 .vendor = "Micron/Numonyx/ST",
10548 .name = "M45PE40",
10549 .bustype = BUS_SPI,
10550 .manufacture_id = ST_ID,
10551 .model_id = ST_M45PE40,
10552 .total_size = 512,
10553 .page_size = 256,
10554 .tested = TEST_UNTESTED,
10555 .probe = probe_spi_rdid,
10556 .probe_timing = TIMING_ZERO,
10557 .block_erasers =
10558 {
10559 {
10560 .eraseblocks = { {256, 2048} },
10561 .block_erase = spi_block_erase_db,
10562 }, {
10563 .eraseblocks = { {64 * 1024, 8} },
10564 .block_erase = spi_block_erase_d8,
10565 }
10566 },
10567 .printlock = spi_prettyprint_status_register_default_welwip,
10568 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10569 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
10570 .read = spi_chip_read, /* Fast read (0x0B) supported */
10571 .voltage = {2700, 3600},
10572 },
10573
10574 {
10575 .vendor = "Micron/Numonyx/ST",
10576 .name = "M45PE80",
10577 .bustype = BUS_SPI,
10578 .manufacture_id = ST_ID,
10579 .model_id = ST_M45PE80,
10580 .total_size = 1024,
10581 .page_size = 256,
10582 .tested = TEST_UNTESTED,
10583 .probe = probe_spi_rdid,
10584 .probe_timing = TIMING_ZERO,
10585 .block_erasers =
10586 {
10587 {
10588 .eraseblocks = { {256, 4096} },
10589 .block_erase = spi_block_erase_db,
10590 }, {
10591 .eraseblocks = { {64 * 1024, 16} },
10592 .block_erase = spi_block_erase_d8,
10593 }
10594 },
10595 .printlock = spi_prettyprint_status_register_default_welwip,
10596 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
10597 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
10598 .read = spi_chip_read, /* Fast read (0x0B) supported */
10599 .voltage = {2700, 3600},
10600 },
10601
10602 {
10603 .vendor = "Micron/Numonyx/ST",
Alan Green82e27422019-08-26 12:18:10 +100010604 .name = "MT25QL256", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10605 .bustype = BUS_SPI,
10606 .manufacture_id = ST_ID,
10607 .model_id = ST_N25Q256__3E,
10608 .total_size = 32768,
10609 .page_size = 256,
10610 /* supports SFDP */
10611 /* OTP: 64B total; read 0x4B, write 0x42 */
10612 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10613 .tested = TEST_OK_PREW,
10614 .probe = probe_spi_rdid,
10615 .probe_timing = TIMING_ZERO,
10616 .block_erasers =
10617 {
10618 {
10619 .eraseblocks = { {4 * 1024, 8192} },
10620 .block_erase = spi_block_erase_21,
10621 }, {
10622 .eraseblocks = { {64 * 1024, 512} },
10623 .block_erase = spi_block_erase_dc,
10624 }, {
10625 .eraseblocks = { {32768 * 1024, 1} },
10626 .block_erase = spi_block_erase_c7,
10627 }
10628 },
10629 .unlock = spi_disable_blockprotect, /* TODO: per 64kB sector lock registers */
10630 .write = spi_chip_write_256, /* Multi I/O supported */
10631 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10632 .voltage = {2700, 3600},
10633 },
10634
10635 {
10636 .vendor = "Micron/Numonyx/ST",
10637 .name = "MT25QL512", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
Alan Greend76dc1f2019-06-26 15:38:19 +100010638 .bustype = BUS_SPI,
10639 .manufacture_id = ST_ID,
10640 .model_id = ST_N25Q512__3E,
10641 .total_size = 65536,
10642 .page_size = 256,
10643 /* supports SFDP */
10644 /* OTP: 64B total; read 0x4B, write 0x42 */
10645 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10646 .tested = TEST_OK_PREW,
10647 .probe = probe_spi_rdid,
10648 .probe_timing = TIMING_ZERO,
10649 .block_erasers =
10650 {
10651 {
10652 .eraseblocks = { {4 * 1024, 16384} },
10653 .block_erase = spi_block_erase_21,
10654 }, {
Alan Green184a7ba2019-07-31 16:02:42 +100010655 .eraseblocks = { {4 * 1024, 16384} },
10656 .block_erase = spi_block_erase_20,
10657 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +100010658 .eraseblocks = { {64 * 1024, 1024} },
10659 .block_erase = spi_block_erase_dc,
10660 }, {
Alan Green184a7ba2019-07-31 16:02:42 +100010661 .eraseblocks = { {64 * 1024, 1024} },
10662 .block_erase = spi_block_erase_d8,
10663 }, {
Alan Greend76dc1f2019-06-26 15:38:19 +100010664 .eraseblocks = { {65536 * 1024, 1} },
10665 .block_erase = spi_block_erase_c7,
10666 }
10667 },
Alan Green184a7ba2019-07-31 16:02:42 +100010668 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10669 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
Alan Greend76dc1f2019-06-26 15:38:19 +100010670 .write = spi_chip_write_256, /* Multi I/O supported */
10671 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10672 .voltage = {2700, 3600},
10673 },
10674
10675 {
Alan Green82e27422019-08-26 12:18:10 +100010676 .vendor = "Micron/Numonyx/ST",
Nikolai Artemieve51e5302020-08-31 17:46:48 +100010677 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
10678 .bustype = BUS_SPI,
10679 .manufacture_id = ST_ID,
10680 .model_id = ST_N25Q00A__1G,
10681 .total_size = 131072,
10682 .page_size = 256,
10683 /* supports SFDP */
10684 /* OTP: 64B total; read 0x4B, write 0x42 */
10685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10686 .tested = TEST_UNTESTED,
10687 .probe = probe_spi_rdid,
10688 .probe_timing = TIMING_ZERO,
10689 .block_erasers =
10690 {
10691 {
10692 .eraseblocks = { {4 * 1024, 32768} },
10693 .block_erase = spi_block_erase_21,
10694 }, {
10695 .eraseblocks = { {4 * 1024, 32768} },
10696 .block_erase = spi_block_erase_20,
10697 }, {
10698 .eraseblocks = { {64 * 1024, 2048} },
10699 .block_erase = spi_block_erase_dc,
10700 }, {
10701 .eraseblocks = { {64 * 1024, 2048} },
10702 .block_erase = spi_block_erase_d8,
10703 }, {
10704 .eraseblocks = { {32768 * 1024, 4} },
10705 .block_erase = spi_block_erase_c4,
10706 }
10707 },
10708 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10709 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10710 .write = spi_chip_write_256, /* Multi I/O supported */
10711 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10712 .voltage = {1700, 2000},
10713 },
10714
10715 {
10716 .vendor = "Micron/Numonyx/ST",
10717 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
10718 .bustype = BUS_SPI,
10719 .manufacture_id = ST_ID,
10720 .model_id = ST_N25Q00A__3G,
10721 .total_size = 131072,
10722 .page_size = 256,
10723 /* supports SFDP */
10724 /* OTP: 64B total; read 0x4B, write 0x42 */
10725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
10726 .tested = TEST_UNTESTED,
10727 .probe = probe_spi_rdid,
10728 .probe_timing = TIMING_ZERO,
10729 .block_erasers =
10730 {
10731 {
10732 .eraseblocks = { {4 * 1024, 32768} },
10733 .block_erase = spi_block_erase_21,
10734 }, {
10735 .eraseblocks = { {4 * 1024, 32768} },
10736 .block_erase = spi_block_erase_20,
10737 }, {
10738 .eraseblocks = { {64 * 1024, 2048} },
10739 .block_erase = spi_block_erase_dc,
10740 }, {
10741 .eraseblocks = { {64 * 1024, 2048} },
10742 .block_erase = spi_block_erase_d8,
10743 }, {
10744 .eraseblocks = { {32768 * 1024, 4} },
10745 .block_erase = spi_block_erase_c4,
10746 }
10747 },
10748 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10749 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10750 .write = spi_chip_write_256, /* Multi I/O supported */
10751 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10752 .voltage = {2700, 3600},
10753 },
10754
10755 {
10756 .vendor = "Micron/Numonyx/ST",
10757 .name = "N25Q016",
10758 .bustype = BUS_SPI,
10759 .manufacture_id = ST_ID,
10760 .model_id = ST_N25Q016__1E,
10761 .total_size = 2048,
10762 .page_size = 256,
10763 /* supports SFDP */
10764 /* OTP: 64B total; read 0x4B, write 0x42 */
10765 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10766 .tested = TEST_UNTESTED,
10767 .probe = probe_spi_rdid,
10768 .probe_timing = TIMING_ZERO,
10769 .block_erasers =
10770 {
10771 {
10772 .eraseblocks = { {4 * 1024, 512} },
10773 .block_erase = spi_block_erase_20,
10774 }, {
10775 .eraseblocks = { {32 * 1024, 64} },
10776 .block_erase = spi_block_erase_52,
10777 }, {
10778 .eraseblocks = { {64 * 1024, 32} },
10779 .block_erase = spi_block_erase_d8,
10780 }, {
10781 .eraseblocks = { {2 * 1024 * 1024, 1} },
10782 .block_erase = spi_block_erase_c7,
10783 }
10784 },
10785 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10786 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10787 .write = spi_chip_write_256, /* Multi I/O supported */
10788 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10789 .voltage = {1700, 2000},
10790 },
10791
10792 {
10793 .vendor = "Micron/Numonyx/ST",
10794 .name = "N25Q032..1E",
10795 .bustype = BUS_SPI,
10796 .manufacture_id = ST_ID,
10797 .model_id = ST_N25Q032__1E,
10798 .total_size = 4096,
10799 .page_size = 256,
10800 /* supports SFDP */
10801 /* OTP: 64B total; read 0x4B, write 0x42 */
10802 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10803 .tested = TEST_UNTESTED,
10804 .probe = probe_spi_rdid,
10805 .probe_timing = TIMING_ZERO,
10806 .block_erasers =
10807 {
10808 {
10809 .eraseblocks = { {4 * 1024, 1024} },
10810 .block_erase = spi_block_erase_20,
10811 }, {
10812 .eraseblocks = { {64 * 1024, 64} },
10813 .block_erase = spi_block_erase_d8,
10814 }, {
10815 .eraseblocks = { {4 * 1024 * 1024, 1} },
10816 .block_erase = spi_block_erase_c7,
10817 }
10818 },
10819 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10820 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10821 .write = spi_chip_write_256, /* Multi I/O supported */
10822 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10823 .voltage = {1700, 2000},
10824 },
10825
10826 {
10827 .vendor = "Micron/Numonyx/ST",
10828 .name = "N25Q032..3E",
10829 .bustype = BUS_SPI,
10830 .manufacture_id = ST_ID,
10831 .model_id = ST_N25Q032__3E,
10832 .total_size = 4096,
10833 .page_size = 256,
10834 /* supports SFDP */
10835 /* OTP: 64B total; read 0x4B, write 0x42 */
10836 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10837 .tested = TEST_OK_PREW,
10838 .probe = probe_spi_rdid,
10839 .probe_timing = TIMING_ZERO,
10840 .block_erasers =
10841 {
10842 {
10843 .eraseblocks = { {4 * 1024, 1024} },
10844 .block_erase = spi_block_erase_20,
10845 }, {
10846 .eraseblocks = { {64 * 1024, 64} },
10847 .block_erase = spi_block_erase_d8,
10848 }, {
10849 .eraseblocks = { {4 * 1024 * 1024, 1} },
10850 .block_erase = spi_block_erase_c7,
10851 }
10852 },
10853 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10854 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10855 .write = spi_chip_write_256, /* Multi I/O supported */
10856 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10857 .voltage = {2700, 3600},
10858 },
10859
10860 {
10861 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +100010862 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +100010863 .bustype = BUS_SPI,
10864 .manufacture_id = ST_ID,
10865 .model_id = ST_N25Q064__1E,
10866 .total_size = 8192,
10867 .page_size = 256,
10868 /* supports SFDP */
10869 /* OTP: 64B total; read 0x4B, write 0x42 */
10870 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10871 .tested = TEST_OK_PREW,
10872 .probe = probe_spi_rdid,
10873 .probe_timing = TIMING_ZERO,
10874 .block_erasers =
10875 {
10876 {
10877 .eraseblocks = { {4 * 1024, 2048 } },
10878 .block_erase = spi_block_erase_20,
10879 }, {
10880 .eraseblocks = { {64 * 1024, 128} },
10881 .block_erase = spi_block_erase_d8,
10882 }, {
10883 .eraseblocks = { {8 * 1024 * 1024, 1} },
10884 .block_erase = spi_block_erase_c7,
10885 }
10886 },
Alan Green197c7432019-09-09 17:24:41 +100010887 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10888 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10889 .write = spi_chip_write_256, /* Multi I/O supported */
10890 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Alan Green82e27422019-08-26 12:18:10 +100010891 .voltage = {1700, 2000},
10892 .wp = &wp_w25,
10893 },
10894
10895 {
10896 .vendor = "Micron/Numonyx/ST",
Alan Green197c7432019-09-09 17:24:41 +100010897 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
Alan Green82e27422019-08-26 12:18:10 +100010898 .bustype = BUS_SPI,
10899 .manufacture_id = ST_ID,
10900 .model_id = ST_N25Q064__3E,
10901 .total_size = 8192,
10902 .page_size = 256,
10903 /* supports SFDP */
10904 /* OTP: 64B total; read 0x4B, write 0x42 */
10905 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10906 .tested = TEST_OK_PREW,
10907 .probe = probe_spi_rdid,
10908 .probe_timing = TIMING_ZERO,
10909 .block_erasers =
10910 {
10911 {
10912 .eraseblocks = { {4 * 1024, 2048 } },
10913 .block_erase = spi_block_erase_20,
10914 }, {
10915 .eraseblocks = { {64 * 1024, 128} },
10916 .block_erase = spi_block_erase_d8,
10917 }, {
10918 .eraseblocks = { {8 * 1024 * 1024, 1} },
10919 .block_erase = spi_block_erase_c7,
10920 }
10921 },
Alan Green197c7432019-09-09 17:24:41 +100010922 .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 */
Alan Green82e27422019-08-26 12:18:10 +100010926 .voltage = {2700, 3600},
10927 .wp = &wp_w25,
10928 },
10929
10930 {
Nikolai Artemievcd7a5d02020-08-31 17:47:26 +100010931 .vendor = "Micron/Numonyx/ST",
10932 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
10933 .bustype = BUS_SPI,
10934 .manufacture_id = ST_ID,
10935 .model_id = ST_N25Q128__1E,
10936 .total_size = 16384,
10937 .page_size = 256,
10938 /* supports SFDP */
10939 /* OTP: 64B total; read 0x4B, write 0x42 */
10940 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10941 .tested = TEST_OK_PREW,
10942 .probe = probe_spi_rdid,
10943 .probe_timing = TIMING_ZERO,
10944 .block_erasers =
10945 {
10946 {
10947 .eraseblocks = { {4 * 1024, 4096 } },
10948 .block_erase = spi_block_erase_20,
10949 }, {
10950 .eraseblocks = { {64 * 1024, 256} },
10951 .block_erase = spi_block_erase_d8,
10952 }, {
10953 .eraseblocks = { {16384 * 1024, 1} },
10954 .block_erase = spi_block_erase_c7,
10955 }
10956 },
10957 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10958 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10959 .write = spi_chip_write_256, /* Multi I/O supported */
10960 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10961 .voltage = {1700, 2000},
10962 },
10963
10964 {
10965 .vendor = "Micron/Numonyx/ST",
10966 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
10967 .bustype = BUS_SPI,
10968 .manufacture_id = ST_ID,
10969 .model_id = ST_N25Q128__3E,
10970 .total_size = 16384,
10971 .page_size = 256,
10972 /* supports SFDP */
10973 /* OTP: 64B total; read 0x4B, write 0x42 */
10974 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
10975 .tested = TEST_OK_PREW,
10976 .probe = probe_spi_rdid,
10977 .probe_timing = TIMING_ZERO,
10978 .block_erasers =
10979 {
10980 {
10981 .eraseblocks = { {4 * 1024, 4096 } },
10982 .block_erase = spi_block_erase_20,
10983 }, {
10984 .eraseblocks = { {64 * 1024, 256} },
10985 .block_erase = spi_block_erase_d8,
10986 }, {
10987 .eraseblocks = { {16384 * 1024, 1} },
10988 .block_erase = spi_block_erase_c7,
10989 }
10990 },
10991 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
10992 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
10993 .write = spi_chip_write_256, /* Multi I/O supported */
10994 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
10995 .voltage = {2700, 3600},
10996 },
10997
10998 {
10999 .vendor = "Micron/Numonyx/ST",
11000 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11001 .bustype = BUS_SPI,
11002 .manufacture_id = ST_ID,
11003 .model_id = ST_N25Q256__1E,
11004 .total_size = 32768,
11005 .page_size = 256,
11006 /* supports SFDP */
11007 /* OTP: 64B total; read 0x4B, write 0x42 */
11008 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11009 .tested = TEST_UNTESTED,
11010 .probe = probe_spi_rdid,
11011 .probe_timing = TIMING_ZERO,
11012 .block_erasers =
11013 {
11014 {
11015 .eraseblocks = { {4 * 1024, 8192} },
11016 .block_erase = spi_block_erase_21,
11017 }, {
11018 .eraseblocks = { {4 * 1024, 8192} },
11019 .block_erase = spi_block_erase_20,
11020 }, {
11021 .eraseblocks = { {64 * 1024, 512} },
11022 .block_erase = spi_block_erase_dc,
11023 }, {
11024 .eraseblocks = { {64 * 1024, 512} },
11025 .block_erase = spi_block_erase_d8,
11026 }, {
11027 .eraseblocks = { {32768 * 1024, 1} },
11028 .block_erase = spi_block_erase_c7,
11029 }
11030 },
11031 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11032 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11033 .write = spi_chip_write_256, /* Multi I/O supported */
11034 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11035 .voltage = {1700, 2000},
11036 },
11037
11038 {
11039 .vendor = "Micron/Numonyx/ST",
11040 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11041 .bustype = BUS_SPI,
11042 .manufacture_id = ST_ID,
11043 .model_id = ST_N25Q256__3E,
11044 .total_size = 32768,
11045 .page_size = 256,
11046 /* supports SFDP */
11047 /* OTP: 64B total; read 0x4B, write 0x42 */
11048 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11049 .tested = TEST_UNTESTED,
11050 .probe = probe_spi_rdid,
11051 .probe_timing = TIMING_ZERO,
11052 .block_erasers =
11053 {
11054 {
11055 .eraseblocks = { {4 * 1024, 8192} },
11056 .block_erase = spi_block_erase_21,
11057 }, {
11058 .eraseblocks = { {4 * 1024, 8192} },
11059 .block_erase = spi_block_erase_20,
11060 }, {
11061 .eraseblocks = { {64 * 1024, 512} },
11062 .block_erase = spi_block_erase_dc,
11063 }, {
11064 .eraseblocks = { {64 * 1024, 512} },
11065 .block_erase = spi_block_erase_d8,
11066 }, {
11067 .eraseblocks = { {32768 * 1024, 1} },
11068 .block_erase = spi_block_erase_c7,
11069 }
11070 },
11071 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11072 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11073 .write = spi_chip_write_256, /* Multi I/O supported */
11074 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11075 .voltage = {2700, 3600},
11076 },
11077
11078 {
11079 .vendor = "Micron/Numonyx/ST",
11080 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
11081 .bustype = BUS_SPI,
11082 .manufacture_id = ST_ID,
11083 .model_id = ST_N25Q512__1G,
11084 .total_size = 65536,
11085 .page_size = 256,
11086 /* supports SFDP */
11087 /* OTP: 64B total; read 0x4B, write 0x42 */
11088 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11089 .tested = TEST_UNTESTED,
11090 .probe = probe_spi_rdid,
11091 .probe_timing = TIMING_ZERO,
11092 .block_erasers =
11093 {
11094 {
11095 .eraseblocks = { {4 * 1024, 16384} },
11096 .block_erase = spi_block_erase_21,
11097 }, {
11098 .eraseblocks = { {4 * 1024, 16384} },
11099 .block_erase = spi_block_erase_20,
11100 }, {
11101 .eraseblocks = { {64 * 1024, 1024} },
11102 .block_erase = spi_block_erase_dc,
11103 }, {
11104 .eraseblocks = { {64 * 1024, 1024} },
11105 .block_erase = spi_block_erase_d8,
11106 }, {
11107 .eraseblocks = { {32768 * 1024, 2} },
11108 .block_erase = spi_block_erase_c4,
11109 }
11110 },
11111 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11112 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11113 .write = spi_chip_write_256, /* Multi I/O supported */
11114 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11115 .voltage = {1700, 2000},
11116 },
11117
11118 {
11119 .vendor = "Micron/Numonyx/ST",
11120 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11121 .bustype = BUS_SPI,
11122 .manufacture_id = ST_ID,
11123 .model_id = ST_N25Q512__3G,
11124 .total_size = 65536,
11125 .page_size = 256,
11126 /* supports SFDP */
11127 /* OTP: 64B total; read 0x4B, write 0x42 */
11128 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11129 .tested = TEST_OK_PREW,
11130 .probe = probe_spi_rdid,
11131 .probe_timing = TIMING_ZERO,
11132 .block_erasers =
11133 {
11134 {
11135 .eraseblocks = { {4 * 1024, 16384} },
11136 .block_erase = spi_block_erase_21,
11137 }, {
11138 .eraseblocks = { {4 * 1024, 16384} },
11139 .block_erase = spi_block_erase_20,
11140 }, {
11141 .eraseblocks = { {64 * 1024, 1024} },
11142 .block_erase = spi_block_erase_dc,
11143 }, {
11144 .eraseblocks = { {64 * 1024, 1024} },
11145 .block_erase = spi_block_erase_d8,
11146 }, {
11147 .eraseblocks = { {32768 * 1024, 2} },
11148 .block_erase = spi_block_erase_c4,
11149 }
11150 },
11151 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11152 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11153 .write = spi_chip_write_256, /* Multi I/O supported */
11154 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11155 .voltage = {2700, 3600},
11156 },
11157
11158 {
11159 .vendor = "Micron",
11160 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11161 .bustype = BUS_SPI,
11162 .manufacture_id = ST_ID,
11163 .model_id = ST_N25Q00A__3G,
11164 .total_size = 131072,
11165 .page_size = 256,
11166 /* supports SFDP */
11167 /* OTP: 64B total; read 0x4B, write 0x42 */
11168 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11169 .tested = TEST_OK_PREW,
11170 .probe = probe_spi_rdid,
11171 .probe_timing = TIMING_ZERO,
11172 .block_erasers =
11173 {
11174 {
11175 .eraseblocks = { {4 * 1024, 32768} },
11176 .block_erase = spi_block_erase_21,
11177 }, {
11178 .eraseblocks = { {4 * 1024, 32768} },
11179 .block_erase = spi_block_erase_20,
11180 }, {
11181 .eraseblocks = { {32 * 1024, 4096} },
11182 .block_erase = spi_block_erase_5c,
11183 }, {
11184 .eraseblocks = { {32 * 1024, 4096} },
11185 .block_erase = spi_block_erase_52,
11186 }, {
11187 .eraseblocks = { {64 * 1024, 2048} },
11188 .block_erase = spi_block_erase_dc,
11189 }, {
11190 .eraseblocks = { {64 * 1024, 2048} },
11191 .block_erase = spi_block_erase_d8,
11192 }, {
11193 .eraseblocks = { {65536 * 1024, 2} },
11194 .block_erase = spi_block_erase_c4,
11195 }
11196 },
11197 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11198 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11199 .write = spi_chip_write_256, /* Multi I/O supported */
11200 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11201 .voltage = {2700, 3600},
11202 },
11203
11204 {
11205 .vendor = "Micron",
11206 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11207 .bustype = BUS_SPI,
11208 .manufacture_id = ST_ID,
11209 .model_id = ST_N25Q00A__1G,
11210 .total_size = 131072,
11211 .page_size = 256,
11212 /* supports SFDP */
11213 /* OTP: 64B total; read 0x4B, write 0x42 */
11214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11215 .tested = TEST_UNTESTED,
11216 .probe = probe_spi_rdid,
11217 .probe_timing = TIMING_ZERO,
11218 .block_erasers =
11219 {
11220 {
11221 .eraseblocks = { {4 * 1024, 32768} },
11222 .block_erase = spi_block_erase_21,
11223 }, {
11224 .eraseblocks = { {4 * 1024, 32768} },
11225 .block_erase = spi_block_erase_20,
11226 }, {
11227 .eraseblocks = { {32 * 1024, 4096} },
11228 .block_erase = spi_block_erase_5c,
11229 }, {
11230 .eraseblocks = { {32 * 1024, 4096} },
11231 .block_erase = spi_block_erase_52,
11232 }, {
11233 .eraseblocks = { {64 * 1024, 2048} },
11234 .block_erase = spi_block_erase_dc,
11235 }, {
11236 .eraseblocks = { {64 * 1024, 2048} },
11237 .block_erase = spi_block_erase_d8,
11238 }, {
11239 .eraseblocks = { {65536 * 1024, 2} },
11240 .block_erase = spi_block_erase_c4,
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 = {1700, 2000},
11248 },
11249
11250 {
11251 .vendor = "Micron",
11252 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11253 .bustype = BUS_SPI,
11254 .manufacture_id = ST_ID,
11255 .model_id = ST_MT25QL02G,
11256 .total_size = 262144,
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, 65536} },
11268 .block_erase = spi_block_erase_21,
11269 }, {
11270 .eraseblocks = { {4 * 1024, 65536} },
11271 .block_erase = spi_block_erase_20,
11272 }, {
11273 .eraseblocks = { {32 * 1024, 8192} },
11274 .block_erase = spi_block_erase_5c,
11275 }, {
11276 .eraseblocks = { {32 * 1024, 8192} },
11277 .block_erase = spi_block_erase_52,
11278 }, {
11279 .eraseblocks = { {64 * 1024, 4096} },
11280 .block_erase = spi_block_erase_dc,
11281 }, {
11282 .eraseblocks = { {64 * 1024, 4096} },
11283 .block_erase = spi_block_erase_d8,
11284 }, {
11285 .eraseblocks = { {65536 * 1024, 4} },
11286 .block_erase = spi_block_erase_c4,
11287 }
11288 },
11289 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11290 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11291 .write = spi_chip_write_256, /* Multi I/O supported */
11292 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11293 .voltage = {2700, 3600},
11294 },
11295
11296 {
11297 .vendor = "Micron",
11298 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11299 .bustype = BUS_SPI,
11300 .manufacture_id = ST_ID,
11301 .model_id = ST_MT25QU02G,
11302 .total_size = 262144,
11303 .page_size = 256,
11304 /* supports SFDP */
11305 /* OTP: 64B total; read 0x4B, write 0x42 */
11306 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11307 .tested = TEST_UNTESTED,
11308 .probe = probe_spi_rdid,
11309 .probe_timing = TIMING_ZERO,
11310 .block_erasers =
11311 {
11312 {
11313 .eraseblocks = { {4 * 1024, 65536} },
11314 .block_erase = spi_block_erase_21,
11315 }, {
11316 .eraseblocks = { {4 * 1024, 65536} },
11317 .block_erase = spi_block_erase_20,
11318 }, {
11319 .eraseblocks = { {32 * 1024, 8192} },
11320 .block_erase = spi_block_erase_5c,
11321 }, {
11322 .eraseblocks = { {32 * 1024, 8192} },
11323 .block_erase = spi_block_erase_52,
11324 }, {
11325 .eraseblocks = { {64 * 1024, 4096} },
11326 .block_erase = spi_block_erase_dc,
11327 }, {
11328 .eraseblocks = { {64 * 1024, 4096} },
11329 .block_erase = spi_block_erase_d8,
11330 }, {
11331 .eraseblocks = { {65536 * 1024, 4} },
11332 .block_erase = spi_block_erase_c4,
11333 }
11334 },
11335 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11336 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11337 .write = spi_chip_write_256, /* Multi I/O supported */
11338 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11339 .voltage = {1700, 2000},
11340 },
11341
11342 {
Nikolai Artemiev09a5eac2020-08-31 17:47:57 +100011343 .vendor = "Micron",
11344 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11345 .bustype = BUS_SPI,
11346 .manufacture_id = ST_ID,
11347 .model_id = ST_N25Q128__1E,
11348 .total_size = 16384,
11349 .page_size = 256,
11350 /* supports SFDP */
11351 /* OTP: 64B total; read 0x4B, write 0x42 */
11352 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11353 .tested = TEST_UNTESTED,
11354 .probe = probe_spi_rdid,
11355 .probe_timing = TIMING_ZERO,
11356 .block_erasers =
11357 {
11358 {
11359 .eraseblocks = { {4 * 1024, 4096} },
11360 .block_erase = spi_block_erase_20,
11361 }, {
11362 .eraseblocks = { {32 * 1024, 512} },
11363 .block_erase = spi_block_erase_52,
11364 }, {
11365 .eraseblocks = { {64 * 1024, 256} },
11366 .block_erase = spi_block_erase_d8,
11367 }, {
11368 .eraseblocks = { {16384 * 1024, 1} },
11369 .block_erase = spi_block_erase_c7,
11370 }, {
11371 .eraseblocks = { {16384 * 1024, 1} },
11372 .block_erase = spi_block_erase_60,
11373 }
11374 },
11375 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11376 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11377 .write = spi_chip_write_256, /* Multi I/O supported */
11378 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11379 .voltage = {1700, 2000},
11380 },
11381
11382 {
11383 .vendor = "Micron",
11384 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11385 .bustype = BUS_SPI,
11386 .manufacture_id = ST_ID,
11387 .model_id = ST_N25Q128__3E,
11388 .total_size = 16384,
11389 .page_size = 256,
11390 /* supports SFDP */
11391 /* OTP: 64B total; read 0x4B, write 0x42 */
11392 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11393 .tested = TEST_UNTESTED,
11394 .probe = probe_spi_rdid,
11395 .probe_timing = TIMING_ZERO,
11396 .block_erasers =
11397 {
11398 {
11399 .eraseblocks = { {4 * 1024, 4096} },
11400 .block_erase = spi_block_erase_20,
11401 }, {
11402 .eraseblocks = { {32 * 1024, 512} },
11403 .block_erase = spi_block_erase_52,
11404 }, {
11405 .eraseblocks = { {64 * 1024, 256} },
11406 .block_erase = spi_block_erase_d8,
11407 }, {
11408 .eraseblocks = { {16384 * 1024, 1} },
11409 .block_erase = spi_block_erase_c7,
11410 }, {
11411 .eraseblocks = { {16384 * 1024, 1} },
11412 .block_erase = spi_block_erase_60,
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 = {2700, 3600},
11420 },
11421
11422 {
11423 .vendor = "Micron",
11424 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11425 .bustype = BUS_SPI,
11426 .manufacture_id = ST_ID,
11427 .model_id = ST_N25Q256__3E,
11428 .total_size = 32768,
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, 8192} },
11440 .block_erase = spi_block_erase_21,
11441 }, {
11442 .eraseblocks = { {4 * 1024, 8192} },
11443 .block_erase = spi_block_erase_20,
11444 }, {
11445 .eraseblocks = { {32 * 1024, 1024} },
11446 .block_erase = spi_block_erase_5c,
11447 }, {
11448 .eraseblocks = { {32 * 1024, 1024} },
11449 .block_erase = spi_block_erase_52,
11450 }, {
11451 .eraseblocks = { {64 * 1024, 512} },
11452 .block_erase = spi_block_erase_dc,
11453 }, {
11454 .eraseblocks = { {64 * 1024, 512} },
11455 .block_erase = spi_block_erase_d8,
11456 }, {
11457 .eraseblocks = { {32768 * 1024, 1} },
11458 .block_erase = spi_block_erase_c7,
11459 }, {
11460 .eraseblocks = { {32768 * 1024, 1} },
11461 .block_erase = spi_block_erase_60,
11462 }
11463 },
11464 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11465 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11466 .write = spi_chip_write_256, /* Multi I/O supported */
11467 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11468 .voltage = {2700, 3600},
11469 },
11470
11471 {
11472 .vendor = "Micron",
11473 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11474 .bustype = BUS_SPI,
11475 .manufacture_id = ST_ID,
11476 .model_id = ST_N25Q256__1E,
11477 .total_size = 32768,
11478 .page_size = 256,
11479 /* supports SFDP */
11480 /* OTP: 64B total; read 0x4B, write 0x42 */
11481 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11482 .tested = TEST_UNTESTED,
11483 .probe = probe_spi_rdid,
11484 .probe_timing = TIMING_ZERO,
11485 .block_erasers =
11486 {
11487 {
11488 .eraseblocks = { {4 * 1024, 8192} },
11489 .block_erase = spi_block_erase_21,
11490 }, {
11491 .eraseblocks = { {4 * 1024, 8192} },
11492 .block_erase = spi_block_erase_20,
11493 }, {
11494 .eraseblocks = { {32 * 1024, 1024} },
11495 .block_erase = spi_block_erase_5c,
11496 }, {
11497 .eraseblocks = { {32 * 1024, 1024} },
11498 .block_erase = spi_block_erase_52,
11499 }, {
11500 .eraseblocks = { {64 * 1024, 512} },
11501 .block_erase = spi_block_erase_dc,
11502 }, {
11503 .eraseblocks = { {64 * 1024, 512} },
11504 .block_erase = spi_block_erase_d8,
11505 }, {
11506 .eraseblocks = { {32768 * 1024, 1} },
11507 .block_erase = spi_block_erase_c7,
11508 }, {
11509 .eraseblocks = { {32768 * 1024, 1} },
11510 .block_erase = spi_block_erase_60,
11511 }
11512 },
11513 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11514 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11515 .write = spi_chip_write_256, /* Multi I/O supported */
11516 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11517 .voltage = {1700, 2000},
11518 },
11519
11520 {
11521 .vendor = "Micron",
11522 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
11523 .bustype = BUS_SPI,
11524 .manufacture_id = ST_ID,
11525 .model_id = ST_N25Q512__3G,
11526 .total_size = 65536,
11527 .page_size = 256,
11528 /* supports SFDP */
11529 /* OTP: 64B total; read 0x4B, write 0x42 */
11530 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11531 .tested = TEST_OK_PREW,
11532 .probe = probe_spi_rdid,
11533 .probe_timing = TIMING_ZERO,
11534 .block_erasers =
11535 {
11536 {
11537 .eraseblocks = { {4 * 1024, 16384} },
11538 .block_erase = spi_block_erase_21,
11539 }, {
11540 .eraseblocks = { {4 * 1024, 16384} },
11541 .block_erase = spi_block_erase_20,
11542 }, {
11543 .eraseblocks = { {32 * 1024, 2048} },
11544 .block_erase = spi_block_erase_5c,
11545 }, {
11546 .eraseblocks = { {32 * 1024, 2048} },
11547 .block_erase = spi_block_erase_52,
11548 }, {
11549 .eraseblocks = { {64 * 1024, 1024} },
11550 .block_erase = spi_block_erase_dc,
11551 }, {
11552 .eraseblocks = { {64 * 1024, 1024} },
11553 .block_erase = spi_block_erase_d8,
11554 }, {
11555 .eraseblocks = { {65536 * 1024, 1} },
11556 .block_erase = spi_block_erase_c7,
11557 }, {
11558 .eraseblocks = { {65536 * 1024, 1} },
11559 .block_erase = spi_block_erase_60,
11560 }
11561 },
11562 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11563 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11564 .write = spi_chip_write_256, /* Multi I/O supported */
11565 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11566 .voltage = {2700, 3600},
11567 },
11568
11569 {
11570 .vendor = "Micron",
11571 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
11572 .bustype = BUS_SPI,
11573 .manufacture_id = ST_ID,
11574 .model_id = ST_N25Q512__1G,
11575 .total_size = 65536,
11576 .page_size = 256,
11577 /* supports SFDP */
11578 /* OTP: 64B total; read 0x4B, write 0x42 */
11579 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11580 .tested = TEST_OK_PREW,
11581 .probe = probe_spi_rdid,
11582 .probe_timing = TIMING_ZERO,
11583 .block_erasers =
11584 {
11585 {
11586 .eraseblocks = { {4 * 1024, 16384} },
11587 .block_erase = spi_block_erase_21,
11588 }, {
11589 .eraseblocks = { {4 * 1024, 16384} },
11590 .block_erase = spi_block_erase_20,
11591 }, {
11592 .eraseblocks = { {32 * 1024, 2048} },
11593 .block_erase = spi_block_erase_5c,
11594 }, {
11595 .eraseblocks = { {32 * 1024, 2048} },
11596 .block_erase = spi_block_erase_52,
11597 }, {
11598 .eraseblocks = { {64 * 1024, 1024} },
11599 .block_erase = spi_block_erase_dc,
11600 }, {
11601 .eraseblocks = { {64 * 1024, 1024} },
11602 .block_erase = spi_block_erase_d8,
11603 }, {
11604 .eraseblocks = { {65536 * 1024, 1} },
11605 .block_erase = spi_block_erase_c7,
11606 }, {
11607 .eraseblocks = { {65536 * 1024, 1} },
11608 .block_erase = spi_block_erase_60,
11609 }
11610 },
11611 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11612 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11613 .write = spi_chip_write_256, /* Multi I/O supported */
11614 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11615 .voltage = {1700, 2000},
11616 },
11617
11618 {
hailfinger0ae231d2010-07-29 20:01:13 +000011619 .vendor = "MoselVitelic",
11620 .name = "V29C51000B",
hailfingere1e41ea2011-07-27 07:13:06 +000011621 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011622 .manufacture_id = SYNCMOS_MVC_ID,
11623 .model_id = MVC_V29C51000B,
11624 .total_size = 64,
11625 .page_size = 512,
11626 .feature_bits = FEATURE_EITHER_RESET,
11627 .tested = TEST_UNTESTED,
11628 .probe = probe_jedec,
11629 .probe_timing = TIMING_ZERO,
11630 .block_erasers =
11631 {
11632 {
11633 .eraseblocks = { {512, 128} },
11634 .block_erase = erase_sector_jedec,
11635 }, {
11636 .eraseblocks = { {64 * 1024, 1} },
11637 .block_erase = erase_chip_block_jedec,
11638 },
11639 },
11640 .write = write_jedec_1,
11641 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011642 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011643 },
11644
11645 {
11646 .vendor = "MoselVitelic",
11647 .name = "V29C51000T",
hailfingere1e41ea2011-07-27 07:13:06 +000011648 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011649 .manufacture_id = SYNCMOS_MVC_ID,
11650 .model_id = MVC_V29C51000T,
11651 .total_size = 64,
11652 .page_size = 512,
11653 .feature_bits = FEATURE_EITHER_RESET,
11654 .tested = TEST_UNTESTED,
11655 .probe = probe_jedec,
11656 .probe_timing = TIMING_ZERO,
11657 .block_erasers =
11658 {
11659 {
11660 .eraseblocks = { {512, 128} },
11661 .block_erase = erase_sector_jedec,
11662 }, {
11663 .eraseblocks = { {64 * 1024, 1} },
11664 .block_erase = erase_chip_block_jedec,
11665 },
11666 },
11667 .write = write_jedec_1,
11668 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011669 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011670 },
11671
11672 {
11673 .vendor = "MoselVitelic",
11674 .name = "V29C51400B",
hailfingere1e41ea2011-07-27 07:13:06 +000011675 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011676 .manufacture_id = SYNCMOS_MVC_ID,
11677 .model_id = MVC_V29C51400B,
11678 .total_size = 512,
11679 .page_size = 1024,
11680 .feature_bits = FEATURE_EITHER_RESET,
11681 .tested = TEST_UNTESTED,
11682 .probe = probe_jedec,
11683 .probe_timing = TIMING_ZERO,
11684 .block_erasers =
11685 {
11686 {
11687 .eraseblocks = { {1024, 512} },
11688 .block_erase = erase_sector_jedec,
11689 }, {
11690 .eraseblocks = { {512 * 1024, 1} },
11691 .block_erase = erase_chip_block_jedec,
11692 },
11693 },
11694 .write = write_jedec_1,
11695 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011696 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011697 },
11698
11699 {
11700 .vendor = "MoselVitelic",
11701 .name = "V29C51400T",
hailfingere1e41ea2011-07-27 07:13:06 +000011702 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011703 .manufacture_id = SYNCMOS_MVC_ID,
11704 .model_id = MVC_V29C51400T,
11705 .total_size = 512,
11706 .page_size = 1024,
11707 .feature_bits = FEATURE_EITHER_RESET,
11708 .tested = TEST_UNTESTED,
11709 .probe = probe_jedec,
11710 .probe_timing = TIMING_ZERO,
11711 .block_erasers =
11712 {
11713 {
11714 .eraseblocks = { {1024, 512} },
11715 .block_erase = erase_sector_jedec,
11716 }, {
11717 .eraseblocks = { {512 * 1024, 1} },
11718 .block_erase = erase_chip_block_jedec,
11719 },
11720 },
11721 .write = write_jedec_1,
11722 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011723 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011724 },
11725
11726 {
11727 .vendor = "MoselVitelic",
11728 .name = "V29LC51000",
hailfingere1e41ea2011-07-27 07:13:06 +000011729 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011730 .manufacture_id = SYNCMOS_MVC_ID,
11731 .model_id = MVC_V29LC51000,
11732 .total_size = 64,
11733 .page_size = 512,
11734 .feature_bits = FEATURE_EITHER_RESET,
11735 .tested = TEST_UNTESTED,
11736 .probe = probe_jedec,
11737 .probe_timing = TIMING_ZERO,
11738 .block_erasers =
11739 {
11740 {
11741 .eraseblocks = { {512, 128} },
11742 .block_erase = erase_sector_jedec,
11743 }, {
11744 .eraseblocks = { {64 * 1024, 1} },
11745 .block_erase = erase_chip_block_jedec,
11746 },
11747 },
11748 .write = write_jedec_1,
11749 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011750 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011751 },
11752
11753 {
11754 .vendor = "MoselVitelic",
11755 .name = "V29LC51001",
hailfingere1e41ea2011-07-27 07:13:06 +000011756 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011757 .manufacture_id = SYNCMOS_MVC_ID,
11758 .model_id = MVC_V29LC51001,
11759 .total_size = 128,
11760 .page_size = 512,
11761 .feature_bits = FEATURE_EITHER_RESET,
11762 .tested = TEST_UNTESTED,
11763 .probe = probe_jedec,
11764 .probe_timing = TIMING_ZERO,
11765 .block_erasers =
11766 {
11767 {
11768 .eraseblocks = { {512, 256} },
11769 .block_erase = erase_sector_jedec,
11770 }, {
11771 .eraseblocks = { {128 * 1024, 1} },
11772 .block_erase = erase_chip_block_jedec,
11773 },
11774 },
11775 .write = write_jedec_1,
11776 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011777 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011778 },
11779
11780 {
11781 .vendor = "MoselVitelic",
11782 .name = "V29LC51002",
hailfingere1e41ea2011-07-27 07:13:06 +000011783 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000011784 .manufacture_id = SYNCMOS_MVC_ID,
11785 .model_id = MVC_V29LC51002,
11786 .total_size = 256,
11787 .page_size = 512,
11788 .feature_bits = FEATURE_EITHER_RESET,
11789 .tested = TEST_UNTESTED,
11790 .probe = probe_jedec,
11791 .probe_timing = TIMING_ZERO,
11792 .block_erasers =
11793 {
11794 {
11795 .eraseblocks = { {512, 512} },
11796 .block_erase = erase_sector_jedec,
11797 }, {
11798 .eraseblocks = { {256 * 1024, 1} },
11799 .block_erase = erase_chip_block_jedec,
11800 },
11801 },
11802 .write = write_jedec_1,
11803 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000011804 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000011805 },
11806
11807 {
Nikolai Artemiev09a5eac2020-08-31 17:47:57 +100011808 .vendor = "Nantronics",
11809 .name = "N25S10",
11810 .bustype = BUS_SPI,
11811 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11812 .model_id = NANTRONICS_N25S10,
11813 .total_size = 128,
11814 .page_size = 256,
11815 .feature_bits = FEATURE_WRSR_WREN,
11816 .tested = TEST_UNTESTED,
11817 .probe = probe_spi_rdid,
11818 .probe_timing = TIMING_ZERO,
11819 .block_erasers =
11820 {
11821 {
11822 .eraseblocks = { {4 * 1024, 32} },
11823 .block_erase = spi_block_erase_20,
11824 }, {
11825 .eraseblocks = { {4 * 1024, 32} },
11826 .block_erase = spi_block_erase_d7,
11827 }, {
11828 .eraseblocks = { {32 * 1024, 4} },
11829 .block_erase = spi_block_erase_52,
11830 }, {
11831 .eraseblocks = { {64 * 1024, 2} },
11832 .block_erase = spi_block_erase_d8,
11833 }, {
11834 .eraseblocks = { {128 * 1024, 1} },
11835 .block_erase = spi_block_erase_60,
11836 }, {
11837 .eraseblocks = { {128 * 1024, 1} },
11838 .block_erase = spi_block_erase_c7,
11839 }
11840 },
11841 .printlock = spi_prettyprint_status_register_bp3_srwd,
11842 .unlock = spi_disable_blockprotect_bp3_srwd,
11843 .write = spi_chip_write_256,
11844 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11845 .voltage = {2700, 3600},
11846 },
11847
11848 {
11849 .vendor = "Nantronics",
11850 .name = "N25S16",
11851 .bustype = BUS_SPI,
11852 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11853 .model_id = NANTRONICS_N25S16,
11854 .total_size = 2048,
11855 .page_size = 256,
11856 .feature_bits = FEATURE_WRSR_WREN,
11857 .tested = TEST_UNTESTED,
11858 .probe = probe_spi_rdid,
11859 .probe_timing = TIMING_ZERO,
11860 .block_erasers =
11861 {
11862 {
11863 .eraseblocks = { {4 * 1024, 512} },
11864 .block_erase = spi_block_erase_20,
11865 }, {
11866 .eraseblocks = { {64 * 1024, 32} },
11867 .block_erase = spi_block_erase_d8,
11868 }, {
11869 .eraseblocks = { {2048 * 1024, 1} },
11870 .block_erase = spi_block_erase_60,
11871 }, {
11872 .eraseblocks = { {2048 * 1024, 1} },
11873 .block_erase = spi_block_erase_c7,
11874 }
11875 },
11876 .printlock = spi_prettyprint_status_register_bp3_srwd,
11877 .unlock = spi_disable_blockprotect_bp3_srwd,
11878 .write = spi_chip_write_256,
11879 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11880 .voltage = {2700, 3600},
11881 },
11882
11883 {
11884 .vendor = "Nantronics",
11885 .name = "N25S20",
11886 .bustype = BUS_SPI,
11887 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11888 .model_id = NANTRONICS_N25S20,
11889 .total_size = 256,
11890 .page_size = 256,
11891 .feature_bits = FEATURE_WRSR_WREN,
11892 .tested = TEST_UNTESTED,
11893 .probe = probe_spi_rdid,
11894 .probe_timing = TIMING_ZERO,
11895 .block_erasers =
11896 {
11897 {
11898 .eraseblocks = { {4 * 1024, 64} },
11899 .block_erase = spi_block_erase_20,
11900 }, {
11901 .eraseblocks = { {4 * 1024, 64} },
11902 .block_erase = spi_block_erase_d7,
11903 }, {
11904 .eraseblocks = { {32 * 1024, 8} },
11905 .block_erase = spi_block_erase_52,
11906 }, {
11907 .eraseblocks = { {64 * 1024, 4} },
11908 .block_erase = spi_block_erase_d8,
11909 }, {
11910 .eraseblocks = { {256 * 1024, 1} },
11911 .block_erase = spi_block_erase_60,
11912 }, {
11913 .eraseblocks = { {256 * 1024, 1} },
11914 .block_erase = spi_block_erase_c7,
11915 }
11916 },
11917 .printlock = spi_prettyprint_status_register_bp3_srwd,
11918 .unlock = spi_disable_blockprotect_bp3_srwd,
11919 .write = spi_chip_write_256,
11920 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11921 .voltage = {2700, 3600},
11922 },
11923
11924 {
11925 .vendor = "Nantronics",
11926 .name = "N25S40",
11927 .bustype = BUS_SPI,
11928 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11929 .model_id = NANTRONICS_N25S40,
11930 .total_size = 512,
11931 .page_size = 256,
11932 .feature_bits = FEATURE_WRSR_WREN,
11933 .tested = TEST_UNTESTED,
11934 .probe = probe_spi_rdid,
11935 .probe_timing = TIMING_ZERO,
11936 .block_erasers =
11937 {
11938 {
11939 .eraseblocks = { {4 * 1024, 128} },
11940 .block_erase = spi_block_erase_20,
11941 }, {
11942 .eraseblocks = { {4 * 1024, 128} },
11943 .block_erase = spi_block_erase_d7,
11944 }, {
11945 .eraseblocks = { {32 * 1024, 16} },
11946 .block_erase = spi_block_erase_52,
11947 }, {
11948 .eraseblocks = { {64 * 1024, 8} },
11949 .block_erase = spi_block_erase_d8,
11950 }, {
11951 .eraseblocks = { {512 * 1024, 1} },
11952 .block_erase = spi_block_erase_60,
11953 }, {
11954 .eraseblocks = { {512 * 1024, 1} },
11955 .block_erase = spi_block_erase_c7,
11956 }
11957 },
11958 .printlock = spi_prettyprint_status_register_bp3_srwd,
11959 .unlock = spi_disable_blockprotect_bp3_srwd,
11960 .write = spi_chip_write_256,
11961 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
11962 .voltage = {2700, 3600},
11963 },
11964
11965 {
Nikolai Artemiev74f90f82020-08-31 17:48:27 +100011966 .vendor = "Nantronics",
11967 .name = "N25S80",
11968 .bustype = BUS_SPI,
11969 .manufacture_id = NANTRONICS_ID_NOPREFIX,
11970 .model_id = NANTRONICS_N25S80,
11971 .total_size = 1024,
11972 .page_size = 256,
11973 .feature_bits = FEATURE_WRSR_WREN,
11974 .tested = TEST_UNTESTED,
11975 .probe = probe_spi_rdid,
11976 .probe_timing = TIMING_ZERO,
11977 .block_erasers =
11978 {
11979 {
11980 .eraseblocks = { {4 * 1024, 256} },
11981 .block_erase = spi_block_erase_20,
11982 }, {
11983 .eraseblocks = { {32 * 1024, 32} },
11984 .block_erase = spi_block_erase_52,
11985 }, {
11986 .eraseblocks = { {64 * 1024, 16} },
11987 .block_erase = spi_block_erase_d8,
11988 }, {
11989 .eraseblocks = { {1024 * 1024, 1} },
11990 .block_erase = spi_block_erase_60,
11991 }, {
11992 .eraseblocks = { {1024 * 1024, 1} },
11993 .block_erase = spi_block_erase_c7,
11994 }
11995 },
11996 .printlock = spi_prettyprint_status_register_bp3_srwd,
11997 .unlock = spi_disable_blockprotect_bp3_srwd,
11998 .write = spi_chip_write_256,
11999 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12000 .voltage = {2700, 3600},
12001 },
12002
12003 {
12004 .vendor = "PMC",
12005 .name = "Pm25LD010(C)",
12006 .bustype = BUS_SPI,
12007 .manufacture_id = PMC_ID,
12008 .model_id = PMC_PM25LD010,
12009 .total_size = 128,
12010 .page_size = 256,
12011 .feature_bits = FEATURE_WRSR_WREN,
12012 .tested = TEST_OK_PREW,
12013 .probe = probe_spi_rdid,
12014 .probe_timing = TIMING_ZERO,
12015 .block_erasers =
12016 {
12017 {
12018 .eraseblocks = { {4 * 1024, 32} },
12019 .block_erase = spi_block_erase_20,
12020 }, {
12021 .eraseblocks = { {4 * 1024, 32} },
12022 .block_erase = spi_block_erase_d7,
12023 }, {
12024 .eraseblocks = { {32 * 1024, 4} },
12025 .block_erase = spi_block_erase_d8,
12026 }, {
12027 .eraseblocks = { {128 * 1024, 1} },
12028 .block_erase = spi_block_erase_60,
12029 }, {
12030 .eraseblocks = { {128 * 1024, 1} },
12031 .block_erase = spi_block_erase_c7,
12032 }
12033 },
12034 .printlock = spi_prettyprint_status_register_bp2_srwd,
12035 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12036 .write = spi_chip_write_256,
12037 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12038 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
12039 },
12040
12041 {
12042 .vendor = "PMC",
12043 .name = "Pm25LD020(C)",
12044 .bustype = BUS_SPI,
12045 .manufacture_id = PMC_ID,
12046 .model_id = PMC_PM25LD020,
12047 .total_size = 256,
12048 .page_size = 256,
12049 .feature_bits = FEATURE_WRSR_WREN,
12050 .tested = TEST_OK_PREW,
12051 .probe = probe_spi_rdid,
12052 .probe_timing = TIMING_ZERO,
12053 .block_erasers =
12054 {
12055 {
12056 .eraseblocks = { {4 * 1024, 64} },
12057 .block_erase = spi_block_erase_20,
12058 }, {
12059 .eraseblocks = { {4 * 1024, 64} },
12060 .block_erase = spi_block_erase_d7,
12061 }, {
12062 .eraseblocks = { {64 * 1024, 4} },
12063 .block_erase = spi_block_erase_d8,
12064 }, {
12065 .eraseblocks = { {256 * 1024, 1} },
12066 .block_erase = spi_block_erase_60,
12067 }, {
12068 .eraseblocks = { {256 * 1024, 1} },
12069 .block_erase = spi_block_erase_c7,
12070 }
12071 },
12072 .printlock = spi_prettyprint_status_register_bp2_srwd,
12073 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12074 .write = spi_chip_write_256,
12075 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12076 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
12077 },
12078
12079 {
12080 .vendor = "PMC",
12081 .name = "Pm25LD040(C)",
12082 .bustype = BUS_SPI,
12083 .manufacture_id = PMC_ID,
12084 .model_id = PMC_PM25LV040,
12085 .total_size = 512,
12086 .page_size = 256,
12087 .feature_bits = FEATURE_WRSR_WREN,
12088 .tested = TEST_OK_PREW,
12089 .probe = probe_spi_rdid,
12090 .probe_timing = TIMING_ZERO,
12091 .block_erasers =
12092 {
12093 {
12094 .eraseblocks = { {4 * 1024, 128} },
12095 .block_erase = spi_block_erase_20,
12096 }, {
12097 .eraseblocks = { {4 * 1024, 128} },
12098 .block_erase = spi_block_erase_d7,
12099 }, {
12100 .eraseblocks = { {64 * 1024, 8} },
12101 .block_erase = spi_block_erase_d8,
12102 }, {
12103 .eraseblocks = { {512 * 1024, 1} },
12104 .block_erase = spi_block_erase_60,
12105 }, {
12106 .eraseblocks = { {512 * 1024, 1} },
12107 .block_erase = spi_block_erase_c7,
12108 }
12109 },
12110 .printlock = spi_prettyprint_status_register_bp2_srwd,
12111 .unlock = spi_disable_blockprotect,
12112 .write = spi_chip_write_256,
12113 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12114 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
12115 },
12116
12117 {
12118 .vendor = "PMC",
12119 .name = "Pm25LD256C",
12120 .bustype = BUS_SPI,
12121 .manufacture_id = PMC_ID,
12122 .model_id = PMC_PM25LD256C,
12123 .total_size = 32,
12124 .page_size = 256,
12125 .feature_bits = FEATURE_WRSR_WREN,
12126 .tested = TEST_UNTESTED,
12127 .probe = probe_spi_rdid,
12128 .probe_timing = TIMING_ZERO,
12129 .block_erasers =
12130 {
12131 {
12132 .eraseblocks = { {4 * 1024, 8} },
12133 .block_erase = spi_block_erase_20,
12134 }, {
12135 .eraseblocks = { {4 * 1024, 8} },
12136 .block_erase = spi_block_erase_d7,
12137 }, {
12138 .eraseblocks = { {32 * 1024, 1} },
12139 .block_erase = spi_block_erase_d8,
12140 }, {
12141 .eraseblocks = { {32 * 1024, 1} },
12142 .block_erase = spi_block_erase_60,
12143 }, {
12144 .eraseblocks = { {32 * 1024, 1} },
12145 .block_erase = spi_block_erase_c7,
12146 }
12147 },
12148 .printlock = spi_prettyprint_status_register_bp2_srwd,
12149 .unlock = spi_disable_blockprotect,
12150 .write = spi_chip_write_256,
12151 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12152 .voltage = {2700, 3600},
12153 },
12154
12155 {
12156 .vendor = "PMC",
12157 .name = "Pm25LD512(C)",
12158 .bustype = BUS_SPI,
12159 .manufacture_id = PMC_ID,
12160 .model_id = PMC_PM25LD512,
12161 .total_size = 64,
12162 .page_size = 256,
12163 .feature_bits = FEATURE_WRSR_WREN,
12164 .tested = TEST_OK_PREW,
12165 .probe = probe_spi_rdid,
12166 .probe_timing = TIMING_ZERO,
12167 .block_erasers =
12168 {
12169 {
12170 .eraseblocks = { {4 * 1024, 16} },
12171 .block_erase = spi_block_erase_20,
12172 }, {
12173 .eraseblocks = { {4 * 1024, 16} },
12174 .block_erase = spi_block_erase_d7,
12175 }, {
12176 .eraseblocks = { {32 * 1024, 2} },
12177 .block_erase = spi_block_erase_d8,
12178 }, {
12179 .eraseblocks = { {64 * 1024, 1} },
12180 .block_erase = spi_block_erase_60,
12181 }, {
12182 .eraseblocks = { {64 * 1024, 1} },
12183 .block_erase = spi_block_erase_c7,
12184 }
12185 },
12186 .printlock = spi_prettyprint_status_register_bp2_srwd,
12187 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
12188 .write = spi_chip_write_256,
12189 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
12190 .voltage = {2300, 3600},
12191 },
12192
12193 {
12194 .vendor = "PMC",
12195 .name = "Pm25LQ016",
12196 .bustype = BUS_SPI,
12197 .manufacture_id = PMC_ID,
12198 .model_id = PMC_PM25LQ016,
12199 .total_size = 2048,
12200 .page_size = 256,
12201 /* OTP: 256B total; read 0x4B, write 0xB1 */
12202 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12203 .tested = TEST_UNTESTED,
12204 .probe = probe_spi_rdid,
12205 .probe_timing = TIMING_ZERO,
12206 .block_erasers =
12207 {
12208 {
12209 .eraseblocks = { {4 * 1024, 512} },
12210 .block_erase = spi_block_erase_20,
12211 }, {
12212 .eraseblocks = { {4 * 1024, 512} },
12213 .block_erase = spi_block_erase_d7,
12214 }, {
12215 .eraseblocks = { {64 * 1024, 32} },
12216 .block_erase = spi_block_erase_d8,
12217 }, {
12218 .eraseblocks = { {2048 * 1024, 1} },
12219 .block_erase = spi_block_erase_60,
12220 }, {
12221 .eraseblocks = { {2048 * 1024, 1} },
12222 .block_erase = spi_block_erase_c7,
12223 }
12224 },
12225 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12226 .unlock = spi_disable_blockprotect_bp3_srwd,
12227 .write = spi_chip_write_256,
12228 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12229 .voltage = {2300, 3600},
12230 },
12231
12232 {
12233 .vendor = "PMC",
12234 .name = "Pm25LQ020",
12235 .bustype = BUS_SPI,
12236 .manufacture_id = PMC_ID,
12237 .model_id = PMC_PM25LQ020,
12238 .total_size = 256,
12239 .page_size = 256,
12240 /* OTP: 256B total; read 0x4B, write 0xB1 */
12241 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12242 .tested = TEST_UNTESTED,
12243 .probe = probe_spi_rdid,
12244 .probe_timing = TIMING_ZERO,
12245 .block_erasers =
12246 {
12247 {
12248 .eraseblocks = { {4 * 1024, 64} },
12249 .block_erase = spi_block_erase_20,
12250 }, {
12251 .eraseblocks = { {4 * 1024, 64} },
12252 .block_erase = spi_block_erase_d7,
12253 }, {
12254 .eraseblocks = { {64 * 1024, 4} },
12255 .block_erase = spi_block_erase_d8,
12256 }, {
12257 .eraseblocks = { {256 * 1024, 1} },
12258 .block_erase = spi_block_erase_60,
12259 }, {
12260 .eraseblocks = { {256 * 1024, 1} },
12261 .block_erase = spi_block_erase_c7,
12262 }
12263 },
12264 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12265 .unlock = spi_disable_blockprotect_bp3_srwd,
12266 .write = spi_chip_write_256,
12267 .read = spi_chip_read,
12268 .voltage = {2300, 3600},
12269 },
12270
12271 {
12272 .vendor = "PMC",
12273 .name = "Pm25LQ032C",
12274 .bustype = BUS_SPI,
12275 .manufacture_id = PMC_ID,
12276 .model_id = PMC_PM25LQ032C,
12277 .total_size = 4096,
12278 .page_size = 256,
12279 /* OTP: 64B total; read 0x4B, write 0xB1 */
12280 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12281 .tested = TEST_OK_PREW,
12282 .probe = probe_spi_rdid,
12283 .probe_timing = TIMING_ZERO,
12284 .block_erasers =
12285 {
12286 {
12287 .eraseblocks = { {4 * 1024, 1024} },
12288 .block_erase = spi_block_erase_20,
12289 }, {
12290 .eraseblocks = { {4 * 1024, 1024} },
12291 .block_erase = spi_block_erase_d7,
12292 }, {
12293 .eraseblocks = { {64 * 1024, 64} },
12294 .block_erase = spi_block_erase_d8,
12295 }, {
12296 .eraseblocks = { {4096 * 1024, 1} },
12297 .block_erase = spi_block_erase_60,
12298 }, {
12299 .eraseblocks = { {4096 * 1024, 1} },
12300 .block_erase = spi_block_erase_c7,
12301 }
12302 },
12303 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12304 .unlock = spi_disable_blockprotect_bp3_srwd,
12305 .write = spi_chip_write_256,
12306 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12307 .voltage = {2700, 3600},
12308 },
12309
12310 {
12311 .vendor = "PMC",
12312 .name = "Pm25LQ040",
12313 .bustype = BUS_SPI,
12314 .manufacture_id = PMC_ID,
12315 .model_id = PMC_PM25LQ040,
12316 .total_size = 512,
12317 .page_size = 256,
12318 /* OTP: 256B total; read 0x4B, write 0xB1 */
12319 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12320 .tested = TEST_UNTESTED,
12321 .probe = probe_spi_rdid,
12322 .probe_timing = TIMING_ZERO,
12323 .block_erasers =
12324 {
12325 {
12326 .eraseblocks = { {4 * 1024, 128} },
12327 .block_erase = spi_block_erase_20,
12328 }, {
12329 .eraseblocks = { {4 * 1024, 128} },
12330 .block_erase = spi_block_erase_d7,
12331 }, {
12332 .eraseblocks = { {64 * 1024, 8} },
12333 .block_erase = spi_block_erase_d8,
12334 }, {
12335 .eraseblocks = { {512 * 1024, 1} },
12336 .block_erase = spi_block_erase_60,
12337 }, {
12338 .eraseblocks = { {512 * 1024, 1} },
12339 .block_erase = spi_block_erase_c7,
12340 }
12341 },
12342 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12343 .unlock = spi_disable_blockprotect_bp3_srwd,
12344 .write = spi_chip_write_256,
12345 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12346 .voltage = {2300, 3600},
12347 },
12348
12349 {
hailfinger286829b2009-01-08 03:40:17 +000012350 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012351 .name = "Pm25LQ080",
12352 .bustype = BUS_SPI,
12353 .manufacture_id = PMC_ID,
12354 .model_id = PMC_PM25LQ080,
12355 .total_size = 1024,
12356 .page_size = 256,
12357 /* OTP: 64B total; read 0x4B, write 0xB1 */
12358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12359 .tested = TEST_UNTESTED,
12360 .probe = probe_spi_rdid,
12361 .probe_timing = TIMING_ZERO,
12362 .block_erasers =
12363 {
12364 {
12365 .eraseblocks = { {4 * 1024, 256} },
12366 .block_erase = spi_block_erase_20,
12367 }, {
12368 .eraseblocks = { {4 * 1024, 256} },
12369 .block_erase = spi_block_erase_d7,
12370 }, {
12371 .eraseblocks = { {64 * 1024, 16} },
12372 .block_erase = spi_block_erase_d8,
12373 }, {
12374 .eraseblocks = { {1024 * 1024, 1} },
12375 .block_erase = spi_block_erase_60,
12376 }, {
12377 .eraseblocks = { {1024 * 1024, 1} },
12378 .block_erase = spi_block_erase_c7,
12379 }
12380 },
12381 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
12382 .unlock = spi_disable_blockprotect_bp3_srwd,
12383 .write = spi_chip_write_256,
12384 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12385 .voltage = {2300, 3600},
12386 },
12387
12388 {
12389 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012390 .name = "Pm25LV010",
hailfingere1e41ea2011-07-27 07:13:06 +000012391 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012392 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012393 .model_id = PMC_PM25LV010,
hailfinger286829b2009-01-08 03:40:17 +000012394 .total_size = 128,
12395 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012396 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012397 .tested = TEST_UNTESTED,
12398 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012399 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012400 .block_erasers =
12401 {
12402 {
12403 .eraseblocks = { {4 * 1024, 32} },
12404 .block_erase = spi_block_erase_d7,
12405 }, {
12406 .eraseblocks = { {32 * 1024, 4} },
12407 .block_erase = spi_block_erase_d8,
12408 }, {
12409 .eraseblocks = { {128 * 1024, 1} },
12410 .block_erase = spi_block_erase_c7,
12411 }
12412 },
hailfingerb9560ee2010-07-14 20:21:22 +000012413 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012414 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012415 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000012416 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012417 },
12418
hailfinger286829b2009-01-08 03:40:17 +000012419 {
12420 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012421 .name = "Pm25LV010A",
12422 .bustype = BUS_SPI,
12423 .manufacture_id = PMC_ID,
12424 .model_id = PMC_PM25LV010,
12425 .total_size = 128,
12426 .page_size = 256,
12427 .feature_bits = FEATURE_WRSR_WREN,
12428 .tested = TEST_OK_PREW,
12429 .probe = probe_spi_rdid,
12430 .probe_timing = TIMING_ZERO,
12431 .block_erasers =
12432 {
12433 {
12434 .eraseblocks = { {4 * 1024, 32} },
12435 .block_erase = spi_block_erase_d7,
12436 }, {
12437 .eraseblocks = { {32 * 1024, 4} },
12438 .block_erase = spi_block_erase_d8,
12439 }, {
12440 .eraseblocks = { {128 * 1024, 1} },
12441 .block_erase = spi_block_erase_c7,
12442 }
12443 },
12444 .printlock = spi_prettyprint_status_register_bp1_srwd,
12445 .unlock = spi_disable_blockprotect,
12446 .write = spi_chip_write_256,
12447 .read = spi_chip_read, /* Fast read (0x0B) supported */
12448 .voltage = {2700, 3600},
12449 },
12450
12451 {
12452 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012453 .name = "Pm25LV016B",
hailfingere1e41ea2011-07-27 07:13:06 +000012454 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012455 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012456 .model_id = PMC_PM25LV016B,
hailfinger286829b2009-01-08 03:40:17 +000012457 .total_size = 2048,
12458 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012459 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012460 .tested = TEST_UNTESTED,
12461 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012462 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012463 .block_erasers =
12464 {
12465 {
12466 .eraseblocks = { {4 * 1024, 512} },
12467 .block_erase = spi_block_erase_d7,
12468 }, {
12469 .eraseblocks = { {4 * 1024, 512} },
12470 .block_erase = spi_block_erase_20,
12471 }, {
12472 .eraseblocks = { {64 * 1024, 32} },
12473 .block_erase = spi_block_erase_d8,
12474 }, {
12475 .eraseblocks = { {2 * 1024 * 1024, 1} },
12476 .block_erase = spi_block_erase_60,
12477 }, {
12478 .eraseblocks = { {2 * 1024 * 1024, 1} },
12479 .block_erase = spi_block_erase_c7,
12480 }
12481 },
Alan Greena514de82019-09-09 16:40:10 +100012482 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012483 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012484 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012485 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000012486 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012487 },
12488
hailfinger286829b2009-01-08 03:40:17 +000012489 {
12490 .vendor = "PMC",
12491 .name = "Pm25LV020",
hailfingere1e41ea2011-07-27 07:13:06 +000012492 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012493 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012494 .model_id = PMC_PM25LV020,
hailfinger286829b2009-01-08 03:40:17 +000012495 .total_size = 256,
12496 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012497 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012498 .tested = TEST_UNTESTED,
12499 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012500 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012501 .block_erasers =
12502 {
12503 {
12504 .eraseblocks = { {4 * 1024, 64} },
12505 .block_erase = spi_block_erase_d7,
12506 }, {
12507 .eraseblocks = { {64 * 1024, 4} },
12508 .block_erase = spi_block_erase_d8,
12509 }, {
12510 .eraseblocks = { {256 * 1024, 1} },
12511 .block_erase = spi_block_erase_c7,
12512 }
12513 },
Alan Greena514de82019-09-09 16:40:10 +100012514 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012515 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012516 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012517 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000012518 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012519 },
12520
hailfinger286829b2009-01-08 03:40:17 +000012521 {
12522 .vendor = "PMC",
12523 .name = "Pm25LV040",
hailfingere1e41ea2011-07-27 07:13:06 +000012524 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012525 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012526 .model_id = PMC_PM25LV040,
hailfinger286829b2009-01-08 03:40:17 +000012527 .total_size = 512,
12528 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012529 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100012530 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000012531 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012532 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012533 .block_erasers =
12534 {
12535 {
12536 .eraseblocks = { {4 * 1024, 128} },
12537 .block_erase = spi_block_erase_d7,
12538 }, {
12539 .eraseblocks = { {64 * 1024, 8} },
12540 .block_erase = spi_block_erase_d8,
12541 }, {
12542 .eraseblocks = { {512 * 1024, 1} },
12543 .block_erase = spi_block_erase_c7,
12544 }
12545 },
Alan Greena514de82019-09-09 16:40:10 +100012546 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012547 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012548 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012549 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000012550 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012551 },
12552
hailfinger286829b2009-01-08 03:40:17 +000012553 {
12554 .vendor = "PMC",
12555 .name = "Pm25LV080B",
hailfingere1e41ea2011-07-27 07:13:06 +000012556 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012557 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012558 .model_id = PMC_PM25LV080B,
hailfinger286829b2009-01-08 03:40:17 +000012559 .total_size = 1024,
12560 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012561 .feature_bits = FEATURE_WRSR_WREN,
hailfinger286829b2009-01-08 03:40:17 +000012562 .tested = TEST_UNTESTED,
12563 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012564 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012565 .block_erasers =
12566 {
12567 {
12568 .eraseblocks = { {4 * 1024, 256} },
12569 .block_erase = spi_block_erase_d7,
12570 }, {
12571 .eraseblocks = { {4 * 1024, 256} },
12572 .block_erase = spi_block_erase_20,
12573 }, {
12574 .eraseblocks = { {64 * 1024, 16} },
12575 .block_erase = spi_block_erase_d8,
12576 }, {
12577 .eraseblocks = { {1024 * 1024, 1} },
12578 .block_erase = spi_block_erase_60,
12579 }, {
12580 .eraseblocks = { {1024 * 1024, 1} },
12581 .block_erase = spi_block_erase_c7,
12582 }
12583 },
Alan Greena514de82019-09-09 16:40:10 +100012584 .printlock = spi_prettyprint_status_register_bp2_srwd,
hailfingerb9560ee2010-07-14 20:21:22 +000012585 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012586 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012587 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000012588 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012589 },
12590
hailfinger286829b2009-01-08 03:40:17 +000012591 {
12592 .vendor = "PMC",
Alan Greenb40ec892019-08-26 11:43:40 +100012593 .name = "Pm25LV512(A)",
hailfingere1e41ea2011-07-27 07:13:06 +000012594 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000012595 .manufacture_id = PMC_ID,
mhmd3c80cd2010-09-15 23:31:03 +000012596 .model_id = PMC_PM25LV512,
hailfinger286829b2009-01-08 03:40:17 +000012597 .total_size = 64,
12598 .page_size = 256,
12599 .tested = TEST_UNTESTED,
12600 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000012601 .probe_timing = TIMING_ZERO,
snelson4d31f0d2010-01-19 03:23:07 +000012602 .block_erasers =
12603 {
12604 {
12605 .eraseblocks = { {4 * 1024, 16} },
12606 .block_erase = spi_block_erase_d7,
12607 }, {
12608 .eraseblocks = { {32 * 1024, 2} },
12609 .block_erase = spi_block_erase_d8,
12610 }, {
12611 .eraseblocks = { {64 * 1024, 1} },
12612 .block_erase = spi_block_erase_c7,
12613 }
12614 },
hailfingerb9560ee2010-07-14 20:21:22 +000012615 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000012616 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000012617 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000012618 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012619 },
12620
hailfinger286829b2009-01-08 03:40:17 +000012621 {
12622 .vendor = "PMC",
hailfingerc43afc92009-12-22 22:15:33 +000012623 .name = "Pm29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +000012624 .bustype = BUS_PARALLEL,
uwe7a083f82009-06-14 21:53:26 +000012625 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012626 .model_id = PMC_PM29F002B,
uwe7a083f82009-06-14 21:53:26 +000012627 .total_size = 256,
hailfingerc43afc92009-12-22 22:15:33 +000012628 .page_size = 8 * 1024,
snelsonc6855342010-01-28 23:55:12 +000012629 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
uwe7a083f82009-06-14 21:53:26 +000012630 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000012631 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060012632 .probe_timing = TIMING_FIXME,
hailfingerc43afc92009-12-22 22:15:33 +000012633 .block_erasers =
12634 {
12635 {
12636 .eraseblocks = {
12637 {16 * 1024, 1},
12638 {8 * 1024, 2},
12639 {96 * 1024, 1},
12640 {128 * 1024, 1},
12641 },
snelsonc6855342010-01-28 23:55:12 +000012642 .block_erase = erase_sector_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000012643 }, {
12644 .eraseblocks = { {256 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +000012645 .block_erase = erase_chip_block_jedec,
hailfingerc43afc92009-12-22 22:15:33 +000012646 },
12647 },
snelsonc6855342010-01-28 23:55:12 +000012648 .write = write_jedec_1,
uwe7a083f82009-06-14 21:53:26 +000012649 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012650 .voltage = {4500, 5500},
uwe7a083f82009-06-14 21:53:26 +000012651 },
12652
12653 {
12654 .vendor = "PMC",
Alan Greend76dc1f2019-06-26 15:38:19 +100012655 .name = "Pm29F002T",
12656 .bustype = BUS_PARALLEL,
12657 .manufacture_id = PMC_ID_NOPREFIX,
12658 .model_id = PMC_PM29F002T,
12659 .total_size = 256,
12660 .page_size = 8 * 1024,
12661 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12662 .tested = TEST_OK_PREW,
12663 .probe = probe_jedec,
12664 .probe_timing = TIMING_FIXME,
12665 .block_erasers =
12666 {
12667 {
12668 .eraseblocks = {
12669 {128 * 1024, 1},
12670 {96 * 1024, 1},
12671 {8 * 1024, 2},
12672 {16 * 1024, 1},
12673 },
12674 .block_erase = erase_sector_jedec,
12675 }, {
12676 .eraseblocks = { {256 * 1024, 1} },
12677 .block_erase = erase_chip_block_jedec,
12678 },
12679 },
12680 .write = write_jedec_1,
12681 .read = read_memmapped,
12682 .voltage = {4500, 5500},
12683 },
12684
12685 {
12686 .vendor = "PMC",
ruika316f402009-05-17 17:02:07 +000012687 .name = "Pm39LV010",
hailfingere1e41ea2011-07-27 07:13:06 +000012688 .bustype = BUS_PARALLEL,
ruika316f402009-05-17 17:02:07 +000012689 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012690 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
ruika316f402009-05-17 17:02:07 +000012691 .total_size = 128,
12692 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000012693 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000012694 .tested = TEST_OK_PREW,
ruika316f402009-05-17 17:02:07 +000012695 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000012696 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelson4d31f0d2010-01-19 03:23:07 +000012697 .block_erasers =
12698 {
12699 {
12700 .eraseblocks = { {4 * 1024, 32} },
12701 .block_erase = erase_sector_jedec,
12702 }, {
12703 .eraseblocks = { {64 * 1024, 2} },
12704 .block_erase = erase_block_jedec,
12705 }, {
12706 .eraseblocks = { {128 * 1024, 1} },
12707 .block_erase = erase_chip_block_jedec,
12708 }
12709 },
snelsonc6855342010-01-28 23:55:12 +000012710 .write = write_jedec_1,
ruika316f402009-05-17 17:02:07 +000012711 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012712 .voltage = {2700, 3600},
ruika316f402009-05-17 17:02:07 +000012713 },
12714
12715 {
12716 .vendor = "PMC",
hailfingerd444cc72010-03-27 23:25:14 +000012717 .name = "Pm39LV020",
hailfingere1e41ea2011-07-27 07:13:06 +000012718 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +000012719 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012720 .model_id = PMC_PM39LV020,
hailfingerd444cc72010-03-27 23:25:14 +000012721 .total_size = 256,
12722 .page_size = 4096,
12723 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12724 .tested = TEST_UNTESTED,
12725 .probe = probe_jedec,
12726 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +100012727 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +000012728 {
12729 {
12730 .eraseblocks = { {4 * 1024, 64} },
12731 .block_erase = erase_sector_jedec,
12732 }, {
12733 .eraseblocks = { {64 * 1024, 4} },
12734 .block_erase = erase_block_jedec,
12735 }, {
12736 .eraseblocks = { {256 * 1024, 1} },
12737 .block_erase = erase_chip_block_jedec,
12738 }
12739 },
12740 .write = write_jedec_1,
12741 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012742 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +000012743 },
12744
12745 {
12746 .vendor = "PMC",
12747 .name = "Pm39LV040",
hailfingere1e41ea2011-07-27 07:13:06 +000012748 .bustype = BUS_PARALLEL,
hailfingerd444cc72010-03-27 23:25:14 +000012749 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012750 .model_id = PMC_PM39LV040,
hailfingerd444cc72010-03-27 23:25:14 +000012751 .total_size = 512,
12752 .page_size = 4096,
12753 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000012754 .tested = TEST_OK_PR,
hailfingerd444cc72010-03-27 23:25:14 +000012755 .probe = probe_jedec,
12756 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greena7cfa332019-06-24 15:48:14 +100012757 .block_erasers =
hailfingerd444cc72010-03-27 23:25:14 +000012758 {
12759 {
12760 .eraseblocks = { {4 * 1024, 128} },
12761 .block_erase = erase_sector_jedec,
12762 }, {
12763 .eraseblocks = { {64 * 1024, 8} },
12764 .block_erase = erase_block_jedec,
12765 }, {
12766 .eraseblocks = { {512 * 1024, 1} },
12767 .block_erase = erase_chip_block_jedec,
12768 }
12769 },
12770 .write = write_jedec_1,
12771 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012772 .voltage = {2700, 3600},
hailfingerd444cc72010-03-27 23:25:14 +000012773 },
Simon Glass8dc82732013-07-16 10:13:51 -060012774
hailfingerd444cc72010-03-27 23:25:14 +000012775 {
12776 .vendor = "PMC",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012777 .name = "Pm39LV512",
12778 .bustype = BUS_PARALLEL,
12779 .manufacture_id = PMC_ID_NOPREFIX,
12780 .model_id = PMC_PM39LV512,
12781 .total_size = 64,
12782 .page_size = 4096,
12783 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
12784 .tested = TEST_OK_PREW,
12785 .probe = probe_jedec,
12786 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
12787 .block_erasers =
12788 {
12789 {
12790 .eraseblocks = { {4 * 1024, 16} },
12791 .block_erase = erase_sector_jedec,
12792 }, {
12793 .eraseblocks = { {64 * 1024, 1} },
12794 .block_erase = erase_block_jedec,
12795 }, {
12796 .eraseblocks = { {64 * 1024, 1} },
12797 .block_erase = erase_chip_block_jedec,
12798 }
12799 },
12800 .write = write_jedec_1,
12801 .read = read_memmapped,
12802 .voltage = {2700, 3600},
12803 },
12804
12805 {
12806 .vendor = "PMC",
hailfinger286829b2009-01-08 03:40:17 +000012807 .name = "Pm49FL002",
hailfingere1e41ea2011-07-27 07:13:06 +000012808 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000012809 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012810 .model_id = PMC_PM49FL002,
hailfinger286829b2009-01-08 03:40:17 +000012811 .total_size = 256,
12812 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000012813 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +100012814 .tested = TEST_OK_PR,
hailfingerafac00e2010-01-09 02:24:17 +000012815 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000012816 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +000012817 .block_erasers =
12818 {
12819 {
12820 .eraseblocks = { {4 * 1024, 64} },
12821 .block_erase = erase_sector_jedec,
12822 }, {
12823 .eraseblocks = { {16 * 1024, 16} },
12824 .block_erase = erase_block_jedec,
12825 }, {
12826 .eraseblocks = { {256 * 1024, 1} },
12827 .block_erase = erase_chip_block_jedec,
12828 }
12829 },
Alan Green90539742019-09-02 17:06:30 +100012830 .unlock = unlock_regspace2_uniform_32k,
snelson59c83d22010-02-27 18:01:15 +000012831 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000012832 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012833 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012834 },
12835
hailfinger286829b2009-01-08 03:40:17 +000012836 {
12837 .vendor = "PMC",
12838 .name = "Pm49FL004",
hailfingere1e41ea2011-07-27 07:13:06 +000012839 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000012840 .manufacture_id = PMC_ID_NOPREFIX,
mhmd3c80cd2010-09-15 23:31:03 +000012841 .model_id = PMC_PM49FL004,
hailfinger286829b2009-01-08 03:40:17 +000012842 .total_size = 512,
12843 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000012844 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Green90539742019-09-02 17:06:30 +100012845 .tested = TEST_OK_PREW,
hailfingerafac00e2010-01-09 02:24:17 +000012846 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000012847 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
snelson4d31f0d2010-01-19 03:23:07 +000012848 .block_erasers =
12849 {
12850 {
12851 .eraseblocks = { {4 * 1024, 128} },
12852 .block_erase = erase_sector_jedec,
12853 }, {
12854 .eraseblocks = { {64 * 1024, 8} },
12855 .block_erase = erase_block_jedec,
12856 }, {
12857 .eraseblocks = { {512 * 1024, 1} },
12858 .block_erase = erase_chip_block_jedec,
12859 }
12860 },
Alan Green90539742019-09-02 17:06:30 +100012861 .unlock = unlock_regspace2_uniform_64k,
snelson59c83d22010-02-27 18:01:15 +000012862 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000012863 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000012864 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000012865 },
12866
hailfinger286829b2009-01-08 03:40:17 +000012867 {
hailfinger286829b2009-01-08 03:40:17 +000012868 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012869 .name = "SST25LF020A",
12870 .bustype = BUS_SPI,
12871 .manufacture_id = SST_ID,
12872 .model_id = SST_SST25VF020_REMS,
12873 .total_size = 256,
12874 .page_size = 256,
12875 .feature_bits = FEATURE_WRSR_EWSR,
12876 .tested = TEST_OK_PREW,
12877 .probe = probe_spi_rems,
12878 .probe_timing = TIMING_ZERO,
12879 .block_erasers =
12880 {
12881 {
12882 .eraseblocks = { {4 * 1024, 64} },
12883 .block_erase = spi_block_erase_20,
12884 }, {
12885 .eraseblocks = { {32 * 1024, 8} },
12886 .block_erase = spi_block_erase_52,
12887 }, {
12888 .eraseblocks = { {256 * 1024, 1} },
12889 .block_erase = spi_block_erase_60,
12890 },
12891 },
12892 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
12893 .unlock = spi_disable_blockprotect,
12894 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12895 .read = spi_chip_read, /* Fast read (0x0B) supported */
12896 .voltage = {2700, 3600},
12897 },
12898
12899 {
12900 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +000012901 .name = "SST25LF040A",
12902 .bustype = BUS_SPI,
12903 .manufacture_id = SST_ID,
12904 .model_id = SST_SST25VF040_REMS,
12905 .total_size = 512,
12906 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100012907 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100012908 .tested = TEST_OK_PREW,
stefanct753c1a52011-08-17 09:50:11 +000012909 .probe = probe_spi_res2,
12910 .probe_timing = TIMING_ZERO,
12911 .block_erasers =
12912 {
12913 {
12914 .eraseblocks = { {4 * 1024, 128} },
12915 .block_erase = spi_block_erase_20,
12916 }, {
12917 .eraseblocks = { {32 * 1024, 16} },
12918 .block_erase = spi_block_erase_52,
12919 }, {
12920 .eraseblocks = { {512 * 1024, 1} },
12921 .block_erase = spi_block_erase_60,
12922 },
12923 },
Alan Greena514de82019-09-09 16:40:10 +100012924 .printlock = spi_prettyprint_status_register_sst25,
stefanct753c1a52011-08-17 09:50:11 +000012925 .unlock = spi_disable_blockprotect,
12926 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12927 .read = spi_chip_read,
12928 .voltage = {3000, 3600},
12929 },
12930
12931 {
12932 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100012933 .name = "SST25LF080(A)",
12934 .bustype = BUS_SPI,
12935 .manufacture_id = SST_ID,
12936 .model_id = SST_SST25VF080_REMS,
12937 .total_size = 1024,
12938 .page_size = 256,
12939 .feature_bits = FEATURE_WRSR_EITHER,
12940 .tested = TEST_UNTESTED,
12941 .probe = probe_spi_res2,
12942 .probe_timing = TIMING_ZERO,
12943 .block_erasers =
12944 {
12945 {
12946 .eraseblocks = { {4 * 1024, 256} },
12947 .block_erase = spi_block_erase_20,
12948 }, {
12949 .eraseblocks = { {32 * 1024, 32} },
12950 .block_erase = spi_block_erase_52,
12951 }, {
12952 .eraseblocks = { {1024 * 1024, 1} },
12953 .block_erase = spi_block_erase_60,
12954 },
12955 },
12956 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
12957 .unlock = spi_disable_blockprotect,
12958 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12959 .read = spi_chip_read,
12960 .voltage = {3000, 3600},
12961 },
12962
12963 {
12964 .vendor = "SST",
stefanct753c1a52011-08-17 09:50:11 +000012965 .name = "SST25LF080A",
12966 .bustype = BUS_SPI,
12967 .manufacture_id = SST_ID,
12968 .model_id = SST_SST25VF080_REMS,
12969 .total_size = 1024,
12970 .page_size = 256,
12971 .tested = TEST_UNTESTED,
12972 .probe = probe_spi_res2,
12973 .probe_timing = TIMING_ZERO,
12974 .block_erasers =
12975 {
12976 {
12977 .eraseblocks = { {4 * 1024, 256} },
12978 .block_erase = spi_block_erase_20,
12979 }, {
12980 .eraseblocks = { {32 * 1024, 32} },
12981 .block_erase = spi_block_erase_52,
12982 }, {
12983 .eraseblocks = { {1024 * 1024, 1} },
12984 .block_erase = spi_block_erase_60,
12985 },
12986 },
12987 .unlock = spi_disable_blockprotect,
12988 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
12989 .read = spi_chip_read,
12990 .voltage = {3000, 3600},
12991 },
12992
12993 {
12994 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +000012995 .name = "SST25VF010",
hailfingere1e41ea2011-07-27 07:13:06 +000012996 .bustype = BUS_SPI,
hailfingerfb1f31f2010-12-03 14:48:11 +000012997 .manufacture_id = SST_ID,
12998 .model_id = SST_SST25VF010_REMS,
12999 .total_size = 128,
13000 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +100013001 .tested = TEST_OK_PREW,
hailfingerfb1f31f2010-12-03 14:48:11 +000013002 .probe = probe_spi_rems,
13003 .probe_timing = TIMING_ZERO,
13004 .block_erasers =
13005 {
13006 {
13007 .eraseblocks = { {4 * 1024, 32} },
13008 .block_erase = spi_block_erase_20,
13009 }, {
13010 .eraseblocks = { {32 * 1024, 4} },
13011 .block_erase = spi_block_erase_52,
13012 }, {
13013 .eraseblocks = { {128 * 1024, 1} },
13014 .block_erase = spi_block_erase_60,
13015 },
13016 },
13017 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013018 .write = spi_aai_write,
hailfingerfb1f31f2010-12-03 14:48:11 +000013019 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000013020 .voltage = {2700, 3600},
hailfingerfb1f31f2010-12-03 14:48:11 +000013021 },
13022
13023 {
David Hendricks668f29d2011-01-27 18:51:45 -080013024 .vendor = "SST",
Alan Greenb40ec892019-08-26 11:43:40 +100013025 .name = "SST25VF010(A)",
hailfingere1e41ea2011-07-27 07:13:06 +000013026 .bustype = BUS_SPI,
David Hendricks668f29d2011-01-27 18:51:45 -080013027 .manufacture_id = SST_ID,
13028 .model_id = SST_SST25VF010_REMS,
13029 .total_size = 128,
13030 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +100013031 .tested = TEST_OK_PREW,
David Hendricks668f29d2011-01-27 18:51:45 -080013032 .probe = probe_spi_rems,
13033 .probe_timing = TIMING_ZERO,
13034 .block_erasers =
13035 {
13036 {
13037 .eraseblocks = { {4 * 1024, 32} },
13038 .block_erase = spi_block_erase_20,
13039 }, {
13040 .eraseblocks = { {32 * 1024, 4} },
13041 .block_erase = spi_block_erase_52,
13042 }, {
13043 .eraseblocks = { {128 * 1024, 1} },
13044 .block_erase = spi_block_erase_60,
13045 },
13046 },
13047 .unlock = spi_disable_blockprotect,
13048 .write = spi_chip_write_1,
13049 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100013050 .voltage = {2700, 3600},
David Hendricks668f29d2011-01-27 18:51:45 -080013051 },
13052
13053 {
hailfingerfb1f31f2010-12-03 14:48:11 +000013054 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013055 .name = "SST25VF016B",
hailfingere1e41ea2011-07-27 07:13:06 +000013056 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013057 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013058 .model_id = SST_SST25VF016B,
hailfinger286829b2009-01-08 03:40:17 +000013059 .total_size = 2048,
13060 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013061 .feature_bits = FEATURE_WRSR_EITHER,
Alan Green1295b292019-07-30 13:38:04 +100013062 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013063 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013064 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013065 .block_erasers =
13066 {
13067 {
13068 .eraseblocks = { {4 * 1024, 512} },
13069 .block_erase = spi_block_erase_20,
13070 }, {
13071 .eraseblocks = { {32 * 1024, 64} },
13072 .block_erase = spi_block_erase_52,
13073 }, {
13074 .eraseblocks = { {64 * 1024, 32} },
13075 .block_erase = spi_block_erase_d8,
13076 }, {
13077 .eraseblocks = { {2 * 1024 * 1024, 1} },
13078 .block_erase = spi_block_erase_60,
13079 }, {
13080 .eraseblocks = { {2 * 1024 * 1024, 1} },
13081 .block_erase = spi_block_erase_c7,
13082 },
13083 },
hailfingerb9560ee2010-07-14 20:21:22 +000013084 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013085 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
hailfinger286829b2009-01-08 03:40:17 +000013086 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013087 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013088 },
13089
hailfinger286829b2009-01-08 03:40:17 +000013090 {
13091 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013092 .name = "SST25VF020",
13093 .bustype = BUS_SPI,
13094 .manufacture_id = SST_ID,
13095 .model_id = SST_SST25VF020_REMS,
13096 .total_size = 256,
13097 .page_size = 256,
13098 .feature_bits = FEATURE_WRSR_EWSR,
13099 .tested = TEST_UNTESTED,
13100 .probe = probe_spi_rems,
13101 .probe_timing = TIMING_ZERO,
13102 .block_erasers =
13103 {
13104 {
13105 .eraseblocks = { {4 * 1024, 64} },
13106 .block_erase = spi_block_erase_20,
13107 }, {
13108 .eraseblocks = { {32 * 1024, 8} },
13109 .block_erase = spi_block_erase_52,
13110 }, {
13111 .eraseblocks = { {256 * 1024, 1} },
13112 .block_erase = spi_block_erase_60,
13113 },
13114 },
13115 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13116 .unlock = spi_disable_blockprotect,
13117 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13118 .read = spi_chip_read, /* only */
13119 .voltage = {2700, 3600},
13120 },
13121
13122 {
13123 .vendor = "SST",
13124 .name = "SST25VF020B",
13125 .bustype = BUS_SPI,
13126 .manufacture_id = SST_ID,
13127 .model_id = SST_SST25VF020B,
13128 .total_size = 256,
13129 .page_size = 256,
13130 .feature_bits = FEATURE_WRSR_EWSR,
13131 .tested = TEST_OK_PREW,
13132 .probe = probe_spi_rdid,
13133 .probe_timing = TIMING_ZERO,
13134 .block_erasers =
13135 {
13136 {
13137 .eraseblocks = { {4 * 1024, 64} },
13138 .block_erase = spi_block_erase_20,
13139 }, {
13140 .eraseblocks = { {32 * 1024, 8} },
13141 .block_erase = spi_block_erase_52,
13142 }, {
13143 .eraseblocks = { {64 * 1024, 4} },
13144 .block_erase = spi_block_erase_d8,
13145 }, {
13146 .eraseblocks = { {256 * 1024, 1} },
13147 .block_erase = spi_block_erase_60,
13148 }, {
13149 .eraseblocks = { {256 * 1024, 1} },
13150 .block_erase = spi_block_erase_c7,
13151 },
13152 },
13153 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
13154 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
13155 .write = spi_aai_write, /* AAI supported (0xAD) */
13156 .read = spi_chip_read, /* Fast read (0x0B) supported */
13157 .voltage = {2700, 3600},
13158 },
13159
13160 {
13161 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013162 .name = "SST25VF032B",
hailfingere1e41ea2011-07-27 07:13:06 +000013163 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013164 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013165 .model_id = SST_SST25VF032B,
hailfinger286829b2009-01-08 03:40:17 +000013166 .total_size = 4096,
13167 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013168 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013169 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013170 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013171 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013172 .block_erasers =
13173 {
13174 {
13175 .eraseblocks = { {4 * 1024, 1024} },
13176 .block_erase = spi_block_erase_20,
13177 }, {
13178 .eraseblocks = { {32 * 1024, 128} },
13179 .block_erase = spi_block_erase_52,
13180 }, {
13181 .eraseblocks = { {64 * 1024, 64} },
13182 .block_erase = spi_block_erase_d8,
13183 }, {
13184 .eraseblocks = { {4 * 1024 * 1024, 1} },
13185 .block_erase = spi_block_erase_60,
13186 }, {
13187 .eraseblocks = { {4 * 1024 * 1024, 1} },
13188 .block_erase = spi_block_erase_c7,
13189 },
13190 },
Alan Greena514de82019-09-09 16:40:10 +100013191 .printlock = spi_prettyprint_status_register_sst25,
hailfingerb9560ee2010-07-14 20:21:22 +000013192 .unlock = spi_disable_blockprotect,
hailfinger081e3512010-10-05 22:29:08 +000013193 .write = spi_aai_write,
hailfinger3aa0df12009-12-23 12:16:47 +000013194 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013195 .voltage = {2700, 3600},
hailfinger3aa0df12009-12-23 12:16:47 +000013196 },
13197
13198 {
13199 .vendor = "SST",
stefanctd6efe1a2011-09-03 11:22:27 +000013200 .name = "SST25VF040",
hailfingere1e41ea2011-07-27 07:13:06 +000013201 .bustype = BUS_SPI,
hailfinger3aa0df12009-12-23 12:16:47 +000013202 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013203 .model_id = SST_SST25VF040_REMS,
hailfinger3aa0df12009-12-23 12:16:47 +000013204 .total_size = 512,
13205 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013206 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013207 .tested = TEST_OK_PR,
hailfinger3aa0df12009-12-23 12:16:47 +000013208 .probe = probe_spi_rems,
13209 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013210 .block_erasers =
13211 {
13212 {
13213 .eraseblocks = { {4 * 1024, 128} },
13214 .block_erase = spi_block_erase_20,
13215 }, {
13216 .eraseblocks = { {32 * 1024, 16} },
13217 .block_erase = spi_block_erase_52,
13218 }, {
13219 .eraseblocks = { {512 * 1024, 1} },
13220 .block_erase = spi_block_erase_60,
13221 },
13222 },
hailfingerb9560ee2010-07-14 20:21:22 +000013223 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013224 .write = spi_aai_write,
hailfinger286829b2009-01-08 03:40:17 +000013225 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000013226 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013227 },
13228
hailfinger286829b2009-01-08 03:40:17 +000013229 {
13230 .vendor = "SST",
13231 .name = "SST25VF040B",
hailfingere1e41ea2011-07-27 07:13:06 +000013232 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013233 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013234 .model_id = SST_SST25VF040B,
hailfinger286829b2009-01-08 03:40:17 +000013235 .total_size = 512,
13236 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013237 .feature_bits = FEATURE_WRSR_EWSR,
hailfinger286829b2009-01-08 03:40:17 +000013238 .tested = TEST_UNTESTED,
13239 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013240 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013241 .block_erasers =
13242 {
13243 {
13244 .eraseblocks = { {4 * 1024, 128} },
13245 .block_erase = spi_block_erase_20,
13246 }, {
13247 .eraseblocks = { {32 * 1024, 16} },
13248 .block_erase = spi_block_erase_52,
13249 }, {
13250 .eraseblocks = { {64 * 1024, 8} },
13251 .block_erase = spi_block_erase_d8,
13252 }, {
13253 .eraseblocks = { {512 * 1024, 1} },
13254 .block_erase = spi_block_erase_60,
13255 }, {
13256 .eraseblocks = { {512 * 1024, 1} },
13257 .block_erase = spi_block_erase_c7,
13258 },
13259 },
hailfingerb9560ee2010-07-14 20:21:22 +000013260 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013261 .write = spi_aai_write,
stuge48dda5c2009-02-25 08:07:33 +000013262 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013263 .voltage = {2700, 3600},
stuge48dda5c2009-02-25 08:07:33 +000013264 },
13265
13266 {
13267 .vendor = "SST",
stuge712ce862009-01-26 03:37:40 +000013268 .name = "SST25VF040B.REMS",
hailfingere1e41ea2011-07-27 07:13:06 +000013269 .bustype = BUS_SPI,
hailfingerc391ccb2009-06-12 11:45:10 +000013270 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013271 .model_id = SST_SST25VF040B_REMS,
stuge712ce862009-01-26 03:37:40 +000013272 .total_size = 512,
hailfinger3aa0df12009-12-23 12:16:47 +000013273 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013274 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013275 .tested = TEST_OK_PR,
stuge712ce862009-01-26 03:37:40 +000013276 .probe = probe_spi_rems,
hailfingere3095d92009-06-05 13:46:17 +000013277 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013278 .block_erasers =
13279 {
13280 {
13281 .eraseblocks = { {4 * 1024, 128} },
13282 .block_erase = spi_block_erase_20,
13283 }, {
13284 .eraseblocks = { {32 * 1024, 16} },
13285 .block_erase = spi_block_erase_52,
13286 }, {
13287 .eraseblocks = { {64 * 1024, 8} },
13288 .block_erase = spi_block_erase_d8,
13289 }, {
13290 .eraseblocks = { {512 * 1024, 1} },
13291 .block_erase = spi_block_erase_60,
13292 }, {
13293 .eraseblocks = { {512 * 1024, 1} },
13294 .block_erase = spi_block_erase_c7,
13295 },
13296 },
hailfingerb9560ee2010-07-14 20:21:22 +000013297 .unlock = spi_disable_blockprotect,
stefanct449d0342011-08-01 18:39:28 +000013298 .write = spi_aai_write,
stuge712ce862009-01-26 03:37:40 +000013299 .read = spi_chip_read,
stefanct66c8c1b2011-07-19 08:50:18 +000013300 .voltage = {2700, 3600},
stuge712ce862009-01-26 03:37:40 +000013301 },
13302
13303 {
13304 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100013305 .name = "SST25VF064C",
13306 .bustype = BUS_SPI,
13307 .manufacture_id = SST_ID,
13308 .model_id = SST_SST25VF064C,
13309 .total_size = 8192,
13310 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013311 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013312 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +100013313 .probe = probe_spi_rdid,
13314 .probe_timing = TIMING_ZERO,
13315 .block_erasers =
13316 {
13317 {
13318 .eraseblocks = { {4 * 1024, 2048} },
13319 .block_erase = spi_block_erase_20,
13320 }, {
13321 .eraseblocks = { {32 * 1024, 256} },
13322 .block_erase = spi_block_erase_52,
13323 }, {
13324 .eraseblocks = { {64 * 1024, 128} },
13325 .block_erase = spi_block_erase_d8,
13326 }, {
13327 .eraseblocks = { {8 * 1024 * 1024, 1} },
13328 .block_erase = spi_block_erase_60,
13329 }, {
13330 .eraseblocks = { {8 * 1024 * 1024, 1} },
13331 .block_erase = spi_block_erase_c7,
13332 },
13333 },
13334 .unlock = spi_disable_blockprotect,
13335 .write = spi_chip_write_256,
13336 .read = spi_chip_read,
13337 .voltage = {2700, 3600},
13338 },
13339
13340 {
13341 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013342 .name = "SST25VF080B",
hailfingere1e41ea2011-07-27 07:13:06 +000013343 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000013344 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013345 .model_id = SST_SST25VF080B,
hailfinger286829b2009-01-08 03:40:17 +000013346 .total_size = 1024,
13347 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100013348 .feature_bits = FEATURE_WRSR_EWSR,
Alan Green1295b292019-07-30 13:38:04 +100013349 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000013350 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000013351 .probe_timing = TIMING_ZERO,
hailfinger3aa0df12009-12-23 12:16:47 +000013352 .block_erasers =
13353 {
13354 {
13355 .eraseblocks = { {4 * 1024, 256} },
13356 .block_erase = spi_block_erase_20,
13357 }, {
13358 .eraseblocks = { {32 * 1024, 32} },
13359 .block_erase = spi_block_erase_52,
13360 }, {
13361 .eraseblocks = { {64 * 1024, 16} },
13362 .block_erase = spi_block_erase_d8,
13363 }, {
13364 .eraseblocks = { {1024 * 1024, 1} },
13365 .block_erase = spi_block_erase_60,
13366 }, {
13367 .eraseblocks = { {1024 * 1024, 1} },
13368 .block_erase = spi_block_erase_c7,
13369 },
13370 },
hailfingerb9560ee2010-07-14 20:21:22 +000013371 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000013372 .write = spi_chip_write_1,
hailfinger286829b2009-01-08 03:40:17 +000013373 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000013374 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013375 },
13376
hailfinger286829b2009-01-08 03:40:17 +000013377 {
13378 .vendor = "SST",
Nikolai Artemievd91a4862020-08-31 17:49:01 +100013379 .name = "SST25VF512(A)",
13380 .bustype = BUS_SPI,
13381 .manufacture_id = SST_ID,
13382 .model_id = SST_SST25VF512_REMS,
13383 .total_size = 64,
13384 .page_size = 256,
13385 .feature_bits = FEATURE_WRSR_EWSR,
13386 .tested = TEST_OK_PREW,
13387 .probe = probe_spi_rems,
13388 .probe_timing = TIMING_ZERO,
13389 .block_erasers =
13390 {
13391 {
13392 .eraseblocks = { {4 * 1024, 16} },
13393 .block_erase = spi_block_erase_20,
13394 }, {
13395 .eraseblocks = { {32 * 1024, 2} },
13396 .block_erase = spi_block_erase_52,
13397 }, {
13398 .eraseblocks = { {32 * 1024, 2} },
13399 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
13400 }, {
13401 .eraseblocks = { {64 * 1024, 1} },
13402 .block_erase = spi_block_erase_60,
13403 }, {
13404 .eraseblocks = { {64 * 1024, 1} },
13405 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
13406 },
13407 },
13408 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13409 .unlock = spi_disable_blockprotect,
13410 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13411 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
13412 .voltage = {2700, 3600},
13413 },
13414
13415 {
13416 .vendor = "SST",
13417 .name = "SST25WF010",
13418 .bustype = BUS_SPI,
13419 .manufacture_id = SST_ID,
13420 .model_id = SST_SST25WF010,
13421 .total_size = 128,
13422 .page_size = 256,
13423 .feature_bits = FEATURE_WRSR_EITHER,
13424 .tested = TEST_UNTESTED,
13425 .probe = probe_spi_rdid,
13426 .probe_timing = TIMING_ZERO,
13427 .block_erasers =
13428 {
13429 {
13430 .eraseblocks = { {4 * 1024, 32} },
13431 .block_erase = spi_block_erase_20,
13432 }, {
13433 .eraseblocks = { {32 * 1024, 4} },
13434 .block_erase = spi_block_erase_52,
13435 }, {
13436 .eraseblocks = { {1024 * 128, 1} },
13437 .block_erase = spi_block_erase_60,
13438 }, {
13439 .eraseblocks = { {1024 * 128, 1} },
13440 .block_erase = spi_block_erase_c7,
13441 },
13442 },
13443 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13444 .unlock = spi_disable_blockprotect_bp2_srwd,
13445 .write = spi_aai_write,
13446 .read = spi_chip_read, /* Fast read (0x0B) supported */
13447 .voltage = {1650, 1950},
13448 },
13449
13450 {
13451 .vendor = "SST",
13452 .name = "SST25WF020",
13453 .bustype = BUS_SPI,
13454 .manufacture_id = SST_ID,
13455 .model_id = SST_SST25WF020,
13456 .total_size = 256,
13457 .page_size = 256,
13458 .feature_bits = FEATURE_WRSR_EITHER,
13459 .tested = TEST_UNTESTED,
13460 .probe = probe_spi_rdid,
13461 .probe_timing = TIMING_ZERO,
13462 .block_erasers =
13463 {
13464 {
13465 .eraseblocks = { {4 * 1024, 64} },
13466 .block_erase = spi_block_erase_20,
13467 }, {
13468 .eraseblocks = { {32 * 1024, 8} },
13469 .block_erase = spi_block_erase_52,
13470 }, {
13471 .eraseblocks = { {64 * 1024, 4} },
13472 .block_erase = spi_block_erase_d8,
13473 }, {
13474 .eraseblocks = { {1024 * 256, 1} },
13475 .block_erase = spi_block_erase_60,
13476 }, {
13477 .eraseblocks = { {1024 * 256, 1} },
13478 .block_erase = spi_block_erase_c7,
13479 },
13480 },
13481 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13482 .unlock = spi_disable_blockprotect_bp2_srwd,
13483 .write = spi_aai_write,
13484 .read = spi_chip_read, /* Fast read (0x0B) supported */
13485 .voltage = {1650, 1950},
13486 },
13487
13488 {
13489 .vendor = "SST",
Nikolai Artemievfe595da2020-08-31 17:49:27 +100013490 .name = "SST25WF020A",
13491 .bustype = BUS_SPI,
13492 .manufacture_id = SANYO_ID, /* See flashchips.h */
13493 .model_id = SST_SST25WF020A,
13494 .total_size = 256,
13495 .page_size = 256,
13496 .feature_bits = FEATURE_WRSR_WREN,
13497 .tested = TEST_UNTESTED,
13498 .probe = probe_spi_rdid,
13499 .probe_timing = TIMING_ZERO,
13500 .block_erasers =
13501 {
13502 {
13503 .eraseblocks = { {4 * 1024, 64} },
13504 .block_erase = spi_block_erase_20,
13505 }, {
13506 .eraseblocks = { {64 * 1024, 4} },
13507 .block_erase = spi_block_erase_d8,
13508 }, {
13509 .eraseblocks = { {256 * 1024, 1} },
13510 .block_erase = spi_block_erase_60,
13511 }, {
13512 .eraseblocks = { {256 * 1024, 1} },
13513 .block_erase = spi_block_erase_c7,
13514 },
13515 },
13516 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13517 .unlock = spi_disable_blockprotect_bp2_srwd,
13518 .write = spi_chip_write_256,
13519 .read = spi_chip_read, /* Fast read (0x0B) supported */
13520 .voltage = {1650, 1950},
13521 },
13522
13523 {
13524 .vendor = "SST",
13525 .name = "SST25WF040",
13526 .bustype = BUS_SPI,
13527 .manufacture_id = SST_ID,
13528 .model_id = SST_SST25WF040,
13529 .total_size = 512,
13530 .page_size = 256,
13531 .feature_bits = FEATURE_WRSR_EITHER,
13532 .tested = TEST_UNTESTED,
13533 .probe = probe_spi_rdid,
13534 .probe_timing = TIMING_ZERO,
13535 .block_erasers =
13536 {
13537 {
13538 .eraseblocks = { {4 * 1024, 128} },
13539 .block_erase = spi_block_erase_20,
13540 }, {
13541 .eraseblocks = { {32 * 1024, 16} },
13542 .block_erase = spi_block_erase_52,
13543 }, {
13544 .eraseblocks = { {64 * 1024, 8} },
13545 .block_erase = spi_block_erase_d8,
13546 }, {
13547 .eraseblocks = { {1024 * 512, 1} },
13548 .block_erase = spi_block_erase_60,
13549 }, {
13550 .eraseblocks = { {1024 * 512, 1} },
13551 .block_erase = spi_block_erase_c7,
13552 },
13553 },
13554 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13555 .unlock = spi_disable_blockprotect_bp2_srwd,
13556 .write = spi_aai_write,
13557 .read = spi_chip_read, /* Fast read (0x0B) supported */
13558 .voltage = {1650, 1950},
13559 },
13560
13561 {
13562 .vendor = "SST",
13563 .name = "SST25WF040B",
13564 .bustype = BUS_SPI,
13565 .manufacture_id = SANYO_ID, /* See flashchips.h */
13566 .model_id = SST_SST25WF040B,
13567 .total_size = 512,
13568 .page_size = 256,
13569 .feature_bits = FEATURE_WRSR_WREN,
13570 .tested = TEST_UNTESTED,
13571 .probe = probe_spi_rdid,
13572 .probe_timing = TIMING_ZERO,
13573 .block_erasers =
13574 {
13575 {
13576 .eraseblocks = { {4 * 1024, 128} },
13577 .block_erase = spi_block_erase_20,
13578 }, {
13579 .eraseblocks = { {64 * 1024, 8} },
13580 .block_erase = spi_block_erase_d8,
13581 }, {
13582 .eraseblocks = { {512 * 1024, 1} },
13583 .block_erase = spi_block_erase_60,
13584 }, {
13585 .eraseblocks = { {512 * 1024, 1} },
13586 .block_erase = spi_block_erase_c7,
13587 },
13588 },
13589 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13590 .unlock = spi_disable_blockprotect_bp2_srwd,
13591 .write = spi_chip_write_256,
13592 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13593 .voltage = {1650, 1950},
13594 },
13595
13596 {
13597 .vendor = "SST",
13598 .name = "SST25WF080",
13599 .bustype = BUS_SPI,
13600 .manufacture_id = SST_ID,
13601 .model_id = SST_SST25WF080,
13602 .total_size = 1024,
13603 .page_size = 256,
13604 .feature_bits = FEATURE_WRSR_EITHER,
13605 .tested = TEST_OK_PREW,
13606 .probe = probe_spi_rdid,
13607 .probe_timing = TIMING_ZERO,
13608 .block_erasers =
13609 {
13610 {
13611 .eraseblocks = { {4 * 1024, 256} },
13612 .block_erase = spi_block_erase_20,
13613 }, {
13614 .eraseblocks = { {32 * 1024, 32} },
13615 .block_erase = spi_block_erase_52,
13616 }, {
13617 .eraseblocks = { {64 * 1024, 16} },
13618 .block_erase = spi_block_erase_d8,
13619 }, {
13620 .eraseblocks = { {1024 * 1024, 1} },
13621 .block_erase = spi_block_erase_60,
13622 }, {
13623 .eraseblocks = { {1024 * 1024, 1} },
13624 .block_erase = spi_block_erase_c7,
13625 },
13626 },
13627 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
13628 .unlock = spi_disable_blockprotect_bp3_srwd,
13629 .write = spi_aai_write,
13630 .read = spi_chip_read, /* Fast read (0x0B) supported */
13631 .voltage = {1650, 1950},
13632 },
13633
13634 {
13635 .vendor = "SST",
13636 .name = "SST25WF080B",
13637 .bustype = BUS_SPI,
13638 .manufacture_id = SANYO_ID, /* See flashchips.h */
13639 .model_id = SST_SST25WF080B,
13640 .total_size = 1024,
13641 .page_size = 256,
13642 .feature_bits = FEATURE_WRSR_WREN,
13643 .tested = TEST_OK_PREW,
13644 .probe = probe_spi_rdid,
13645 .probe_timing = TIMING_ZERO,
13646 .block_erasers =
13647 {
13648 {
13649 .eraseblocks = { {4 * 1024, 256} },
13650 .block_erase = spi_block_erase_20,
13651 }, {
13652 .eraseblocks = { {64 * 1024, 16} },
13653 .block_erase = spi_block_erase_d8,
13654 }, {
13655 .eraseblocks = { {1024 * 1024, 1} },
13656 .block_erase = spi_block_erase_60,
13657 }, {
13658 .eraseblocks = { {1024 * 1024, 1} },
13659 .block_erase = spi_block_erase_c7,
13660 },
13661 },
13662 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
13663 .unlock = spi_disable_blockprotect_bp2_srwd,
13664 .write = spi_chip_write_256,
13665 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
13666 .voltage = {1650, 1950},
13667 },
13668
13669 {
13670 .vendor = "SST",
13671 .name = "SST25WF512",
13672 .bustype = BUS_SPI,
13673 .manufacture_id = SST_ID,
13674 .model_id = SST_SST25WF512,
13675 .total_size = 64,
13676 .page_size = 256,
13677 .feature_bits = FEATURE_WRSR_EITHER,
13678 .tested = TEST_UNTESTED,
13679 .probe = probe_spi_rdid,
13680 .probe_timing = TIMING_ZERO,
13681 .block_erasers =
13682 {
13683 {
13684 .eraseblocks = { {4 * 1024, 16} },
13685 .block_erase = spi_block_erase_20,
13686 }, {
13687 .eraseblocks = { {32 * 1024, 2} },
13688 .block_erase = spi_block_erase_52,
13689 }, {
13690 .eraseblocks = { {1024 * 64, 1} },
13691 .block_erase = spi_block_erase_60,
13692 }, {
13693 .eraseblocks = { {1024 * 64, 1} },
13694 .block_erase = spi_block_erase_c7,
13695 },
13696 },
13697 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
13698 .unlock = spi_disable_blockprotect_bp2_srwd,
13699 .write = spi_aai_write,
13700 .read = spi_chip_read, /* Fast read (0x0B) supported */
13701 .voltage = {1650, 1950},
13702 },
13703
13704 {
13705 .vendor = "SST",
13706 .name = "SST26VF016B(A)",
13707 .bustype = BUS_SPI,
13708 .manufacture_id = SST_ID,
13709 .model_id = SST_SST26VF016B,
13710 .total_size = 2048,
13711 .page_size = 256,
13712 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13713 .tested = TEST_OK_PREW,
13714 .probe = probe_spi_rdid,
13715 .probe_timing = TIMING_ZERO,
13716 .block_erasers =
13717 {
13718 {
13719 .eraseblocks = { {4 * 1024, 512} },
13720 .block_erase = spi_block_erase_20,
13721 }, {
13722 .eraseblocks = {
13723 {8 * 1024, 4},
13724 {32 * 1024, 1},
13725 {64 * 1024, 30},
13726 {32 * 1024, 1},
13727 {8 * 1024, 4},
13728 },
13729 .block_erase = spi_block_erase_d8,
13730 }, {
13731 .eraseblocks = { {2 * 1024 * 1024, 1} },
13732 .block_erase = spi_block_erase_c7,
13733 },
13734 },
13735 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13736 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13737 .write = spi_chip_write_256, /* Multi I/O supported */
13738 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13739 .voltage = {2700, 3600},
13740 },
13741
13742 {
13743 .vendor = "SST",
13744 .name = "SST26VF032B(A)",
13745 .bustype = BUS_SPI,
13746 .manufacture_id = SST_ID,
13747 .model_id = SST_SST26VF032B,
13748 .total_size = 4096,
13749 .page_size = 256,
13750 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13751 .tested = TEST_UNTESTED,
13752 .probe = probe_spi_rdid,
13753 .probe_timing = TIMING_ZERO,
13754 .block_erasers =
13755 {
13756 {
13757 .eraseblocks = { {4 * 1024, 1024} },
13758 .block_erase = spi_block_erase_20,
13759 }, {
13760 .eraseblocks = {
13761 {8 * 1024, 4},
13762 {32 * 1024, 1},
13763 {64 * 1024, 62},
13764 {32 * 1024, 1},
13765 {8 * 1024, 4},
13766 },
13767 .block_erase = spi_block_erase_d8,
13768 }, {
13769 .eraseblocks = { {4 * 1024 * 1024, 1} },
13770 .block_erase = spi_block_erase_c7,
13771 },
13772 },
13773 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13774 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13775 .write = spi_chip_write_256, /* Multi I/O supported */
13776 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13777 .voltage = {2700, 3600},
13778 },
13779
13780 {
13781 .vendor = "SST",
13782 .name = "SST26VF064B(A)",
13783 .bustype = BUS_SPI,
13784 .manufacture_id = SST_ID,
13785 .model_id = SST_SST26VF064B,
13786 .total_size = 8192,
13787 .page_size = 256,
13788 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13789 .tested = TEST_OK_PREW,
13790 .probe = probe_spi_rdid,
13791 .probe_timing = TIMING_ZERO,
13792 .block_erasers =
13793 {
13794 {
13795 .eraseblocks = { {4 * 1024, 2048} },
13796 .block_erase = spi_block_erase_20,
13797 }, {
13798 .eraseblocks = {
13799 {8 * 1024, 4},
13800 {32 * 1024, 1},
13801 {64 * 1024, 126},
13802 {32 * 1024, 1},
13803 {8 * 1024, 4},
13804 },
13805 .block_erase = spi_block_erase_d8,
13806 }, {
13807 .eraseblocks = { {8 * 1024 * 1024, 1} },
13808 .block_erase = spi_block_erase_c7,
13809 },
13810 },
13811 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
13812 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
13813 .write = spi_chip_write_256, /* Multi I/O supported */
13814 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13815 .voltage = {2700, 3600},
13816 },
13817
13818 {
13819 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013820 .name = "SST28SF040A",
hailfingere1e41ea2011-07-27 07:13:06 +000013821 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013822 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013823 .model_id = SST_SST28SF040,
hailfinger286829b2009-01-08 03:40:17 +000013824 .total_size = 512,
13825 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000013826 .feature_bits = 0,
hailfinger286829b2009-01-08 03:40:17 +000013827 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000013828 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000013829 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
snelson264e57c2010-01-20 20:55:53 +000013830 .block_erasers =
13831 {
13832 {
13833 .eraseblocks = { {128, 4096} },
13834 .block_erase = erase_sector_28sf040,
13835 }, {
13836 .eraseblocks = { {512 * 1024, 1} },
13837 .block_erase = erase_chip_28sf040,
13838 }
13839 },
hailfinger86bf3b52010-10-13 21:49:30 +000013840 .unlock = unprotect_28sf040,
hailfinger286829b2009-01-08 03:40:17 +000013841 .write = write_28sf040,
hailfinger23060112009-05-08 12:49:03 +000013842 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013843 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013844 },
13845
hailfinger286829b2009-01-08 03:40:17 +000013846 {
13847 .vendor = "SST",
13848 .name = "SST29EE010",
hailfingere1e41ea2011-07-27 07:13:06 +000013849 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013850 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013851 .model_id = SST_SST29EE010,
hailfinger286829b2009-01-08 03:40:17 +000013852 .total_size = 128,
13853 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000013854 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000013855 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000013856 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060013857 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000013858 .block_erasers =
13859 {
13860 {
13861 .eraseblocks = { {128 * 1024, 1} },
13862 .block_erase = erase_chip_block_jedec,
13863 }
13864 },
hailfinger286829b2009-01-08 03:40:17 +000013865 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000013866 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013867 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013868 },
13869
hailfinger286829b2009-01-08 03:40:17 +000013870 {
13871 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013872 .name = "SST29EE020A",
hailfingere1e41ea2011-07-27 07:13:06 +000013873 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013874 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013875 .model_id = SST_SST29EE020A,
hailfinger286829b2009-01-08 03:40:17 +000013876 .total_size = 256,
13877 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000013878 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000013879 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000013880 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000013881 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000013882 .block_erasers =
13883 {
13884 {
13885 .eraseblocks = { {256 * 1024, 1} },
13886 .block_erase = erase_chip_block_jedec,
13887 }
13888 },
hailfinger286829b2009-01-08 03:40:17 +000013889 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000013890 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013891 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013892 },
13893
hailfinger286829b2009-01-08 03:40:17 +000013894 {
13895 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100013896 .name = "SST29LE010",
13897 .bustype = BUS_PARALLEL,
13898 .manufacture_id = SST_ID,
13899 .model_id = SST_SST29LE010,
13900 .total_size = 128,
13901 .page_size = 128,
13902 .feature_bits = FEATURE_LONG_RESET,
13903 .tested = TEST_UNTESTED,
13904 .probe = probe_jedec,
13905 .probe_timing = 10,
13906 .block_erasers =
13907 {
13908 {
13909 .eraseblocks = { {128 * 1024, 1} },
13910 .block_erase = erase_chip_block_jedec,
13911 }
13912 },
13913 .write = write_jedec,
13914 .read = read_memmapped,
13915 .voltage = {3000, 3600},
13916 },
13917
13918 {
13919 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000013920 .name = "SST29LE020",
hailfingere1e41ea2011-07-27 07:13:06 +000013921 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013922 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013923 .model_id = SST_SST29LE020,
hailfinger286829b2009-01-08 03:40:17 +000013924 .total_size = 256,
13925 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000013926 .feature_bits = FEATURE_LONG_RESET,
hailfingerd217d122010-10-08 18:52:29 +000013927 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000013928 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060013929 .probe_timing = 10,
snelson264e57c2010-01-20 20:55:53 +000013930 .block_erasers =
13931 {
13932 {
13933 .eraseblocks = { {256 * 1024, 1} },
13934 .block_erase = erase_chip_block_jedec,
13935 }
13936 },
hailfinger286829b2009-01-08 03:40:17 +000013937 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000013938 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013939 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000013940 },
13941
hailfinger286829b2009-01-08 03:40:17 +000013942 {
13943 .vendor = "SST",
13944 .name = "SST39SF010A",
hailfingere1e41ea2011-07-27 07:13:06 +000013945 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013946 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013947 .model_id = SST_SST39SF010,
hailfinger286829b2009-01-08 03:40:17 +000013948 .total_size = 128,
13949 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000013950 .feature_bits = FEATURE_EITHER_RESET,
stefanct371e7e82011-07-07 19:56:58 +000013951 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013952 .probe = probe_jedec,
hailfingerc391ccb2009-06-12 11:45:10 +000013953 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000013954 .block_erasers =
13955 {
13956 {
13957 .eraseblocks = { {4 * 1024, 32} },
13958 .block_erase = erase_sector_jedec,
13959 }, {
13960 .eraseblocks = { {128 * 1024, 1} },
13961 .block_erase = erase_chip_block_jedec,
13962 }
13963 },
snelsonc6855342010-01-28 23:55:12 +000013964 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000013965 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013966 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013967 },
13968
hailfinger286829b2009-01-08 03:40:17 +000013969 {
13970 .vendor = "SST",
13971 .name = "SST39SF020A",
hailfingere1e41ea2011-07-27 07:13:06 +000013972 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000013973 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000013974 .model_id = SST_SST39SF020,
hailfinger286829b2009-01-08 03:40:17 +000013975 .total_size = 256,
13976 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000013977 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100013978 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000013979 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000013980 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000013981 .block_erasers =
13982 {
13983 {
13984 .eraseblocks = { {4 * 1024, 64} },
13985 .block_erase = erase_sector_jedec,
13986 }, {
13987 .eraseblocks = { {256 * 1024, 1} },
13988 .block_erase = erase_chip_block_jedec,
13989 }
13990 },
snelsonc6855342010-01-28 23:55:12 +000013991 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000013992 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000013993 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000013994 },
13995
hailfinger286829b2009-01-08 03:40:17 +000013996 {
13997 .vendor = "SST",
13998 .name = "SST39SF040",
hailfingere1e41ea2011-07-27 07:13:06 +000013999 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014000 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014001 .model_id = SST_SST39SF040,
hailfinger286829b2009-01-08 03:40:17 +000014002 .total_size = 512,
14003 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014004 .feature_bits = FEATURE_EITHER_RESET,
stefanctd6efe1a2011-09-03 11:22:27 +000014005 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014006 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014007 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014008 .block_erasers =
14009 {
14010 {
14011 .eraseblocks = { {4 * 1024, 128} },
14012 .block_erase = erase_sector_jedec,
14013 }, {
14014 .eraseblocks = { {512 * 1024, 1} },
14015 .block_erase = erase_chip_block_jedec,
14016 }
14017 },
snelsonc6855342010-01-28 23:55:12 +000014018 .write = write_jedec_1,
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 = "SST39SF512",
hailfingere1e41ea2011-07-27 07:13:06 +000014026 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014027 .manufacture_id = SST_ID,
Alan Greend76dc1f2019-06-26 15:38:19 +100014028 .model_id = SST_SST39SF512,
hailfinger286829b2009-01-08 03:40:17 +000014029 .total_size = 64,
14030 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014031 .feature_bits = FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100014032 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014033 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014034 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014035 .block_erasers =
14036 {
14037 {
14038 .eraseblocks = { {4 * 1024, 16} },
14039 .block_erase = erase_sector_jedec,
14040 }, {
14041 .eraseblocks = { {64 * 1024, 1} },
14042 .block_erase = erase_chip_block_jedec,
14043 }
14044 },
snelsonc6855342010-01-28 23:55:12 +000014045 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014046 .read = read_memmapped,
Alan Greend76dc1f2019-06-26 15:38:19 +100014047 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014048 },
14049
hailfinger286829b2009-01-08 03:40:17 +000014050 {
14051 .vendor = "SST",
14052 .name = "SST39VF010",
hailfingere1e41ea2011-07-27 07:13:06 +000014053 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014054 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014055 .model_id = SST_SST39VF010,
hailfinger286829b2009-01-08 03:40:17 +000014056 .total_size = 128,
14057 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014058 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014059 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014060 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014061 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014062 .block_erasers =
14063 {
14064 {
14065 .eraseblocks = { {4 * 1024, 32} },
14066 .block_erase = erase_sector_jedec,
14067 }, {
14068 .eraseblocks = { {128 * 1024, 1} },
14069 .block_erase = erase_chip_block_jedec,
14070 }
14071 },
snelsonc6855342010-01-28 23:55:12 +000014072 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014073 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014074 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014075 },
14076
hailfinger286829b2009-01-08 03:40:17 +000014077 {
14078 .vendor = "SST",
14079 .name = "SST39VF020",
hailfingere1e41ea2011-07-27 07:13:06 +000014080 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014081 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014082 .model_id = SST_SST39VF020,
hailfinger286829b2009-01-08 03:40:17 +000014083 .total_size = 256,
14084 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014085 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014086 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014087 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014088 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014089 .block_erasers =
14090 {
14091 {
14092 .eraseblocks = { {4 * 1024, 64} },
14093 .block_erase = erase_sector_jedec,
14094 }, {
14095 .eraseblocks = { {256 * 1024, 1} },
14096 .block_erase = erase_chip_block_jedec,
14097 }
14098 },
snelsonc6855342010-01-28 23:55:12 +000014099 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014100 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014101 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014102 },
14103
hailfinger286829b2009-01-08 03:40:17 +000014104 {
14105 .vendor = "SST",
14106 .name = "SST39VF040",
hailfingere1e41ea2011-07-27 07:13:06 +000014107 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014108 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014109 .model_id = SST_SST39VF040,
hailfinger286829b2009-01-08 03:40:17 +000014110 .total_size = 512,
14111 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014112 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014113 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014114 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014115 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014116 .block_erasers =
14117 {
14118 {
14119 .eraseblocks = { {4 * 1024, 128} },
14120 .block_erase = erase_sector_jedec,
14121 }, {
14122 .eraseblocks = { {512 * 1024, 1} },
14123 .block_erase = erase_chip_block_jedec,
14124 }
14125 },
snelsonc6855342010-01-28 23:55:12 +000014126 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014127 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014128 .voltage = {2700, 3600},
hailfingerdfa338f2008-12-08 23:51:45 +000014129 },
stepanaa1b6a22008-12-08 18:15:10 +000014130
hailfinger286829b2009-01-08 03:40:17 +000014131 {
14132 .vendor = "SST",
stuged9f66152009-01-25 23:55:12 +000014133 .name = "SST39VF080",
hailfingere1e41ea2011-07-27 07:13:06 +000014134 .bustype = BUS_PARALLEL,
hailfingerc391ccb2009-06-12 11:45:10 +000014135 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014136 .model_id = SST_SST39VF080,
stuged9f66152009-01-25 23:55:12 +000014137 .total_size = 1024,
14138 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014139 .feature_bits = FEATURE_EITHER_RESET,
stuged9f66152009-01-25 23:55:12 +000014140 .tested = TEST_UNTESTED,
14141 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014142 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014143 .block_erasers =
14144 {
14145 {
14146 .eraseblocks = { {4 * 1024, 256} },
14147 .block_erase = erase_sector_jedec,
14148 }, {
14149 .eraseblocks = { {64 * 1024, 16} },
14150 .block_erase = erase_block_jedec,
14151 }, {
14152 .eraseblocks = { {1024 * 1024, 1} },
14153 .block_erase = erase_chip_block_jedec,
14154 }
14155 },
snelsonc6855342010-01-28 23:55:12 +000014156 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014157 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014158 .voltage = {2700, 3600},
stuged9f66152009-01-25 23:55:12 +000014159 },
14160
14161 {
14162 .vendor = "SST",
Alan Greend76dc1f2019-06-26 15:38:19 +100014163 .name = "SST39VF512",
14164 .bustype = BUS_PARALLEL,
14165 .manufacture_id = SST_ID,
14166 .model_id = SST_SST39VF512,
14167 .total_size = 64,
14168 .page_size = 4096,
14169 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014170 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100014171 .probe = probe_jedec,
14172 .probe_timing = 1, /* 150 ns */
14173 .block_erasers =
14174 {
14175 {
14176 .eraseblocks = { {4 * 1024, 16} },
14177 .block_erase = erase_sector_jedec,
14178 }, {
14179 .eraseblocks = { {64 * 1024, 1} },
14180 .block_erase = erase_chip_block_jedec,
14181 }
14182 },
14183 .write = write_jedec_1,
14184 .read = read_memmapped,
14185 .voltage = {2700, 3600},
14186 },
14187
14188 {
14189 .vendor = "SST",
hailfinger286829b2009-01-08 03:40:17 +000014190 .name = "SST49LF002A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014191 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014192 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014193 .model_id = SST_SST49LF002A,
hailfinger286829b2009-01-08 03:40:17 +000014194 .total_size = 256,
14195 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014196 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014197 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014198 .probe = probe_jedec,
14199 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014200 .block_erasers =
14201 {
14202 {
14203 .eraseblocks = { {4 * 1024, 64} },
snelson712e72d2010-03-16 03:09:10 +000014204 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014205 }, {
14206 .eraseblocks = { {16 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +000014207 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014208 }, {
14209 .eraseblocks = { {256 * 1024, 1} },
14210 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14211 }
14212 },
hailfingerb8e4e212010-03-15 03:48:42 +000014213 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014214 .unlock = unlock_sst_fwhub,
14215 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014216 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014217 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014218 },
14219
hailfinger286829b2009-01-08 03:40:17 +000014220 {
14221 .vendor = "SST",
14222 .name = "SST49LF003A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014223 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014224 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014225 .model_id = SST_SST49LF003A,
hailfinger286829b2009-01-08 03:40:17 +000014226 .total_size = 384,
14227 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014228 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014229 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014230 .probe = probe_jedec,
14231 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014232 .block_erasers =
14233 {
14234 {
14235 .eraseblocks = { {4 * 1024, 96} },
snelson712e72d2010-03-16 03:09:10 +000014236 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014237 }, {
14238 .eraseblocks = { {64 * 1024, 6} },
snelson712e72d2010-03-16 03:09:10 +000014239 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014240 }, {
14241 .eraseblocks = { {384 * 1024, 1} },
14242 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14243 }
14244 },
hailfingerb8e4e212010-03-15 03:48:42 +000014245 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014246 .unlock = unlock_sst_fwhub,
14247 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014248 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014249 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014250 },
14251
hailfinger286829b2009-01-08 03:40:17 +000014252 {
hailfinger80f48682009-09-23 22:01:33 +000014253 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
14254 * and is only honored for 64k block erase, but not 4k sector erase.
14255 */
hailfinger286829b2009-01-08 03:40:17 +000014256 .vendor = "SST",
14257 .name = "SST49LF004A/B",
hailfingere1e41ea2011-07-27 07:13:06 +000014258 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014259 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014260 .model_id = SST_SST49LF004A,
hailfinger286829b2009-01-08 03:40:17 +000014261 .total_size = 512,
14262 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014263 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014264 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014265 .probe = probe_jedec,
14266 .probe_timing = 1, /* 150 ns */
hailfinger80f48682009-09-23 22:01:33 +000014267 .block_erasers =
14268 {
14269 {
14270 .eraseblocks = { {4 * 1024, 128} },
snelson712e72d2010-03-16 03:09:10 +000014271 .block_erase = erase_sector_jedec,
hailfinger80f48682009-09-23 22:01:33 +000014272 }, {
14273 .eraseblocks = { {64 * 1024, 8} },
snelson712e72d2010-03-16 03:09:10 +000014274 .block_erase = erase_block_jedec,
hailfinger80f48682009-09-23 22:01:33 +000014275 }, {
14276 .eraseblocks = { {512 * 1024, 1} },
snelson264e57c2010-01-20 20:55:53 +000014277 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
hailfinger80f48682009-09-23 22:01:33 +000014278 },
14279 },
hailfingerb8e4e212010-03-15 03:48:42 +000014280 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014281 .unlock = unlock_sst_fwhub,
14282 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014283 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014284 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014285 },
14286
hailfinger286829b2009-01-08 03:40:17 +000014287 {
14288 .vendor = "SST",
14289 .name = "SST49LF004C",
hailfingere1e41ea2011-07-27 07:13:06 +000014290 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014291 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014292 .model_id = SST_SST49LF004C,
hailfinger286829b2009-01-08 03:40:17 +000014293 .total_size = 512,
14294 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014295 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014296 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000014297 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014298 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014299 .block_erasers =
14300 {
14301 {
14302 .eraseblocks = { {4 * 1024, 128} },
14303 .block_erase = erase_sector_49lfxxxc,
14304 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014305 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014306 {64 * 1024, 7},
14307 {32 * 1024, 1},
14308 {8 * 1024, 2},
14309 {16 * 1024, 1},
14310 },
snelson3a69e422010-03-23 17:10:28 +000014311 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014312 }
14313 },
snelson3a69e422010-03-23 17:10:28 +000014314 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +000014315 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014316 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014317 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014318 },
14319
hailfinger286829b2009-01-08 03:40:17 +000014320 {
14321 .vendor = "SST",
14322 .name = "SST49LF008A",
hailfingere1e41ea2011-07-27 07:13:06 +000014323 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014324 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014325 .model_id = SST_SST49LF008A,
hailfinger286829b2009-01-08 03:40:17 +000014326 .total_size = 1024,
14327 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014328 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000014329 .tested = TEST_OK_PREW,
hailfingerb8e4e212010-03-15 03:48:42 +000014330 .probe = probe_jedec,
14331 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014332 .block_erasers =
14333 {
14334 {
14335 .eraseblocks = { {4 * 1024, 256} },
snelson712e72d2010-03-16 03:09:10 +000014336 .block_erase = erase_sector_jedec,
snelson264e57c2010-01-20 20:55:53 +000014337 }, {
14338 .eraseblocks = { {64 * 1024, 16} },
snelson712e72d2010-03-16 03:09:10 +000014339 .block_erase = erase_block_jedec,
snelson264e57c2010-01-20 20:55:53 +000014340 }, {
14341 .eraseblocks = { {1024 * 1024, 1} },
14342 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
14343 }
14344 },
hailfingerb8e4e212010-03-15 03:48:42 +000014345 .printlock = printlock_sst_fwhub,
snelson712e72d2010-03-16 03:09:10 +000014346 .unlock = unlock_sst_fwhub,
14347 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014348 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014349 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014350 },
14351
hailfinger286829b2009-01-08 03:40:17 +000014352 {
14353 .vendor = "SST",
14354 .name = "SST49LF008C",
hailfingere1e41ea2011-07-27 07:13:06 +000014355 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014356 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014357 .model_id = SST_SST49LF008C,
hailfinger286829b2009-01-08 03:40:17 +000014358 .total_size = 1024,
14359 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014360 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014361 .tested = TEST_UNTESTED,
hailfingerb8e4e212010-03-15 03:48:42 +000014362 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014363 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014364 .block_erasers =
14365 {
14366 {
14367 .eraseblocks = { {4 * 1024, 256} },
14368 .block_erase = erase_sector_49lfxxxc,
14369 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014370 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014371 {64 * 1024, 15},
14372 {32 * 1024, 1},
14373 {8 * 1024, 2},
14374 {16 * 1024, 1},
14375 },
snelson3a69e422010-03-23 17:10:28 +000014376 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014377 }
14378 },
snelson3a69e422010-03-23 17:10:28 +000014379 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +000014380 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014381 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014382 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014383 },
14384
hailfinger286829b2009-01-08 03:40:17 +000014385 {
14386 .vendor = "SST",
14387 .name = "SST49LF016C",
hailfingere1e41ea2011-07-27 07:13:06 +000014388 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000014389 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014390 .model_id = SST_SST49LF016C,
hailfinger286829b2009-01-08 03:40:17 +000014391 .total_size = 2048,
14392 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014393 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +000014394 .tested = TEST_OK_PR,
hailfingerb8e4e212010-03-15 03:48:42 +000014395 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014396 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014397 .block_erasers =
14398 {
14399 {
14400 .eraseblocks = { {4 * 1024, 512} },
14401 .block_erase = erase_sector_49lfxxxc,
14402 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014403 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014404 {64 * 1024, 31},
14405 {32 * 1024, 1},
14406 {8 * 1024, 2},
14407 {16 * 1024, 1},
14408 },
snelson3a69e422010-03-23 17:10:28 +000014409 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014410 }
14411 },
snelson3a69e422010-03-23 17:10:28 +000014412 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +000014413 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014414 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014415 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014416 },
14417
hailfinger286829b2009-01-08 03:40:17 +000014418 {
14419 .vendor = "SST",
14420 .name = "SST49LF020",
hailfingere1e41ea2011-07-27 07:13:06 +000014421 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014422 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014423 .model_id = SST_SST49LF020,
hailfinger286829b2009-01-08 03:40:17 +000014424 .total_size = 256,
14425 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014426 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014427 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014428 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014429 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014430 .block_erasers =
14431 {
14432 {
14433 .eraseblocks = { {4 * 1024, 64} },
14434 .block_erase = erase_sector_jedec,
14435 }, {
14436 .eraseblocks = { {16 * 1024, 16} },
14437 .block_erase = erase_block_jedec,
14438 }, {
14439 .eraseblocks = { {256 * 1024, 1} },
14440 .block_erase = NULL,
14441 }
14442 },
snelsonc6855342010-01-28 23:55:12 +000014443 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014444 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014445 .voltage = {3000, 3600},
uwebf4a9a92009-01-07 12:35:09 +000014446 },
14447
hailfinger286829b2009-01-08 03:40:17 +000014448 {
14449 .vendor = "SST",
14450 .name = "SST49LF020A",
hailfingere1e41ea2011-07-27 07:13:06 +000014451 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014452 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014453 .model_id = SST_SST49LF020A,
hailfinger286829b2009-01-08 03:40:17 +000014454 .total_size = 256,
hailfinger73134c42009-07-23 01:44:38 +000014455 .page_size = 4 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014456 .feature_bits = FEATURE_EITHER_RESET,
hailfingerd217d122010-10-08 18:52:29 +000014457 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000014458 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014459 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014460 .block_erasers =
14461 {
14462 {
14463 .eraseblocks = { {4 * 1024, 64} },
14464 .block_erase = erase_sector_jedec,
14465 }, {
14466 .eraseblocks = { {16 * 1024, 16} },
14467 .block_erase = erase_block_jedec,
14468 }, {
14469 .eraseblocks = { {256 * 1024, 1} },
14470 .block_erase = NULL,
14471 }
14472 },
snelsonc6855342010-01-28 23:55:12 +000014473 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014474 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014475 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014476 },
14477
hailfinger286829b2009-01-08 03:40:17 +000014478 {
14479 .vendor = "SST",
14480 .name = "SST49LF040",
hailfingere1e41ea2011-07-27 07:13:06 +000014481 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014482 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014483 .model_id = SST_SST49LF040,
hailfinger286829b2009-01-08 03:40:17 +000014484 .total_size = 512,
14485 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014486 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014487 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014488 .probe = probe_jedec,
uwe81d75ab2010-09-05 12:41:25 +000014489 .probe_timing = 1, /* 150 ns */
snelson264e57c2010-01-20 20:55:53 +000014490 .block_erasers =
14491 {
14492 {
14493 .eraseblocks = { {4 * 1024, 128} },
14494 .block_erase = erase_sector_jedec,
14495 }, {
14496 .eraseblocks = { {64 * 1024, 8} },
14497 .block_erase = erase_block_jedec,
14498 }, {
14499 .eraseblocks = { {512 * 1024, 1} },
14500 .block_erase = NULL,
14501 }
14502 },
snelsonc6855342010-01-28 23:55:12 +000014503 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014504 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014505 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014506 },
14507
hailfinger286829b2009-01-08 03:40:17 +000014508 {
14509 .vendor = "SST",
14510 .name = "SST49LF040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014511 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014512 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014513 .model_id = SST_SST49LF040B,
hailfinger286829b2009-01-08 03:40:17 +000014514 .total_size = 512,
14515 .page_size = 64 * 1024,
mkarcher83414fc2010-08-16 22:12:39 +000014516 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
stefanctd6efe1a2011-09-03 11:22:27 +000014517 .tested = TEST_OK_PREW,
snelson264e57c2010-01-20 20:55:53 +000014518 .probe = probe_jedec,
hailfingerb8e4e212010-03-15 03:48:42 +000014519 .probe_timing = 1, /* 150ns */
snelson264e57c2010-01-20 20:55:53 +000014520 .block_erasers =
14521 {
14522 {
14523 .eraseblocks = { {4 * 1024, 128} },
14524 .block_erase = erase_sector_jedec,
14525 }, {
14526 .eraseblocks = { {64 * 1024, 8} },
14527 .block_erase = erase_block_jedec,
14528 }, {
14529 .eraseblocks = { {512 * 1024, 1} },
14530 .block_erase = NULL,
14531 }
14532 },
Alan Greena59b2ae2019-09-02 17:26:10 +100014533 .unlock = unlock_regspace2_uniform_64k,
snelsonc6855342010-01-28 23:55:12 +000014534 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014535 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014536 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014537 },
14538
hailfinger286829b2009-01-08 03:40:17 +000014539 {
14540 .vendor = "SST",
14541 .name = "SST49LF080A",
hailfingere1e41ea2011-07-27 07:13:06 +000014542 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014543 .manufacture_id = SST_ID,
Alan Greena7cfa332019-06-24 15:48:14 +100014544 .model_id = SST_SST49LF080A,
hailfinger286829b2009-01-08 03:40:17 +000014545 .total_size = 1024,
14546 .page_size = 4096,
snelsonc6855342010-01-28 23:55:12 +000014547 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014548 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014549 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060014550 .probe_timing = TIMING_FIXME,
snelson264e57c2010-01-20 20:55:53 +000014551 .block_erasers =
14552 {
14553 {
14554 .eraseblocks = { {4 * 1024, 256} },
14555 .block_erase = erase_sector_jedec,
14556 }, {
14557 .eraseblocks = { {64 * 1024, 16} },
14558 .block_erase = erase_block_jedec,
14559 }, {
14560 .eraseblocks = { {1024 * 1024, 1} },
14561 .block_erase = NULL,
14562 }
14563 },
snelsonc6855342010-01-28 23:55:12 +000014564 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014565 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014566 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014567 },
14568
hailfinger286829b2009-01-08 03:40:17 +000014569 {
14570 .vendor = "SST",
14571 .name = "SST49LF160C",
hailfingere1e41ea2011-07-27 07:13:06 +000014572 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000014573 .manufacture_id = SST_ID,
mhmd3c80cd2010-09-15 23:31:03 +000014574 .model_id = SST_SST49LF160C,
hailfinger286829b2009-01-08 03:40:17 +000014575 .total_size = 2048,
14576 .page_size = 4 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014577 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +000014578 .tested = TEST_OK_PRE,
hailfingerb8e4e212010-03-15 03:48:42 +000014579 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014580 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelson264e57c2010-01-20 20:55:53 +000014581 .block_erasers =
14582 {
14583 {
14584 .eraseblocks = { {4 * 1024, 512} },
14585 .block_erase = erase_sector_49lfxxxc,
14586 }, {
Simon Glass8dc82732013-07-16 10:13:51 -060014587 .eraseblocks = {
snelson264e57c2010-01-20 20:55:53 +000014588 {64 * 1024, 31},
14589 {32 * 1024, 1},
14590 {8 * 1024, 2},
14591 {16 * 1024, 1},
14592 },
snelson3a69e422010-03-23 17:10:28 +000014593 .block_erase = erase_block_82802ab,
snelson264e57c2010-01-20 20:55:53 +000014594 }
14595 },
snelson1ee293c2010-02-19 00:52:10 +000014596 .unlock = unlock_49lfxxxc,
hailfinger86bf3b52010-10-13 21:49:30 +000014597 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014598 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014599 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014600 },
14601
Alan Greend76dc1f2019-06-26 15:38:19 +100014602 {
14603 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000014604 .name = "M29F002B",
hailfingere1e41ea2011-07-27 07:13:06 +000014605 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014606 .manufacture_id = ST_ID,
14607 .model_id = ST_M29F002B,
14608 .total_size = 256,
14609 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014610 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014611 .tested = TEST_UNTESTED,
14612 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014613 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014614 .block_erasers =
14615 {
14616 {
14617 .eraseblocks = {
14618 {16 * 1024, 1},
14619 {8 * 1024, 2},
14620 {32 * 1024, 1},
14621 {64 * 1024, 3},
14622 },
14623 .block_erase = erase_sector_jedec,
14624 }, {
14625 .eraseblocks = { {256 * 1024, 1} },
14626 .block_erase = erase_chip_block_jedec,
14627 }
14628 },
snelsonc6855342010-01-28 23:55:12 +000014629 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014630 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000014631 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000014632 },
14633
hailfinger286829b2009-01-08 03:40:17 +000014634 {
14635 .vendor = "ST",
14636 .name = "M29F002T/NT",
hailfingere1e41ea2011-07-27 07:13:06 +000014637 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014638 .manufacture_id = ST_ID,
14639 .model_id = ST_M29F002T,
14640 .total_size = 256,
14641 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014642 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014643 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000014644 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014645 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014646 .block_erasers =
14647 {
14648 {
14649 .eraseblocks = {
14650 {64 * 1024, 3},
14651 {32 * 1024, 1},
14652 {8 * 1024, 2},
14653 {16 * 1024, 1},
14654 },
14655 .block_erase = erase_sector_jedec,
14656 }, {
14657 .eraseblocks = { {256 * 1024, 1} },
14658 .block_erase = erase_chip_block_jedec,
14659 }
14660 },
snelsonc6855342010-01-28 23:55:12 +000014661 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014662 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000014663 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
stepanaa1b6a22008-12-08 18:15:10 +000014664 },
14665
hailfinger286829b2009-01-08 03:40:17 +000014666 {
14667 .vendor = "ST",
14668 .name = "M29F040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014669 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014670 .manufacture_id = ST_ID,
14671 .model_id = ST_M29F040B,
14672 .total_size = 512,
14673 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014674 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
14675 .tested = TEST_UNTESTED,
14676 .probe = probe_jedec,
hailfinger8ddaff32010-12-04 03:26:40 +000014677 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
snelsone0c56352010-01-19 16:08:51 +000014678 .block_erasers =
14679 {
14680 {
Alan Green0d97b472019-07-26 10:33:25 +100014681 .eraseblocks = { {64 * 1024, 8} },
snelsonc6855342010-01-28 23:55:12 +000014682 .block_erase = erase_sector_jedec,
snelsone0c56352010-01-19 16:08:51 +000014683 }, {
14684 .eraseblocks = { {512 * 1024, 1} },
snelsonc6855342010-01-28 23:55:12 +000014685 .block_erase = erase_chip_block_jedec,
snelsone0c56352010-01-19 16:08:51 +000014686 }
14687 },
snelsonc6855342010-01-28 23:55:12 +000014688 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014689 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014690 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014691 },
14692
hailfinger286829b2009-01-08 03:40:17 +000014693 {
snelsonc6855342010-01-28 23:55:12 +000014694 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
hailfinger286829b2009-01-08 03:40:17 +000014695 .vendor = "ST",
hailfingerfa513302010-07-16 22:07:20 +000014696 .name = "M29F400BB",
hailfingere1e41ea2011-07-27 07:13:06 +000014697 .bustype = BUS_PARALLEL,
hailfingerfa513302010-07-16 22:07:20 +000014698 .manufacture_id = ST_ID,
14699 .model_id = ST_M29F400BB,
14700 .total_size = 512,
14701 .page_size = 64 * 1024,
14702 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger86bf3b52010-10-13 21:49:30 +000014703 .tested = TEST_UNTESTED,
hailfingerfa513302010-07-16 22:07:20 +000014704 .probe = probe_m29f400bt,
14705 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
14706 .block_erasers =
14707 {
14708 {
14709 .eraseblocks = {
14710 {16 * 1024, 1},
14711 {8 * 1024, 2},
14712 {32 * 1024, 1},
14713 {64 * 1024, 7},
14714 },
14715 .block_erase = block_erase_m29f400bt,
14716 }, {
14717 .eraseblocks = { {512 * 1024, 1} },
14718 .block_erase = block_erase_chip_m29f400bt,
14719 }
14720 },
hailfinger86bf3b52010-10-13 21:49:30 +000014721 .write = write_m29f400bt,
hailfingerfa513302010-07-16 22:07:20 +000014722 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014723 .voltage = {4500, 5500},
hailfingerfa513302010-07-16 22:07:20 +000014724 },
Alan Green753a38e2019-06-07 14:44:32 +100014725
hailfingerfa513302010-07-16 22:07:20 +000014726 {
14727 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
14728 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000014729 .name = "M29F400BT",
hailfingere1e41ea2011-07-27 07:13:06 +000014730 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014731 .manufacture_id = ST_ID,
14732 .model_id = ST_M29F400BT,
14733 .total_size = 512,
14734 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014735 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014736 .tested = TEST_UNTESTED,
14737 .probe = probe_m29f400bt,
uwe37f43422011-06-19 17:23:55 +000014738 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
snelsone0c56352010-01-19 16:08:51 +000014739 .block_erasers =
14740 {
14741 {
14742 .eraseblocks = {
14743 {64 * 1024, 7},
14744 {32 * 1024, 1},
14745 {8 * 1024, 2},
14746 {16 * 1024, 1},
14747 },
14748 .block_erase = block_erase_m29f400bt,
14749 }, {
14750 .eraseblocks = { {512 * 1024, 1} },
14751 .block_erase = block_erase_chip_m29f400bt,
14752 }
14753 },
hailfingerfa513302010-07-16 22:07:20 +000014754 .write = write_m29f400bt,
hailfinger23060112009-05-08 12:49:03 +000014755 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014756 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000014757 },
14758
hailfinger286829b2009-01-08 03:40:17 +000014759 {
14760 .vendor = "ST",
14761 .name = "M29W010B",
hailfingere1e41ea2011-07-27 07:13:06 +000014762 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014763 .manufacture_id = ST_ID,
14764 .model_id = ST_M29W010B,
14765 .total_size = 128,
14766 .page_size = 16 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014767 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014768 .tested = TEST_UNTESTED,
14769 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014770 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014771 .block_erasers =
14772 {
14773 {
Alan Green0d97b472019-07-26 10:33:25 +100014774 .eraseblocks = { {16 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +000014775 .block_erase = erase_sector_jedec,
14776 }, {
14777 .eraseblocks = { {128 * 1024, 1} },
14778 .block_erase = erase_chip_block_jedec,
14779 }
14780 },
snelsonc6855342010-01-28 23:55:12 +000014781 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014782 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014783 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014784 },
14785
hailfinger286829b2009-01-08 03:40:17 +000014786 {
14787 .vendor = "ST",
14788 .name = "M29W040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014789 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000014790 .manufacture_id = ST_ID,
14791 .model_id = ST_M29W040B,
14792 .total_size = 512,
14793 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000014794 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000014795 .tested = TEST_UNTESTED,
14796 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000014797 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000014798 .block_erasers =
14799 {
14800 {
Alan Green0d97b472019-07-26 10:33:25 +100014801 .eraseblocks = { {64 * 1024, 8} },
snelsone0c56352010-01-19 16:08:51 +000014802 .block_erase = erase_sector_jedec,
14803 }, {
14804 .eraseblocks = { {512 * 1024, 1} },
14805 .block_erase = erase_chip_block_jedec,
14806 }
14807 },
snelsonc6855342010-01-28 23:55:12 +000014808 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000014809 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014810 .voltage = {2700, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000014811 },
14812
Alan Green753a38e2019-06-07 14:44:32 +100014813 {
14814 .vendor = "ST",
14815 .name = "M29W512B",
hailfingere1e41ea2011-07-27 07:13:06 +000014816 .bustype = BUS_PARALLEL,
Alan Green753a38e2019-06-07 14:44:32 +100014817 .manufacture_id = ST_ID,
14818 .model_id = ST_M29W512B,
Alan Greena7cfa332019-06-24 15:48:14 +100014819 .total_size = 64,
14820 .page_size = 64 * 1024,
14821 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100014822 .tested = TEST_OK_PREW,
Alan Green753a38e2019-06-07 14:44:32 +100014823 .probe = probe_jedec,
14824 .probe_timing = TIMING_ZERO,
14825 .block_erasers =
14826 {
14827 {
14828 .eraseblocks = { {64 * 1024, 1} },
14829 .block_erase = erase_chip_block_jedec,
14830 }
14831 },
14832 .write = write_jedec_1,
14833 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014834 .voltage = {2700, 3600},
Alan Green753a38e2019-06-07 14:44:32 +100014835 },
snelson91cd0662010-02-01 05:49:46 +000014836
hailfinger286829b2009-01-08 03:40:17 +000014837 {
14838 .vendor = "ST",
14839 .name = "M50FLW040A",
hailfingere1e41ea2011-07-27 07:13:06 +000014840 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014841 .manufacture_id = ST_ID,
14842 .model_id = ST_M50FLW040A,
14843 .total_size = 512,
14844 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014845 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014846 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000014847 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000014848 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000014849 .block_erasers =
14850 {
14851 {
snelsonf88616b2010-01-19 16:39:19 +000014852 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000014853 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000014854 {64 * 1024, 5}, /* block */
14855 {4 * 1024, 16}, /* sector */
14856 {4 * 1024, 16}, /* sector */
14857 },
14858 .block_erase = NULL,
14859 }, {
Alan Green0d97b472019-07-26 10:33:25 +100014860 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000014861 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014862 }
14863 },
snelsonc0acbeb2010-03-19 18:47:06 +000014864 .unlock = unlock_stm50flw0x0x,
14865 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014866 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014867 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000014868 },
14869
hailfinger286829b2009-01-08 03:40:17 +000014870 {
14871 .vendor = "ST",
14872 .name = "M50FLW040B",
hailfingere1e41ea2011-07-27 07:13:06 +000014873 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014874 .manufacture_id = ST_ID,
14875 .model_id = ST_M50FLW040B,
14876 .total_size = 512,
14877 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014878 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014879 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000014880 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000014881 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000014882 .block_erasers =
14883 {
14884 {
snelsonf88616b2010-01-19 16:39:19 +000014885 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000014886 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000014887 {4 * 1024, 16}, /* sector */
14888 {64 * 1024, 5}, /* block */
14889 {4 * 1024, 16}, /* sector */
14890 },
14891 .block_erase = NULL,
14892 }, {
Alan Green0d97b472019-07-26 10:33:25 +100014893 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000014894 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014895 }
14896 },
snelsonc0acbeb2010-03-19 18:47:06 +000014897 .unlock = unlock_stm50flw0x0x,
14898 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014899 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014900 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000014901 },
14902
hailfinger286829b2009-01-08 03:40:17 +000014903 {
14904 .vendor = "ST",
14905 .name = "M50FLW080A",
hailfingere1e41ea2011-07-27 07:13:06 +000014906 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014907 .manufacture_id = ST_ID,
14908 .model_id = ST_M50FLW080A,
14909 .total_size = 1024,
14910 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014911 .feature_bits = FEATURE_REGISTERMAP,
hailfingerd217d122010-10-08 18:52:29 +000014912 .tested = TEST_OK_PRE,
snelsonc6855342010-01-28 23:55:12 +000014913 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000014914 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000014915 .block_erasers =
14916 {
14917 {
snelsonf88616b2010-01-19 16:39:19 +000014918 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000014919 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000014920 {64 * 1024, 13}, /* block */
14921 {4 * 1024, 16}, /* sector */
14922 {4 * 1024, 16}, /* sector */
14923 },
14924 .block_erase = NULL,
14925 }, {
Alan Green0d97b472019-07-26 10:33:25 +100014926 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000014927 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014928 }
14929 },
snelsonc0acbeb2010-03-19 18:47:06 +000014930 .unlock = unlock_stm50flw0x0x,
14931 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014932 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014933 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000014934 },
14935
hailfinger286829b2009-01-08 03:40:17 +000014936 {
14937 .vendor = "ST",
14938 .name = "M50FLW080B",
hailfingere1e41ea2011-07-27 07:13:06 +000014939 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014940 .manufacture_id = ST_ID,
14941 .model_id = ST_M50FLW080B,
14942 .total_size = 1024,
14943 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014944 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014945 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000014946 .probe = probe_82802ab,
hailfinger4d547032010-01-10 01:34:00 +000014947 .probe_timing = TIMING_FIXME,
snelsone0c56352010-01-19 16:08:51 +000014948 .block_erasers =
14949 {
14950 {
snelsonf88616b2010-01-19 16:39:19 +000014951 .eraseblocks = {
uwe81d75ab2010-09-05 12:41:25 +000014952 {4 * 1024, 16}, /* sector */
snelsonf88616b2010-01-19 16:39:19 +000014953 {4 * 1024, 16}, /* sector */
14954 {64 * 1024, 13}, /* block */
14955 {4 * 1024, 16}, /* sector */
14956 },
14957 .block_erase = NULL,
14958 }, {
Alan Green0d97b472019-07-26 10:33:25 +100014959 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000014960 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014961 }
14962 },
snelsonc0acbeb2010-03-19 18:47:06 +000014963 .unlock = unlock_stm50flw0x0x,
14964 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014965 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014966 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000014967 },
14968
hailfinger286829b2009-01-08 03:40:17 +000014969 {
14970 .vendor = "ST",
14971 .name = "M50FW002",
hailfingere1e41ea2011-07-27 07:13:06 +000014972 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000014973 .manufacture_id = ST_ID,
14974 .model_id = ST_M50FW002,
14975 .total_size = 256,
14976 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000014977 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000014978 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000014979 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000014980 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
snelsone0c56352010-01-19 16:08:51 +000014981 .block_erasers =
14982 {
14983 {
14984 .eraseblocks = {
14985 {64 * 1024, 3},
14986 {32 * 1024, 1},
14987 {8 * 1024, 2},
14988 {16 * 1024, 1},
14989 },
snelsonc0acbeb2010-03-19 18:47:06 +000014990 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000014991 }
14992 },
snelsonc0acbeb2010-03-19 18:47:06 +000014993 .unlock = unlock_stm50flw0x0x,
14994 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000014995 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000014996 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000014997 },
14998
hailfinger286829b2009-01-08 03:40:17 +000014999 {
15000 .vendor = "ST",
15001 .name = "M50FW016",
hailfingere1e41ea2011-07-27 07:13:06 +000015002 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015003 .manufacture_id = ST_ID,
15004 .model_id = ST_M50FW016,
15005 .total_size = 2048,
15006 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000015007 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015008 .tested = TEST_UNTESTED,
15009 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015010 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015011 .block_erasers =
15012 {
15013 {
Alan Green0d97b472019-07-26 10:33:25 +100015014 .eraseblocks = { {64 * 1024, 32} },
snelsonc0acbeb2010-03-19 18:47:06 +000015015 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015016 }
15017 },
snelsonc0acbeb2010-03-19 18:47:06 +000015018 .unlock = unlock_stm50flw0x0x,
15019 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015020 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015021 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015022 },
15023
hailfinger286829b2009-01-08 03:40:17 +000015024 {
15025 .vendor = "ST",
15026 .name = "M50FW040",
hailfingere1e41ea2011-07-27 07:13:06 +000015027 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015028 .manufacture_id = ST_ID,
15029 .model_id = ST_M50FW040,
15030 .total_size = 512,
15031 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000015032 .feature_bits = FEATURE_REGISTERMAP,
snelsonc0acbeb2010-03-19 18:47:06 +000015033 .tested = TEST_OK_PR,
hailfinger286829b2009-01-08 03:40:17 +000015034 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015035 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015036 .block_erasers =
15037 {
15038 {
Alan Green0d97b472019-07-26 10:33:25 +100015039 .eraseblocks = { {64 * 1024, 8} },
snelsonc0acbeb2010-03-19 18:47:06 +000015040 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015041 }
15042 },
snelsonc0acbeb2010-03-19 18:47:06 +000015043 .unlock = unlock_stm50flw0x0x,
15044 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015045 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015046 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015047 },
15048
hailfinger286829b2009-01-08 03:40:17 +000015049 {
15050 .vendor = "ST",
15051 .name = "M50FW080",
hailfingere1e41ea2011-07-27 07:13:06 +000015052 .bustype = BUS_FWH, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015053 .manufacture_id = ST_ID,
15054 .model_id = ST_M50FW080,
15055 .total_size = 1024,
15056 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000015057 .feature_bits = FEATURE_REGISTERMAP,
stefancte0e52902011-05-26 14:28:51 +000015058 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000015059 .probe = probe_82802ab,
uwe37f43422011-06-19 17:23:55 +000015060 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
snelsone0c56352010-01-19 16:08:51 +000015061 .block_erasers =
15062 {
15063 {
Alan Green0d97b472019-07-26 10:33:25 +100015064 .eraseblocks = { {64 * 1024, 16} },
snelsonc0acbeb2010-03-19 18:47:06 +000015065 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015066 }
15067 },
snelsonc0acbeb2010-03-19 18:47:06 +000015068 .unlock = unlock_stm50flw0x0x,
15069 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015070 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015071 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015072 },
15073
hailfinger286829b2009-01-08 03:40:17 +000015074 {
15075 .vendor = "ST",
Nikolai Artemievfe595da2020-08-31 17:49:27 +100015076 .name = "M50LPW080",
15077 .bustype = BUS_LPC, /* A/A Mux */
15078 .manufacture_id = ST_ID,
15079 .model_id = ST_M50LPW080,
15080 .total_size = 1024,
15081 .page_size = 0,
15082 .feature_bits = FEATURE_REGISTERMAP,
15083 .tested = TEST_UNTESTED,
15084 .probe = probe_82802ab,
15085 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
15086 .block_erasers =
15087 {
15088 {
15089 .eraseblocks = { {64 * 1024, 16} },
15090 .block_erase = erase_block_82802ab,
15091 }
15092 },
15093 .unlock = unlock_regspace2_uniform_64k,
15094 .write = write_82802ab,
15095 .read = read_memmapped,
15096 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
15097 },
15098
15099 {
15100 .vendor = "ST",
hailfinger286829b2009-01-08 03:40:17 +000015101 .name = "M50LPW116",
hailfingere1e41ea2011-07-27 07:13:06 +000015102 .bustype = BUS_LPC, /* A/A Mux */
hailfinger286829b2009-01-08 03:40:17 +000015103 .manufacture_id = ST_ID,
15104 .model_id = ST_M50LPW116,
15105 .total_size = 2048,
15106 .page_size = 64 * 1024,
hailfingerb8e4e212010-03-15 03:48:42 +000015107 .feature_bits = FEATURE_REGISTERMAP,
hailfinger286829b2009-01-08 03:40:17 +000015108 .tested = TEST_UNTESTED,
snelsonc6855342010-01-28 23:55:12 +000015109 .probe = probe_82802ab,
hailfinger94466802009-09-05 01:31:32 +000015110 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000015111 .block_erasers =
15112 {
15113 {
15114 .eraseblocks = {
15115 {4 * 1024, 16},
15116 {64 * 1024, 30},
15117 {32 * 1024, 1},
15118 {8 * 1024, 2},
15119 {16 * 1024, 1},
15120 },
snelsonc0acbeb2010-03-19 18:47:06 +000015121 .block_erase = erase_block_82802ab,
snelsone0c56352010-01-19 16:08:51 +000015122 }
15123 },
snelsonc0acbeb2010-03-19 18:47:06 +000015124 .unlock = unlock_stm50flw0x0x,
15125 .write = write_82802ab,
hailfinger23060112009-05-08 12:49:03 +000015126 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000015127 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
stepanaa1b6a22008-12-08 18:15:10 +000015128 },
15129
hailfinger286829b2009-01-08 03:40:17 +000015130 {
Nikolai Artemiev7bdf1e72020-08-31 17:50:33 +100015131 .vendor = "ST",
15132 .name = "M95M02",
15133 .bustype = BUS_SPI,
15134 .manufacture_id = ST_ID,
15135 .model_id = ST_M95M02,
15136 .total_size = 256,
15137 .page_size = 256,
15138 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
15139 .tested = TEST_OK_PREW,
15140 .probe = probe_spi_st95,
15141 .probe_timing = TIMING_ZERO,
15142 .block_erasers =
15143 {
15144 {
15145 .eraseblocks = { {256 * 1024, 1} },
15146 .block_erase = spi_block_erase_emulation,
15147 }
15148 },
15149
15150 .printlock = spi_prettyprint_status_register_bp1_srwd,
15151 .unlock = spi_disable_blockprotect_bp1_srwd,
15152 .write = spi_chip_write_256,
15153 .read = spi_chip_read,
15154 .voltage = {2500, 5500},
15155 },
15156
15157 {
15158 .vendor = "Sanyo",
15159 .name = "LE25FU106B",
15160 .bustype = BUS_SPI,
15161 .manufacture_id = SANYO_ID,
15162 .model_id = SANYO_LE25FU106B,
15163 .total_size = 128,
15164 .page_size = 256,
15165 .feature_bits = FEATURE_WRSR_WREN,
15166 .tested = TEST_UNTESTED,
15167 .probe = probe_spi_res2,
15168 .probe_timing = TIMING_ZERO,
15169 .block_erasers =
15170 {
15171 /* FIXME: Is this correct?
15172 {
15173 .eraseblocks = { {2 * 1024, 64} },
15174 .block_erase = spi_block_erase_d7,
15175 },*/
15176 {
15177 .eraseblocks = { {32 * 1024, 4} },
15178 .block_erase = spi_block_erase_d8,
15179 }, {
15180 .eraseblocks = { {128 * 1024, 1} },
15181 .block_erase = spi_block_erase_c7,
15182 }
15183 },
15184 .printlock = spi_prettyprint_status_register_bp1_srwd,
15185 .unlock = spi_disable_blockprotect_bp1_srwd,
15186 .write = spi_chip_write_256,
15187 .read = spi_chip_read,
15188 .voltage = {2300, 3600},
15189 },
15190
15191 {
15192 .vendor = "Sanyo",
15193 .name = "LE25FU206",
15194 .bustype = BUS_SPI,
15195 .manufacture_id = SANYO_ID,
15196 .model_id = SANYO_LE25FU206,
15197 .total_size = 256,
15198 .page_size = 256,
15199 .feature_bits = FEATURE_WRSR_WREN,
15200 .tested = TEST_UNTESTED,
15201 .probe = probe_spi_res2,
15202 .probe_timing = TIMING_ZERO,
15203 .block_erasers =
15204 {
15205 {
15206 .eraseblocks = { {4 * 1024, 64} },
15207 .block_erase = spi_block_erase_d7,
15208 }, {
15209 .eraseblocks = { {64 * 1024, 4} },
15210 .block_erase = spi_block_erase_d8,
15211 }, {
15212 .eraseblocks = { {256 * 1024, 1} },
15213 .block_erase = spi_block_erase_c7,
15214 }
15215 },
15216 .printlock = spi_prettyprint_status_register_bp1_srwd,
15217 .unlock = spi_disable_blockprotect_bp1_srwd,
15218 .write = spi_chip_write_256,
15219 .read = spi_chip_read,
15220 .voltage = {2300, 3600},
15221 },
15222
15223 {
15224 .vendor = "Sanyo",
15225 .name = "LE25FU206A",
15226 .bustype = BUS_SPI,
15227 .manufacture_id = SANYO_ID,
15228 .model_id = SANYO_LE25FU206A,
15229 .total_size = 256,
15230 .page_size = 256,
15231 .tested = TEST_UNTESTED,
15232 .probe = probe_spi_rdid,
15233 .probe_timing = TIMING_ZERO,
15234 .block_erasers =
15235 {
15236 {
15237 .eraseblocks = { {4 * 1024, 64} },
15238 .block_erase = spi_block_erase_20,
15239 }, {
15240 .eraseblocks = { {4 * 1024, 64} },
15241 .block_erase = spi_block_erase_d7,
15242 }, {
15243 .eraseblocks = { {64 * 1024, 4} },
15244 .block_erase = spi_block_erase_d8,
15245 }, {
15246 .eraseblocks = { {256 * 1024, 1} },
15247 .block_erase = spi_block_erase_60,
15248 }, {
15249 .eraseblocks = { {256 * 1024, 1} },
15250 .block_erase = spi_block_erase_c7,
15251 }
15252 },
15253 .printlock = spi_prettyprint_status_register_bp2_srwd,
15254 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15255 .write = spi_chip_write_256,
15256 .read = spi_chip_read,
15257 .voltage = {2300, 3600},
15258 },
15259
15260 {
15261 .vendor = "Sanyo",
15262 .name = "LE25FU406B",
15263 .bustype = BUS_SPI,
15264 .manufacture_id = SANYO_ID,
15265 .model_id = SANYO_LE25FU406B,
15266 .total_size = 512,
15267 .page_size = 256,
15268 .feature_bits = FEATURE_WRSR_WREN,
15269 .tested = TEST_OK_PREW,
15270 .probe = probe_spi_res2,
15271 .probe_timing = TIMING_ZERO,
15272 .block_erasers =
15273 {
15274 {
15275 .eraseblocks = { {4 * 1024, 128} },
15276 .block_erase = spi_block_erase_d7,
15277 }, {
15278 .eraseblocks = { {64 * 1024, 8} },
15279 .block_erase = spi_block_erase_d8,
15280 }, {
15281 .eraseblocks = { {512 * 1024, 1} },
15282 .block_erase = spi_block_erase_c7,
15283 }
15284 },
15285 .printlock = spi_prettyprint_status_register_bp2_srwd,
15286 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15287 .write = spi_chip_write_256,
15288 .read = spi_chip_read,
15289 .voltage = {2300, 3600},
15290 },
15291
15292 {
15293 .vendor = "Sanyo",
15294 .name = "LE25FU406C/LE25U40CMC",
15295 .bustype = BUS_SPI,
15296 .manufacture_id = SANYO_ID,
15297 .model_id = SANYO_LE25FU406C,
15298 .total_size = 512,
15299 .page_size = 256,
15300 .feature_bits = FEATURE_WRSR_WREN,
15301 .tested = TEST_OK_PREW,
15302 .probe = probe_spi_rdid,
15303 .probe_timing = TIMING_ZERO,
15304 .block_erasers =
15305 {
15306 {
15307 .eraseblocks = { {4 * 1024, 128} },
15308 .block_erase = spi_block_erase_20,
15309 }, {
15310 .eraseblocks = { {4 * 1024, 128} },
15311 .block_erase = spi_block_erase_d7,
15312 }, {
15313 .eraseblocks = { {64 * 1024, 8} },
15314 .block_erase = spi_block_erase_d8,
15315 }, {
15316 .eraseblocks = { {512 * 1024, 1} },
15317 .block_erase = spi_block_erase_60,
15318 }, {
15319 .eraseblocks = { {512 * 1024, 1} },
15320 .block_erase = spi_block_erase_c7,
15321 }
15322 },
15323 .printlock = spi_prettyprint_status_register_bp2_srwd,
15324 .unlock = spi_disable_blockprotect_bp2_srwd,
15325 .write = spi_chip_write_256,
15326 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
15327 .voltage = {2300, 3600},
15328 },
15329
15330 {
15331 .vendor = "Sanyo",
15332 .name = "LE25FW106",
15333 .bustype = BUS_SPI,
15334 .manufacture_id = SANYO_ID,
15335 .model_id = SANYO_LE25FW106,
15336 .total_size = 128,
15337 .page_size = 256,
15338 .feature_bits = FEATURE_WRSR_WREN,
15339 .tested = TEST_OK_PREW,
15340 .probe = probe_spi_res2,
15341 .probe_timing = TIMING_ZERO,
15342 .block_erasers =
15343 {
15344 {
15345 .eraseblocks = { {2 * 1024, 64} },
15346 .block_erase = spi_block_erase_d7,
15347 }, {
15348 .eraseblocks = { {32 * 1024, 4} },
15349 .block_erase = spi_block_erase_d8,
15350 }, {
15351 .eraseblocks = { {128 * 1024, 1} },
15352 .block_erase = spi_block_erase_c7,
15353 }
15354 },
15355 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
15356 .unlock = spi_disable_blockprotect_bp1_srwd,
15357 .write = spi_chip_write_256,
15358 .read = spi_chip_read,
15359 .voltage = {2700, 3600},
15360 },
15361
15362 {
15363 .vendor = "Sanyo",
15364 .name = "LE25FW203A",
15365 .bustype = BUS_SPI,
15366 .manufacture_id = SANYO_ID,
15367 .model_id = SANYO_LE25FW203A,
15368 .total_size = 256,
15369 .page_size = 256,
15370 .tested = TEST_UNTESTED,
15371 .probe = probe_spi_rdid,
15372 .probe_timing = TIMING_ZERO,
15373 .block_erasers =
15374 {
15375 {
15376 .eraseblocks = { {256, 1024} },
15377 .block_erase = spi_block_erase_db,
15378 }, {
15379 .eraseblocks = { {64 * 1024, 4} },
15380 .block_erase = spi_block_erase_d8,
15381 }, {
15382 .eraseblocks = { {256 * 1024, 1} },
15383 .block_erase = spi_block_erase_c7,
15384 }
15385 },
15386 .printlock = spi_prettyprint_status_register_default_welwip,
15387 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15388 .write = spi_chip_write_256,
15389 .read = spi_chip_read,
15390 .voltage = {2700, 3600},
15391 },
15392
15393 {
15394 .vendor = "Sanyo",
15395 .name = "LE25FW403A",
15396 .bustype = BUS_SPI,
15397 .manufacture_id = SANYO_ID,
15398 .model_id = SANYO_LE25FW403A,
15399 .total_size = 512,
15400 .page_size = 256,
15401 .tested = TEST_UNTESTED,
15402 .probe = probe_spi_rdid,
15403 .probe_timing = TIMING_ZERO,
15404 .block_erasers =
15405 {
15406 {
15407 .eraseblocks = { {256, 2 * 1024} },
15408 .block_erase = spi_block_erase_db,
15409 }, {
15410 .eraseblocks = { {64 * 1024, 8} },
15411 .block_erase = spi_block_erase_d8,
15412 }, {
15413 .eraseblocks = { {512 * 1024, 1} },
15414 .block_erase = spi_block_erase_c7,
15415 }
15416 },
15417 .printlock = spi_prettyprint_status_register_default_welwip,
15418 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
15419 .write = spi_chip_write_256,
15420 .read = spi_chip_read,
15421 .voltage = {2700, 3600},
15422 },
15423
15424 {
15425 .vendor = "Sanyo",
15426 .name = "LE25FW406A",
15427 .bustype = BUS_SPI,
15428 .manufacture_id = SANYO_ID,
15429 .model_id = SANYO_LE25FW406A,
15430 .total_size = 512,
15431 .page_size = 256,
15432 .feature_bits = FEATURE_WRSR_WREN,
15433 .tested = TEST_OK_PREW,
15434 .probe = probe_spi_res2,
15435 .probe_timing = TIMING_ZERO,
15436 .block_erasers =
15437 {
15438 {
15439 .eraseblocks = { {4 * 1024, 128} },
15440 .block_erase = spi_block_erase_d7,
15441 }, {
15442 .eraseblocks = { {64 * 1024, 8} },
15443 .block_erase = spi_block_erase_d8,
15444 }, {
15445 .eraseblocks = { {512 * 1024, 1} },
15446 .block_erase = spi_block_erase_c7,
15447 }
15448 },
15449 .printlock = spi_prettyprint_status_register_plain,
15450 .unlock = spi_disable_blockprotect,
15451 .write = spi_chip_write_256,
15452 .read = spi_chip_read,
15453 .voltage = {2700, 3600},
15454 },
15455
15456 {
15457 .vendor = "Sanyo",
15458 .name = "LE25FW418A",
15459 .bustype = BUS_SPI,
15460 .manufacture_id = SANYO_ID,
15461 .model_id = SANYO_LE25FW418A,
15462 .total_size = 512,
15463 .page_size = 256,
15464 .feature_bits = FEATURE_WRSR_WREN,
15465 .tested = TEST_UNTESTED,
15466 .probe = probe_spi_res2,
15467 .probe_timing = TIMING_ZERO,
15468 .block_erasers =
15469 {
15470 {
15471 .eraseblocks = { {4 * 1024, 128} },
15472 .block_erase = spi_block_erase_d7,
15473 }, {
15474 .eraseblocks = { {64 * 1024, 8} },
15475 .block_erase = spi_block_erase_d8,
15476 }, {
15477 .eraseblocks = { {512 * 1024, 1} },
15478 .block_erase = spi_block_erase_c7,
15479 }
15480 },
15481 .printlock = spi_prettyprint_status_register_bp2_srwd,
15482 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15483 .write = spi_chip_write_256,
15484 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15485 .voltage = {2700, 3600},
15486 },
15487
15488 {
Alan Greend76dc1f2019-06-26 15:38:19 +100015489 .vendor = "Sanyo",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100015490 .name = "LE25FW806",
15491 .bustype = BUS_SPI,
15492 .manufacture_id = SANYO_ID,
15493 .model_id = SANYO_LE25FW806,
15494 .total_size = 1024,
15495 .page_size = 256,
15496 .feature_bits = FEATURE_WRSR_WREN,
15497 .tested = TEST_UNTESTED,
15498 .probe = probe_spi_res2,
15499 .probe_timing = TIMING_ZERO,
15500 .block_erasers =
15501 {
15502 {
15503 .eraseblocks = { {4 * 1024, 256} },
15504 .block_erase = spi_block_erase_20,
15505 }, {
15506 .eraseblocks = { {4 * 1024, 256} },
15507 .block_erase = spi_block_erase_d7,
15508 }, {
15509 .eraseblocks = { {64 * 1024, 16} },
15510 .block_erase = spi_block_erase_d8,
15511 }, {
15512 .eraseblocks = { {1024 * 1024, 1} },
15513 .block_erase = spi_block_erase_c7,
15514 }
15515 },
15516 .printlock = spi_prettyprint_status_register_bp2_srwd,
15517 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15518 .write = spi_chip_write_256,
15519 .read = spi_chip_read,
15520 .voltage = {2700, 3600},
15521 },
15522
15523 {
15524 .vendor = "Sanyo",
15525 .name = "LE25FW808",
15526 .bustype = BUS_SPI,
15527 .manufacture_id = SANYO_ID,
15528 .model_id = SANYO_LE25FW808,
15529 .total_size = 1024,
15530 .page_size = 256,
15531 .feature_bits = FEATURE_WRSR_WREN,
15532 .tested = TEST_UNTESTED,
15533 .probe = probe_spi_res2,
15534 .probe_timing = TIMING_ZERO,
15535 .block_erasers =
15536 {
15537 {
15538 .eraseblocks = { {8 * 1024, 128} },
15539 .block_erase = spi_block_erase_d7,
15540 }, {
15541 .eraseblocks = { {64 * 1024, 16} },
15542 .block_erase = spi_block_erase_d8,
15543 }, {
15544 .eraseblocks = { {1024 * 1024, 1} },
15545 .block_erase = spi_block_erase_c7,
15546 }
15547 },
15548 .printlock = spi_prettyprint_status_register_bp2_srwd,
15549 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
15550 .write = spi_chip_write_256,
15551 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
15552 .voltage = {2700, 3600},
15553 },
15554
15555 {
15556 .vendor = "Sanyo",
Alan Greend76dc1f2019-06-26 15:38:19 +100015557 .name = "LF25FW203A",
15558 .bustype = BUS_SPI,
15559 .manufacture_id = SANYO_ID,
15560 .model_id = SANYO_LE25FW203A,
15561 .total_size = 2048,
15562 .page_size = 256,
Alan Greend76dc1f2019-06-26 15:38:19 +100015563 .tested = TEST_UNTESTED,
15564 .probe = probe_spi_rdid,
15565 .probe_timing = TIMING_ZERO,
15566 .block_erasers =
15567 {
15568 {
15569 .eraseblocks = { {64 * 1024, 32} },
15570 .block_erase = spi_block_erase_d8,
15571 }, {
15572 .eraseblocks = { {2 * 1024 * 1024, 1} },
15573 .block_erase = spi_block_erase_c7,
15574 }
15575 },
15576 .unlock = spi_disable_blockprotect,
15577 .write = spi_chip_write_256,
15578 .read = spi_chip_read,
15579 },
15580
15581 {
15582 .vendor = "Sharp",
15583 .name = "LH28F008BJT-BTLZ1",
15584 .bustype = BUS_PARALLEL,
15585 .manufacture_id = SHARP_ID,
15586 .model_id = SHARP_LH28F008BJ__PB,
15587 .total_size = 1024,
15588 .page_size = 64 * 1024,
15589 .tested = TEST_OK_PREW,
15590 .probe = probe_82802ab,
15591 .probe_timing = TIMING_ZERO,
15592 .block_erasers =
15593 {
15594 {
15595 .eraseblocks = {
15596 {8 * 1024, 8},
15597 {64 * 1024, 15}
15598 },
15599 .block_erase = erase_block_82802ab,
15600 }, {
15601 .eraseblocks = { {1024 * 1024, 1} },
15602 .block_erase = erase_sector_49lfxxxc,
15603 }
15604 },
15605 .unlock = unlock_lh28f008bjt,
15606 .write = write_82802ab,
15607 .read = read_memmapped,
15608 .voltage = {2700, 3600},
15609 },
15610
15611 {
15612 .vendor = "Sharp",
15613 .name = "LHF00L04",
15614 .bustype = BUS_FWH, /* A/A Mux */
15615 .manufacture_id = SHARP_ID,
15616 .model_id = SHARP_LHF00L04,
15617 .total_size = 1024,
15618 .page_size = 64 * 1024,
15619 .feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
15620 .tested = TEST_UNTESTED,
15621 .probe = probe_82802ab,
15622 .probe_timing = TIMING_ZERO,
15623 .block_erasers =
15624 {
15625 {
15626 .eraseblocks = {
15627 {64 * 1024, 15},
15628 {8 * 1024, 8}
15629 },
15630 .block_erase = erase_block_82802ab,
15631 }, {
15632 .eraseblocks = {
15633 {1024 * 1024, 1}
15634 },
15635 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
15636 },
15637 },
Alan Greena59b2ae2019-09-02 17:26:10 +100015638 .unlock = unlock_regspace2_uniform_64k,
Alan Greend76dc1f2019-06-26 15:38:19 +100015639 .write = write_82802ab,
15640 .read = read_memmapped,
15641 .voltage = {3000, 3600},
15642 },
15643
15644 {
15645 .vendor = "Spansion",
15646 .name = "S25FL004A",
15647 .bustype = BUS_SPI,
15648 .manufacture_id = SPANSION_ID,
15649 .model_id = SPANSION_S25FL004A,
15650 .total_size = 512,
15651 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015652 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100015653 .tested = TEST_UNTESTED,
15654 .probe = probe_spi_rdid,
15655 .probe_timing = TIMING_ZERO,
15656 .block_erasers =
15657 {
15658 {
15659 .eraseblocks = { {64 * 1024, 8} },
15660 .block_erase = spi_block_erase_d8,
15661 }, {
15662 .eraseblocks = { {512 * 1024, 1} },
15663 .block_erase = spi_block_erase_c7,
15664 }
15665 },
Alan Green6cfd0182019-07-26 13:50:04 +100015666 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100015667 .unlock = spi_disable_blockprotect,
15668 .write = spi_chip_write_256,
15669 .read = spi_chip_read,
15670 .voltage = {2700, 3600},
15671 },
15672
15673 {
15674 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100015675 .name = "S25FL008A",
15676 .bustype = BUS_SPI,
15677 .manufacture_id = SPANSION_ID,
15678 .model_id = SPANSION_S25FL008A,
15679 .total_size = 1024,
15680 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015681 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100015682 .tested = TEST_OK_PRE,
Alan Greend76dc1f2019-06-26 15:38:19 +100015683 .probe = probe_spi_rdid,
15684 .probe_timing = TIMING_ZERO,
15685 .block_erasers =
15686 {
15687 {
15688 .eraseblocks = { {64 * 1024, 16} },
15689 .block_erase = spi_block_erase_d8,
15690 }, {
15691 .eraseblocks = { {1024 * 1024, 1} },
15692 .block_erase = spi_block_erase_c7,
15693 }
15694 },
Alan Green6cfd0182019-07-26 13:50:04 +100015695 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100015696 .unlock = spi_disable_blockprotect,
15697 .write = spi_chip_write_256,
15698 .read = spi_chip_read,
15699 .voltage = {2700, 3600},
15700 },
15701
15702 {
15703 .vendor = "Spansion",
15704 .name = "S25FL016A",
15705 .bustype = BUS_SPI,
15706 .manufacture_id = SPANSION_ID,
15707 .model_id = SPANSION_S25FL016A,
15708 .total_size = 2048,
15709 .page_size = 256,
Alan Green1a4d1182019-08-21 16:14:19 +100015710 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100015711 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015712 .probe = probe_spi_rdid,
15713 .probe_timing = TIMING_ZERO,
15714 .block_erasers =
15715 {
15716 {
15717 .eraseblocks = { {64 * 1024, 32} },
15718 .block_erase = spi_block_erase_d8,
15719 }, {
15720 .eraseblocks = { {2 * 1024 * 1024, 1} },
15721 .block_erase = spi_block_erase_c7,
15722 }
15723 },
Alan Green6cfd0182019-07-26 13:50:04 +100015724 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100015725 .unlock = spi_disable_blockprotect,
15726 .write = spi_chip_write_256,
15727 .read = spi_chip_read,
15728 .voltage = {2700, 3600},
15729 },
15730
15731 {
15732 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015733 .name = "S25FL032A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +100015734 .bustype = BUS_SPI,
15735 .manufacture_id = SPANSION_ID,
15736 .model_id = SPANSION_S25FL032A,
15737 .total_size = 4096,
15738 .page_size = 256,
Alan Greenc63f8d62019-08-26 15:10:04 +100015739 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015740 .probe = probe_spi_rdid,
15741 .probe_timing = TIMING_ZERO,
15742 .block_erasers =
15743 {
15744 {
15745 .eraseblocks = { {64 * 1024, 64} },
15746 .block_erase = spi_block_erase_d8,
15747 }, {
15748 .eraseblocks = { {4 * 1024 * 1024, 1} },
15749 .block_erase = spi_block_erase_c7,
15750 }
15751 },
15752 .unlock = spi_disable_blockprotect,
15753 .write = spi_chip_write_256,
15754 .read = spi_chip_read,
15755 .voltage = {2700, 3600},
15756 },
15757
15758 {
15759 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015760 .name = "S25FL064A/P",
Alan Greend76dc1f2019-06-26 15:38:19 +100015761 .bustype = BUS_SPI,
15762 .manufacture_id = SPANSION_ID,
15763 .model_id = SPANSION_S25FL064A,
15764 .total_size = 8192,
15765 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +100015766 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015767 .probe = probe_spi_rdid,
15768 .probe_timing = TIMING_ZERO,
15769 .block_erasers =
15770 {
15771 {
15772 .eraseblocks = { {64 * 1024, 128} },
15773 .block_erase = spi_block_erase_d8,
15774 }, {
15775 .eraseblocks = { {8 * 1024 * 1024, 1} },
15776 .block_erase = spi_block_erase_c7,
15777 }
15778 },
15779 .unlock = spi_disable_blockprotect,
15780 .write = spi_chip_write_256,
15781 .read = spi_chip_read,
15782 .voltage = {2700, 3600},
15783 },
15784
15785 {
15786 .vendor = "Spansion",
Alan Greenb40ec892019-08-26 11:43:40 +100015787 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
Alan Greend76dc1f2019-06-26 15:38:19 +100015788 .bustype = BUS_SPI,
15789 .manufacture_id = SPANSION_ID,
15790 .model_id = SPANSION_S25FL116K,
15791 .total_size = 2048,
15792 .page_size = 256,
Alan Green1295b292019-07-30 13:38:04 +100015793 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100015794 .probe = probe_spi_rdid,
15795 .probe_timing = TIMING_ZERO,
15796 .block_erasers =
15797 {
15798 {
15799 .eraseblocks = { {4 * 1024, 512} },
15800 .block_erase = spi_block_erase_20,
15801 }, {
15802 .eraseblocks = { {64 * 1024, 32} },
15803 .block_erase = spi_block_erase_d8,
15804 }, {
15805 .eraseblocks = { {2 * 1024 * 1024, 1} },
15806 .block_erase = spi_block_erase_c7,
15807 }
15808 },
15809 .unlock = spi_disable_blockprotect,
15810 .write = spi_chip_write_256,
15811 .read = spi_chip_read,
15812 .voltage = {2700, 3600},
15813 /* TODO: write-protection */
15814 },
15815
15816 {
15817 .vendor = "Spansion",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100015818 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
15819 .bustype = BUS_SPI,
15820 .manufacture_id = SPANSION_ID,
15821 .model_id = SPANSION_S25FL128,
15822 .total_size = 16384,
15823 .page_size = 512,
15824 /* supports 4B addressing */
15825 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15826 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15827 .tested = TEST_UNTESTED,
15828 .probe = probe_spi_rdid,
15829 .probe_timing = TIMING_ZERO,
15830 .block_erasers =
15831 {
15832 {
15833 .eraseblocks = { {256 * 1024, 64} },
15834 .block_erase = spi_block_erase_d8,
15835 }, {
15836 .eraseblocks = { { 16384 * 1024, 1} },
15837 .block_erase = spi_block_erase_60,
15838 }, {
15839 .eraseblocks = { { 16384 * 1024, 1} },
15840 .block_erase = spi_block_erase_c7,
15841 }
15842 },
15843 .printlock = spi_prettyprint_status_register_bp2_srwd,
15844 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15845 .write = spi_chip_write_256, /* Multi I/O supported */
15846 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15847 .voltage = {2700, 3600},
15848 },
15849
15850 {
15851 .vendor = "Spansion",
15852 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15853 .bustype = BUS_SPI,
15854 .manufacture_id = SPANSION_ID,
15855 .model_id = SPANSION_S25FL128,
15856 .total_size = 16384,
15857 .page_size = 256,
15858 /* supports 4B addressing */
15859 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15860 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15861 .tested = TEST_OK_PREW,
15862 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
15863 .probe = probe_spi_rdid,
15864 .probe_timing = TIMING_ZERO,
15865 .block_erasers =
15866 {
15867 {
15868 /* This chip supports erasing of 32 so-called "parameter sectors" with
15869 * opcode 0x20 which may be configured to be on top or bottom of the address
15870 * space. Trying to access an address outside these 4kB blocks does have no
15871 * effect on the memory contents, e.g.
15872 .eraseblocks = {
15873 {4 * 1024, 32},
15874 {64 * 1024, 254} // inaccessible
15875 },
15876 .block_erase = spi_block_erase_20,
15877 }, { */
15878 .eraseblocks = { { 64 * 1024, 256} },
15879 .block_erase = spi_block_erase_d8,
15880 }, {
15881 .eraseblocks = { { 16384 * 1024, 1} },
15882 .block_erase = spi_block_erase_60,
15883 }, {
15884 .eraseblocks = { { 16384 * 1024, 1} },
15885 .block_erase = spi_block_erase_c7,
15886 }
15887 },
15888 .printlock = spi_prettyprint_status_register_bp2_srwd,
15889 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
15890 .write = spi_chip_write_256, /* Multi I/O supported */
15891 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15892 .voltage = {2700, 3600},
15893 },
15894
15895 {
15896 .vendor = "Spansion",
15897 .name = "S25FL128P......0", /* uniform 64 kB sectors */
15898 .bustype = BUS_SPI,
15899 .manufacture_id = SPANSION_ID,
15900 .model_id = SPANSION_S25FL128,
15901 .total_size = 16384,
15902 .page_size = 256,
15903 .feature_bits = FEATURE_WRSR_WREN,
15904 .tested = TEST_OK_PREW,
15905 .probe = probe_spi_rdid,
15906 .probe_timing = TIMING_ZERO,
15907 .block_erasers =
15908 {
15909 {
15910 .eraseblocks = { {64 * 1024, 256} },
15911 .block_erase = spi_block_erase_20,
15912 }, {
15913 .eraseblocks = { {64 * 1024, 256} },
15914 .block_erase = spi_block_erase_d8,
15915 }, {
15916 .eraseblocks = { { 16384 * 1024, 1} },
15917 .block_erase = spi_block_erase_60,
15918 }, {
15919 .eraseblocks = { { 16384 * 1024, 1} },
15920 .block_erase = spi_block_erase_c7,
15921 }
15922 },
15923 .printlock = spi_prettyprint_status_register_bp3_srwd,
15924 .unlock = spi_disable_blockprotect_bp3_srwd,
15925 .write = spi_chip_write_256,
15926 .read = spi_chip_read, /* Fast read (0x0B) supported */
15927 .voltage = {2700, 3600},
15928 },
15929
15930 {
15931 .vendor = "Spansion",
15932 .name = "S25FL128P......1", /* uniform 256kB sectors */
15933 .bustype = BUS_SPI,
15934 .manufacture_id = SPANSION_ID,
15935 .model_id = SPANSION_S25FL128,
15936 .total_size = 16384,
15937 .page_size = 256,
15938 .feature_bits = FEATURE_WRSR_WREN,
15939 .tested = TEST_UNTESTED,
15940 .probe = probe_spi_rdid,
15941 .probe_timing = TIMING_ZERO,
15942 .block_erasers =
15943 {
15944 {
15945 .eraseblocks = { {256 * 1024, 64} },
15946 .block_erase = spi_block_erase_d8,
15947 }, {
15948 .eraseblocks = { { 16384 * 1024, 1} },
15949 .block_erase = spi_block_erase_c7,
15950 }
15951 },
15952 .printlock = spi_prettyprint_status_register_bp2_srwd,
15953 .unlock = spi_disable_blockprotect_bp2_srwd,
15954 .write = spi_chip_write_256,
15955 .read = spi_chip_read, /* Fast read (0x0B) supported */
15956 .voltage = {2700, 3600},
15957 },
15958
15959 {
15960 .vendor = "Spansion",
15961 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
15962 .bustype = BUS_SPI,
15963 .manufacture_id = SPANSION_ID,
15964 .model_id = SPANSION_S25FL128,
15965 .total_size = 16384,
15966 .page_size = 256,
15967 /* supports 4B addressing */
15968 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
15969 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
15970 .tested = TEST_OK_PREW,
15971 .probe = probe_spi_rdid,
15972 .probe_timing = TIMING_ZERO,
15973 .block_erasers =
15974 {
15975 {
15976 /* This chip supports erasing of the 32 so-called "parameter sectors" with
15977 * opcode 0x20. Trying to access an address outside these 4kB blocks does
15978 * have no effect on the memory contents, but sets a flag in the SR.
15979 .eraseblocks = {
15980 {4 * 1024, 32},
15981 {64 * 1024, 254} // inaccessible
15982 },
15983 .block_erase = spi_block_erase_20,
15984 }, { */
15985 .eraseblocks = { { 64 * 1024, 256} },
15986 .block_erase = spi_block_erase_d8,
15987 }, {
15988 .eraseblocks = { { 16384 * 1024, 1} },
15989 .block_erase = spi_block_erase_60,
15990 }, {
15991 .eraseblocks = { { 16384 * 1024, 1} },
15992 .block_erase = spi_block_erase_c7,
15993 }
15994 },
15995 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
15996 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
15997 .write = spi_chip_write_256, /* Multi I/O supported */
15998 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
15999 .voltage = {2700, 3600},
16000 },
16001
16002 {
16003 .vendor = "Spansion",
16004 .name = "S25FL128S......1", /* uniform 256 kB sectors */
16005 .bustype = BUS_SPI,
16006 .manufacture_id = SPANSION_ID,
16007 .model_id = SPANSION_S25FL128,
16008 .total_size = 16384,
16009 .page_size = 512,
16010 /* supports 4B addressing */
16011 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16012 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16013 .tested = TEST_UNTESTED,
16014 .probe = probe_spi_rdid,
16015 .probe_timing = TIMING_ZERO,
16016 .block_erasers =
16017 {
16018 {
16019 .eraseblocks = { {256 * 1024, 64} },
16020 .block_erase = spi_block_erase_d8,
16021 }, {
16022 .eraseblocks = { { 16384 * 1024, 1} },
16023 .block_erase = spi_block_erase_60,
16024 }, {
16025 .eraseblocks = { { 16384 * 1024, 1} },
16026 .block_erase = spi_block_erase_c7,
16027 }
16028 },
16029 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16030 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16031 .write = spi_chip_write_256, /* Multi I/O supported */
16032 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16033 .voltage = {2700, 3600},
16034 },
16035
16036 {
16037 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016038 .name = "S25FL128S_UL Uniform 128 kB Sectors",
16039 .bustype = BUS_SPI,
16040 .manufacture_id = SPANSION_ID,
16041 .model_id = SPANSION_S25FL128S_UL,
16042 .total_size = 16384,
16043 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016044 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016045 .tested = TEST_UNTESTED,
16046 .probe = probe_spi_big_spansion,
16047 .probe_timing = TIMING_ZERO,
16048 .block_erasers =
16049 {
16050 {
16051 .eraseblocks = { {128 * 1024, 128} },
16052 .block_erase = spi_block_erase_d8,
16053 }, {
16054 .eraseblocks = { {16 * 1024 * 1024, 1} },
16055 .block_erase = spi_block_erase_60,
16056 }, {
16057 .eraseblocks = { {16 * 1024 * 1024, 1} },
16058 .block_erase = spi_block_erase_c7,
16059 },
16060 },
16061 .unlock = spi_disable_blockprotect,
16062 .write = spi_chip_write_256,
16063 .read = spi_chip_read,
16064 .voltage = {1700, 2000},
16065 .wp = &wp_generic,
16066 },
16067
16068 {
16069 .vendor = "Spansion",
16070 .name = "S25FL128S_US Uniform 64 kB Sectors",
16071 .bustype = BUS_SPI,
16072 .manufacture_id = SPANSION_ID,
16073 .model_id = SPANSION_S25FL128S_US,
16074 .total_size = 16384,
16075 .page_size = 256,
16076 .feature_bits = FEATURE_WRSR_WREN,
16077 .tested = TEST_UNTESTED,
16078 .probe = probe_spi_big_spansion,
16079 .probe_timing = TIMING_ZERO,
16080 .block_erasers =
16081 {
16082 {
16083 .eraseblocks = { {64 * 1024, 256} },
16084 .block_erase = spi_block_erase_d8,
16085 }, {
16086 .eraseblocks = { {16 * 1024 * 1024, 1} },
16087 .block_erase = spi_block_erase_60,
16088 }, {
16089 .eraseblocks = { {16 * 1024 * 1024, 1} },
16090 .block_erase = spi_block_erase_c7,
16091 },
16092 },
16093 .unlock = spi_disable_blockprotect,
16094 .write = spi_chip_write_256,
16095 .read = spi_chip_read,
16096 .voltage = {1700, 2000},
16097 .wp = &wp_generic,
16098 },
16099
16100 {
16101 .vendor = "Spansion",
Nikolai Artemievd7acc192020-08-31 17:50:48 +100016102 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16103 .bustype = BUS_SPI,
16104 .manufacture_id = SPANSION_ID,
16105 .model_id = SPANSION_S25FL128,
16106 .total_size = 16384,
16107 .page_size = 256,
16108 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16109 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16110 .tested = TEST_OK_PREW,
16111 .probe = probe_spi_rdid,
16112 .probe_timing = TIMING_ZERO,
16113 .block_erasers =
16114 {
16115 {
16116 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
16117 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
16118 * effect on the memory contents, but sets a flag in the SR.
16119 .eraseblocks = {
16120 {4 * 1024, 32},
16121 {64 * 1024, 254} // inaccessible
16122 },
16123 .block_erase = spi_block_erase_20,
16124 }, { */
16125 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
16126 .eraseblocks = {
16127 {8 * 1024, 16},
16128 {64 * 1024, 254} // inaccessible
16129 },
16130 .block_erase = spi_block_erase_40,
16131 }, { */
16132 .eraseblocks = { { 64 * 1024, 256} },
16133 .block_erase = spi_block_erase_d8,
16134 }, {
16135 .eraseblocks = { { 16384 * 1024, 1} },
16136 .block_erase = spi_block_erase_60,
16137 }, {
16138 .eraseblocks = { { 16384 * 1024, 1} },
16139 .block_erase = spi_block_erase_c7,
16140 }
16141 },
16142 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16143 .unlock = spi_disable_blockprotect_bp2_srwd,
16144 .write = spi_chip_write_256, /* Multi I/O supported */
16145 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16146 .voltage = {2700, 3600},
16147 },
16148
16149 {
16150 .vendor = "Spansion",
16151 .name = "S25FL129P......1", /* uniform 256 kB sectors */
16152 .bustype = BUS_SPI,
16153 .manufacture_id = SPANSION_ID,
16154 .model_id = SPANSION_S25FL128,
16155 .total_size = 16384,
16156 .page_size = 256,
16157 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
16158 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16159 .tested = TEST_UNTESTED,
16160 .probe = probe_spi_rdid,
16161 .probe_timing = TIMING_ZERO,
16162 .block_erasers =
16163 {
16164 {
16165 .eraseblocks = { {256 * 1024, 64} },
16166 .block_erase = spi_block_erase_d8,
16167 }, {
16168 .eraseblocks = { { 16384 * 1024, 1} },
16169 .block_erase = spi_block_erase_60,
16170 }, {
16171 .eraseblocks = { { 16384 * 1024, 1} },
16172 .block_erase = spi_block_erase_c7,
16173 }
16174 },
16175 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
16176 .unlock = spi_disable_blockprotect_bp2_srwd,
16177 .write = spi_chip_write_256, /* Multi I/O supported */
16178 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16179 .voltage = {2700, 3600},
16180 },
16181
16182 {
16183 .vendor = "Spansion",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016184 .name = "S25FL132K",
16185 .bustype = BUS_SPI,
16186 .manufacture_id = SPANSION_ID,
16187 .model_id = SPANSION_S25FL132K,
16188 .total_size = 4096,
16189 .page_size = 256,
16190 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16191 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16192 .tested = TEST_UNTESTED,
16193 .probe = probe_spi_rdid,
16194 .probe_timing = TIMING_ZERO,
16195 .block_erasers =
16196 {
16197 {
16198 .eraseblocks = { {4 * 1024, 1024} },
16199 .block_erase = spi_block_erase_20,
16200 }, {
16201 .eraseblocks = { {64 * 1024, 64} },
16202 .block_erase = spi_block_erase_d8,
16203 }, {
16204 .eraseblocks = { { 4096 * 1024, 1} },
16205 .block_erase = spi_block_erase_60,
16206 }, {
16207 .eraseblocks = { { 4096 * 1024, 1} },
16208 .block_erase = spi_block_erase_c7,
16209 }
16210 },
16211 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16212 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16213 .write = spi_chip_write_256,
16214 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16215 .voltage = {2700, 3600},
16216 },
16217
16218 {
16219 .vendor = "Spansion",
16220 .name = "S25FL164K",
16221 .bustype = BUS_SPI,
16222 .manufacture_id = SPANSION_ID,
16223 .model_id = SPANSION_S25FL164K,
16224 .total_size = 8192,
16225 .page_size = 256,
16226 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
16227 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16228 .tested = TEST_OK_PREW,
16229 .probe = probe_spi_rdid,
16230 .probe_timing = TIMING_ZERO,
16231 .block_erasers =
16232 {
16233 {
16234 .eraseblocks = { {4 * 1024, 2048} },
16235 .block_erase = spi_block_erase_20,
16236 }, {
16237 .eraseblocks = { {64 * 1024, 128} },
16238 .block_erase = spi_block_erase_d8,
16239 }, {
16240 .eraseblocks = { { 8192 * 1024, 1} },
16241 .block_erase = spi_block_erase_60,
16242 }, {
16243 .eraseblocks = { { 8192 * 1024, 1} },
16244 .block_erase = spi_block_erase_c7,
16245 }
16246 },
16247 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
16248 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16249 .write = spi_chip_write_256,
16250 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16251 .voltage = {2700, 3600},
16252 },
16253
16254 {
16255 .vendor = "Spansion",
16256 .name = "S25FL204K",
16257 .bustype = BUS_SPI,
16258 .manufacture_id = SPANSION_ID,
16259 .model_id = SPANSION_S25FL204,
16260 .total_size = 512,
16261 .page_size = 256,
16262 .feature_bits = FEATURE_WRSR_WREN,
16263 .tested = TEST_OK_PR,
16264 .probe = probe_spi_rdid,
16265 .probe_timing = TIMING_ZERO,
16266 .block_erasers =
16267 {
16268 {
16269 .eraseblocks = { {4 * 1024, 128} },
16270 .block_erase = spi_block_erase_20,
16271 }, {
16272 .eraseblocks = { {64 * 1024, 8} },
16273 .block_erase = spi_block_erase_d8,
16274 }, {
16275 .eraseblocks = { { 512 * 1024, 1} },
16276 .block_erase = spi_block_erase_60,
16277 }, {
16278 .eraseblocks = { { 512 * 1024, 1} },
16279 .block_erase = spi_block_erase_c7,
16280 }
16281 },
16282 .printlock = spi_prettyprint_status_register_bp3_srwd,
16283 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16284 .write = spi_chip_write_256,
16285 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16286 .voltage = {2700, 3600},
16287 },
16288
16289 {
16290 .vendor = "Spansion",
16291 .name = "S25FL208K",
16292 .bustype = BUS_SPI,
16293 .manufacture_id = SPANSION_ID,
16294 .model_id = SPANSION_S25FL208,
16295 .total_size = 1024,
16296 .page_size = 256,
16297 .feature_bits = FEATURE_WRSR_WREN,
16298 .tested = TEST_OK_PREW,
16299 .probe = probe_spi_rdid,
16300 .probe_timing = TIMING_ZERO,
16301 .block_erasers =
16302 {
16303 {
16304 .eraseblocks = { {4 * 1024, 256} },
16305 .block_erase = spi_block_erase_20,
16306 }, {
16307 .eraseblocks = { {64 * 1024, 16} },
16308 .block_erase = spi_block_erase_d8,
16309 }, {
16310 .eraseblocks = { { 1024 * 1024, 1} },
16311 .block_erase = spi_block_erase_60,
16312 }, {
16313 .eraseblocks = { { 1024 * 1024, 1} },
16314 .block_erase = spi_block_erase_c7,
16315 }
16316 },
16317 .printlock = spi_prettyprint_status_register_bp3_srwd,
16318 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16319 .write = spi_chip_write_256,
16320 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16321 .voltage = {2700, 3600},
16322 },
16323
16324 {
16325 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016326 .name = "S25FL256S Large Sectors",
16327 .bustype = BUS_SPI,
16328 .manufacture_id = SPANSION_ID,
16329 .model_id = SPANSION_S25FL256S_UL,
16330 .total_size = 16384, /* This is just half the size.... */
16331 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016332 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016333 .tested = TEST_UNTESTED,
16334 .probe = probe_spi_big_spansion,
16335 .probe_timing = TIMING_ZERO,
16336 .block_erasers =
16337 {
16338 {
16339 .eraseblocks = { {256 * 1024, 64} },
16340 .block_erase = s25fl_block_erase,
16341 }, {
16342 .eraseblocks = { {16 * 1024 * 1024, 1} },
16343 .block_erase = spi_block_erase_60,
16344 },
16345 },
16346 .unlock = spi_disable_blockprotect,
16347 .write = spi_chip_write_256,
16348 .read = spi_chip_read,
16349 .voltage = {1700, 2000},
16350 .wp = &wp_generic,
16351 },
16352
16353 {
16354 .vendor = "Spansion",
16355 .name = "S25FL256S Small Sectors",
16356 .bustype = BUS_SPI,
16357 .manufacture_id = SPANSION_ID,
16358 .model_id = SPANSION_S25FL256S_US,
16359 .total_size = 16384, /* This is just half the size.... */
16360 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016361 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100016362 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100016363 .probe = probe_spi_big_spansion,
16364 .probe_timing = TIMING_ZERO,
16365 .block_erasers =
16366 {
16367 {
16368 .eraseblocks = { {64 * 1024, 256} },
16369 .block_erase = s25fl_block_erase,
16370 }, {
16371 .eraseblocks = { {16 * 1024 * 1024, 1} },
16372 .block_erase = spi_block_erase_60,
16373 },
16374 },
16375 .unlock = spi_disable_blockprotect,
16376 .write = spi_chip_write_256,
16377 .read = spi_chip_read,
16378 .voltage = {1700, 2000},
16379 .wp = &wp_generic,
16380 },
16381
16382 {
16383 .vendor = "Spansion",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016384 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16385 .bustype = BUS_SPI,
16386 .manufacture_id = SPANSION_ID,
16387 .model_id = SPANSION_S25FL256,
16388 .total_size = 32768,
16389 .page_size = 256,
16390 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16391 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_EAR7,
16392 .tested = TEST_OK_PREW,
16393 .probe = probe_spi_rdid,
16394 .probe_timing = TIMING_ZERO,
16395 .block_erasers =
16396 {
16397 {
16398 /* This chip supports erasing of the 32 so-called "parameter sectors" with
16399 * opcode 0x20. Trying to access an address outside these 4kB blocks does
16400 * have no effect on the memory contents, but sets a flag in the SR.
16401 .eraseblocks = {
16402 {4 * 1024, 32},
16403 {64 * 1024, 254} // inaccessible
16404 },
16405 .block_erase = spi_block_erase_20,
16406 }, { */
16407 .eraseblocks = { { 64 * 1024, 512} },
16408 .block_erase = spi_block_erase_dc,
16409 }, {
16410 .eraseblocks = { { 64 * 1024, 512} },
16411 .block_erase = spi_block_erase_d8,
16412 }, {
16413 .eraseblocks = { { 32768 * 1024, 1} },
16414 .block_erase = spi_block_erase_60,
16415 }, {
16416 .eraseblocks = { { 32768 * 1024, 1} },
16417 .block_erase = spi_block_erase_c7,
16418 }
16419 },
16420 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16421 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16422 .write = spi_chip_write_256, /* Multi I/O supported */
16423 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16424 .voltage = {2700, 3600},
16425 .wrea_override = 0x17,
16426 },
16427
16428 {
16429 .vendor = "Spansion",
16430 .name = "S25FL512S",
16431 .bustype = BUS_SPI,
16432 .manufacture_id = SPANSION_ID,
16433 .model_id = SPANSION_S25FL512,
16434 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
16435 .page_size = 256,
16436 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16437 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_NATIVE,
16438 .tested = TEST_OK_PREW,
16439 .probe = probe_spi_rdid,
16440 .probe_timing = TIMING_ZERO,
16441 .block_erasers =
16442 {
16443 {
16444 .eraseblocks = { { 256 * 1024, 256} },
16445 .block_erase = spi_block_erase_dc,
16446 }, {
16447 .eraseblocks = { { 65536 * 1024, 1} },
16448 .block_erase = spi_block_erase_60,
16449 }, {
16450 .eraseblocks = { { 65536 * 1024, 1} },
16451 .block_erase = spi_block_erase_c7,
16452 }
16453 },
16454 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
16455 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
16456 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
16457 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16458 .voltage = {2700, 3600},
16459 },
16460
16461 {
16462 .vendor = "Spansion",
Alan Greend76dc1f2019-06-26 15:38:19 +100016463 .name = "S25FS128S Large Sectors",
16464 .bustype = BUS_SPI,
16465 .manufacture_id = SPANSION_ID,
16466 .model_id = SPANSION_S25FS128S_L,
16467 .total_size = 16384,
16468 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016469 .feature_bits = FEATURE_WRSR_WREN,
Alan Greend76dc1f2019-06-26 15:38:19 +100016470 .tested = TEST_UNTESTED,
16471 .probe = probe_spi_big_spansion,
16472 .probe_timing = TIMING_ZERO,
16473 .block_erasers =
16474 {
16475 {
16476 .eraseblocks = { {64 * 1024, 256} },
16477 .block_erase = s25fs_block_erase_d8,
16478 }, {
16479 .eraseblocks = { {16 * 1024 * 1024, 1} },
16480 .block_erase = spi_block_erase_60,
16481 }, {
16482 .eraseblocks = { {16 * 1024 * 1024, 1} },
16483 .block_erase = spi_block_erase_c7,
16484 },
16485 },
16486 .unlock = spi_disable_blockprotect,
16487 .write = spi_chip_write_256,
16488 .read = spi_chip_read,
16489 .voltage = {1700, 2000},
16490 .wp = &wp_generic,
16491 },
16492
16493 {
16494 .vendor = "Spansion",
16495 .name = "S25FS128S Small Sectors",
16496 .bustype = BUS_SPI,
16497 .manufacture_id = SPANSION_ID,
16498 .model_id = SPANSION_S25FS128S_S,
16499 .total_size = 16384,
16500 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016501 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100016502 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100016503 .probe = probe_spi_big_spansion,
16504 .probe_timing = TIMING_ZERO,
16505 .block_erasers =
16506 {
16507 {
16508 .eraseblocks = { {64 * 1024, 256} },
16509 .block_erase = s25fs_block_erase_d8,
16510 }, {
16511 .eraseblocks = { {16 * 1024 * 1024, 1} },
16512 .block_erase = spi_block_erase_60,
16513 }, {
16514 .eraseblocks = { {16 * 1024 * 1024, 1} },
16515 .block_erase = spi_block_erase_c7,
16516 },
16517 },
16518 .unlock = spi_disable_blockprotect,
16519 .write = spi_chip_write_256,
16520 .read = spi_chip_read,
16521 .voltage = {1700, 2000},
16522 .wp = &wp_generic,
16523 },
16524
16525 {
hailfinger0ae231d2010-07-29 20:01:13 +000016526 .vendor = "SyncMOS/MoselVitelic",
16527 .name = "{F,S,V}29C51001B",
hailfingere1e41ea2011-07-27 07:13:06 +000016528 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016529 .manufacture_id = SYNCMOS_MVC_ID,
16530 .model_id = SM_MVC_29C51001B,
hailfinger286829b2009-01-08 03:40:17 +000016531 .total_size = 128,
hailfinger0ae231d2010-07-29 20:01:13 +000016532 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +000016533 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000016534 .tested = TEST_UNTESTED,
16535 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016536 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016537 .block_erasers =
16538 {
16539 {
16540 .eraseblocks = { {512, 256} },
16541 .block_erase = erase_sector_jedec,
16542 }, {
16543 .eraseblocks = { {128 * 1024, 1} },
16544 .block_erase = erase_chip_block_jedec,
16545 },
16546 },
snelsonc6855342010-01-28 23:55:12 +000016547 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016548 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016549 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000016550 },
16551
hailfinger286829b2009-01-08 03:40:17 +000016552 {
hailfinger0ae231d2010-07-29 20:01:13 +000016553 .vendor = "SyncMOS/MoselVitelic",
16554 .name = "{F,S,V}29C51001T",
hailfingere1e41ea2011-07-27 07:13:06 +000016555 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016556 .manufacture_id = SYNCMOS_MVC_ID,
16557 .model_id = SM_MVC_29C51001T,
16558 .total_size = 128,
16559 .page_size = 512,
snelsonc6855342010-01-28 23:55:12 +000016560 .feature_bits = FEATURE_EITHER_RESET,
hailfinger0ae231d2010-07-29 20:01:13 +000016561 .tested = TEST_UNTESTED,
16562 .probe = probe_jedec,
16563 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16564 .block_erasers =
16565 {
16566 {
16567 .eraseblocks = { {512, 256} },
16568 .block_erase = erase_sector_jedec,
16569 }, {
16570 .eraseblocks = { {128 * 1024, 1} },
16571 .block_erase = erase_chip_block_jedec,
16572 },
16573 },
16574 .write = write_jedec_1,
16575 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016576 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016577 },
16578
16579 {
16580 .vendor = "SyncMOS/MoselVitelic",
16581 .name = "{F,S,V}29C51002B",
hailfingere1e41ea2011-07-27 07:13:06 +000016582 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016583 .manufacture_id = SYNCMOS_MVC_ID,
16584 .model_id = SM_MVC_29C51002B,
16585 .total_size = 256,
16586 .page_size = 512,
16587 .feature_bits = FEATURE_EITHER_RESET,
16588 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000016589 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016590 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016591 .block_erasers =
16592 {
16593 {
16594 .eraseblocks = { {512, 512} },
16595 .block_erase = erase_sector_jedec,
16596 }, {
16597 .eraseblocks = { {256 * 1024, 1} },
16598 .block_erase = erase_chip_block_jedec,
16599 },
16600 },
snelsonc6855342010-01-28 23:55:12 +000016601 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016602 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000016603 },
16604
hailfinger286829b2009-01-08 03:40:17 +000016605 {
hailfinger0ae231d2010-07-29 20:01:13 +000016606 .vendor = "SyncMOS/MoselVitelic",
16607 .name = "{F,S,V}29C51002T",
hailfingere1e41ea2011-07-27 07:13:06 +000016608 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016609 .manufacture_id = SYNCMOS_MVC_ID,
16610 .model_id = SM_MVC_29C51002T,
16611 .total_size = 256,
16612 .page_size = 512,
16613 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000016614 .tested = TEST_OK_PREW,
hailfinger0ae231d2010-07-29 20:01:13 +000016615 .probe = probe_jedec,
16616 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16617 .block_erasers =
16618 {
16619 {
16620 .eraseblocks = { {512, 512} },
16621 .block_erase = erase_sector_jedec,
16622 }, {
16623 .eraseblocks = { {256 * 1024, 1} },
16624 .block_erase = erase_chip_block_jedec,
16625 },
16626 },
16627 .write = write_jedec_1,
16628 .read = read_memmapped,
16629 },
16630
16631 {
16632 .vendor = "SyncMOS/MoselVitelic",
16633 .name = "{F,S,V}29C51004B",
hailfingere1e41ea2011-07-27 07:13:06 +000016634 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016635 .manufacture_id = SYNCMOS_MVC_ID,
16636 .model_id = SM_MVC_29C51004B,
hailfinger286829b2009-01-08 03:40:17 +000016637 .total_size = 512,
hailfinger0ae231d2010-07-29 20:01:13 +000016638 .page_size = 1024,
snelsonc6855342010-01-28 23:55:12 +000016639 .feature_bits = FEATURE_EITHER_RESET,
hailfinger286829b2009-01-08 03:40:17 +000016640 .tested = TEST_UNTESTED,
16641 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016642 .probe_timing = TIMING_ZERO,
snelsone0c56352010-01-19 16:08:51 +000016643 .block_erasers =
16644 {
16645 {
hailfinger0ae231d2010-07-29 20:01:13 +000016646 .eraseblocks = { {1024, 512} },
16647 .block_erase = erase_sector_jedec,
16648 }, {
16649 .eraseblocks = { {512 * 1024, 1} },
16650 .block_erase = erase_chip_block_jedec,
16651 },
16652 },
16653 .write = write_jedec_1,
16654 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016655 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016656 },
16657
16658 {
16659 .vendor = "SyncMOS/MoselVitelic",
16660 .name = "{F,S,V}29C51004T",
hailfingere1e41ea2011-07-27 07:13:06 +000016661 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016662 .manufacture_id = SYNCMOS_MVC_ID,
16663 .model_id = SM_MVC_29C51004T,
16664 .total_size = 512,
16665 .page_size = 1024,
16666 .feature_bits = FEATURE_EITHER_RESET,
16667 .tested = TEST_UNTESTED,
16668 .probe = probe_jedec,
16669 .probe_timing = TIMING_ZERO,
16670 .block_erasers =
16671 {
16672 {
16673 .eraseblocks = { {1024, 512} },
16674 .block_erase = erase_sector_jedec,
16675 }, {
16676 .eraseblocks = { {512 * 1024, 1} },
16677 .block_erase = erase_chip_block_jedec,
16678 },
16679 },
16680 .write = write_jedec_1,
16681 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016682 .voltage = {4500, 5500},
hailfinger0ae231d2010-07-29 20:01:13 +000016683 },
16684
16685 {
16686 .vendor = "SyncMOS/MoselVitelic",
16687 .name = "{S,V}29C31004B",
hailfingere1e41ea2011-07-27 07:13:06 +000016688 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016689 .manufacture_id = SYNCMOS_MVC_ID,
16690 .model_id = SM_MVC_29C31004B,
16691 .total_size = 512,
16692 .page_size = 1024,
16693 .feature_bits = FEATURE_EITHER_RESET,
16694 .tested = TEST_UNTESTED,
16695 .probe = probe_jedec,
16696 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16697 .block_erasers =
16698 {
16699 {
16700 .eraseblocks = { {1024, 512} },
16701 .block_erase = erase_sector_jedec,
16702 }, {
16703 .eraseblocks = { {512 * 1024, 1} },
16704 .block_erase = erase_chip_block_jedec,
16705 },
16706 },
16707 .write = write_jedec_1,
16708 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016709 .voltage = {3000, 3600},
hailfinger0ae231d2010-07-29 20:01:13 +000016710 },
16711
16712 {
16713 .vendor = "SyncMOS/MoselVitelic",
16714 .name = "{S,V}29C31004T",
hailfingere1e41ea2011-07-27 07:13:06 +000016715 .bustype = BUS_PARALLEL,
hailfinger0ae231d2010-07-29 20:01:13 +000016716 .manufacture_id = SYNCMOS_MVC_ID,
16717 .model_id = SM_MVC_29C31004T,
16718 .total_size = 512,
16719 .page_size = 1024,
16720 .feature_bits = FEATURE_EITHER_RESET,
16721 .tested = TEST_UNTESTED,
16722 .probe = probe_jedec,
16723 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16724 .block_erasers =
16725 {
16726 {
16727 .eraseblocks = { {1024, 512} },
snelsone0c56352010-01-19 16:08:51 +000016728 .block_erase = erase_sector_jedec,
16729 }, {
16730 .eraseblocks = { {512 * 1024, 1} },
16731 .block_erase = erase_chip_block_jedec,
16732 },
16733 },
snelsonc6855342010-01-28 23:55:12 +000016734 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000016735 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016736 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000016737 },
16738
hailfinger286829b2009-01-08 03:40:17 +000016739 {
uwe77048c72009-05-27 23:17:40 +000016740 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +000016741 .name = "TMS29F002RB",
hailfingere1e41ea2011-07-27 07:13:06 +000016742 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +000016743 .manufacture_id = TI_OLD_ID,
16744 .model_id = TI_TMS29F002RB,
16745 .total_size = 256,
16746 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +000016747 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +000016748 .tested = TEST_UNTESTED,
16749 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016750 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016751 .block_erasers =
16752 {
16753 {
16754 .eraseblocks = {
16755 {16 * 1024, 1},
16756 {8 * 1024, 2},
16757 {32 * 1024, 1},
16758 {64 * 1024, 3},
16759 },
16760 .block_erase = erase_sector_jedec,
16761 }, {
16762 .eraseblocks = { {256 * 1024, 1} },
16763 .block_erase = erase_chip_block_jedec,
16764 },
16765 },
snelsonc6855342010-01-28 23:55:12 +000016766 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +000016767 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016768 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +000016769 },
16770
16771 {
uwe77048c72009-05-27 23:17:40 +000016772 .vendor = "TI",
hailfingerf66fa232009-05-26 21:26:23 +000016773 .name = "TMS29F002RT",
hailfingere1e41ea2011-07-27 07:13:06 +000016774 .bustype = BUS_PARALLEL,
hailfingerf66fa232009-05-26 21:26:23 +000016775 .manufacture_id = TI_OLD_ID,
16776 .model_id = TI_TMS29F002RT,
16777 .total_size = 256,
16778 .page_size = 16384, /* Non-uniform sectors */
snelsonc6855342010-01-28 23:55:12 +000016779 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
hailfingerf66fa232009-05-26 21:26:23 +000016780 .tested = TEST_UNTESTED,
16781 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000016782 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
snelsone0c56352010-01-19 16:08:51 +000016783 .block_erasers =
16784 {
16785 {
16786 .eraseblocks = {
16787 {64 * 1024, 3},
16788 {32 * 1024, 1},
16789 {8 * 1024, 2},
16790 {16 * 1024, 1},
16791 },
16792 .block_erase = erase_sector_jedec,
16793 }, {
16794 .eraseblocks = { {256 * 1024, 1} },
16795 .block_erase = erase_chip_block_jedec,
16796 },
16797 },
snelsonc6855342010-01-28 23:55:12 +000016798 .write = write_jedec_1,
hailfingerf66fa232009-05-26 21:26:23 +000016799 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000016800 .voltage = {4500, 5500},
hailfingerf66fa232009-05-26 21:26:23 +000016801 },
16802
16803 {
hailfinger286829b2009-01-08 03:40:17 +000016804 .vendor = "Winbond",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100016805 .name = "W25P16",
16806 .bustype = BUS_SPI,
16807 .manufacture_id = WINBOND_NEX_ID,
16808 .model_id = WINBOND_NEX_W25P16,
16809 .total_size = 2048,
16810 .page_size = 256,
16811 .feature_bits = FEATURE_WRSR_WREN,
16812 .tested = TEST_UNTESTED,
16813 .probe = probe_spi_rdid,
16814 .probe_timing = TIMING_ZERO,
16815 .block_erasers =
16816 {
16817 {
16818 .eraseblocks = { {64 * 1024, 32} },
16819 .block_erase = spi_block_erase_d8,
16820 }, {
16821 .eraseblocks = { {2048 * 1024, 1} },
16822 .block_erase = spi_block_erase_c7,
16823 }
16824 },
16825 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16826 .unlock = spi_disable_blockprotect,
16827 .write = spi_chip_write_256,
16828 .read = spi_chip_read, /* Fast read (0x0B) supported */
16829 .voltage = {2700, 3600},
16830 },
16831
16832 {
16833 .vendor = "Winbond",
16834 .name = "W25P32",
16835 .bustype = BUS_SPI,
16836 .manufacture_id = WINBOND_NEX_ID,
16837 .model_id = WINBOND_NEX_W25P32,
16838 .total_size = 4096,
16839 .page_size = 256,
16840 .feature_bits = FEATURE_WRSR_WREN,
16841 .tested = TEST_UNTESTED,
16842 .probe = probe_spi_rdid,
16843 .probe_timing = TIMING_ZERO,
16844 .block_erasers =
16845 {
16846 {
16847 .eraseblocks = { {64 * 1024, 64} },
16848 .block_erase = spi_block_erase_d8,
16849 }, {
16850 .eraseblocks = { {4096 * 1024, 1} },
16851 .block_erase = spi_block_erase_c7,
16852 }
16853 },
16854 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16855 .unlock = spi_disable_blockprotect,
16856 .write = spi_chip_write_256,
16857 .read = spi_chip_read, /* Fast read (0x0B) supported */
16858 .voltage = {2700, 3600},
16859 },
16860
16861 {
16862 .vendor = "Winbond",
16863 .name = "W25P80",
16864 .bustype = BUS_SPI,
16865 .manufacture_id = WINBOND_NEX_ID,
16866 .model_id = WINBOND_NEX_W25P80,
16867 .total_size = 1024,
16868 .page_size = 256,
16869 .feature_bits = FEATURE_WRSR_WREN,
16870 .tested = TEST_UNTESTED,
16871 .probe = probe_spi_rdid,
16872 .probe_timing = TIMING_ZERO,
16873 .block_erasers =
16874 {
16875 {
16876 .eraseblocks = { {64 * 1024, 16} },
16877 .block_erase = spi_block_erase_d8,
16878 }, {
16879 .eraseblocks = { {1024 * 1024, 1} },
16880 .block_erase = spi_block_erase_c7,
16881 }
16882 },
16883 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16884 .unlock = spi_disable_blockprotect,
16885 .write = spi_chip_write_256,
16886 .read = spi_chip_read, /* Fast read (0x0B) supported */
16887 .voltage = {2700, 3600},
16888 },
16889
16890 {
16891 .vendor = "Winbond",
David Hendricks07153282016-12-22 16:07:00 -080016892 .name = "W25Q128.V",
hailfingere1e41ea2011-07-27 07:13:06 +000016893 .bustype = BUS_SPI,
stefancte0e52902011-05-26 14:28:51 +000016894 .manufacture_id = WINBOND_NEX_ID,
Patrick Georgicc04a452017-02-06 12:14:43 +010016895 .model_id = WINBOND_NEX_W25Q128_V,
David Hendricks9356d162015-03-06 14:07:25 -080016896 .total_size = 16384,
stefancte0e52902011-05-26 14:28:51 +000016897 .page_size = 256,
Stefan Tauner9816fc82016-08-12 15:47:49 -070016898 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +100016899 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100016900 .tested = TEST_OK_PREW,
stefancte0e52902011-05-26 14:28:51 +000016901 .probe = probe_spi_rdid,
16902 .probe_timing = TIMING_ZERO,
16903 .block_erasers =
16904 {
16905 {
David Hendricks9356d162015-03-06 14:07:25 -080016906 .eraseblocks = { {4 * 1024, 4096} },
stefancte0e52902011-05-26 14:28:51 +000016907 .block_erase = spi_block_erase_20,
16908 }, {
David Hendricks9356d162015-03-06 14:07:25 -080016909 .eraseblocks = { {32 * 1024, 512} },
stefancte0e52902011-05-26 14:28:51 +000016910 .block_erase = spi_block_erase_52,
16911 }, {
David Hendricks9356d162015-03-06 14:07:25 -080016912 .eraseblocks = { {64 * 1024, 256} },
stefancte0e52902011-05-26 14:28:51 +000016913 .block_erase = spi_block_erase_d8,
16914 }, {
David Hendricks9356d162015-03-06 14:07:25 -080016915 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000016916 .block_erase = spi_block_erase_60,
16917 }, {
David Hendricks9356d162015-03-06 14:07:25 -080016918 .eraseblocks = { {16 * 1024 * 1024, 1} },
stefancte0e52902011-05-26 14:28:51 +000016919 .block_erase = spi_block_erase_c7,
16920 }
16921 },
Alan Green6cfd0182019-07-26 13:50:04 +100016922 .printlock = spi_prettyprint_status_register_plain,
stefancte0e52902011-05-26 14:28:51 +000016923 .unlock = spi_disable_blockprotect,
16924 .write = spi_chip_write_256,
16925 .read = spi_chip_read,
Alan Green5dc48da2019-08-26 15:35:10 +100016926 .voltage = {2700, 3600},
Duncan Laurieed32d7b2015-05-27 11:28:18 -070016927 .wp = &wp_w25q,
stefancte0e52902011-05-26 14:28:51 +000016928 },
16929
16930 {
16931 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100016932 .name = "W25Q128.V..M",
Martin Rothee8dcf92017-05-10 19:16:19 -060016933 .bustype = BUS_SPI,
16934 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +100016935 .model_id = WINBOND_NEX_W25Q128_V_M,
Martin Rothee8dcf92017-05-10 19:16:19 -060016936 .total_size = 16384,
16937 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100016938 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100016939 .tested = TEST_OK_PREW,
Martin Rothee8dcf92017-05-10 19:16:19 -060016940 .probe = probe_spi_rdid,
16941 .probe_timing = TIMING_ZERO,
16942 .block_erasers =
16943 {
16944 {
16945 .eraseblocks = { {4 * 1024, 4096} },
16946 .block_erase = spi_block_erase_20,
16947 }, {
16948 .eraseblocks = { {32 * 1024, 512} },
16949 .block_erase = spi_block_erase_52,
16950 }, {
16951 .eraseblocks = { {64 * 1024, 256} },
16952 .block_erase = spi_block_erase_d8,
16953 }, {
16954 .eraseblocks = { {16 * 1024 * 1024, 1} },
16955 .block_erase = spi_block_erase_60,
16956 }, {
16957 .eraseblocks = { {16 * 1024 * 1024, 1} },
16958 .block_erase = spi_block_erase_c7,
16959 }
16960 },
Alan Green6cfd0182019-07-26 13:50:04 +100016961 .printlock = spi_prettyprint_status_register_plain,
Alan Green96685f12019-08-26 15:48:25 +100016962 .unlock = spi_disable_blockprotect,
Martin Rothee8dcf92017-05-10 19:16:19 -060016963 .write = spi_chip_write_256,
16964 .read = spi_chip_read,
16965 .voltage = {2700, 3600},
16966 .wp = &wp_w25,
16967 },
Alan Greena7cfa332019-06-24 15:48:14 +100016968
Martin Rothee8dcf92017-05-10 19:16:19 -060016969 {
16970 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100016971 .name = "W25Q128.W",
16972 .bustype = BUS_SPI,
16973 .manufacture_id = WINBOND_NEX_ID,
16974 .model_id = WINBOND_NEX_W25Q128_W,
16975 .total_size = 16384,
16976 .page_size = 256,
16977 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16978 .tested = TEST_OK_PREW,
16979 .probe = probe_spi_rdid,
16980 .probe_timing = TIMING_ZERO,
16981 .block_erasers =
16982 {
16983 {
16984 .eraseblocks = { {4 * 1024, 4096} },
16985 .block_erase = spi_block_erase_20,
16986 }, {
16987 .eraseblocks = { {32 * 1024, 512} },
16988 .block_erase = spi_block_erase_52,
16989 }, {
16990 .eraseblocks = { {64 * 1024, 256} },
16991 .block_erase = spi_block_erase_d8,
16992 }, {
16993 .eraseblocks = { {16 * 1024 * 1024, 1} },
16994 .block_erase = spi_block_erase_60,
16995 }, {
16996 .eraseblocks = { {16 * 1024 * 1024, 1} },
16997 .block_erase = spi_block_erase_c7,
16998 }
16999 },
Alan Green61599c02019-09-23 13:24:32 +100017000 .printlock = spi_prettyprint_status_register_plain,
Alan Greenb40ec892019-08-26 11:43:40 +100017001 .unlock = spi_disable_blockprotect,
17002 .write = spi_chip_write_256,
17003 .read = spi_chip_read,
17004 /*
17005 * W25Q128FW is a 1.8V chip, however 3.3V variants with the same
17006 * model ID exist. We'll err on the side of caution here. A user
17007 * with a 3.3V chip sharing the model ID will need to either
17008 * specify voltage on the command line or duplicate this struct
17009 * with a different name/voltage and specify it with "-c".
17010 */
17011 .voltage = {1650, 1950},
17012 .wp = &wp_w25q,
17013 },
17014
17015 {
17016 .vendor = "Winbond",
Peichao Wang5767baa2019-11-12 08:58:59 +080017017 .name = "W25Q128.JW.DTR",
17018 .bustype = BUS_SPI,
17019 .manufacture_id = WINBOND_NEX_ID,
17020 .model_id = WINBOND_NEX_W25Q128_DTR,
17021 .total_size = 16384,
17022 .page_size = 256,
17023 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17024 .tested = TEST_OK_PREW,
17025 .probe = probe_spi_rdid,
17026 .probe_timing = TIMING_ZERO,
17027 .block_erasers =
17028 {
17029 {
17030 .eraseblocks = { {4 * 1024, 4096} },
17031 .block_erase = spi_block_erase_20,
17032 }, {
17033 .eraseblocks = { {32 * 1024, 512} },
17034 .block_erase = spi_block_erase_52,
17035 }, {
17036 .eraseblocks = { {64 * 1024, 256} },
17037 .block_erase = spi_block_erase_d8,
17038 }, {
17039 .eraseblocks = { {16 * 1024 * 1024, 1} },
17040 .block_erase = spi_block_erase_60,
17041 }, {
17042 .eraseblocks = { {16 * 1024 * 1024, 1} },
17043 .block_erase = spi_block_erase_c7,
17044 }
17045 },
17046 .printlock = spi_prettyprint_status_register_plain,
17047 .unlock = spi_disable_blockprotect,
17048 .write = spi_chip_write_256,
17049 .read = spi_chip_read,
17050 .voltage = {1650, 1950},
17051 .wp = &wp_w25q,
17052 },
17053
17054 {
17055 .vendor = "Winbond",
Alan Green0bf96472019-09-23 13:29:37 +100017056 .name = "W25Q16.V",
Alan Green96685f12019-08-26 15:48:25 +100017057 .bustype = BUS_SPI,
17058 .manufacture_id = WINBOND_NEX_ID,
17059 .model_id = WINBOND_NEX_W25Q16_V,
17060 .total_size = 2048,
17061 .page_size = 256,
17062 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
17063 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17064 .tested = TEST_OK_PREW,
17065 .probe = probe_spi_rdid,
17066 .probe_timing = TIMING_ZERO,
17067 .block_erasers =
17068 {
17069 {
17070 .eraseblocks = { {4 * 1024, 512} },
17071 .block_erase = spi_block_erase_20,
17072 }, {
17073 .eraseblocks = { {32 * 1024, 64} },
17074 .block_erase = spi_block_erase_52,
17075 }, {
17076 .eraseblocks = { {64 * 1024, 32} },
17077 .block_erase = spi_block_erase_d8,
17078 }, {
17079 .eraseblocks = { {2 * 1024 * 1024, 1} },
17080 .block_erase = spi_block_erase_60,
17081 }, {
17082 .eraseblocks = { {2 * 1024 * 1024, 1} },
17083 .block_erase = spi_block_erase_c7,
17084 }
17085 },
Alan Green0bf96472019-09-23 13:29:37 +100017086 .printlock = spi_prettyprint_status_register_plain,
Alan Green96685f12019-08-26 15:48:25 +100017087 .unlock = spi_disable_blockprotect,
17088 .write = spi_chip_write_256,
17089 .read = spi_chip_read,
17090 .voltage = {2700, 3600},
17091 .wp = &wp_w25q,
17092 },
17093
17094 {
17095 .vendor = "Winbond",
Nikolai Artemievd90fc8c2020-08-31 17:51:06 +100017096 .name = "W25Q16.W",
17097 .bustype = BUS_SPI,
17098 .manufacture_id = WINBOND_NEX_ID,
17099 .model_id = WINBOND_NEX_W25Q16_W,
17100 .total_size = 2048,
17101 .page_size = 256,
17102 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17103 /* QPI enable 0x38, disable 0xFF */
17104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
17105 .tested = TEST_UNTESTED,
17106 .probe = probe_spi_rdid,
17107 .probe_timing = TIMING_ZERO,
17108 .block_erasers =
17109 {
17110 {
17111 .eraseblocks = { {4 * 1024, 512} },
17112 .block_erase = spi_block_erase_20,
17113 }, {
17114 .eraseblocks = { {32 * 1024, 64} },
17115 .block_erase = spi_block_erase_52,
17116 }, {
17117 .eraseblocks = { {64 * 1024, 32} },
17118 .block_erase = spi_block_erase_d8,
17119 }, {
17120 .eraseblocks = { {2 * 1024 * 1024, 1} },
17121 .block_erase = spi_block_erase_60,
17122 }, {
17123 .eraseblocks = { {2 * 1024 * 1024, 1} },
17124 .block_erase = spi_block_erase_c7,
17125 }
17126 },
17127 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17128 .unlock = spi_disable_blockprotect,
17129 .write = spi_chip_write_256,
17130 .read = spi_chip_read,
17131 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17132 },
17133
17134 {
17135 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017136 .name = "W25Q256.V",
17137 .bustype = BUS_SPI,
17138 .manufacture_id = WINBOND_NEX_ID,
17139 .model_id = WINBOND_NEX_W25Q256_V,
17140 .total_size = 32768,
17141 .page_size = 256,
17142 /* supports SFDP */
17143 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17144 /* FOUR_BYTE_ADDR: supports 4-bytes addressing mode */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017145 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017146 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017147 .probe = probe_spi_rdid,
17148 .probe_timing = TIMING_ZERO,
17149 .block_erasers =
17150 {
17151 {
17152 .eraseblocks = { {4 * 1024, 8192} },
17153 .block_erase = spi_block_erase_20,
17154 }, {
17155 .eraseblocks = { {32 * 1024, 1024} },
17156 .block_erase = spi_block_erase_52,
17157 }, {
17158 .eraseblocks = { {64 * 1024, 512} },
17159 .block_erase = spi_block_erase_d8,
17160 }, {
17161 .eraseblocks = { {32 * 1024 * 1024, 1} },
17162 .block_erase = spi_block_erase_60,
17163 }, {
17164 .eraseblocks = { {32 * 1024 * 1024, 1} },
17165 .block_erase = spi_block_erase_c7,
17166 }
17167 },
Alan Green6cfd0182019-07-26 13:50:04 +100017168 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017169 .unlock = spi_disable_blockprotect,
17170 .write = spi_chip_write_256,
17171 .read = spi_chip_read,
17172 .set_4ba = spi_enter_4ba_b7_we,
17173 .voltage = {2700, 3600},
Justin TerAvest40083232020-08-17 16:34:46 -060017174 .wp = &wp_w25q_large,
Alan Greend76dc1f2019-06-26 15:38:19 +100017175 },
17176
17177 {
17178 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017179 .name = "W25Q256JV_M",
Shelley Chenfc338ee2018-07-20 16:27:15 -070017180 .bustype = BUS_SPI,
17181 .manufacture_id = WINBOND_NEX_ID,
Alan Green77a95de2019-07-01 16:40:39 +100017182 .model_id = WINBOND_NEX_W25Q256JV_M,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017183 .total_size = 32768,
17184 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017185 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017186 .tested = TEST_OK_PREW,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017187 .probe = probe_spi_rdid,
17188 .probe_timing = TIMING_ZERO,
17189 .block_erasers =
17190 {
17191 {
17192 .eraseblocks = { {4 * 1024, 8192} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017193 .block_erase = spi_block_erase_20,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017194 }, {
17195 .eraseblocks = { {32 * 1024, 1024} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017196 .block_erase = spi_block_erase_52,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017197 }, {
17198 .eraseblocks = { {64 * 1024, 512} },
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017199 .block_erase = spi_block_erase_d8,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017200 }, {
17201 .eraseblocks = { {32 * 1024 * 1024, 1} },
17202 .block_erase = spi_block_erase_60,
17203 }, {
17204 .eraseblocks = { {32 * 1024 * 1024, 1} },
17205 .block_erase = spi_block_erase_c7,
17206 }
17207 },
Alan Green61599c02019-09-23 13:24:32 +100017208 .printlock = spi_prettyprint_status_register_plain,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017209 .unlock = spi_disable_blockprotect,
17210 .write = spi_chip_write_256,
17211 .read = spi_chip_read,
Edward O'Callaghan4fe3a972019-06-19 16:56:10 +100017212 .set_4ba = spi_enter_4ba_b7_we,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017213 .voltage = {2700, 3600},
Duncan Laurie1801f7c2019-01-09 18:02:51 -080017214 .wp = &wp_w25q_large,
Shelley Chenfc338ee2018-07-20 16:27:15 -070017215 },
Alan Greena7cfa332019-06-24 15:48:14 +100017216
Shelley Chenfc338ee2018-07-20 16:27:15 -070017217 {
17218 .vendor = "Winbond",
Alan Green8c3c3c62019-09-23 13:55:21 +100017219 .name = "W25Q32.V",
17220 .bustype = BUS_SPI,
17221 .manufacture_id = WINBOND_NEX_ID,
17222 .model_id = WINBOND_NEX_W25Q32_V,
17223 .total_size = 4096,
17224 .page_size = 256,
17225 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
17226 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17227 .tested = TEST_OK_PREW,
17228 .probe = probe_spi_rdid,
17229 .probe_timing = TIMING_ZERO,
17230 .block_erasers =
17231 {
17232 {
17233 .eraseblocks = { {4 * 1024, 1024} },
17234 .block_erase = spi_block_erase_20,
17235 }, {
17236 .eraseblocks = { {32 * 1024, 128} },
17237 .block_erase = spi_block_erase_52,
17238 }, {
17239 .eraseblocks = { {64 * 1024, 64} },
17240 .block_erase = spi_block_erase_d8,
17241 }, {
17242 .eraseblocks = { {4 * 1024 * 1024, 1} },
17243 .block_erase = spi_block_erase_60,
17244 }, {
17245 .eraseblocks = { {4 * 1024 * 1024, 1} },
17246 .block_erase = spi_block_erase_c7,
17247 }
17248 },
17249 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17250 .unlock = spi_disable_blockprotect,
17251 .write = spi_chip_write_256,
17252 .read = spi_chip_read,
17253 .voltage = {2700, 3600},
17254 .wp = &wp_w25q,
17255 },
17256
17257 {
17258 .vendor = "Winbond",
Alan Greenb40ec892019-08-26 11:43:40 +100017259 .name = "W25Q32.W",
Alan Greend76dc1f2019-06-26 15:38:19 +100017260 .bustype = BUS_SPI,
17261 .manufacture_id = WINBOND_NEX_ID,
17262 .model_id = WINBOND_NEX_W25Q32_W,
17263 .total_size = 4096,
17264 .page_size = 256,
Alan Green1f6b6962019-09-23 16:56:02 +100017265 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017266 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017267 .probe = probe_spi_rdid,
17268 .probe_timing = TIMING_ZERO,
17269 .block_erasers =
17270 {
17271 {
17272 .eraseblocks = { {4 * 1024, 1024} },
17273 .block_erase = spi_block_erase_20,
17274 }, {
17275 .eraseblocks = { {32 * 1024, 128} },
17276 .block_erase = spi_block_erase_52,
17277 }, {
17278 .eraseblocks = { {64 * 1024, 64} },
17279 .block_erase = spi_block_erase_d8,
17280 }, {
17281 .eraseblocks = { {4 * 1024 * 1024, 1} },
17282 .block_erase = spi_block_erase_60,
17283 }, {
17284 .eraseblocks = { {4 * 1024 * 1024, 1} },
17285 .block_erase = spi_block_erase_c7,
17286 }
17287 },
Alan Green61599c02019-09-23 13:24:32 +100017288 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017289 .unlock = spi_disable_blockprotect,
17290 .write = spi_chip_write_256,
17291 .read = spi_chip_read,
17292 .voltage = {1700, 1950},
17293 .wp = &wp_w25q,
17294 },
17295
17296 {
17297 .vendor = "Winbond",
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017298 .name = "W25Q32JW",
17299 .bustype = BUS_SPI,
17300 .manufacture_id = WINBOND_NEX_ID,
17301 .model_id = WINBOND_NEX_W25Q32JW,
17302 .total_size = 4096,
17303 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017304 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017305 .tested = TEST_OK_PREW,
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017306 .probe = probe_spi_rdid,
17307 .probe_timing = TIMING_ZERO,
17308 .block_erasers =
17309 {
17310 {
17311 .eraseblocks = { {4 * 1024, 1024} },
17312 .block_erase = spi_block_erase_20,
17313 }, {
17314 .eraseblocks = { {32 * 1024, 128} },
17315 .block_erase = spi_block_erase_52,
17316 }, {
17317 .eraseblocks = { {64 * 1024, 64} },
17318 .block_erase = spi_block_erase_d8,
17319 }, {
17320 .eraseblocks = { {4 * 1024 * 1024, 1} },
17321 .block_erase = spi_block_erase_60,
17322 }, {
17323 .eraseblocks = { {4 * 1024 * 1024, 1} },
17324 .block_erase = spi_block_erase_c7,
17325 }
17326 },
17327 .unlock = spi_disable_blockprotect,
17328 .write = spi_chip_write_256,
17329 .read = spi_chip_read,
17330 .voltage = {1700, 1950},
17331 .wp = &wp_w25q,
17332 },
Alan Greena7cfa332019-06-24 15:48:14 +100017333
Edward O'Callaghand80cf712019-05-24 22:06:36 +100017334 {
17335 .vendor = "Winbond",
Martin Rotha608fcc2019-09-26 02:27:11 -060017336 .name = "W25Q40.V",
17337 .bustype = BUS_SPI,
17338 .manufacture_id = WINBOND_NEX_ID,
17339 .model_id = WINBOND_NEX_W25Q40_V,
17340 .total_size = 512,
17341 .page_size = 256,
17342 /* supports SFDP */
17343 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17344 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17345 .tested = TEST_OK_PREW,
17346 .probe = probe_spi_rdid,
17347 .probe_timing = TIMING_ZERO,
17348 .block_erasers =
17349 {
17350 {
17351 .eraseblocks = { {4 * 1024, 128} },
17352 .block_erase = spi_block_erase_20,
17353 }, {
17354 .eraseblocks = { {32 * 1024, 16} },
17355 .block_erase = spi_block_erase_52,
17356 }, {
17357 .eraseblocks = { {64 * 1024, 8} },
17358 .block_erase = spi_block_erase_d8,
17359 }, {
17360 .eraseblocks = { {512 * 1024, 1} },
17361 .block_erase = spi_block_erase_60,
17362 }, {
17363 .eraseblocks = { {512 * 1024, 1} },
17364 .block_erase = spi_block_erase_c7,
17365 }
17366 },
17367 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17368 .unlock = spi_disable_blockprotect,
17369 .write = spi_chip_write_256, /* Multi I/O supported */
17370 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17371 .voltage = {2700, 3600},
17372 },
17373
17374 {
17375 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017376 .name = "W25Q40EW",
17377 .bustype = BUS_SPI,
17378 .manufacture_id = WINBOND_NEX_ID,
17379 .model_id = WINBOND_NEX_W25Q40EW,
17380 .total_size = 512,
17381 .page_size = 256,
Alan Green1f6b6962019-09-23 16:56:02 +100017382 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017383 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017384 .probe = probe_spi_rdid,
17385 .probe_timing = TIMING_ZERO,
17386 .block_erasers =
17387 {
17388 {
17389 .eraseblocks = { {4 * 1024, 128} },
17390 .block_erase = spi_block_erase_20,
17391 }, {
17392 .eraseblocks = { {32 * 1024, 16} },
17393 .block_erase = spi_block_erase_52,
17394 }, {
17395 .eraseblocks = { {64 * 1024, 8} },
17396 .block_erase = spi_block_erase_d8,
17397 }, {
Alan Green1655a2e2019-07-26 10:55:55 +100017398 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +100017399 .block_erase = spi_block_erase_60,
17400 }, {
Alan Green1655a2e2019-07-26 10:55:55 +100017401 .eraseblocks = { {512 * 1024, 1} },
Alan Greend76dc1f2019-06-26 15:38:19 +100017402 .block_erase = spi_block_erase_c7,
17403 }
17404 },
Alan Green6cfd0182019-07-26 13:50:04 +100017405 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017406 .unlock = spi_disable_blockprotect,
17407 .write = spi_chip_write_256,
17408 .read = spi_chip_read,
17409 .voltage = {1650, 1950},
17410 /* FIXME(dhendrix): Add write-protection support */
17411 },
17412
17413 {
17414 .vendor = "Winbond",
Joel Stanley89c9d212019-07-27 19:25:35 +093017415 .name = "W25Q512JV",
17416 .bustype = BUS_SPI,
17417 .manufacture_id = WINBOND_NEX_ID,
17418 .model_id = WINBOND_NEX_W25Q512JV,
17419 .total_size = 64 * 1024,
17420 .page_size = 256,
17421 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
17422 .tested = TEST_OK_PREW,
17423 .probe = probe_spi_rdid,
17424 .probe_timing = TIMING_ZERO,
17425 .block_erasers =
17426 {
17427 {
17428 .eraseblocks = { {4 * 1024, 16384} },
17429 .block_erase = spi_block_erase_21,
17430 }, {
17431 .eraseblocks = { {4 * 1024, 16384} },
17432 .block_erase = spi_block_erase_20,
17433 }, {
17434 .eraseblocks = { {32 * 1024, 2048} },
17435 .block_erase = spi_block_erase_52,
17436 }, {
17437 .eraseblocks = { {64 * 1024, 1024} },
17438 .block_erase = spi_block_erase_dc,
17439 }, {
17440 .eraseblocks = { {64 * 1024, 1024} },
17441 .block_erase = spi_block_erase_d8,
17442 }, {
17443 .eraseblocks = { {64 * 1024 * 1024, 1} },
17444 .block_erase = spi_block_erase_60,
17445 }, {
17446 .eraseblocks = { {64 * 1024 * 1024, 1} },
17447 .block_erase = spi_block_erase_c7,
17448 }
17449 },
17450 .printlock = spi_prettyprint_status_register_plain,
17451 .unlock = spi_disable_blockprotect,
17452 .write = spi_chip_write_256,
17453 .read = spi_chip_read,
17454 .voltage = {2700, 3600},
17455 },
17456
17457 {
17458 .vendor = "Winbond",
Alan Greend3624cb2019-09-23 17:08:05 +100017459 .name = "W25Q64.V",
Alan Greend76dc1f2019-06-26 15:38:19 +100017460 .bustype = BUS_SPI,
17461 .manufacture_id = WINBOND_NEX_ID,
17462 .model_id = WINBOND_NEX_W25Q64_V,
17463 .total_size = 8192,
17464 .page_size = 256,
17465 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017466 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017467 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017468 .probe = probe_spi_rdid,
17469 .probe_timing = TIMING_ZERO,
17470 .block_erasers =
17471 {
17472 {
17473 .eraseblocks = { {4 * 1024, 2048} },
17474 .block_erase = spi_block_erase_20,
17475 }, {
17476 .eraseblocks = { {32 * 1024, 256} },
17477 .block_erase = spi_block_erase_52,
17478 }, {
17479 .eraseblocks = { {64 * 1024, 128} },
17480 .block_erase = spi_block_erase_d8,
17481 }, {
17482 .eraseblocks = { {8 * 1024 * 1024, 1} },
17483 .block_erase = spi_block_erase_60,
17484 }, {
17485 .eraseblocks = { {8 * 1024 * 1024, 1} },
17486 .block_erase = spi_block_erase_c7,
17487 }
17488 },
Alan Greend3624cb2019-09-23 17:08:05 +100017489 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017490 .unlock = spi_disable_blockprotect,
17491 .write = spi_chip_write_256,
17492 .read = spi_chip_read,
17493 .voltage = {2700, 3600},
17494 .wp = &wp_w25q,
17495 },
17496
17497 {
17498 .vendor = "Winbond",
Alan Greenfa6db7e2019-10-04 11:43:55 +100017499 .name = "W25Q64.W",
Alan Greend76dc1f2019-06-26 15:38:19 +100017500 .bustype = BUS_SPI,
17501 .manufacture_id = WINBOND_NEX_ID,
17502 .model_id = WINBOND_NEX_W25Q64_W,
17503 .total_size = 8192,
17504 .page_size = 256,
Alan Greenfa6db7e2019-10-04 11:43:55 +100017505 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017506 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017507 .probe = probe_spi_rdid,
17508 .probe_timing = TIMING_ZERO,
17509 .block_erasers =
17510 {
17511 {
17512 .eraseblocks = { {4 * 1024, 2048} },
17513 .block_erase = spi_block_erase_20,
17514 }, {
17515 .eraseblocks = { {32 * 1024, 256} },
17516 .block_erase = spi_block_erase_52,
17517 }, {
17518 .eraseblocks = { {64 * 1024, 128} },
17519 .block_erase = spi_block_erase_d8,
17520 }, {
17521 .eraseblocks = { {8 * 1024 * 1024, 1} },
17522 .block_erase = spi_block_erase_60,
17523 }, {
17524 .eraseblocks = { {8 * 1024 * 1024, 1} },
17525 .block_erase = spi_block_erase_c7,
17526 }
17527 },
Alan Greenfa6db7e2019-10-04 11:43:55 +100017528 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017529 .unlock = spi_disable_blockprotect,
17530 .write = spi_chip_write_256,
17531 .read = spi_chip_read,
17532 .voltage = {1700, 1950},
17533 .wp = &wp_w25q,
17534 },
17535
17536 {
17537 .vendor = "Winbond",
Scott Chao0448a6b2020-04-08 22:10:50 +080017538 .name = "W25Q64JW",
17539 .bustype = BUS_SPI,
17540 .manufacture_id = WINBOND_NEX_ID,
17541 .model_id = WINBOND_NEX_W25Q64JW,
17542 .total_size = 8192,
17543 .page_size = 256,
17544 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
17545 /* QPI enable 0x38, disable 0xFF */
17546 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17547 .tested = TEST_OK_PREW,
17548 .probe = probe_spi_rdid,
17549 .probe_timing = TIMING_ZERO,
17550 .block_erasers =
17551 {
17552 {
17553 .eraseblocks = { {4 * 1024, 2048} },
17554 .block_erase = spi_block_erase_20,
17555 }, {
17556 .eraseblocks = { {32 * 1024, 256} },
17557 .block_erase = spi_block_erase_52,
17558 }, {
17559 .eraseblocks = { {64 * 1024, 128} },
17560 .block_erase = spi_block_erase_d8,
17561 }, {
17562 .eraseblocks = { {8 * 1024 * 1024, 1} },
17563 .block_erase = spi_block_erase_60,
17564 }, {
17565 .eraseblocks = { {8 * 1024 * 1024, 1} },
17566 .block_erase = spi_block_erase_c7,
17567 }
17568 },
17569 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17570 .unlock = spi_disable_blockprotect,
17571 .write = spi_chip_write_256,
17572 .read = spi_chip_read,
17573 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
17574 .wp = &wp_w25q,
17575 },
17576
17577 {
17578 .vendor = "Winbond",
Alan Green57aca1e2019-10-04 11:55:52 +100017579 .name = "W25Q80.V",
Alan Greend76dc1f2019-06-26 15:38:19 +100017580 .bustype = BUS_SPI,
17581 .manufacture_id = WINBOND_NEX_ID,
17582 .model_id = WINBOND_NEX_W25Q80_V,
17583 .total_size = 1024,
17584 .page_size = 256,
17585 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42 */
Edward O'Callaghan27486212019-07-26 21:59:55 +100017586 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1295b292019-07-30 13:38:04 +100017587 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017588 .probe = probe_spi_rdid,
17589 .probe_timing = TIMING_ZERO,
17590 .block_erasers =
17591 {
17592 {
17593 .eraseblocks = { {4 * 1024, 256} },
17594 .block_erase = spi_block_erase_20,
17595 }, {
17596 .eraseblocks = { {32 * 1024, 32} },
17597 .block_erase = spi_block_erase_52,
17598 }, {
17599 .eraseblocks = { {64 * 1024, 16} },
17600 .block_erase = spi_block_erase_d8,
17601 }, {
17602 .eraseblocks = { {1024 * 1024, 1} },
17603 .block_erase = spi_block_erase_60,
17604 }, {
17605 .eraseblocks = { {1024 * 1024, 1} },
17606 .block_erase = spi_block_erase_c7,
17607 }
17608 },
Alan Green57aca1e2019-10-04 11:55:52 +100017609 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greend76dc1f2019-06-26 15:38:19 +100017610 .unlock = spi_disable_blockprotect,
17611 .write = spi_chip_write_256,
17612 .read = spi_chip_read,
17613 .voltage = {2700, 3600},
17614 .wp = &wp_w25q,
17615 },
17616
17617 {
17618 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000017619 .name = "W25X10",
hailfingere1e41ea2011-07-27 07:13:06 +000017620 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000017621 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000017622 .model_id = WINBOND_NEX_W25X10,
hailfinger286829b2009-01-08 03:40:17 +000017623 .total_size = 128,
17624 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017625 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017626 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000017627 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000017628 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000017629 .block_erasers =
17630 {
17631 {
17632 .eraseblocks = { {4 * 1024, 32} },
17633 .block_erase = spi_block_erase_20,
17634 }, {
snelson376060c2010-01-19 03:24:55 +000017635 .eraseblocks = { {64 * 1024, 2} },
17636 .block_erase = spi_block_erase_d8,
17637 }, {
17638 .eraseblocks = { {128 * 1024, 1} },
snelson376060c2010-01-19 03:24:55 +000017639 .block_erase = spi_block_erase_c7,
17640 }
17641 },
Alan Green6cfd0182019-07-26 13:50:04 +100017642 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000017643 .unlock = spi_disable_blockprotect,
hailfinger87c05482009-05-09 02:34:18 +000017644 .write = spi_chip_write_256,
hailfinger286829b2009-01-08 03:40:17 +000017645 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000017646 .voltage = {2700, 3600},
Louis Yung-Chieh Lo232951f2010-09-16 11:30:00 +080017647 .wp = &wp_w25,
stepanaa1b6a22008-12-08 18:15:10 +000017648 },
17649
hailfinger286829b2009-01-08 03:40:17 +000017650 {
17651 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000017652 .name = "W25X16",
hailfingere1e41ea2011-07-27 07:13:06 +000017653 .bustype = BUS_SPI,
hailfingerea04a9e2009-07-11 19:39:11 +000017654 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000017655 .model_id = WINBOND_NEX_W25X16,
hailfingerea04a9e2009-07-11 19:39:11 +000017656 .total_size = 2048,
17657 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017658 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017659 .tested = TEST_OK_PREW,
hailfingerea04a9e2009-07-11 19:39:11 +000017660 .probe = probe_spi_rdid,
17661 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000017662 .block_erasers =
17663 {
17664 {
17665 .eraseblocks = { {4 * 1024, 512} },
17666 .block_erase = spi_block_erase_20,
17667 }, {
17668 .eraseblocks = { {32 * 1024, 64} },
17669 .block_erase = spi_block_erase_52,
17670 }, {
17671 .eraseblocks = { {64 * 1024, 32} },
17672 .block_erase = spi_block_erase_d8,
17673 }, {
17674 .eraseblocks = { {2 * 1024 * 1024, 1} },
17675 .block_erase = spi_block_erase_60,
17676 }, {
17677 .eraseblocks = { {2 * 1024 * 1024, 1} },
17678 .block_erase = spi_block_erase_c7,
17679 }
17680 },
Alan Green6cfd0182019-07-26 13:50:04 +100017681 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000017682 .unlock = spi_disable_blockprotect,
hailfingerea04a9e2009-07-11 19:39:11 +000017683 .write = spi_chip_write_256,
17684 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000017685 .voltage = {2700, 3600},
hailfingerea04a9e2009-07-11 19:39:11 +000017686 },
17687
17688 {
17689 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017690 .name = "W25X20",
17691 .bustype = BUS_SPI,
17692 .manufacture_id = WINBOND_NEX_ID,
17693 .model_id = WINBOND_NEX_W25X20,
17694 .total_size = 256,
17695 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017696 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100017697 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017698 .probe = probe_spi_rdid,
17699 .probe_timing = TIMING_ZERO,
17700 .block_erasers =
17701 {
17702 {
17703 .eraseblocks = { {4 * 1024, 64} },
17704 .block_erase = spi_block_erase_20,
17705 }, {
17706 .eraseblocks = { {64 * 1024, 4} },
17707 .block_erase = spi_block_erase_d8,
17708 }, {
17709 .eraseblocks = { {256 * 1024, 1} },
17710 .block_erase = spi_block_erase_c7,
17711 }
17712 },
Alan Green6cfd0182019-07-26 13:50:04 +100017713 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017714 .unlock = spi_disable_blockprotect,
17715 .write = spi_chip_write_256,
17716 .read = spi_chip_read,
17717 .voltage = {2700, 3600},
17718 .wp = &wp_w25,
17719 },
17720
17721 {
17722 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000017723 .name = "W25X32",
hailfingere1e41ea2011-07-27 07:13:06 +000017724 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000017725 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000017726 .model_id = WINBOND_NEX_W25X32,
hailfingerd5431fb2009-11-26 11:05:01 +000017727 .total_size = 4096,
17728 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017729 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100017730 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000017731 .probe = probe_spi_rdid,
17732 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000017733 .block_erasers =
17734 {
17735 {
17736 .eraseblocks = { {4 * 1024, 1024} },
17737 .block_erase = spi_block_erase_20,
17738 }, {
17739 .eraseblocks = { {32 * 1024, 128} },
17740 .block_erase = spi_block_erase_52,
17741 }, {
17742 .eraseblocks = { {64 * 1024, 64} },
17743 .block_erase = spi_block_erase_d8,
17744 }, {
17745 .eraseblocks = { {4 * 1024 * 1024, 1} },
17746 .block_erase = spi_block_erase_60,
17747 }, {
17748 .eraseblocks = { {4 * 1024 * 1024, 1} },
17749 .block_erase = spi_block_erase_c7,
17750 }
17751 },
Alan Green6cfd0182019-07-26 13:50:04 +100017752 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000017753 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000017754 .write = spi_chip_write_256,
17755 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000017756 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000017757 },
17758
17759 {
17760 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017761 .name = "W25X40",
17762 .bustype = BUS_SPI,
17763 .manufacture_id = WINBOND_NEX_ID,
17764 .model_id = WINBOND_NEX_W25X40,
17765 .total_size = 512,
17766 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017767 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017768 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017769 .probe = probe_spi_rdid,
17770 .probe_timing = TIMING_ZERO,
17771 .block_erasers =
17772 {
17773 {
17774 .eraseblocks = { {4 * 1024, 128} },
17775 .block_erase = spi_block_erase_20,
17776 }, {
17777 .eraseblocks = { {64 * 1024, 8} },
17778 .block_erase = spi_block_erase_d8,
17779 }, {
17780 .eraseblocks = { {512 * 1024, 1} },
17781 .block_erase = spi_block_erase_c7,
17782 }
17783 },
Alan Green6cfd0182019-07-26 13:50:04 +100017784 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017785 .unlock = spi_disable_blockprotect,
17786 .write = spi_chip_write_256,
17787 .read = spi_chip_read,
17788 .voltage = {2700, 3600},
17789 .wp = &wp_w25,
17790 },
17791
17792 {
17793 .vendor = "Winbond",
stefanct371e7e82011-07-07 19:56:58 +000017794 .name = "W25X64",
hailfingere1e41ea2011-07-27 07:13:06 +000017795 .bustype = BUS_SPI,
hailfingerd5431fb2009-11-26 11:05:01 +000017796 .manufacture_id = WINBOND_NEX_ID,
mhm38e577e2010-09-14 23:56:56 +000017797 .model_id = WINBOND_NEX_W25X64,
hailfingerd5431fb2009-11-26 11:05:01 +000017798 .total_size = 8192,
17799 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017800 .feature_bits = FEATURE_WRSR_WREN,
Alan Greenc63f8d62019-08-26 15:10:04 +100017801 .tested = TEST_OK_PREW,
hailfingerd5431fb2009-11-26 11:05:01 +000017802 .probe = probe_spi_rdid,
17803 .probe_timing = TIMING_ZERO,
snelson376060c2010-01-19 03:24:55 +000017804 .block_erasers =
17805 {
17806 {
17807 .eraseblocks = { {4 * 1024, 2048} },
17808 .block_erase = spi_block_erase_20,
17809 }, {
17810 .eraseblocks = { {32 * 1024, 256} },
17811 .block_erase = spi_block_erase_52,
17812 }, {
17813 .eraseblocks = { {64 * 1024, 128} },
17814 .block_erase = spi_block_erase_d8,
17815 }, {
17816 .eraseblocks = { {8 * 1024 * 1024, 1} },
17817 .block_erase = spi_block_erase_60,
17818 }, {
17819 .eraseblocks = { {8 * 1024 * 1024, 1} },
17820 .block_erase = spi_block_erase_c7,
17821 }
17822 },
Alan Green6cfd0182019-07-26 13:50:04 +100017823 .printlock = spi_prettyprint_status_register_plain,
hailfingerb9560ee2010-07-14 20:21:22 +000017824 .unlock = spi_disable_blockprotect,
hailfingerd5431fb2009-11-26 11:05:01 +000017825 .write = spi_chip_write_256,
17826 .read = spi_chip_read,
stefanct7e00e222011-06-03 07:26:31 +000017827 .voltage = {2700, 3600},
hailfingerd5431fb2009-11-26 11:05:01 +000017828 },
17829
17830 {
17831 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017832 .name = "W25X80",
17833 .bustype = BUS_SPI,
17834 .manufacture_id = WINBOND_NEX_ID,
17835 .model_id = WINBOND_NEX_W25X80,
17836 .total_size = 1024,
17837 .page_size = 256,
Edward O'Callaghan27486212019-07-26 21:59:55 +100017838 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1295b292019-07-30 13:38:04 +100017839 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017840 .probe = probe_spi_rdid,
17841 .probe_timing = TIMING_ZERO,
hailfingere51a2012011-07-26 14:18:52 +000017842 .block_erasers =
17843 {
17844 {
Alan Greend76dc1f2019-06-26 15:38:19 +100017845 .eraseblocks = { {4 * 1024, 256} },
17846 .block_erase = spi_block_erase_20,
17847 }, {
17848 .eraseblocks = { {64 * 1024, 16} },
17849 .block_erase = spi_block_erase_d8,
17850 }, {
17851 .eraseblocks = { {1024 * 1024, 1} },
17852 .block_erase = spi_block_erase_c7,
hailfingere51a2012011-07-26 14:18:52 +000017853 }
17854 },
Alan Green6cfd0182019-07-26 13:50:04 +100017855 .printlock = spi_prettyprint_status_register_plain,
Alan Greend76dc1f2019-06-26 15:38:19 +100017856 .unlock = spi_disable_blockprotect,
17857 .write = spi_chip_write_256,
17858 .read = spi_chip_read,
17859 .voltage = {2700, 3600},
17860 .wp = &wp_w25,
hailfingere51a2012011-07-26 14:18:52 +000017861 },
17862
Alan Green753a38e2019-06-07 14:44:32 +100017863 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
17864 {
hailfingere51a2012011-07-26 14:18:52 +000017865 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000017866 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
hailfingere1e41ea2011-07-27 07:13:06 +000017867 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000017868 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000017869 .model_id = WINBOND_W29C010,
hailfinger286829b2009-01-08 03:40:17 +000017870 .total_size = 128,
17871 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000017872 .feature_bits = FEATURE_LONG_RESET,
stefanctf4eea092011-05-18 01:31:03 +000017873 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000017874 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000017875 .probe_timing = 10, /* used datasheet for the W29C011A */
snelson376060c2010-01-19 03:24:55 +000017876 .block_erasers =
17877 {
17878 {
17879 .eraseblocks = { {128 * 1024, 1} },
17880 .block_erase = erase_chip_block_jedec,
17881 }
17882 },
hailfinger286829b2009-01-08 03:40:17 +000017883 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000017884 .read = read_memmapped,
stepanaa1b6a22008-12-08 18:15:10 +000017885 },
17886
hailfinger286829b2009-01-08 03:40:17 +000017887 {
17888 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100017889 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
17890 .bustype = BUS_PARALLEL,
17891 .manufacture_id = WINBOND_ID,
17892 .model_id = WINBOND_W29C010,
17893 .total_size = 128,
17894 .page_size = 128,
17895 .feature_bits = FEATURE_LONG_RESET,
Alan Greenc63f8d62019-08-26 15:10:04 +100017896 .tested = TEST_OK_PREW,
Alan Greend76dc1f2019-06-26 15:38:19 +100017897 .probe = probe_w29ee011,
17898 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
17899 .block_erasers =
17900 {
17901 {
17902 .eraseblocks = { {128 * 1024, 1} },
17903 .block_erase = erase_chip_block_jedec,
17904 }
17905 },
17906 .write = write_jedec,
17907 .read = read_memmapped,
17908 },
17909
17910 {
17911 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000017912 .name = "W29C020(C)/W29C022",
hailfingere1e41ea2011-07-27 07:13:06 +000017913 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000017914 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000017915 .model_id = WINBOND_W29C020,
hailfinger286829b2009-01-08 03:40:17 +000017916 .total_size = 256,
17917 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000017918 .feature_bits = FEATURE_LONG_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100017919 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000017920 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000017921 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000017922 .block_erasers =
17923 {
17924 {
17925 .eraseblocks = { {256 * 1024, 1} },
17926 .block_erase = erase_chip_block_jedec,
17927 }
17928 },
hailfinger286829b2009-01-08 03:40:17 +000017929 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000017930 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000017931 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000017932 },
17933
hailfinger286829b2009-01-08 03:40:17 +000017934 {
17935 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000017936 .name = "W29C040/P",
hailfingere1e41ea2011-07-27 07:13:06 +000017937 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000017938 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000017939 .model_id = WINBOND_W29C040,
hailfinger286829b2009-01-08 03:40:17 +000017940 .total_size = 512,
17941 .page_size = 256,
snelsonc6855342010-01-28 23:55:12 +000017942 .feature_bits = FEATURE_LONG_RESET,
17943 .tested = TEST_UNTESTED,
hailfinger286829b2009-01-08 03:40:17 +000017944 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060017945 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000017946 .block_erasers =
17947 {
17948 {
17949 .eraseblocks = { {512 * 1024, 1} },
17950 .block_erase = erase_chip_block_jedec,
17951 }
17952 },
hailfinger286829b2009-01-08 03:40:17 +000017953 .write = write_jedec,
hailfinger23060112009-05-08 12:49:03 +000017954 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000017955 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000017956 },
17957
hailfinger286829b2009-01-08 03:40:17 +000017958 {
17959 .vendor = "Winbond",
mkarcherb8f55a62011-03-06 17:58:05 +000017960 .name = "W39L040",
hailfingere1e41ea2011-07-27 07:13:06 +000017961 .bustype = BUS_PARALLEL,
mkarcherb8f55a62011-03-06 17:58:05 +000017962 .manufacture_id = WINBOND_ID,
17963 .model_id = WINBOND_W39L040,
17964 .total_size = 512,
17965 .page_size = 64 * 1024,
17966 .feature_bits = FEATURE_EITHER_RESET,
17967 .tested = TEST_OK_PR,
17968 .probe = probe_jedec,
17969 .probe_timing = 10,
17970 .block_erasers =
17971 {
17972 {
17973 .eraseblocks = { {4 * 1024, 128} },
17974 .block_erase = erase_block_jedec,
17975 }, {
17976 .eraseblocks = { {64 * 1024, 8} },
17977 .block_erase = erase_sector_jedec,
17978 }, {
17979 .eraseblocks = { {512 * 1024, 1} },
17980 .block_erase = erase_chip_block_jedec,
17981 }
17982 },
17983 .printlock = printlock_w39l040,
17984 .write = write_jedec_1,
17985 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000017986 .voltage = {3000, 3600},
mkarcherb8f55a62011-03-06 17:58:05 +000017987 },
17988
17989 {
17990 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000017991 .name = "W39V040A",
hailfingere1e41ea2011-07-27 07:13:06 +000017992 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000017993 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000017994 .model_id = WINBOND_W39V040A,
hailfinger286829b2009-01-08 03:40:17 +000017995 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000017996 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000017997 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000017998 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000017999 .probe = probe_jedec,
stefanctdfd58832011-07-25 20:38:52 +000018000 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018001 .block_erasers =
18002 {
18003 {
18004 .eraseblocks = { {64 * 1024, 8} },
18005 .block_erase = erase_sector_jedec,
18006 }, {
18007 .eraseblocks = { {512 * 1024, 1} },
18008 .block_erase = erase_chip_block_jedec,
18009 }
18010 },
hailfingerf8993012010-12-05 16:33:59 +000018011 .printlock = printlock_w39v040a,
snelsonc6855342010-01-28 23:55:12 +000018012 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018013 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018014 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018015 },
18016
hailfinger286829b2009-01-08 03:40:17 +000018017 {
18018 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018019 .name = "W39V040B",
hailfingere1e41ea2011-07-27 07:13:06 +000018020 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018021 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018022 .model_id = WINBOND_W39V040B,
hailfinger286829b2009-01-08 03:40:17 +000018023 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018024 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018025 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000018026 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018027 .probe = probe_jedec,
stefanct98d917c2011-10-21 12:33:07 +000018028 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018029 .block_erasers =
18030 {
18031 {
18032 .eraseblocks = { {64 * 1024, 8} },
18033 .block_erase = erase_sector_jedec,
18034 }, {
18035 .eraseblocks = { {512 * 1024, 1} },
18036 .block_erase = erase_chip_block_jedec,
18037 }
18038 },
hailfingerf8993012010-12-05 16:33:59 +000018039 .printlock = printlock_w39v040b,
snelsonc6855342010-01-28 23:55:12 +000018040 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018041 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018042 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018043 },
18044
hailfinger286829b2009-01-08 03:40:17 +000018045 {
18046 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018047 .name = "W39V040C",
hailfingere1e41ea2011-07-27 07:13:06 +000018048 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018049 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018050 .model_id = WINBOND_W39V040C,
hailfinger286829b2009-01-08 03:40:17 +000018051 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018052 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018053 .feature_bits = FEATURE_EITHER_RESET,
stefanct98d917c2011-10-21 12:33:07 +000018054 .tested = TEST_OK_PREW,
snelsonc6855342010-01-28 23:55:12 +000018055 .probe = probe_jedec,
hailfingerf8993012010-12-05 16:33:59 +000018056 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018057 .block_erasers =
18058 {
18059 {
18060 .eraseblocks = { {64 * 1024, 8} },
18061 .block_erase = erase_sector_jedec,
18062 }, {
18063 .eraseblocks = { {512 * 1024, 1} },
18064 .block_erase = erase_chip_block_jedec,
18065 }
18066 },
snelson1ee293c2010-02-19 00:52:10 +000018067 .printlock = printlock_w39v040c,
snelsonc6855342010-01-28 23:55:12 +000018068 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018069 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018070 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018071 },
18072
hailfinger286829b2009-01-08 03:40:17 +000018073 {
18074 .vendor = "Winbond",
18075 .name = "W39V040FA",
hailfingere1e41ea2011-07-27 07:13:06 +000018076 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000018077 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018078 .model_id = WINBOND_W39V040FA,
hailfinger286829b2009-01-08 03:40:17 +000018079 .total_size = 512,
hailfingerc43afc92009-12-22 22:15:33 +000018080 .page_size = 64 * 1024,
mkarcher74173032010-05-30 16:55:18 +000018081 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
David Hendricksc801adb2010-12-09 16:58:56 -080018082 .tested = TEST_OK_PRE,
hailfinger286829b2009-01-08 03:40:17 +000018083 .probe = probe_jedec,
stefancte0e52902011-05-26 14:28:51 +000018084 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018085 .block_erasers =
18086 {
18087 {
18088 .eraseblocks = { {4 * 1024, 128} },
18089 .block_erase = erase_block_jedec,
18090 }, {
18091 .eraseblocks = { {64 * 1024, 8} },
18092 .block_erase = erase_sector_jedec,
18093 }, {
18094 .eraseblocks = { {512 * 1024, 1} },
18095 .block_erase = erase_chip_block_jedec,
18096 }
18097 },
hailfingerf8993012010-12-05 16:33:59 +000018098 .printlock = printlock_w39v040fa,
mkarcher74173032010-05-30 16:55:18 +000018099 .unlock = unlock_sst_fwhub,
snelsonc6855342010-01-28 23:55:12 +000018100 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018101 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018102 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018103 },
18104
hailfinger286829b2009-01-08 03:40:17 +000018105 {
18106 .vendor = "Winbond",
hailfingerf8993012010-12-05 16:33:59 +000018107 .name = "W39V040FB",
hailfingere1e41ea2011-07-27 07:13:06 +000018108 .bustype = BUS_FWH,
hailfingerf8993012010-12-05 16:33:59 +000018109 .manufacture_id = WINBOND_ID,
18110 .model_id = WINBOND_W39V040B,
18111 .total_size = 512,
18112 .page_size = 64 * 1024,
18113 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
hailfingere29b25b2011-03-06 22:26:23 +000018114 .tested = TEST_OK_PREW,
hailfingerf8993012010-12-05 16:33:59 +000018115 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060018116 .probe_timing = 10,
hailfingerf8993012010-12-05 16:33:59 +000018117 .block_erasers =
18118 {
18119 {
18120 .eraseblocks = { {64 * 1024, 8} },
18121 .block_erase = erase_sector_jedec,
18122 }, {
18123 .eraseblocks = { {512 * 1024, 1} },
18124 .block_erase = erase_chip_block_jedec,
18125 }
18126 },
18127 .printlock = printlock_w39v040fb,
mkarcher64dbd922010-12-26 23:55:12 +000018128 .unlock = unlock_w39v040fb,
hailfingerf8993012010-12-05 16:33:59 +000018129 .write = write_jedec_1,
18130 .read = read_memmapped,
stefanct66c8c1b2011-07-19 08:50:18 +000018131 .voltage = {3000, 3600}, /* Also has 12V fast program */
hailfingerf8993012010-12-05 16:33:59 +000018132 },
18133
18134 {
18135 .vendor = "Winbond",
David Hendricks668f29d2011-01-27 18:51:45 -080018136 .name = "W39V040FC",
hailfingere1e41ea2011-07-27 07:13:06 +000018137 .bustype = BUS_FWH,
David Hendricks668f29d2011-01-27 18:51:45 -080018138 .manufacture_id = WINBOND_ID,
18139 .model_id = WINBOND_W39V040C,
18140 .total_size = 512,
18141 .page_size = 64 * 1024,
18142 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
Alan Greend76dc1f2019-06-26 15:38:19 +100018143 .tested = TEST_OK_PREW,
18144 .probe = probe_jedec,
18145 .probe_timing = 10,
18146 .block_erasers =
18147 {
18148 {
18149 .eraseblocks = { {64 * 1024, 8} },
18150 .block_erase = erase_sector_jedec,
18151 }, {
18152 .eraseblocks = { {512 * 1024, 1} },
18153 .block_erase = erase_chip_block_jedec,
18154 }
18155 },
18156 .printlock = printlock_w39v040fc,
18157 .write = write_jedec_1,
18158 .read = read_memmapped,
18159 .voltage = {3000, 3600}, /* Also has 12V fast program */
18160 },
18161
18162 {
18163 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000018164 .name = "W39V080A",
hailfingere1e41ea2011-07-27 07:13:06 +000018165 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018166 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018167 .model_id = WINBOND_W39V080A,
hailfinger286829b2009-01-08 03:40:17 +000018168 .total_size = 1024,
hailfingerc43afc92009-12-22 22:15:33 +000018169 .page_size = 64 * 1024,
snelsonc6855342010-01-28 23:55:12 +000018170 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner718d1eb2016-08-18 18:00:53 -070018171 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018172 .probe = probe_jedec,
Simon Glass8dc82732013-07-16 10:13:51 -060018173 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018174 .block_erasers =
18175 {
18176 {
18177 .eraseblocks = { {64 * 1024, 16} },
18178 .block_erase = erase_sector_jedec,
18179 }, {
18180 .eraseblocks = { {1024 * 1024, 1} },
18181 .block_erase = erase_chip_block_jedec,
18182 }
18183 },
hailfingerf8993012010-12-05 16:33:59 +000018184 .printlock = printlock_w39v080a,
snelsonc6855342010-01-28 23:55:12 +000018185 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018186 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018187 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018188 },
18189
hailfinger286829b2009-01-08 03:40:17 +000018190 {
18191 .vendor = "Winbond",
Alan Greend76dc1f2019-06-26 15:38:19 +100018192 .name = "W39V080FA",
18193 .bustype = BUS_FWH,
18194 .manufacture_id = WINBOND_ID,
18195 .model_id = WINBOND_W39V080FA,
18196 .total_size = 1024,
18197 .page_size = 64 * 1024,
18198 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18199 .tested = TEST_OK_PREW,
18200 .probe = probe_jedec,
18201 .probe_timing = 10,
18202 .block_erasers =
18203 {
18204 {
Alan Green0d97b472019-07-26 10:33:25 +100018205 .eraseblocks = { {64 * 1024, 16} },
Alan Greend76dc1f2019-06-26 15:38:19 +100018206 .block_erase = erase_sector_jedec,
18207 }, {
18208 .eraseblocks = { {1024 * 1024, 1} },
18209 .block_erase = erase_chip_block_jedec,
18210 }
18211 },
18212 .printlock = printlock_w39v080fa,
18213 .unlock = unlock_w39v080fa,
18214 .write = write_jedec_1,
18215 .read = read_memmapped,
18216 .voltage = {3000, 3600}, /* Also has 12V fast program */
18217 },
18218
18219 {
18220 .vendor = "Winbond",
18221 .name = "W39V080FA (dual mode)",
18222 .bustype = BUS_FWH,
18223 .manufacture_id = WINBOND_ID,
18224 .model_id = WINBOND_W39V080FA_DM,
18225 .total_size = 512,
18226 .page_size = 64 * 1024,
18227 .feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
18228 .tested = TEST_UNTESTED,
18229 .probe = probe_jedec,
18230 .probe_timing = 10,
18231 .block_erasers =
18232 {
18233 {
Alan Green0d97b472019-07-26 10:33:25 +100018234 .eraseblocks = { {64 * 1024, 8} },
Alan Greend76dc1f2019-06-26 15:38:19 +100018235 .block_erase = erase_sector_jedec,
18236 }, {
18237 .eraseblocks = { {512 * 1024, 1} },
18238 .block_erase = erase_chip_block_jedec,
18239 }
18240 },
18241 .printlock = printlock_w39v080fa_dual,
18242 .write = write_jedec_1,
18243 .read = read_memmapped,
18244 .voltage = {3000, 3600}, /* Also has 12V fast program */
18245 },
18246
18247 {
18248 .vendor = "Winbond",
mhm38e577e2010-09-14 23:56:56 +000018249 .name = "W49F002U/N",
hailfingere1e41ea2011-07-27 07:13:06 +000018250 .bustype = BUS_PARALLEL,
hailfinger286829b2009-01-08 03:40:17 +000018251 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018252 .model_id = WINBOND_W49F002U,
hailfinger286829b2009-01-08 03:40:17 +000018253 .total_size = 256,
18254 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018255 .feature_bits = FEATURE_EITHER_RESET,
stefanctdfd58832011-07-25 20:38:52 +000018256 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018257 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000018258 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018259 .block_erasers =
18260 {
18261 {
18262 .eraseblocks = {
18263 {128 * 1024, 1},
18264 {96 * 1024, 1},
18265 {8 * 1024, 2},
18266 {16 * 1024, 1},
18267 },
18268 .block_erase = erase_sector_jedec,
18269 }, {
18270 .eraseblocks = { {256 * 1024, 1} },
18271 .block_erase = erase_chip_block_jedec,
18272 }
18273 },
snelsonc6855342010-01-28 23:55:12 +000018274 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018275 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018276 .voltage = {4500, 5500},
stepanaa1b6a22008-12-08 18:15:10 +000018277 },
18278
hailfinger286829b2009-01-08 03:40:17 +000018279 {
18280 .vendor = "Winbond",
hailfinger808e6aa2010-07-17 13:45:42 +000018281 .name = "W49F020",
hailfingere1e41ea2011-07-27 07:13:06 +000018282 .bustype = BUS_PARALLEL,
hailfinger808e6aa2010-07-17 13:45:42 +000018283 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018284 .model_id = WINBOND_W49F020,
hailfinger808e6aa2010-07-17 13:45:42 +000018285 .total_size = 256,
18286 .page_size = 128,
18287 .feature_bits = FEATURE_EITHER_RESET,
18288 .tested = TEST_OK_PROBE,
18289 .probe = probe_jedec,
18290 .probe_timing = 10,
18291 .block_erasers =
18292 {
18293 {
18294 .eraseblocks = { {256 * 1024, 1} },
18295 .block_erase = erase_chip_block_jedec,
18296 }
18297 },
18298 .write = write_jedec_1,
18299 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018300 .voltage = {4500, 5500},
hailfinger808e6aa2010-07-17 13:45:42 +000018301 },
18302
18303 {
18304 .vendor = "Winbond",
hailfinger286829b2009-01-08 03:40:17 +000018305 .name = "W49V002A",
hailfingere1e41ea2011-07-27 07:13:06 +000018306 .bustype = BUS_LPC,
hailfinger286829b2009-01-08 03:40:17 +000018307 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018308 .model_id = WINBOND_W49V002A,
hailfinger286829b2009-01-08 03:40:17 +000018309 .total_size = 256,
18310 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018311 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100018312 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018313 .probe = probe_jedec,
stefanct371e7e82011-07-07 19:56:58 +000018314 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018315 .block_erasers =
18316 {
18317 {
18318 .eraseblocks = {
18319 {64 * 1024, 3},
18320 {32 * 1024, 1},
18321 {8 * 1024, 2},
18322 {16 * 1024, 1},
18323 },
18324 .block_erase = erase_sector_jedec,
18325 }, {
18326 .eraseblocks = { {256 * 1024, 1} },
18327 .block_erase = erase_chip_block_jedec,
18328 }
18329 },
snelsonc6855342010-01-28 23:55:12 +000018330 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018331 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018332 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018333 },
18334
hailfinger286829b2009-01-08 03:40:17 +000018335 {
18336 .vendor = "Winbond",
18337 .name = "W49V002FA",
hailfingere1e41ea2011-07-27 07:13:06 +000018338 .bustype = BUS_FWH,
hailfinger286829b2009-01-08 03:40:17 +000018339 .manufacture_id = WINBOND_ID,
mhm38e577e2010-09-14 23:56:56 +000018340 .model_id = WINBOND_W49V002FA,
hailfinger286829b2009-01-08 03:40:17 +000018341 .total_size = 256,
18342 .page_size = 128,
snelsonc6855342010-01-28 23:55:12 +000018343 .feature_bits = FEATURE_EITHER_RESET,
Alan Greenf5424a22019-07-26 14:32:32 +100018344 .tested = TEST_OK_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018345 .probe = probe_jedec,
hailfinger94466802009-09-05 01:31:32 +000018346 .probe_timing = 10,
snelson376060c2010-01-19 03:24:55 +000018347 .block_erasers =
18348 {
18349 {
18350 .eraseblocks = {
18351 {64 * 1024, 3},
18352 {32 * 1024, 1},
18353 {8 * 1024, 2},
18354 {16 * 1024, 1},
18355 },
18356 .block_erase = erase_sector_jedec,
18357 }, {
18358 .eraseblocks = { {256 * 1024, 1} },
18359 .block_erase = erase_chip_block_jedec,
18360 }
18361 },
snelsonc6855342010-01-28 23:55:12 +000018362 .write = write_jedec_1,
hailfinger23060112009-05-08 12:49:03 +000018363 .read = read_memmapped,
stefanct7e00e222011-06-03 07:26:31 +000018364 .voltage = {3000, 3600},
stepanaa1b6a22008-12-08 18:15:10 +000018365 },
18366
hailfinger286829b2009-01-08 03:40:17 +000018367 {
Duncan Laurie89ee23d2015-05-08 20:27:50 +000018368 .vendor = "Programmer",
18369 .name = "Opaque flash chip",
18370 .bustype = BUS_PROG,
18371 .manufacture_id = PROGMANUF_ID,
18372 .model_id = PROGDEV_ID,
18373 .total_size = 0,
18374 .page_size = 256,
18375 /* probe is assumed to work, rest will be filled in by probe */
18376 .tested = TEST_OK_PROBE,
18377 .probe = probe_opaque,
18378 /* eraseblock sizes will be set by the probing function */
18379 .block_erasers =
18380 {
18381 {
18382 .block_erase = erase_opaque,
18383 }
18384 },
18385 .write = write_opaque,
18386 .read = read_opaque,
18387 },
18388
18389 {
hailfinger867df6b2010-07-22 11:44:38 +000018390 .vendor = "AMIC",
18391 .name = "unknown AMIC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018392 .bustype = BUS_SPI,
hailfinger867df6b2010-07-22 11:44:38 +000018393 .manufacture_id = AMIC_ID,
18394 .model_id = GENERIC_DEVICE_ID,
18395 .total_size = 0,
18396 .page_size = 256,
18397 .tested = TEST_BAD_PREW,
18398 .probe = probe_spi_rdid4,
18399 .probe_timing = TIMING_ZERO,
18400 .write = NULL,
18401 .read = NULL,
18402 },
18403
18404 {
hailfinger286829b2009-01-08 03:40:17 +000018405 .vendor = "Atmel",
18406 .name = "unknown Atmel SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018407 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018408 .manufacture_id = ATMEL_ID,
18409 .model_id = GENERIC_DEVICE_ID,
18410 .total_size = 0,
18411 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018412 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018413 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018414 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018415 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018416 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018417 },
18418
hailfinger286829b2009-01-08 03:40:17 +000018419 {
hailfinger61958912010-07-28 22:20:20 +000018420 .vendor = "Eon",
18421 .name = "unknown Eon SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018422 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018423 .manufacture_id = EON_ID_NOPREFIX,
18424 .model_id = GENERIC_DEVICE_ID,
18425 .total_size = 0,
18426 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018427 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018428 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018429 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018430 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018431 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018432 },
18433
hailfinger286829b2009-01-08 03:40:17 +000018434 {
18435 .vendor = "Macronix",
18436 .name = "unknown Macronix SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018437 .bustype = BUS_SPI,
mhmd3c80cd2010-09-15 23:31:03 +000018438 .manufacture_id = MACRONIX_ID,
hailfinger286829b2009-01-08 03:40:17 +000018439 .model_id = GENERIC_DEVICE_ID,
18440 .total_size = 0,
18441 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018442 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018443 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018444 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018445 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018446 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018447 },
18448
hailfinger286829b2009-01-08 03:40:17 +000018449 {
18450 .vendor = "PMC",
18451 .name = "unknown PMC SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018452 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018453 .manufacture_id = PMC_ID,
18454 .model_id = GENERIC_DEVICE_ID,
18455 .total_size = 0,
18456 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018457 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018458 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018459 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018460 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018461 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018462 },
18463
hailfinger286829b2009-01-08 03:40:17 +000018464 {
18465 .vendor = "SST",
18466 .name = "unknown SST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018467 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018468 .manufacture_id = SST_ID,
18469 .model_id = GENERIC_DEVICE_ID,
18470 .total_size = 0,
18471 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018472 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018473 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018474 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018475 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018476 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018477 },
18478
hailfinger286829b2009-01-08 03:40:17 +000018479 {
18480 .vendor = "ST",
18481 .name = "unknown ST SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018482 .bustype = BUS_SPI,
hailfinger286829b2009-01-08 03:40:17 +000018483 .manufacture_id = ST_ID,
18484 .model_id = GENERIC_DEVICE_ID,
18485 .total_size = 0,
18486 .page_size = 256,
hailfinger97ab2632009-04-22 13:33:43 +000018487 .tested = TEST_BAD_PREW,
hailfinger286829b2009-01-08 03:40:17 +000018488 .probe = probe_spi_rdid,
hailfingere3095d92009-06-05 13:46:17 +000018489 .probe_timing = TIMING_ZERO,
hailfinger286829b2009-01-08 03:40:17 +000018490 .write = NULL,
hailfinger23060112009-05-08 12:49:03 +000018491 .read = NULL,
stepanaa1b6a22008-12-08 18:15:10 +000018492 },
uwec93fbdb2008-03-16 02:06:25 +000018493
hailfinger63165602009-11-20 01:12:45 +000018494 {
hailfinger201f62f2009-11-24 02:08:11 +000018495 .vendor = "Sanyo",
18496 .name = "unknown Sanyo SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018497 .bustype = BUS_SPI,
hailfinger201f62f2009-11-24 02:08:11 +000018498 .manufacture_id = SANYO_ID,
18499 .model_id = GENERIC_DEVICE_ID,
18500 .total_size = 0,
18501 .page_size = 256,
18502 .tested = TEST_BAD_PREW,
18503 .probe = probe_spi_rdid,
18504 .probe_timing = TIMING_ZERO,
hailfinger201f62f2009-11-24 02:08:11 +000018505 .write = NULL,
18506 .read = NULL,
18507 },
18508
18509 {
hailfinger63165602009-11-20 01:12:45 +000018510 .vendor = "Generic",
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080018511 .name = "Variable Size SPI chip",
hailfingere1e41ea2011-07-27 07:13:06 +000018512 .bustype = BUS_SPI,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080018513 .manufacture_id = VARIABLE_SIZE_MANUF_ID,
18514 .model_id = VARIABLE_SIZE_DEVICE_ID,
18515 .total_size = 64, /* This size is set temporarily */
18516 .page_size = 256,
Namyoon Woob71a2962020-08-27 16:27:49 -070018517 .feature_bits = FEATURE_4BA,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080018518 .tested = TEST_OK_PREW,
18519 .probe = probe_variable_size,
18520 .block_erasers =
18521 {
18522 {
18523 .eraseblocks = { {4 * 1024, 16} },
18524 .block_erase = spi_block_erase_20,
18525 }, {
18526 .eraseblocks = { {64 * 1024, 1} },
Namyoon Woob71a2962020-08-27 16:27:49 -070018527 .block_erase = spi_block_erase_c7,
Louis Yung-Chieh Loe53fa0f2011-04-11 17:18:41 +080018528 }
18529 },
18530 .write = spi_chip_write_256,
18531 .read = spi_chip_read,
18532 },
18533
18534 {
18535 .vendor = "Generic",
hailfinger63165602009-11-20 01:12:45 +000018536 .name = "unknown SPI chip (RDID)",
hailfingere1e41ea2011-07-27 07:13:06 +000018537 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000018538 .manufacture_id = GENERIC_MANUF_ID,
18539 .model_id = GENERIC_DEVICE_ID,
18540 .total_size = 0,
18541 .page_size = 256,
18542 .tested = TEST_BAD_PREW,
18543 .probe = probe_spi_rdid,
hailfinger63165602009-11-20 01:12:45 +000018544 .write = NULL,
18545 },
David Hendricks07af3a42011-07-11 22:13:02 -070018546
hailfinger63165602009-11-20 01:12:45 +000018547 {
18548 .vendor = "Generic",
18549 .name = "unknown SPI chip (REMS)",
hailfingere1e41ea2011-07-27 07:13:06 +000018550 .bustype = BUS_SPI,
hailfinger63165602009-11-20 01:12:45 +000018551 .manufacture_id = GENERIC_MANUF_ID,
18552 .model_id = GENERIC_DEVICE_ID,
18553 .total_size = 0,
18554 .page_size = 256,
18555 .tested = TEST_BAD_PREW,
18556 .probe = probe_spi_rems,
hailfinger63165602009-11-20 01:12:45 +000018557 .write = NULL,
18558 },
18559
Edward O'Callaghan6240c852019-07-02 15:49:58 +100018560 {0}
stuge7be5d032009-04-21 01:46:07 +000018561};
Simon Glass4c214132013-07-16 10:09:28 -060018562
Edward O'Callaghan6240c852019-07-02 15:49:58 +100018563const unsigned int flashchips_size = ARRAY_SIZE(flashchips);