blob: 32fce302fd3de091463d28d55b30a6f8a2f1f412 [file] [log] [blame]
Ollie Lho184a4042005-11-26 21:55:36 +00001/*
Uwe Hermannd1107642007-08-29 17:52:32 +00002 * This file is part of the flashrom project.
Ollie Lho184a4042005-11-26 21:55:36 +00003 *
Uwe Hermannd22a1d42007-09-09 20:21:05 +00004 * Copyright (C) 2000 Silicon Integrated System Corporation
5 * Copyright (C) 2004 Tyan Corp
Stefan Reinauer4c390c82008-07-02 13:33:09 +00006 * Copyright (C) 2005-2008 coresystems GmbH <stepan@openbios.org>
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00007 * Copyright (C) 2006-2009 Carl-Daniel Hailfinger
Sean Nelsonc57a9202010-01-04 17:15:23 +00008 * Copyright (C) 2009 Sean Nelson <audiohacked@gmail.com>
Uwe Hermannd1107642007-08-29 17:52:32 +00009 *
Stefan Reinauerce532972007-05-23 17:20:56 +000010 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
Ollie Lho184a4042005-11-26 21:55:36 +000014 *
Stefan Reinauerce532972007-05-23 17:20:56 +000015 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
Ollie Lho184a4042005-11-26 21:55:36 +000019 */
20
21#include "flash.h"
Carl-Daniel Hailfinger08454642009-06-15 14:14:48 +000022#include "flashchips.h"
Sean Nelson14ba6682010-02-26 05:48:29 +000023#include "chipdrivers.h"
Nico Huberaabb3e02023-01-13 00:22:30 +010024#include "writeprotect.h"
Ollie Lho184a4042005-11-26 21:55:36 +000025
Uwe Hermannfc425e82008-03-16 02:06:25 +000026/**
Uwe Hermanna9720402009-05-21 15:55:46 +000027 * List of supported flash chips.
Uwe Hermannfc425e82008-03-16 02:06:25 +000028 *
Alan Green1f9cc7d2019-07-01 11:10:45 +100029 * Temporarily, this file is sorted alphabetically by vendor and name to
Nico Huberc3b02dc2023-08-12 01:13:45 +020030 * assist with merging the Chromium fork of flashprog.
Alan Green1f9cc7d2019-07-01 11:10:45 +100031 *
32 * The usual intention is that that this list is sorted by vendor, then chip
Nico Huberc3b02dc2023-08-12 01:13:45 +020033 * family and chip density, which is useful for the output of 'flashprog -L'.
Uwe Hermannfc425e82008-03-16 02:06:25 +000034 */
Carl-Daniel Hailfinger4c823182011-05-04 00:39:50 +000035const struct flashchip flashchips[] = {
Uwe Hermannfc425e82008-03-16 02:06:25 +000036
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000037 /*
38 * .vendor = Vendor name
39 * .name = Chip name
40 * .bustype = Supported flash bus types (Parallel, LPC...)
41 * .manufacture_id = Manufacturer chip ID
42 * .model_id = Model chip ID
43 * .total_size = Total size in (binary) kbytes
44 * .page_size = Page or eraseblock(?) size in bytes
45 * .tested = Test status
46 * .probe = Probe function
47 * .probe_timing = Probe function delay
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +000048 * .block_erasers[] = Array of erase layouts and erase functions
49 * {
50 * .eraseblocks[] = Array of { blocksize, blockcount }
51 * .block_erase = Block erase function
52 * }
Sean Nelson6e0b9122010-02-19 00:52:10 +000053 * .printlock = Chip lock status function
54 * .unlock = Chip unlock function
Carl-Daniel Hailfinger21eedec2009-07-23 12:42:01 +000055 * .write = Chip write function
56 * .read = Chip read function
Steven Zakuleccbe370e2011-06-03 07:26:31 +000057 * .voltage = Voltage range in millivolt
FENG yu ningff692fb2008-12-08 18:15:10 +000058 */
59
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000060 {
61 .vendor = "AMD",
62 .name = "Am29F002(N)BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000063 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000064 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000065 .model_id = AMD_AM29F002BB,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000066 .total_size = 256,
67 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000068 .feature_bits = FEATURE_SHORT_RESET | FEATURE_ADDR_2AA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000069 .tested = TEST_UNTESTED,
70 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000071 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +000072 .block_erasers =
73 {
74 {
75 .eraseblocks = {
76 {16 * 1024, 1},
77 {8 * 1024, 2},
78 {32 * 1024, 1},
79 {64 * 1024, 3},
80 },
81 .block_erase = erase_sector_jedec,
82 }, {
83 .eraseblocks = { {256 * 1024, 1} },
84 .block_erase = erase_chip_block_jedec,
85 },
86 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000087 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000088 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000089 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010090 .prepare_access = prepare_memory_access,
91 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000092 },
93
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000094 {
95 .vendor = "AMD",
96 .name = "Am29F002(N)BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000097 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000098 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000099 .model_id = AMD_AM29F002BT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000100 .total_size = 256,
101 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +0000102 .feature_bits = FEATURE_EITHER_RESET | FEATURE_ADDR_2AA,
103 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000104 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000105 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000106 .block_erasers =
107 {
108 {
109 .eraseblocks = {
110 {64 * 1024, 3},
111 {32 * 1024, 1},
112 {8 * 1024, 2},
113 {16 * 1024, 1},
114 },
115 .block_erase = erase_sector_jedec,
116 }, {
117 .eraseblocks = { {256 * 1024, 1} },
118 .block_erase = erase_chip_block_jedec,
119 },
120 },
Michael Karcher1c296ca2009-11-27 17:49:42 +0000121 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000122 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000123 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +0100124 .prepare_access = prepare_memory_access,
125 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +0000126 },
127
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000128 {
129 .vendor = "AMD",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000130 .name = "Am29F010",
131 .bustype = BUS_PARALLEL,
132 .manufacture_id = AMD_ID,
133 .model_id = AMD_AM29F010,
134 .total_size = 128,
135 .page_size = 16 * 1024,
136 .feature_bits = FEATURE_SHORT_RESET,
137 .tested = TEST_UNTESTED,
138 .probe = probe_jedec,
139 .probe_timing = TIMING_ZERO,
140 .block_erasers =
141 {
142 {
143 .eraseblocks = { {16 * 1024, 8} },
144 .block_erase = erase_sector_jedec,
145 }, {
146 .eraseblocks = { {128 * 1024, 1} },
147 .block_erase = erase_chip_block_jedec,
148 },
149 },
150 .write = write_jedec_1,
151 .read = read_memmapped,
152 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100153 .prepare_access = prepare_memory_access,
154 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +1000155 },
156
157 {
158 .vendor = "AMD",
159 .name = "Am29F010A/B",
160 .bustype = BUS_PARALLEL,
161 .manufacture_id = AMD_ID,
162 .model_id = AMD_AM29F010,
163 .total_size = 128,
164 .page_size = 16 * 1024,
165 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Alan Greena4e579f2019-07-24 14:18:39 +1000166 .tested = TEST_OK_PRE,
Alan Green1f9cc7d2019-07-01 11:10:45 +1000167 .probe = probe_jedec,
168 .probe_timing = TIMING_ZERO,
169 .block_erasers =
170 {
171 {
172 .eraseblocks = { {16 * 1024, 8} },
173 .block_erase = erase_sector_jedec,
174 }, {
175 .eraseblocks = { {128 * 1024, 1} },
176 .block_erase = erase_chip_block_jedec,
177 },
178 },
179 .write = write_jedec_1,
180 .read = read_memmapped,
181 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100182 .prepare_access = prepare_memory_access,
183 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +1000184 },
185
186 {
187 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000188 .name = "Am29F016D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000189 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000190 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000191 .model_id = AMD_AM29F016D,
Sean Nelson72a9a022009-12-22 22:15:33 +0000192 .total_size = 2 * 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000193 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000194 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000195 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000196 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000197 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000198 .block_erasers =
199 {
200 {
201 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson35727f72010-01-28 23:55:12 +0000202 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000203 }, {
204 .eraseblocks = { {2048 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000205 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000206 },
207 },
Sean Nelson35727f72010-01-28 23:55:12 +0000208 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000209 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000210 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100211 .prepare_access = prepare_memory_access,
212 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +0000213 },
214
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000215 {
216 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000217 .name = "Am29F040",
218 .bustype = BUS_PARALLEL,
219 .manufacture_id = AMD_ID,
220 .model_id = AMD_AM29F040,
221 .total_size = 512,
222 .page_size = 64 * 1024,
223 .feature_bits = FEATURE_EITHER_RESET,
224 .tested = TEST_UNTESTED,
225 .probe = probe_jedec,
226 .probe_timing = TIMING_ZERO,
227 .block_erasers =
228 {
229 {
230 .eraseblocks = { {64 * 1024, 8} },
231 .block_erase = erase_sector_jedec,
232 }, {
233 .eraseblocks = { {512 * 1024, 1} },
234 .block_erase = erase_chip_block_jedec,
235 },
236 },
237 .write = write_jedec_1,
238 .read = read_memmapped,
239 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100240 .prepare_access = prepare_memory_access,
241 .finish_access = finish_memory_access,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000242 },
243
244 {
245 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000246 .name = "Am29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000247 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000248 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000249 .model_id = AMD_AM29F040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000250 .total_size = 512,
251 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000252 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
253 .tested = TEST_UNTESTED,
254 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000255 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000256 .block_erasers =
257 {
258 {
259 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000260 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000261 }, {
262 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000263 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000264 },
265 },
Sean Nelson35727f72010-01-28 23:55:12 +0000266 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000267 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000268 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100269 .prepare_access = prepare_memory_access,
270 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +0000271 },
272
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000273 {
274 .vendor = "AMD",
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000275 .name = "Am29F080",
276 .bustype = BUS_PARALLEL,
277 .manufacture_id = AMD_ID,
278 .model_id = AMD_AM29F080,
279 .total_size = 1024,
280 .page_size = 64 * 1024,
281 .feature_bits = FEATURE_EITHER_RESET,
282 .tested = TEST_UNTESTED,
283 .probe = probe_jedec,
284 .probe_timing = TIMING_ZERO,
285 .block_erasers =
286 {
287 {
288 .eraseblocks = { {64 * 1024, 16} },
289 .block_erase = erase_sector_jedec,
290 }, {
291 .eraseblocks = { {1024 * 1024, 1} },
292 .block_erase = erase_chip_block_jedec,
293 },
294 },
295 .write = write_jedec_1,
296 .read = read_memmapped,
297 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100298 .prepare_access = prepare_memory_access,
299 .finish_access = finish_memory_access,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000300 },
301
302 {
303 .vendor = "AMD",
Peter Stuge8440cc02009-01-25 23:55:12 +0000304 .name = "Am29F080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000305 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000306 .manufacture_id = AMD_ID,
Stefan Taunerd1ca1e82016-01-31 23:17:35 +0000307 .model_id = AMD_AM29F080,
Peter Stuge8440cc02009-01-25 23:55:12 +0000308 .total_size = 1024,
309 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000310 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +0000311 .tested = TEST_UNTESTED,
312 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +0000313 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000314 .block_erasers =
315 {
316 {
317 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000318 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000319 }, {
320 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000321 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000322 },
323 },
Sean Nelson35727f72010-01-28 23:55:12 +0000324 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000325 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000326 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +0100327 .prepare_access = prepare_memory_access,
328 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +0000329 },
330
331 {
332 .vendor = "AMD",
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000333 .name = "Am29LV001BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000334 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000335 .manufacture_id = AMD_ID,
336 .model_id = AMD_AM29LV001BB,
337 .total_size = 128,
338 .page_size = 64 * 1024, /* unused */
339 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
340 .tested = TEST_OK_PREW,
341 .probe = probe_jedec,
342 .probe_timing = TIMING_ZERO,
343 .block_erasers =
344 {
345 {
346 .eraseblocks = {
347 {8 * 1024, 1},
348 {4 * 1024, 2},
349 {16 * 1024, 7},
350 },
351 .block_erase = erase_sector_jedec,
352 }, {
353 .eraseblocks = { {128 * 1024, 1} },
354 .block_erase = erase_chip_block_jedec,
355 },
356 },
357 .write = write_jedec_1,
358 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000359 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100360 .prepare_access = prepare_memory_access,
361 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000362 },
363
364 {
365 .vendor = "AMD",
366 .name = "Am29LV001BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000367 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000368 .manufacture_id = AMD_ID,
369 .model_id = AMD_AM29LV001BT,
370 .total_size = 128,
371 .page_size = 64 * 1024, /* unused */
372 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
373 .tested = TEST_UNTESTED,
374 .probe = probe_jedec,
375 .probe_timing = TIMING_ZERO,
376 .block_erasers =
377 {
378 {
379 .eraseblocks = {
380 {16 * 1024, 7},
381 {4 * 1024, 2},
382 {8 * 1024, 1},
383 },
384 .block_erase = erase_sector_jedec,
385 }, {
386 .eraseblocks = { {128 * 1024, 1} },
387 .block_erase = erase_chip_block_jedec,
388 },
389 },
390 .write = write_jedec_1,
391 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000392 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100393 .prepare_access = prepare_memory_access,
394 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000395 },
396
397 {
398 .vendor = "AMD",
399 .name = "Am29LV002BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000400 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000401 .manufacture_id = AMD_ID,
402 .model_id = AMD_AM29LV002BB,
403 .total_size = 256,
404 .page_size = 64 * 1024, /* unused */
405 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
406 .tested = TEST_UNTESTED,
407 .probe = probe_jedec,
408 .probe_timing = TIMING_ZERO,
409 .block_erasers =
410 {
411 {
412 .eraseblocks = {
413 {16 * 1024, 1},
414 {8 * 1024, 2},
415 {32 * 1024, 1},
416 {64 * 1024, 3},
417 },
418 .block_erase = erase_sector_jedec,
419 }, {
420 .eraseblocks = { {256 * 1024, 1} },
421 .block_erase = erase_chip_block_jedec,
422 },
423 },
424 .write = write_jedec_1,
425 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000426 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100427 .prepare_access = prepare_memory_access,
428 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000429 },
430
431 {
432 .vendor = "AMD",
433 .name = "Am29LV002BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000434 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000435 .manufacture_id = AMD_ID,
436 .model_id = AMD_AM29LV002BT,
437 .total_size = 256,
438 .page_size = 64 * 1024, /* unused */
439 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
440 .tested = TEST_UNTESTED,
441 .probe = probe_jedec,
442 .probe_timing = TIMING_ZERO,
443 .block_erasers =
444 {
445 {
446 .eraseblocks = {
447 {64 * 1024, 3},
448 {32 * 1024, 1},
449 {8 * 1024, 2},
450 {16 * 1024, 1},
451 },
452 .block_erase = erase_sector_jedec,
453 }, {
454 .eraseblocks = { {256 * 1024, 1} },
455 .block_erase = erase_chip_block_jedec,
456 },
457 },
458 .write = write_jedec_1,
459 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000460 .voltage = {3000, 3600}, /* 3.0-3.6V for type -55, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100461 .prepare_access = prepare_memory_access,
462 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000463 },
464
465 {
466 .vendor = "AMD",
467 .name = "Am29LV004BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000468 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000469 .manufacture_id = AMD_ID,
470 .model_id = AMD_AM29LV004BB,
471 .total_size = 512,
472 .page_size = 64 * 1024, /* unused */
473 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
474 .tested = TEST_UNTESTED,
475 .probe = probe_jedec,
476 .probe_timing = TIMING_ZERO,
477 .block_erasers =
478 {
479 {
480 .eraseblocks = {
481 {16 * 1024, 1},
482 {8 * 1024, 2},
483 {32 * 1024, 1},
484 {64 * 1024, 7},
485 },
486 .block_erase = erase_sector_jedec,
487 }, {
488 .eraseblocks = { {512 * 1024, 1} },
489 .block_erase = erase_chip_block_jedec,
490 },
491 },
492 .write = write_jedec_1,
493 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000494 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +0100495 .prepare_access = prepare_memory_access,
496 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000497 },
498
499 {
500 .vendor = "AMD",
501 .name = "Am29LV004BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000502 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000503 .manufacture_id = AMD_ID,
504 .model_id = AMD_AM29LV004BT,
505 .total_size = 512,
506 .page_size = 64 * 1024, /* unused */
507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
508 .tested = TEST_UNTESTED,
509 .probe = probe_jedec,
510 .probe_timing = TIMING_ZERO,
511 .block_erasers =
512 {
513 {
514 .eraseblocks = {
515 {64 * 1024, 7},
516 {32 * 1024, 1},
517 {8 * 1024, 2},
518 {16 * 1024, 1},
519 },
520 .block_erase = erase_sector_jedec,
521 }, {
522 .eraseblocks = { {512 * 1024, 1} },
523 .block_erase = erase_chip_block_jedec,
524 },
525 },
526 .write = write_jedec_1,
527 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000528 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +0100529 .prepare_access = prepare_memory_access,
530 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000531 },
532
533 {
534 .vendor = "AMD",
535 .name = "Am29LV008BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000536 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000537 .manufacture_id = AMD_ID,
538 .model_id = AMD_AM29LV008BB,
539 .total_size = 1024,
540 .page_size = 64 * 1024, /* unused */
541 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Uwe Hermann09ebd522011-08-25 22:54:23 +0000542 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000543 .probe = probe_jedec,
544 .probe_timing = TIMING_ZERO,
545 .block_erasers =
546 {
547 {
548 .eraseblocks = {
549 {16 * 1024, 1},
550 {8 * 1024, 2},
551 {32 * 1024, 1},
552 {64 * 1024, 15},
553 },
554 .block_erase = erase_sector_jedec,
555 }, {
556 .eraseblocks = { {1024 * 1024, 1} },
557 .block_erase = erase_chip_block_jedec,
558 },
559 },
560 .write = write_jedec_1,
561 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000562 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100563 .prepare_access = prepare_memory_access,
564 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000565 },
566
567 {
568 .vendor = "AMD",
569 .name = "Am29LV008BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000570 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000571 .manufacture_id = AMD_ID,
572 .model_id = AMD_AM29LV008BT,
573 .total_size = 1024,
574 .page_size = 64 * 1024, /* unused */
575 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
576 .tested = TEST_UNTESTED,
577 .probe = probe_jedec,
578 .probe_timing = TIMING_ZERO,
579 .block_erasers =
580 {
581 {
582 .eraseblocks = {
583 {64 * 1024, 15},
584 {32 * 1024, 1},
585 {8 * 1024, 2},
586 {16 * 1024, 1},
587 },
588 .block_erase = erase_sector_jedec,
589 }, {
590 .eraseblocks = { {1024 * 1024, 1} },
591 .block_erase = erase_chip_block_jedec,
592 },
593 },
594 .write = write_jedec_1,
595 .read = read_memmapped,
Alan Greenf5ad6882019-06-27 12:09:13 +1000596 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100597 .prepare_access = prepare_memory_access,
598 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerc753e5b2011-02-05 12:11:17 +0000599 },
600
601 {
602 .vendor = "AMD",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000603 .name = "Am29LV040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000604 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000605 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000606 .model_id = AMD_AM29LV040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000607 .total_size = 512,
608 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +0000609 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +0000610 .tested = TEST_OK_PRE,
Sean Nelson35727f72010-01-28 23:55:12 +0000611 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000612 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000613 .block_erasers =
614 {
615 {
616 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +0000617 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000618 }, {
619 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000620 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000621 },
622 },
Sean Nelson35727f72010-01-28 23:55:12 +0000623 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000624 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000625 .voltage = {3000, 3600}, /* 3.0-3.6V for type -60R, others 2.7-3.6V*/
Nico Huber9eec4072023-01-12 01:17:30 +0100626 .prepare_access = prepare_memory_access,
627 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +0000628 },
629
Stephan Guilloux5c5b5252009-01-08 03:40:17 +0000630 {
Peter Stuge8440cc02009-01-25 23:55:12 +0000631 .vendor = "AMD",
632 .name = "Am29LV081B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000633 .bustype = BUS_PARALLEL,
Mateusz Murawski5bae4382009-06-02 00:38:14 +0000634 .manufacture_id = AMD_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +0000635 .model_id = AMD_AM29LV080B,
Peter Stuge8440cc02009-01-25 23:55:12 +0000636 .total_size = 1024,
637 .page_size = 64 * 1024,
David Borg204f4652010-12-04 03:26:40 +0000638 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET, /* datasheet specifies address as don't care */
Peter Stuge8440cc02009-01-25 23:55:12 +0000639 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +0000640 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +0000641 .probe_timing = TIMING_ZERO,
Sean Nelson72a9a022009-12-22 22:15:33 +0000642 .block_erasers =
643 {
644 {
645 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson35727f72010-01-28 23:55:12 +0000646 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000647 }, {
648 .eraseblocks = { {1024 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +0000649 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +0000650 },
651 },
Sean Nelson35727f72010-01-28 23:55:12 +0000652 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +0000653 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000654 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +0100655 .prepare_access = prepare_memory_access,
656 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +0000657 },
658
659 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000660 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000661 .name = "A25L010",
662 .bustype = BUS_SPI,
663 .manufacture_id = AMIC_ID_NOPREFIX,
664 .model_id = AMIC_A25L010,
665 .total_size = 128,
666 .page_size = 256,
667 .feature_bits = FEATURE_WRSR_WREN,
668 .tested = TEST_UNTESTED,
669 .probe = probe_spi_rdid,
670 .probe_timing = TIMING_ZERO,
671 .block_erasers =
672 {
673 {
674 .eraseblocks = { { 4 * 1024, 32 } },
675 .block_erase = spi_block_erase_20,
676 }, {
677 .eraseblocks = { { 64 * 1024, 2 } },
678 .block_erase = spi_block_erase_d8,
679 }, {
680 .eraseblocks = { { 128 * 1024, 1 } },
681 .block_erase = spi_block_erase_c7,
682 }
683 },
684 .printlock = spi_prettyprint_status_register_bp2_srwd,
685 .unlock = spi_disable_blockprotect,
686 .write = spi_chip_write_256,
687 .read = spi_chip_read,
688 .voltage = {2700, 3600},
689 },
690
691 {
692 .vendor = "AMIC",
693 .name = "A25L016",
694 .bustype = BUS_SPI,
695 .manufacture_id = AMIC_ID_NOPREFIX,
696 .model_id = AMIC_A25L016,
697 .total_size = 2048,
698 .page_size = 256,
699 .feature_bits = FEATURE_WRSR_WREN,
700 .tested = TEST_UNTESTED,
701 .probe = probe_spi_rdid,
702 .probe_timing = TIMING_ZERO,
703 .block_erasers =
704 {
705 {
706 .eraseblocks = { { 4 * 1024, 512 } },
707 .block_erase = spi_block_erase_20,
708 }, {
709 .eraseblocks = { { 64 * 1024, 32 } },
710 .block_erase = spi_block_erase_d8,
711 }, {
712 .eraseblocks = { { 2048 * 1024, 1 } },
713 .block_erase = spi_block_erase_c7,
714 }
715 },
716 .printlock = spi_prettyprint_status_register_bp2_srwd,
717 .unlock = spi_disable_blockprotect,
718 .write = spi_chip_write_256,
719 .read = spi_chip_read,
720 .voltage = {2700, 3600},
721 },
722
723 {
724 .vendor = "AMIC",
725 .name = "A25L020",
726 .bustype = BUS_SPI,
727 .manufacture_id = AMIC_ID_NOPREFIX,
728 .model_id = AMIC_A25L020,
729 .total_size = 256,
730 .page_size = 256,
731 .feature_bits = FEATURE_WRSR_WREN,
732 .tested = TEST_UNTESTED,
733 .probe = probe_spi_rdid,
734 .probe_timing = TIMING_ZERO,
735 .block_erasers =
736 {
737 {
738 .eraseblocks = { { 4 * 1024, 64 } },
739 .block_erase = spi_block_erase_20,
740 }, {
741 .eraseblocks = { { 64 * 1024, 4 } },
742 .block_erase = spi_block_erase_d8,
743 }, {
744 .eraseblocks = { { 256 * 1024, 1 } },
745 .block_erase = spi_block_erase_c7,
746 }
747 },
748 .printlock = spi_prettyprint_status_register_bp2_srwd,
749 .unlock = spi_disable_blockprotect,
750 .write = spi_chip_write_256,
751 .read = spi_chip_read,
752 .voltage = {2700, 3600},
753 },
754
755 {
756 .vendor = "AMIC",
757 .name = "A25L032",
758 .bustype = BUS_SPI,
759 .manufacture_id = AMIC_ID_NOPREFIX,
760 .model_id = AMIC_A25L032,
761 .total_size = 4096,
762 .page_size = 256,
763 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
765 .tested = TEST_OK_PREW,
766 .probe = probe_spi_rdid,
767 .probe_timing = TIMING_ZERO,
768 .block_erasers =
769 {
770 {
771 .eraseblocks = { { 4 * 1024, 1024 } },
772 .block_erase = spi_block_erase_20,
773 }, {
774 .eraseblocks = { { 64 * 1024, 64 } },
775 .block_erase = spi_block_erase_52,
776 }, {
777 .eraseblocks = { { 64 * 1024, 64 } },
778 .block_erase = spi_block_erase_d8,
779 }, {
780 .eraseblocks = { { 4096 * 1024, 1 } },
781 .block_erase = spi_block_erase_60,
782 }, {
783 .eraseblocks = { { 4096 * 1024, 1 } },
784 .block_erase = spi_block_erase_c7,
785 }
786 },
787 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
788 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
789 .write = spi_chip_write_256,
790 .read = spi_chip_read,
791 .voltage = {2700, 3600},
792 },
793
794 {
795 .vendor = "AMIC",
796 .name = "A25L040",
797 .bustype = BUS_SPI,
798 .manufacture_id = AMIC_ID_NOPREFIX,
799 .model_id = AMIC_A25L040,
800 .total_size = 512,
801 .page_size = 256,
802 .feature_bits = FEATURE_WRSR_WREN,
803 .tested = TEST_UNTESTED,
804 .probe = probe_spi_rdid,
805 .probe_timing = TIMING_ZERO,
806 .block_erasers =
807 {
808 {
809 .eraseblocks = { { 4 * 1024, 128 } },
810 .block_erase = spi_block_erase_20,
811 }, {
812 .eraseblocks = { { 64 * 1024, 8 } },
813 .block_erase = spi_block_erase_d8,
814 }, {
815 .eraseblocks = { { 512 * 1024, 1 } },
816 .block_erase = spi_block_erase_c7,
817 }
818 },
819 .printlock = spi_prettyprint_status_register_bp2_srwd,
820 .unlock = spi_disable_blockprotect,
821 .write = spi_chip_write_256,
822 .read = spi_chip_read,
823 .voltage = {2700, 3600},
824 },
825
826 {
827 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000828 .name = "A25L05PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000829 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000830 .manufacture_id = AMIC_ID,
831 .model_id = AMIC_A25L05PT,
832 .total_size = 64,
833 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000834 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000835 .tested = TEST_UNTESTED,
836 .probe = probe_spi_rdid4,
837 .probe_timing = TIMING_ZERO,
838 .block_erasers =
839 {
840 {
841 .eraseblocks = {
842 {32 * 1024, 1},
843 {16 * 1024, 1},
844 {8 * 1024, 1},
845 {4 * 1024, 2},
846 },
847 .block_erase = spi_block_erase_d8,
848 }, {
849 .eraseblocks = { {64 * 1024, 1} },
850 .block_erase = spi_block_erase_c7,
851 }
852 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000853 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000854 .unlock = spi_disable_blockprotect,
855 .write = spi_chip_write_256,
856 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000857 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000858 },
859
860 {
861 .vendor = "AMIC",
862 .name = "A25L05PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000863 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000864 .manufacture_id = AMIC_ID,
865 .model_id = AMIC_A25L05PU,
866 .total_size = 64,
867 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000868 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000869 .tested = TEST_UNTESTED,
870 .probe = probe_spi_rdid4,
871 .probe_timing = TIMING_ZERO,
872 .block_erasers =
873 {
874 {
875 .eraseblocks = {
876 {4 * 1024, 2},
877 {8 * 1024, 1},
878 {16 * 1024, 1},
879 {32 * 1024, 1},
880 },
881 .block_erase = spi_block_erase_d8,
882 }, {
883 .eraseblocks = { {64 * 1024, 1} },
884 .block_erase = spi_block_erase_c7,
885 }
886 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000887 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000888 .unlock = spi_disable_blockprotect,
889 .write = spi_chip_write_256,
890 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +0000891 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000892 },
893
894 {
895 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000896 .name = "A25L080",
897 .bustype = BUS_SPI,
898 .manufacture_id = AMIC_ID_NOPREFIX,
899 .model_id = AMIC_A25L080,
900 .total_size = 1024,
901 .page_size = 256,
902 .feature_bits = FEATURE_WRSR_WREN,
903 .tested = TEST_UNTESTED,
904 .probe = probe_spi_rdid,
905 .probe_timing = TIMING_ZERO,
906 .block_erasers =
907 {
908 {
909 .eraseblocks = { { 4 * 1024, 256 } },
910 .block_erase = spi_block_erase_20,
911 }, {
912 .eraseblocks = { { 64 * 1024, 16 } },
913 .block_erase = spi_block_erase_d8,
914 }, {
915 .eraseblocks = { { 1024 * 1024, 1 } },
916 .block_erase = spi_block_erase_c7,
917 }
918 },
919 .printlock = spi_prettyprint_status_register_bp2_srwd,
920 .unlock = spi_disable_blockprotect,
921 .write = spi_chip_write_256,
922 .read = spi_chip_read,
923 .voltage = {2700, 3600},
924 },
925
926 {
927 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000928 .name = "A25L10PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000929 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000930 .manufacture_id = AMIC_ID,
931 .model_id = AMIC_A25L10PT,
932 .total_size = 128,
933 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000934 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000935 .tested = TEST_UNTESTED,
936 .probe = probe_spi_rdid4,
937 .probe_timing = TIMING_ZERO,
938 .block_erasers =
939 {
940 {
941 .eraseblocks = {
942 {64 * 1024, 1},
943 {32 * 1024, 1},
944 {16 * 1024, 1},
945 {8 * 1024, 1},
946 {4 * 1024, 2},
947 },
948 .block_erase = spi_block_erase_d8,
949 }, {
950 .eraseblocks = { {128 * 1024, 1} },
951 .block_erase = spi_block_erase_c7,
952 }
953 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000954 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000955 .unlock = spi_disable_blockprotect,
956 .write = spi_chip_write_256,
957 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000958 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000959 },
960
961 {
962 .vendor = "AMIC",
963 .name = "A25L10PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +0000964 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000965 .manufacture_id = AMIC_ID,
966 .model_id = AMIC_A25L10PU,
967 .total_size = 128,
968 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +0000969 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000970 .tested = TEST_UNTESTED,
971 .probe = probe_spi_rdid4,
972 .probe_timing = TIMING_ZERO,
973 .block_erasers =
974 {
975 {
976 .eraseblocks = {
977 {4 * 1024, 2},
978 {8 * 1024, 1},
979 {16 * 1024, 1},
980 {32 * 1024, 1},
981 {64 * 1024, 1},
982 },
983 .block_erase = spi_block_erase_d8,
984 }, {
985 .eraseblocks = { {128 * 1024, 1} },
986 .block_erase = spi_block_erase_c7,
987 }
988 },
Stefan Tauner12f3d512014-05-27 21:27:27 +0000989 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000990 .unlock = spi_disable_blockprotect,
991 .write = spi_chip_write_256,
992 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +0000993 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +0000994 },
995
996 {
997 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +1000998 .name = "A25L16PT",
999 .bustype = BUS_SPI,
1000 .manufacture_id = AMIC_ID,
1001 .model_id = AMIC_A25L16PT,
1002 .total_size = 2048,
1003 .page_size = 256,
1004 .feature_bits = FEATURE_WRSR_WREN,
1005 .tested = TEST_UNTESTED,
1006 .probe = probe_spi_rdid4,
1007 .probe_timing = TIMING_ZERO,
1008 .block_erasers =
1009 {
1010 {
1011 .eraseblocks = {
1012 {64 * 1024, 31},
1013 {32 * 1024, 1},
1014 {16 * 1024, 1},
1015 {8 * 1024, 1},
1016 {4 * 1024, 2},
1017 },
1018 .block_erase = spi_block_erase_d8,
1019 }, {
1020 .eraseblocks = { {2048 * 1024, 1} },
1021 .block_erase = spi_block_erase_60,
1022 }, {
1023 .eraseblocks = { {2048 * 1024, 1} },
1024 .block_erase = spi_block_erase_c7,
1025 }
1026 },
1027 .printlock = spi_prettyprint_status_register_bp2_srwd,
1028 .unlock = spi_disable_blockprotect,
1029 .write = spi_chip_write_256,
1030 .read = spi_chip_read,
1031 .voltage = {2700, 3600},
1032 },
1033
1034 {
1035 .vendor = "AMIC",
1036 .name = "A25L16PU",
1037 .bustype = BUS_SPI,
1038 .manufacture_id = AMIC_ID,
1039 .model_id = AMIC_A25L16PU,
1040 .total_size = 2048,
1041 .page_size = 256,
1042 .feature_bits = FEATURE_WRSR_WREN,
1043 .tested = TEST_OK_PR,
1044 .probe = probe_spi_rdid4,
1045 .probe_timing = TIMING_ZERO,
1046 .block_erasers =
1047 {
1048 {
1049 .eraseblocks = {
1050 {4 * 1024, 2},
1051 {8 * 1024, 1},
1052 {16 * 1024, 1},
1053 {32 * 1024, 1},
1054 {64 * 1024, 31},
1055 },
1056 .block_erase = spi_block_erase_d8,
1057 }, {
1058 .eraseblocks = { {2048 * 1024, 1} },
1059 .block_erase = spi_block_erase_60,
1060 }, {
1061 .eraseblocks = { {2048 * 1024, 1} },
1062 .block_erase = spi_block_erase_c7,
1063 }
1064 },
1065 .printlock = spi_prettyprint_status_register_bp2_srwd,
1066 .unlock = spi_disable_blockprotect,
1067 .write = spi_chip_write_256,
1068 .read = spi_chip_read,
1069 .voltage = {2700, 3600},
1070 },
1071
1072 {
1073 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001074 .name = "A25L20PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001075 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001076 .manufacture_id = AMIC_ID,
1077 .model_id = AMIC_A25L20PT,
1078 .total_size = 256,
1079 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001080 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001081 .tested = TEST_UNTESTED,
1082 .probe = probe_spi_rdid4,
1083 .probe_timing = TIMING_ZERO,
1084 .block_erasers =
1085 {
1086 {
1087 .eraseblocks = {
1088 {64 * 1024, 3},
1089 {32 * 1024, 1},
1090 {16 * 1024, 1},
1091 {8 * 1024, 1},
1092 {4 * 1024, 2},
1093 },
1094 .block_erase = spi_block_erase_d8,
1095 }, {
1096 .eraseblocks = { {256 * 1024, 1} },
1097 .block_erase = spi_block_erase_c7,
1098 }
1099 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001100 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001101 .unlock = spi_disable_blockprotect,
1102 .write = spi_chip_write_256,
1103 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001104 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001105 },
1106
1107 {
1108 .vendor = "AMIC",
1109 .name = "A25L20PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001110 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001111 .manufacture_id = AMIC_ID,
1112 .model_id = AMIC_A25L20PU,
1113 .total_size = 256,
1114 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001115 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001116 .tested = TEST_UNTESTED,
1117 .probe = probe_spi_rdid4,
1118 .probe_timing = TIMING_ZERO,
1119 .block_erasers =
1120 {
1121 {
1122 .eraseblocks = {
1123 {4 * 1024, 2},
1124 {8 * 1024, 1},
1125 {16 * 1024, 1},
1126 {32 * 1024, 1},
1127 {64 * 1024, 3},
1128 },
1129 .block_erase = spi_block_erase_d8,
1130 }, {
1131 .eraseblocks = { {256 * 1024, 1} },
1132 .block_erase = spi_block_erase_c7,
1133 }
1134 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001135 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001136 .unlock = spi_disable_blockprotect,
1137 .write = spi_chip_write_256,
1138 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001139 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001140 },
1141
1142 /* The A25L40P{T,U} chips are distinguished by their
1143 * erase block layouts, but without any distinction in RDID.
1144 * This inexplicable quirk was verified by Rudolf Marek
Nico Huberc3b02dc2023-08-12 01:13:45 +02001145 * and discussed on the flashprog mailing list on 2010-07-12.
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001146 */
1147 {
1148 .vendor = "AMIC",
1149 .name = "A25L40PT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001150 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001151 .manufacture_id = AMIC_ID,
1152 .model_id = AMIC_A25L40PT,
1153 .total_size = 512,
1154 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001155 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001156 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001157 .probe = probe_spi_rdid4,
1158 .probe_timing = TIMING_ZERO,
1159 .block_erasers =
1160 {
1161 {
1162 .eraseblocks = {
1163 {64 * 1024, 7},
1164 {32 * 1024, 1},
1165 {16 * 1024, 1},
1166 {8 * 1024, 1},
1167 {4 * 1024, 2},
1168 },
1169 .block_erase = spi_block_erase_d8,
1170 }, {
1171 .eraseblocks = { {512 * 1024, 1} },
1172 .block_erase = spi_block_erase_c7,
1173 }
1174 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001175 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001176 .unlock = spi_disable_blockprotect,
1177 .write = spi_chip_write_256,
1178 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001179 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001180 },
1181
1182 {
1183 .vendor = "AMIC",
1184 .name = "A25L40PU",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001185 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001186 .manufacture_id = AMIC_ID,
1187 .model_id = AMIC_A25L40PU,
1188 .total_size = 512,
1189 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001190 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons6f088352018-09-30 19:59:42 +02001191 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001192 .probe = probe_spi_rdid4,
1193 .probe_timing = TIMING_ZERO,
1194 .block_erasers =
1195 {
1196 {
1197 .eraseblocks = {
1198 {4 * 1024, 2},
1199 {8 * 1024, 1},
1200 {16 * 1024, 1},
1201 {32 * 1024, 1},
1202 {64 * 1024, 7},
1203 },
1204 .block_erase = spi_block_erase_d8,
1205 }, {
1206 .eraseblocks = { {512 * 1024, 1} },
1207 .block_erase = spi_block_erase_c7,
1208 }
1209 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001210 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001211 .unlock = spi_disable_blockprotect,
1212 .write = spi_chip_write_256,
1213 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001214 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001215 },
1216
1217 {
1218 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001219 .name = "A25L512",
1220 .bustype = BUS_SPI,
1221 .manufacture_id = AMIC_ID_NOPREFIX,
1222 .model_id = AMIC_A25L512,
1223 .total_size = 64,
1224 .page_size = 256,
1225 .feature_bits = FEATURE_WRSR_WREN,
1226 .tested = TEST_UNTESTED,
1227 .probe = probe_spi_rdid,
1228 .probe_timing = TIMING_ZERO,
1229 .block_erasers =
1230 {
1231 {
1232 .eraseblocks = { { 4 * 1024, 16 } },
1233 .block_erase = spi_block_erase_20,
1234 }, {
1235 .eraseblocks = { { 64 * 1024, 1 } },
1236 .block_erase = spi_block_erase_d8,
1237 }, {
1238 .eraseblocks = { { 64 * 1024, 1 } },
1239 .block_erase = spi_block_erase_c7,
1240 }
1241 },
1242 .printlock = spi_prettyprint_status_register_bp2_srwd,
1243 .unlock = spi_disable_blockprotect,
1244 .write = spi_chip_write_256,
1245 .read = spi_chip_read,
1246 .voltage = {2700, 3600},
1247 },
1248
1249 {
1250 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001251 .name = "A25L80P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001252 .bustype = BUS_SPI,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001253 .manufacture_id = AMIC_ID,
1254 .model_id = AMIC_A25L80P,
1255 .total_size = 1024,
1256 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00001257 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00001258 .tested = TEST_OK_PRE,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001259 .probe = probe_spi_rdid4,
1260 .probe_timing = TIMING_ZERO,
1261 .block_erasers =
1262 {
1263 {
1264 .eraseblocks = {
1265 {4 * 1024, 2},
1266 {8 * 1024, 1},
1267 {16 * 1024, 1},
1268 {32 * 1024, 1},
1269 {64 * 1024, 15},
1270 },
1271 .block_erase = spi_block_erase_d8,
1272 }, {
1273 .eraseblocks = { {1024 * 1024, 1} },
1274 .block_erase = spi_block_erase_c7,
1275 }
1276 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001277 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001278 .unlock = spi_disable_blockprotect,
1279 .write = spi_chip_write_256,
1280 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001281 .voltage = {2700, 3600},
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001282 },
1283
1284 {
1285 .vendor = "AMIC",
Alan Green1f9cc7d2019-07-01 11:10:45 +10001286 .name = "A25LQ032/A25LQ32A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001287 .bustype = BUS_SPI,
Dan Lenski11617122010-07-29 15:00:40 +00001288 .manufacture_id = AMIC_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001289 .model_id = AMIC_A25LQ032,
Dan Lenski11617122010-07-29 15:00:40 +00001290 .total_size = 4096,
1291 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001292 /* A25LQ32A supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00001293 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1294 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Alan Green1f9cc7d2019-07-01 11:10:45 +10001295 .tested = TEST_UNTESTED,
Dan Lenski11617122010-07-29 15:00:40 +00001296 .probe = probe_spi_rdid,
1297 .probe_timing = TIMING_ZERO,
1298 .block_erasers =
1299 {
1300 {
1301 .eraseblocks = { { 4 * 1024, 1024 } },
1302 .block_erase = spi_block_erase_20,
1303 }, {
1304 .eraseblocks = { { 64 * 1024, 64 } },
1305 .block_erase = spi_block_erase_52,
1306 }, {
1307 .eraseblocks = { { 64 * 1024, 64 } },
1308 .block_erase = spi_block_erase_d8,
1309 }, {
1310 .eraseblocks = { { 4096 * 1024, 1 } },
1311 .block_erase = spi_block_erase_60,
1312 }, {
1313 .eraseblocks = { { 4096 * 1024, 1 } },
1314 .block_erase = spi_block_erase_c7,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00001315 }
Dan Lenski11617122010-07-29 15:00:40 +00001316 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001317 .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) */
Dan Lenski11617122010-07-29 15:00:40 +00001319 .write = spi_chip_write_256,
1320 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001321 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001322 },
1323
1324 {
1325 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001326 .name = "A25LQ16",
1327 .bustype = BUS_SPI,
1328 .manufacture_id = AMIC_ID_NOPREFIX,
1329 .model_id = AMIC_A25LQ16,
1330 .total_size = 2048,
1331 .page_size = 256,
1332 /* supports SFDP */
1333 /* OTP: 64B total; read 0x4B, 0x48; write 0x42 */
1334 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1335 .tested = TEST_UNTESTED,
1336 .probe = probe_spi_rdid,
1337 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10001338 .block_erasers =
1339 {
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001340 {
1341 .eraseblocks = { { 4 * 1024, 512 } },
1342 .block_erase = spi_block_erase_20,
1343 }, {
1344 .eraseblocks = { { 64 * 1024, 32 } },
1345 .block_erase = spi_block_erase_52,
1346 }, {
1347 .eraseblocks = { { 64 * 1024, 32 } },
1348 .block_erase = spi_block_erase_d8,
1349 }, {
1350 .eraseblocks = { { 2048 * 1024, 1 } },
1351 .block_erase = spi_block_erase_60,
1352 }, {
1353 .eraseblocks = { { 2048 * 1024, 1 } },
1354 .block_erase = spi_block_erase_c7,
1355 }
1356 },
1357 .printlock = spi_prettyprint_status_register_amic_a25l032, /* bit5: T/B, bit6: prot size */
1358 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: 2nd status reg (read with 0x35) */
1359 .write = spi_chip_write_256,
1360 .read = spi_chip_read,
1361 .voltage = {2700, 3600},
1362 },
1363
1364 {
1365 .vendor = "AMIC",
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001366 .name = "A25LQ64",
1367 .bustype = BUS_SPI,
1368 .manufacture_id = AMIC_ID_NOPREFIX,
Stefan Tauner23e10b82016-01-23 16:16:49 +00001369 .model_id = AMIC_A25LQ64,
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001370 .total_size = 8192,
1371 .page_size = 256,
1372 /* supports SFDP */
1373 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +01001374 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
1375 FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT |
1376 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO |
1377 FEATURE_QPI_35_F5,
1378 .dummy_cycles =
1379 {
1380 .qpi_fast_read = 4,
1381 .qpi_fast_read_qio = 6,
1382 },
Nikolay Nikolaevd07fde62013-06-28 21:29:21 +00001383 .tested = TEST_UNTESTED,
1384 .probe = probe_spi_rdid,
1385 .probe_timing = TIMING_ZERO,
1386 .block_erasers =
1387 {
1388 {
1389 .eraseblocks = { { 4 * 1024, 2048 } },
1390 .block_erase = spi_block_erase_20,
1391 }, {
1392 .eraseblocks = { { 32 * 1024, 256 } },
1393 .block_erase = spi_block_erase_52,
1394 }, {
1395 .eraseblocks = { { 64 * 1024, 128 } },
1396 .block_erase = spi_block_erase_d8,
1397 }, {
1398 .eraseblocks = { { 8192 * 1024, 1 } },
1399 .block_erase = spi_block_erase_60,
1400 }, {
1401 .eraseblocks = { { 8192 * 1024, 1 } },
1402 .block_erase = spi_block_erase_c7,
1403 }
1404 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00001405 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enhance (sic!) */
Stefan Tauner5c316f92015-02-08 21:57:52 +00001406 .unlock = spi_disable_blockprotect_bp3_srwd,
Dan Lenski11617122010-07-29 15:00:40 +00001407 .write = spi_chip_write_256,
1408 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001409 .voltage = {2700, 3600},
Dan Lenski11617122010-07-29 15:00:40 +00001410 },
1411
1412 {
1413 .vendor = "AMIC",
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001414 .name = "A29002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001415 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001416 .manufacture_id = AMIC_ID_NOPREFIX,
1417 .model_id = AMIC_A29002B,
1418 .total_size = 256,
1419 .page_size = 64 * 1024,
1420 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
1421 .tested = TEST_UNTESTED,
1422 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001423 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001424 .block_erasers =
1425 {
1426 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001427 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001428 {16 * 1024, 1},
1429 {8 * 1024, 2},
1430 {32 * 1024, 1},
1431 {64 * 1024, 3},
1432 },
1433 .block_erase = erase_sector_jedec,
1434 }, {
1435 .eraseblocks = { {256 * 1024, 1} },
1436 .block_erase = erase_chip_block_jedec,
1437 },
1438 },
1439 .write = write_jedec_1,
1440 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001441 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001442 .prepare_access = prepare_memory_access,
1443 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001444 },
1445
1446 {
1447 .vendor = "AMIC",
1448 .name = "A29002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001449 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001450 .manufacture_id = AMIC_ID_NOPREFIX,
1451 .model_id = AMIC_A29002T,
1452 .total_size = 256,
1453 .page_size = 64 * 1024,
1454 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00001455 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001456 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001457 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001458 .block_erasers =
1459 {
1460 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00001461 .eraseblocks = {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001462 {64 * 1024, 3},
1463 {32 * 1024, 1},
1464 {8 * 1024, 2},
1465 {16 * 1024, 1},
1466 },
1467 .block_erase = erase_sector_jedec,
1468 }, {
1469 .eraseblocks = { {256 * 1024, 1} },
1470 .block_erase = erase_chip_block_jedec,
1471 },
1472 },
1473 .write = write_jedec_1,
1474 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001475 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001476 .prepare_access = prepare_memory_access,
1477 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001478 },
1479
1480 {
1481 .vendor = "AMIC",
1482 .name = "A29040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001483 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001484 .manufacture_id = AMIC_ID_NOPREFIX,
1485 .model_id = AMIC_A29040B,
1486 .total_size = 512,
1487 .page_size = 64 * 1024,
1488 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Corey Osgoodcbd56652013-09-10 10:42:48 +00001489 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001490 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +00001491 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001492 .block_erasers =
1493 {
1494 {
1495 .eraseblocks = { {64 * 1024, 8} },
1496 .block_erase = erase_sector_jedec,
1497 }, {
1498 .eraseblocks = { {512 * 1024, 1} },
1499 .block_erase = erase_chip_block_jedec,
1500 },
1501 },
1502 .write = write_jedec_1,
1503 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001504 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01001505 .prepare_access = prepare_memory_access,
1506 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001507 },
1508
1509 {
1510 .vendor = "AMIC",
1511 .name = "A49LF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001512 .bustype = BUS_LPC,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001513 .manufacture_id = AMIC_ID_NOPREFIX,
1514 .model_id = AMIC_A49LF040A,
1515 .total_size = 512,
1516 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +01001517 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001518 .tested = TEST_OK_PR,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001519 .probe = probe_jedec,
1520 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
1521 .block_erasers =
1522 {
1523 {
1524 .eraseblocks = { {64 * 1024, 8} },
1525 .block_erase = erase_block_jedec,
1526 }, {
1527 .eraseblocks = { {512 * 1024, 1} },
1528 .block_erase = erase_chip_block_jedec,
1529 }
1530 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +00001531 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001532 .write = write_jedec_1,
1533 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001534 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01001535 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01001536 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00001537 },
1538
1539 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001540 .vendor = "Atmel",
1541 .name = "AT25DF021",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001542 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001543 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001544 .model_id = ATMEL_AT25DF021,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001545 .total_size = 256,
1546 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001547 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1548 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001549 .tested = TEST_UNTESTED,
1550 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001551 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001552 .block_erasers =
1553 {
1554 {
1555 .eraseblocks = { {4 * 1024, 64} },
1556 .block_erase = spi_block_erase_20,
1557 }, {
1558 .eraseblocks = { {32 * 1024, 8} },
1559 .block_erase = spi_block_erase_52,
1560 }, {
1561 .eraseblocks = { {64 * 1024, 4} },
1562 .block_erase = spi_block_erase_d8,
1563 }, {
1564 .eraseblocks = { {256 * 1024, 1} },
1565 .block_erase = spi_block_erase_60,
1566 }, {
1567 .eraseblocks = { {256 * 1024, 1} },
1568 .block_erase = spi_block_erase_c7,
1569 }
1570 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001571 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001572 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001573 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001574 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001575 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001576 },
1577
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001578 {
1579 .vendor = "Atmel",
Steffen Mauch0b59b0d2018-06-02 23:46:03 +02001580 .name = "AT25DF021A",
1581 .bustype = BUS_SPI,
1582 .manufacture_id = ATMEL_ID,
1583 .model_id = ATMEL_AT25DF021A,
1584 .total_size = 256,
1585 .page_size = 256,
1586 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1587 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1588 .tested = TEST_OK_PREW,
1589 .probe = probe_spi_rdid,
1590 .probe_timing = TIMING_ZERO,
1591 .block_erasers =
1592 {
1593 {
1594 .eraseblocks = { {4 * 1024, 64} },
1595 .block_erase = spi_block_erase_20,
1596 }, {
1597 .eraseblocks = { {32 * 1024, 8} },
1598 .block_erase = spi_block_erase_52,
1599 }, {
1600 .eraseblocks = { {64 * 1024, 4} },
1601 .block_erase = spi_block_erase_d8,
1602 }, {
1603 .eraseblocks = { {256 * 1024, 1} },
1604 .block_erase = spi_block_erase_60,
1605 }, {
1606 .eraseblocks = { {256 * 1024, 1} },
1607 .block_erase = spi_block_erase_c7,
1608 }
1609 },
1610 .printlock = spi_prettyprint_status_register_at25df,
1611 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
1612 .write = spi_chip_write_256,
1613 .read = spi_chip_read,
1614 .voltage = {1650, 3600},
1615 },
1616
1617 {
1618 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001619 .name = "AT25DF041A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001620 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001621 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001622 .model_id = ATMEL_AT25DF041A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001623 .total_size = 512,
1624 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001625 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00001626 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001627 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001628 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001629 .block_erasers =
1630 {
1631 {
1632 .eraseblocks = { {4 * 1024, 128} },
1633 .block_erase = spi_block_erase_20,
1634 }, {
1635 .eraseblocks = { {32 * 1024, 16} },
1636 .block_erase = spi_block_erase_52,
1637 }, {
1638 .eraseblocks = { {64 * 1024, 8} },
1639 .block_erase = spi_block_erase_d8,
1640 }, {
1641 .eraseblocks = { {512 * 1024, 1} },
1642 .block_erase = spi_block_erase_60,
1643 }, {
1644 .eraseblocks = { {512 * 1024, 1} },
1645 .block_erase = spi_block_erase_c7,
1646 }
1647 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001648 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001649 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001650 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001651 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001652 .voltage = {2700, 3600}, /* 2.3-3.6V & 2.7-3.6V models available */
FENG yu ningff692fb2008-12-08 18:15:10 +00001653 },
1654
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001655 {
1656 .vendor = "Atmel",
1657 .name = "AT25DF081",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001658 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001659 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001660 .model_id = ATMEL_AT25DF081,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001661 .total_size = 1024,
1662 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001663 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001664 .tested = TEST_UNTESTED,
1665 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001666 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001667 .block_erasers =
1668 {
1669 {
1670 .eraseblocks = { {4 * 1024, 256} },
1671 .block_erase = spi_block_erase_20,
1672 }, {
1673 .eraseblocks = { {32 * 1024, 32} },
1674 .block_erase = spi_block_erase_52,
1675 }, {
1676 .eraseblocks = { {64 * 1024, 16} },
1677 .block_erase = spi_block_erase_d8,
1678 }, {
1679 .eraseblocks = { {1024 * 1024, 1} },
1680 .block_erase = spi_block_erase_60,
1681 }, {
1682 .eraseblocks = { {1024 * 1024, 1} },
1683 .block_erase = spi_block_erase_c7,
1684 }
1685 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001686 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001687 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001688 .write = spi_chip_write_256,
1689 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001690 .voltage = {1600, 2000}, /* Datasheet says range is 1.65-1.95 V */
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001691 },
1692
1693 {
1694 .vendor = "Atmel",
1695 .name = "AT25DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001696 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001697 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001698 .model_id = ATMEL_AT25DF081A,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001699 .total_size = 1024,
1700 .page_size = 256,
1701 .feature_bits = FEATURE_WRSR_WREN,
1702 .tested = TEST_UNTESTED,
1703 .probe = probe_spi_rdid,
1704 .probe_timing = TIMING_ZERO,
1705 .block_erasers =
1706 {
1707 {
1708 .eraseblocks = { {4 * 1024, 256} },
1709 .block_erase = spi_block_erase_20,
1710 }, {
1711 .eraseblocks = { {32 * 1024, 32} },
1712 .block_erase = spi_block_erase_52,
1713 }, {
1714 .eraseblocks = { {64 * 1024, 16} },
1715 .block_erase = spi_block_erase_d8,
1716 }, {
1717 .eraseblocks = { {1024 * 1024, 1} },
1718 .block_erase = spi_block_erase_60,
1719 }, {
1720 .eraseblocks = { {1024 * 1024, 1} },
1721 .block_erase = spi_block_erase_c7,
1722 }
1723 },
1724 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001725 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001726 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001727 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00001728 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001729 },
1730
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001731 {
1732 .vendor = "Atmel",
1733 .name = "AT25DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001734 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001735 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001736 .model_id = ATMEL_AT25DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001737 .total_size = 2048,
1738 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001739 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons8b5b9622018-09-30 19:13:15 +02001740 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001741 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001742 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001743 .block_erasers =
1744 {
1745 {
1746 .eraseblocks = { {4 * 1024, 512} },
1747 .block_erase = spi_block_erase_20,
1748 }, {
1749 .eraseblocks = { {32 * 1024, 64} },
1750 .block_erase = spi_block_erase_52,
1751 }, {
1752 .eraseblocks = { {64 * 1024, 32} },
1753 .block_erase = spi_block_erase_d8,
1754 }, {
1755 .eraseblocks = { {2 * 1024 * 1024, 1} },
1756 .block_erase = spi_block_erase_60,
1757 }, {
1758 .eraseblocks = { {2 * 1024 * 1024, 1} },
1759 .block_erase = spi_block_erase_c7,
1760 }
1761 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001762 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001763 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001764 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001765 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001766 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001767 },
1768
Alan Green86bf6ab2019-06-27 16:58:20 +10001769 /*The AT26DF321 has the same ID as the AT25DF321. */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001770 {
1771 .vendor = "Atmel",
1772 .name = "AT25DF321",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001773 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001774 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001775 .model_id = ATMEL_AT25DF321,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001776 .total_size = 4096,
1777 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001778 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerd06d9412011-06-12 19:47:55 +00001779 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001780 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001781 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001782 .block_erasers =
1783 {
1784 {
1785 .eraseblocks = { {4 * 1024, 1024} },
1786 .block_erase = spi_block_erase_20,
1787 }, {
1788 .eraseblocks = { {32 * 1024, 128} },
1789 .block_erase = spi_block_erase_52,
1790 }, {
1791 .eraseblocks = { {64 * 1024, 64} },
1792 .block_erase = spi_block_erase_d8,
1793 }, {
1794 .eraseblocks = { {4 * 1024 * 1024, 1} },
1795 .block_erase = spi_block_erase_60,
1796 }, {
1797 .eraseblocks = { {4 * 1024 * 1024, 1} },
1798 .block_erase = spi_block_erase_c7,
1799 }
1800 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001801 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001802 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001803 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001804 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001805 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001806 },
1807
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001808 {
1809 .vendor = "Atmel",
1810 .name = "AT25DF321A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001811 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001812 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001813 .model_id = ATMEL_AT25DF321A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001814 .total_size = 4096,
1815 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001816 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1817 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerd94d25d2012-07-28 03:17:15 +00001818 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001819 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001820 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001821 .block_erasers =
1822 {
1823 {
1824 .eraseblocks = { {4 * 1024, 1024} },
1825 .block_erase = spi_block_erase_20,
1826 }, {
1827 .eraseblocks = { {32 * 1024, 128} },
1828 .block_erase = spi_block_erase_52,
1829 }, {
1830 .eraseblocks = { {64 * 1024, 64} },
1831 .block_erase = spi_block_erase_d8,
1832 }, {
1833 .eraseblocks = { {4 * 1024 * 1024, 1} },
1834 .block_erase = spi_block_erase_60,
1835 }, {
1836 .eraseblocks = { {4 * 1024 * 1024, 1} },
1837 .block_erase = spi_block_erase_c7,
1838 }
1839 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001840 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001841 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001842 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001843 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001844 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00001845 },
1846
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001847 {
1848 .vendor = "Atmel",
Paul Menzelac427b22012-02-16 21:07:07 +00001849 .name = "AT25DF641(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001850 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001851 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001852 .model_id = ATMEL_AT25DF641,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001853 .total_size = 8192,
1854 .page_size = 256,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001855 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00001856 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001857 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00001858 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00001859 .block_erasers =
1860 {
1861 {
1862 .eraseblocks = { {4 * 1024, 2048} },
1863 .block_erase = spi_block_erase_20,
1864 }, {
1865 .eraseblocks = { {32 * 1024, 256} },
1866 .block_erase = spi_block_erase_52,
1867 }, {
1868 .eraseblocks = { {64 * 1024, 128} },
1869 .block_erase = spi_block_erase_d8,
1870 }, {
1871 .eraseblocks = { {8 * 1024 * 1024, 1} },
1872 .block_erase = spi_block_erase_60,
1873 }, {
1874 .eraseblocks = { {8 * 1024 * 1024, 1} },
1875 .block_erase = spi_block_erase_c7,
1876 }
1877 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001878 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001879 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001880 .write = spi_chip_write_256,
1881 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001882 .voltage = {2700, 3600},
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001883 },
1884
1885 {
1886 .vendor = "Atmel",
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001887 .name = "AT25DL081",
1888 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001889 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001890 .model_id = ATMEL_AT25DF081,
1891 .total_size = 1024,
1892 .page_size = 256,
1893 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1894 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1895 .tested = TEST_UNTESTED,
1896 .probe = probe_spi_rdid,
1897 .probe_timing = TIMING_ZERO,
1898 .block_erasers =
1899 {
1900 {
1901 .eraseblocks = { {4 * 1024, 256} },
1902 .block_erase = spi_block_erase_20,
1903 }, {
1904 .eraseblocks = { {32 * 1024, 32} },
1905 .block_erase = spi_block_erase_52,
1906 }, {
1907 .eraseblocks = { {64 * 1024, 16} },
1908 .block_erase = spi_block_erase_d8,
1909 }, {
1910 .eraseblocks = { {1 * 1024 * 1024, 1} },
1911 .block_erase = spi_block_erase_60,
1912 }, {
1913 .eraseblocks = { {1 * 1024 * 1024, 1} },
1914 .block_erase = spi_block_erase_c7,
1915 }
1916 },
1917 .printlock = spi_prettyprint_status_register_at25df_sec,
1918 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1919 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1920 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1921 .voltage = {1650, 1950},
1922 },
1923
1924 {
1925 .vendor = "Atmel",
1926 .name = "AT25DL161",
1927 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10001928 .manufacture_id = ATMEL_ID,
Stefan Taunerc9d8b272014-06-01 13:22:35 +00001929 .model_id = ATMEL_AT25DL161,
1930 .total_size = 2048,
1931 .page_size = 256,
1932 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1933 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
1934 .tested = TEST_UNTESTED,
1935 .probe = probe_spi_rdid,
1936 .probe_timing = TIMING_ZERO,
1937 .block_erasers =
1938 {
1939 {
1940 .eraseblocks = { {4 * 1024, 512} },
1941 .block_erase = spi_block_erase_20,
1942 }, {
1943 .eraseblocks = { {32 * 1024, 64} },
1944 .block_erase = spi_block_erase_52,
1945 }, {
1946 .eraseblocks = { {64 * 1024, 32} },
1947 .block_erase = spi_block_erase_d8,
1948 }, {
1949 .eraseblocks = { {2 * 1024 * 1024, 1} },
1950 .block_erase = spi_block_erase_60,
1951 }, {
1952 .eraseblocks = { {2 * 1024 * 1024, 1} },
1953 .block_erase = spi_block_erase_c7,
1954 }
1955 },
1956 .printlock = spi_prettyprint_status_register_at25df_sec,
1957 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
1958 .write = spi_chip_write_256, /* Dual I/O (0xA2) supported */
1959 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
1960 .voltage = {1650, 1950},
1961 },
1962
1963 {
1964 .vendor = "Atmel",
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001965 .name = "AT25DQ161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00001966 .bustype = BUS_SPI,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001967 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00001968 .model_id = ATMEL_AT25DQ161,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001969 .total_size = 2048,
1970 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00001971 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
1972 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00001973 .tested = TEST_UNTESTED,
1974 .probe = probe_spi_rdid,
1975 .probe_timing = TIMING_ZERO,
1976 .block_erasers =
1977 {
1978 {
1979 .eraseblocks = { {4 * 1024, 512} },
1980 .block_erase = spi_block_erase_20,
1981 }, {
1982 .eraseblocks = { {32 * 1024, 64} },
1983 .block_erase = spi_block_erase_52,
1984 }, {
1985 .eraseblocks = { {64 * 1024, 32} },
1986 .block_erase = spi_block_erase_d8,
1987 }, {
1988 .eraseblocks = { {2 * 1024 * 1024, 1} },
1989 .block_erase = spi_block_erase_60,
1990 }, {
1991 .eraseblocks = { {2 * 1024 * 1024, 1} },
1992 .block_erase = spi_block_erase_c7,
1993 }
1994 },
1995 .printlock = spi_prettyprint_status_register_at25df_sec,
Stefan Taunercecb2c52013-06-20 22:55:41 +00001996 .unlock = spi_disable_blockprotect_at2x_global_unprotect_sec,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00001997 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00001998 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00001999 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002000 },
2001
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002002 {
2003 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002004 /* The A suffix indicates 33MHz instead of 20MHz clock rate.
2005 * All other properties seem to be the same.*/
2006 .name = "AT25F1024(A)",
2007 .bustype = BUS_SPI,
2008 .manufacture_id = ATMEL_ID,
2009 .model_id = ATMEL_AT25F1024,
2010 .total_size = 128,
2011 .page_size = 256,
2012 .feature_bits = FEATURE_WRSR_WREN,
2013 .tested = TEST_OK_PREW,
2014 .probe = probe_spi_at25f,
2015 .probe_timing = TIMING_ZERO,
2016 .block_erasers =
2017 {
2018 {
2019 .eraseblocks = { {32 * 1024, 4} },
2020 .block_erase = spi_block_erase_52,
2021 }, {
2022 .eraseblocks = { {128 * 1024, 1} },
2023 .block_erase = spi_block_erase_62,
2024 }
2025 },
2026 .printlock = spi_prettyprint_status_register_at25f,
2027 .unlock = spi_disable_blockprotect_at25f,
2028 .write = spi_chip_write_256,
2029 .read = spi_chip_read,
2030 .voltage = {2700, 3600},
2031 },
2032
2033 {
2034 .vendor = "Atmel",
2035 .name = "AT25F2048",
2036 .bustype = BUS_SPI,
2037 .manufacture_id = ATMEL_ID,
2038 .model_id = ATMEL_AT25F2048,
2039 .total_size = 256,
2040 .page_size = 256,
2041 .feature_bits = FEATURE_WRSR_WREN,
2042 .tested = TEST_UNTESTED,
2043 .probe = probe_spi_at25f,
2044 .probe_timing = TIMING_ZERO,
2045 .block_erasers =
2046 {
2047 {
2048 .eraseblocks = { {64 * 1024, 4} },
2049 .block_erase = spi_block_erase_52,
2050 }, {
2051 .eraseblocks = { {256 * 1024, 1} },
2052 .block_erase = spi_block_erase_62,
2053 }
2054 },
2055 .printlock = spi_prettyprint_status_register_at25f,
2056 .unlock = spi_disable_blockprotect_at25f,
2057 .write = spi_chip_write_256,
2058 .read = spi_chip_read,
2059 .voltage = {2700, 3600},
2060 },
2061
2062 {
2063 .vendor = "Atmel",
2064 .name = "AT25F4096",
2065 .bustype = BUS_SPI,
2066 .manufacture_id = ATMEL_ID,
2067 .model_id = ATMEL_AT25F4096,
2068 .total_size = 512,
2069 .page_size = 256,
2070 .feature_bits = FEATURE_WRSR_WREN,
2071 .tested = TEST_OK_PREW,
2072 .probe = probe_spi_at25f,
2073 .probe_timing = TIMING_ZERO,
2074 .block_erasers =
2075 {
2076 {
2077 .eraseblocks = { {64 * 1024, 8} },
2078 .block_erase = spi_block_erase_52,
2079 }, {
2080 .eraseblocks = { {512 * 1024, 1} },
2081 .block_erase = spi_block_erase_62,
2082 }
2083 },
2084 .printlock = spi_prettyprint_status_register_at25f4096,
2085 /* "Bits 5-6 are 0s when device is not in an internal write cycle." Better leave them alone: */
2086 .unlock = spi_disable_blockprotect_bp2_srwd,
2087 .write = spi_chip_write_256,
2088 .read = spi_chip_read,
2089 .voltage = {2700, 3600},
2090 },
2091
2092 {
2093 .vendor = "Atmel",
Stefan Tauner57794ac2012-12-29 15:04:20 +00002094 .name = "AT25F512",
2095 .bustype = BUS_SPI,
2096 .manufacture_id = ATMEL_ID,
2097 .model_id = ATMEL_AT25F512,
2098 .total_size = 64,
2099 .page_size = 256,
2100 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002101 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002102 .probe = probe_spi_at25f,
2103 .probe_timing = TIMING_ZERO,
2104 .block_erasers =
2105 {
2106 {
2107 .eraseblocks = { {32 * 1024, 2} },
2108 .block_erase = spi_block_erase_52,
2109 }, {
2110 .eraseblocks = { {64 * 1024, 1} },
2111 .block_erase = spi_block_erase_62,
2112 }
2113 },
2114 .printlock = spi_prettyprint_status_register_at25f,
2115 .unlock = spi_disable_blockprotect_at25f,
2116 .write = spi_chip_write_256,
2117 .read = spi_chip_read,
2118 .voltage = {2700, 3600},
2119 },
2120
2121 {
2122 .vendor = "Atmel",
2123 .name = "AT25F512A",
2124 .bustype = BUS_SPI,
2125 .manufacture_id = ATMEL_ID,
2126 .model_id = ATMEL_AT25F512A,
2127 .total_size = 64,
2128 .page_size = 128,
2129 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00002130 .tested = TEST_OK_PREW,
Stefan Tauner57794ac2012-12-29 15:04:20 +00002131 .probe = probe_spi_at25f,
2132 .probe_timing = TIMING_ZERO,
2133 .block_erasers =
2134 {
2135 {
2136 .eraseblocks = { {32 * 1024, 2} },
2137 .block_erase = spi_block_erase_52,
2138 }, {
2139 .eraseblocks = { {64 * 1024, 1} },
2140 .block_erase = spi_block_erase_62,
2141 }
2142 },
2143 .printlock = spi_prettyprint_status_register_at25f512a,
2144 /* FIXME: It is not correct to use this one, because the BP1 bit is N/A. */
2145 .unlock = spi_disable_blockprotect_at25f512a,
2146 .write = spi_chip_write_256,
2147 .read = spi_chip_read,
2148 .voltage = {2700, 3600},
2149 },
2150
2151 {
2152 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002153 .name = "AT25F512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002154 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002155 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002156 .model_id = ATMEL_AT25F512B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002157 .total_size = 64,
2158 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00002159 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2160 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002161 .tested = TEST_UNTESTED,
2162 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002163 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002164 .block_erasers =
2165 {
2166 {
2167 .eraseblocks = { {4 * 1024, 16} },
2168 .block_erase = spi_block_erase_20,
2169 }, {
2170 .eraseblocks = { {32 * 1024, 2} },
2171 .block_erase = spi_block_erase_52,
2172 }, {
2173 .eraseblocks = { {32 * 1024, 2} },
2174 .block_erase = spi_block_erase_d8,
2175 }, {
2176 .eraseblocks = { {64 * 1024, 1} },
2177 .block_erase = spi_block_erase_60,
2178 }, {
2179 .eraseblocks = { {64 * 1024, 1} },
2180 .block_erase = spi_block_erase_c7,
Stefan Tauner3c0fcd02012-09-21 12:46:56 +00002181 }, {
2182 .eraseblocks = { {64 * 1024, 1} },
2183 .block_erase = spi_block_erase_62,
Sean Nelson89187292009-12-23 12:02:55 +00002184 }
2185 },
Stefan Tauner7bf4ed92012-08-26 21:04:27 +00002186 .printlock = spi_prettyprint_status_register_at25f512b,
2187 .unlock = spi_disable_blockprotect_at25f512b,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002188 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002189 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002190 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002191 },
2192
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002193 {
2194 .vendor = "Atmel",
2195 .name = "AT25FS010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002196 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002197 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002198 .model_id = ATMEL_AT25FS010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002199 .total_size = 128,
2200 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002201 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00002202 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002203 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002204 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002205 .block_erasers =
2206 {
2207 {
2208 .eraseblocks = { {4 * 1024, 32} },
2209 .block_erase = spi_block_erase_20,
2210 }, {
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002211 .eraseblocks = { {4 * 1024, 32} },
2212 .block_erase = spi_block_erase_d7,
2213 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002214 .eraseblocks = { {32 * 1024, 4} },
2215 .block_erase = spi_block_erase_52,
2216 }, {
2217 .eraseblocks = { {32 * 1024, 4} },
2218 .block_erase = spi_block_erase_d8,
2219 }, {
2220 .eraseblocks = { {128 * 1024, 1} },
2221 .block_erase = spi_block_erase_60,
2222 }, {
2223 .eraseblocks = { {128 * 1024, 1} },
2224 .block_erase = spi_block_erase_c7,
2225 }
2226 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002227 .printlock = spi_prettyprint_status_register_at25fs010,
2228 .unlock = spi_disable_blockprotect_at25fs010,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002229 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002230 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002231 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002232 },
2233
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002234 {
2235 .vendor = "Atmel",
2236 .name = "AT25FS040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002237 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002238 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002239 .model_id = ATMEL_AT25FS040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002240 .total_size = 512,
2241 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002242 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002243 .tested = TEST_UNTESTED,
2244 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002245 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002246 .block_erasers =
2247 {
2248 {
2249 .eraseblocks = { {4 * 1024, 128} },
2250 .block_erase = spi_block_erase_20,
2251 }, {
2252 .eraseblocks = { {64 * 1024, 8} },
2253 .block_erase = spi_block_erase_52,
2254 }, {
2255 .eraseblocks = { {64 * 1024, 8} },
2256 .block_erase = spi_block_erase_d8,
2257 }, {
2258 .eraseblocks = { {512 * 1024, 1} },
2259 .block_erase = spi_block_erase_60,
2260 }, {
2261 .eraseblocks = { {512 * 1024, 1} },
2262 .block_erase = spi_block_erase_c7,
2263 }
2264 },
Carl-Daniel Hailfingerfd7075a2010-07-29 13:09:18 +00002265 .printlock = spi_prettyprint_status_register_at25fs040,
2266 .unlock = spi_disable_blockprotect_at25fs040,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002267 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002268 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002269 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002270 },
2271
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002272 {
2273 .vendor = "Atmel",
jvma3ab6c62018-03-08 15:43:20 +01002274 .name = "AT25SF041",
2275 .bustype = BUS_SPI,
2276 .manufacture_id = ATMEL_ID,
2277 .model_id = ATMEL_AT25SF041,
2278 .total_size = 512,
2279 .page_size = 256,
2280 .feature_bits = FEATURE_WRSR_WREN,
2281 .tested = TEST_OK_PREW,
2282 .probe = probe_spi_rdid,
2283 .probe_timing = TIMING_ZERO,
2284 .block_erasers =
2285 {
2286 {
2287 .eraseblocks = { {4 * 1024, 128} },
2288 .block_erase = spi_block_erase_20,
2289 }, {
2290 .eraseblocks = { {32 * 1024, 16} },
2291 .block_erase = spi_block_erase_52,
2292 }, {
2293 .eraseblocks = { {64 * 1024, 8} },
2294 .block_erase = spi_block_erase_d8,
2295 }, {
2296 .eraseblocks = { {512 * 1024, 1} },
2297 .block_erase = spi_block_erase_60,
2298 }, {
2299 .eraseblocks = { {512 * 1024, 1} },
2300 .block_erase = spi_block_erase_c7,
2301 }
2302 },
2303 .printlock = spi_prettyprint_status_register_plain,
2304 .unlock = spi_disable_blockprotect,
2305 .write = spi_chip_write_256,
2306 .read = spi_chip_read,
2307 .voltage = {2500, 3600},
2308 },
2309
2310 {
2311 .vendor = "Atmel",
Evan Jensen291c1012018-05-17 14:30:19 -07002312 .name = "AT25SF081",
2313 .bustype = BUS_SPI,
2314 .manufacture_id = ATMEL_ID,
2315 .model_id = ATMEL_AT25SF081,
2316 .total_size = 1024,
2317 .page_size = 256,
2318 .feature_bits = FEATURE_WRSR_WREN,
2319 .tested = TEST_OK_PREW,
2320 .probe = probe_spi_rdid,
2321 .probe_timing = TIMING_ZERO,
2322 .block_erasers =
2323 {
2324 {
2325 .eraseblocks = { {4 * 1024, 256} },
2326 .block_erase = spi_block_erase_20,
2327 }, {
2328 .eraseblocks = { {32 * 1024, 32} },
2329 .block_erase = spi_block_erase_52,
2330 }, {
2331 .eraseblocks = { {64 * 1024, 16} },
2332 .block_erase = spi_block_erase_d8,
2333 }, {
2334 .eraseblocks = { {1024 * 1024, 1} },
2335 .block_erase = spi_block_erase_60,
2336 }, {
2337 .eraseblocks = { {1024 * 1024, 1} },
2338 .block_erase = spi_block_erase_c7,
2339 }
2340 },
2341 .printlock = spi_prettyprint_status_register_plain,
2342 .unlock = spi_disable_blockprotect,
2343 .write = spi_chip_write_256,
2344 .read = spi_chip_read,
2345 .voltage = {2300, 3600},
2346 },
2347
2348 {
2349 .vendor = "Atmel",
Stanislav Sedovf5775442018-03-07 14:16:51 -08002350 .name = "AT25SF161",
2351 .bustype = BUS_SPI,
2352 .manufacture_id = ATMEL_ID,
2353 .model_id = ATMEL_AT25SF161,
2354 .total_size = 2048,
2355 .page_size = 256,
2356 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
2357 .tested = TEST_OK_PREW,
2358 .probe = probe_spi_rdid,
2359 .probe_timing = TIMING_ZERO,
2360 .block_erasers =
2361 {
2362 {
2363 .eraseblocks = { {4 * 1024, 512} },
2364 .block_erase = spi_block_erase_20,
2365 }, {
2366 .eraseblocks = { {32 * 1024, 64} },
2367 .block_erase = spi_block_erase_52,
2368 }, {
2369 .eraseblocks = { {64 * 1024, 32} },
2370 .block_erase = spi_block_erase_d8,
2371 }, {
2372 .eraseblocks = { {2048 * 1024, 1} },
2373 .block_erase = spi_block_erase_60,
2374 }, {
2375 .eraseblocks = { {2048 * 1024, 1} },
2376 .block_erase = spi_block_erase_c7,
2377 }
2378 },
2379 .printlock = spi_prettyprint_status_register_plain,
2380 .unlock = spi_disable_blockprotect,
2381 .write = spi_chip_write_256,
2382 .read = spi_chip_read,
2383 .voltage = {2500, 3600},
2384 },
2385
2386 {
Alan Green57938f82019-06-27 15:06:43 +10002387 .vendor = "Atmel",
darkarnium41394382019-11-04 20:06:48 +00002388 .name = "AT25SF321",
2389 .bustype = BUS_SPI,
2390 .manufacture_id = ATMEL_ID,
2391 .model_id = ATMEL_AT25SF321,
2392 .total_size = 4096,
2393 .page_size = 256,
2394 .feature_bits = FEATURE_WRSR_WREN,
2395 .tested = TEST_OK_PR,
2396 .probe = probe_spi_rdid,
2397 .probe_timing = TIMING_ZERO,
2398 .block_erasers =
2399 {
2400 {
2401 .eraseblocks = { {4 * 1024, 1024} },
2402 .block_erase = spi_block_erase_20,
2403 }, {
2404 .eraseblocks = { {32 * 1024, 128} },
2405 .block_erase = spi_block_erase_52,
2406 }, {
2407 .eraseblocks = { {64 * 1024, 64} },
2408 .block_erase = spi_block_erase_d8,
2409 }, {
2410 .eraseblocks = { {4096 * 1024, 1} },
2411 .block_erase = spi_block_erase_60,
2412 }, {
2413 .eraseblocks = { {4096 * 1024, 1} },
2414 .block_erase = spi_block_erase_c7,
2415 }
2416 },
2417 .printlock = spi_prettyprint_status_register_plain,
2418 .unlock = spi_disable_blockprotect,
2419 .write = spi_chip_write_256,
2420 .read = spi_chip_read,
2421 .voltage = {2500, 3600},
2422 },
2423
2424 {
2425 .vendor = "Atmel",
Hal Martin49e23d22018-05-27 14:18:43 +02002426 .name = "AT25SL128A",
2427 .bustype = BUS_SPI,
2428 .manufacture_id = ATMEL_ID,
2429 .model_id = ATMEL_AT25SL128A,
2430 .total_size = 16384,
2431 .page_size = 256,
2432 /* supports SFDP */
Nico Huber1412d9f2024-01-06 18:25:49 +01002433 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
2434 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Hal Martin49e23d22018-05-27 14:18:43 +02002435 .tested = TEST_OK_PREW,
2436 .probe = probe_spi_rdid,
2437 .probe_timing = TIMING_ZERO,
2438 .block_erasers =
2439 {
2440 {
2441 .eraseblocks = { {4 * 1024, 4096} },
2442 .block_erase = spi_block_erase_20,
2443 }, {
2444 .eraseblocks = { {32 * 1024, 512} },
2445 .block_erase = spi_block_erase_52,
2446 }, {
2447 .eraseblocks = { {64 * 1024, 256} },
2448 .block_erase = spi_block_erase_d8,
2449 }, {
2450 .eraseblocks = { {16 * 1024 * 1024, 1} },
2451 .block_erase = spi_block_erase_60,
2452 }, {
2453 .eraseblocks = { {16 * 1024 * 1024, 1} },
2454 .block_erase = spi_block_erase_c7,
2455 }
2456 },
2457 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
2458 .unlock = spi_disable_blockprotect,
2459 .write = spi_chip_write_256,
2460 .read = spi_chip_read,
2461 .voltage = {1700, 2000},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002462 .reg_bits =
2463 {
Nico Huber226bb872024-04-09 23:30:34 +02002464 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002465 .srp = {STATUS1, 7, RW},
2466 .srl = {STATUS2, 0, RW},
2467 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
2468 .tb = {STATUS1, 5, RW},
2469 .sec = {STATUS1, 6, RW},
2470 .cmp = {STATUS2, 6, RW},
2471 },
Nico Huberaabb3e02023-01-13 00:22:30 +01002472 .wp_write_cfg = spi_wp_write_cfg,
2473 .wp_read_cfg = spi_wp_read_cfg,
2474 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11002475 .decode_range = decode_range_spi25,
Hal Martin49e23d22018-05-27 14:18:43 +02002476 },
2477
2478 {
Stanislav Sedovf5775442018-03-07 14:16:51 -08002479 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002480 .name = "AT26DF041",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002481 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002482 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002483 .model_id = ATMEL_AT26DF041,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002484 .total_size = 512,
2485 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002486 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002487 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002488 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002489 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002490 .block_erasers =
2491 {
2492 {
Stefan Tauner94b39b42012-10-27 00:06:02 +00002493 .eraseblocks = { {256, 2048} },
2494 .block_erase = spi_block_erase_81,
2495 }, {
2496 .eraseblocks = { {2 * 1024, 256} },
2497 .block_erase = spi_block_erase_50,
2498 }, {
Sean Nelson89187292009-12-23 12:02:55 +00002499 .eraseblocks = { {4 * 1024, 128} },
2500 .block_erase = spi_block_erase_20,
2501 }
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002502 },
Stefan Taunercecb2c52013-06-20 22:55:41 +00002503 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002504 /* Supports also an incompatible page write (of exactly 256 B) and an auto-erasing write. */
Stefan Tauner94b39b42012-10-27 00:06:02 +00002505 .write = spi_chip_write_1,
2506 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002507 .voltage = {2700, 3600}, /* 3.0-3.6V for higher speed, 2.7-3.6V normal */
FENG yu ningff692fb2008-12-08 18:15:10 +00002508 },
2509
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002510 {
2511 .vendor = "Atmel",
2512 .name = "AT26DF081A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002513 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002514 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002515 .model_id = ATMEL_AT26DF081A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002516 .total_size = 1024,
2517 .page_size = 256,
Mathias Krause2c3afa32011-01-17 07:45:54 +00002518 .feature_bits = FEATURE_WRSR_WREN,
2519 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002520 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002521 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002522 .block_erasers =
2523 {
2524 {
2525 .eraseblocks = { {4 * 1024, 256} },
2526 .block_erase = spi_block_erase_20,
2527 }, {
2528 .eraseblocks = { {32 * 1024, 32} },
2529 .block_erase = spi_block_erase_52,
2530 }, {
2531 .eraseblocks = { {64 * 1024, 16} },
2532 .block_erase = spi_block_erase_d8,
2533 }, {
2534 .eraseblocks = { {1024 * 1024, 1} },
2535 .block_erase = spi_block_erase_60,
2536 }, {
2537 .eraseblocks = { {1024 * 1024, 1} },
2538 .block_erase = spi_block_erase_c7,
2539 }
2540 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002541 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002542 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002543 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002544 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002545 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002546 },
2547
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002548 {
2549 .vendor = "Atmel",
2550 .name = "AT26DF161",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002551 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002552 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002553 .model_id = ATMEL_AT26DF161,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002554 .total_size = 2048,
2555 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002556 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002557 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002558 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002559 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002560 .block_erasers =
2561 {
2562 {
2563 .eraseblocks = { {4 * 1024, 512} },
2564 .block_erase = spi_block_erase_20,
2565 }, {
2566 .eraseblocks = { {32 * 1024, 64} },
2567 .block_erase = spi_block_erase_52,
2568 }, {
2569 .eraseblocks = { {64 * 1024, 32} },
2570 .block_erase = spi_block_erase_d8,
2571 }, {
2572 .eraseblocks = { {2 * 1024 * 1024, 1} },
2573 .block_erase = spi_block_erase_60,
2574 }, {
2575 .eraseblocks = { {2 * 1024 * 1024, 1} },
2576 .block_erase = spi_block_erase_c7,
2577 }
2578 },
Carl-Daniel Hailfinger7a3bd8f2011-05-19 00:06:06 +00002579 .printlock = spi_prettyprint_status_register_at25df,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002580 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002581 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002582 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002583 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002584 },
2585
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002586 {
2587 .vendor = "Atmel",
2588 .name = "AT26DF161A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002589 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002590 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002591 .model_id = ATMEL_AT26DF161A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002592 .total_size = 2048,
2593 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002594 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002595 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002596 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002597 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002598 .block_erasers =
2599 {
2600 {
2601 .eraseblocks = { {4 * 1024, 512} },
2602 .block_erase = spi_block_erase_20,
2603 }, {
2604 .eraseblocks = { {32 * 1024, 64} },
2605 .block_erase = spi_block_erase_52,
2606 }, {
2607 .eraseblocks = { {64 * 1024, 32} },
2608 .block_erase = spi_block_erase_d8,
2609 }, {
2610 .eraseblocks = { {2 * 1024 * 1024, 1} },
2611 .block_erase = spi_block_erase_60,
2612 }, {
2613 .eraseblocks = { {2 * 1024 * 1024, 1} },
2614 .block_erase = spi_block_erase_c7,
2615 }
2616 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002617 .printlock = spi_prettyprint_status_register_at26df081a,
Stefan Taunercecb2c52013-06-20 22:55:41 +00002618 .unlock = spi_disable_blockprotect_at2x_global_unprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00002619 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002620 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002621 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002622 },
2623
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002624 {
2625 .vendor = "Atmel",
2626 .name = "AT26F004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002627 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002628 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002629 .model_id = ATMEL_AT26F004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002630 .total_size = 512,
2631 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00002632 .feature_bits = FEATURE_WRSR_WREN,
Alan Green908adf42019-07-03 15:34:06 +10002633 .tested = {.probe = NT, .read = NT, .erase = NT, .write = BAD},
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002634 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002635 .probe_timing = TIMING_ZERO,
Sean Nelson89187292009-12-23 12:02:55 +00002636 .block_erasers =
2637 {
2638 {
2639 .eraseblocks = { {4 * 1024, 128} },
2640 .block_erase = spi_block_erase_20,
2641 }, {
2642 .eraseblocks = { {32 * 1024, 16} },
2643 .block_erase = spi_block_erase_52,
2644 }, {
2645 .eraseblocks = { {64 * 1024, 8} },
2646 .block_erase = spi_block_erase_d8,
2647 }, {
2648 .eraseblocks = { {512 * 1024, 1} },
2649 .block_erase = spi_block_erase_60,
2650 }, {
2651 .eraseblocks = { {512 * 1024, 1} },
2652 .block_erase = spi_block_erase_c7,
2653 }
2654 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00002655 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Alan Greencbb85c02019-06-25 13:42:34 +10002656 .write = NULL, /* Incompatible Page write */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002657 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002658 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00002659 },
2660
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002661 {
2662 .vendor = "Atmel",
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002663 .name = "AT29C010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002664 .bustype = BUS_PARALLEL,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002665 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002666 .model_id = ATMEL_AT29C010A,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002667 .total_size = 128,
2668 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +00002669 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00002670 .tested = TEST_OK_PRE,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002671 .probe = probe_jedec,
Maciej Pijankac6e11112009-06-03 14:46:22 +00002672 .probe_timing = 10000, /* 10mS, Enter=Exec */
Sean Nelson89187292009-12-23 12:02:55 +00002673 .block_erasers =
2674 {
2675 {
2676 .eraseblocks = { {128 * 1024, 1} },
2677 .block_erase = erase_chip_block_jedec,
2678 }
2679 },
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002680 .write = write_jedec, /* FIXME */
2681 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002682 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002683 .prepare_access = prepare_memory_access,
2684 .finish_access = finish_memory_access,
Uwe Hermann8403ccb2009-05-16 21:39:19 +00002685 },
2686
2687 {
2688 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002689 .name = "AT29C020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002690 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002691 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002692 .model_id = ATMEL_AT29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002693 .total_size = 256,
2694 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002695 .feature_bits = FEATURE_LONG_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00002696 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002697 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +00002698 .probe_timing = 10000, /* 10ms */
Sean Nelson89187292009-12-23 12:02:55 +00002699 .block_erasers =
2700 {
2701 {
2702 .eraseblocks = { {256 * 1024, 1} },
2703 .block_erase = erase_chip_block_jedec,
2704 }
2705 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002706 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002707 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002708 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002709 .prepare_access = prepare_memory_access,
2710 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002711 },
2712
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002713 {
2714 .vendor = "Atmel",
2715 .name = "AT29C040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002716 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002717 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002718 .model_id = ATMEL_AT29C040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002719 .total_size = 512,
2720 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00002721 .feature_bits = FEATURE_LONG_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002722 .tested = TEST_UNTESTED,
2723 .probe = probe_jedec,
Mateusz Murawski8b2f46b2009-06-12 21:29:36 +00002724 .probe_timing = 10000, /* 10 ms */
Sean Nelson89187292009-12-23 12:02:55 +00002725 .block_erasers =
2726 {
2727 {
2728 .eraseblocks = { {512 * 1024, 1} },
2729 .block_erase = erase_chip_block_jedec,
2730 }
2731 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002732 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00002733 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002734 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002735 .prepare_access = prepare_memory_access,
2736 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00002737 },
2738
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002739 {
2740 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10002741 .name = "AT29C512",
2742 .bustype = BUS_PARALLEL,
2743 .manufacture_id = ATMEL_ID,
2744 .model_id = ATMEL_AT29C512,
2745 .total_size = 64,
2746 .page_size = 128,
2747 .feature_bits = FEATURE_LONG_RESET,
2748 .tested = TEST_OK_PREW,
2749 .probe = probe_jedec,
2750 .probe_timing = 10000, /* 10mS, Enter=Exec */
2751 .block_erasers =
2752 {
2753 {
2754 .eraseblocks = { {64 * 1024, 1} },
2755 .block_erase = erase_chip_block_jedec,
2756 }
2757 },
2758 .write = write_jedec,
2759 .read = read_memmapped,
2760 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01002761 .prepare_access = prepare_memory_access,
2762 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10002763 },
2764
2765 {
2766 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002767 .name = "AT45CS1282",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002768 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002769 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002770 .model_id = ATMEL_AT45CS1282,
Alan Greencbb85c02019-06-25 13:42:34 +10002771 .total_size = 16896, /* No power of two sizes */
2772 .page_size = 1056, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00002773 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002774 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
2775 .feature_bits = FEATURE_OTP,
2776 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002777 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002778 .probe_timing = TIMING_ZERO,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002779 .block_erasers =
2780 {
2781 {
2782 .eraseblocks = {
2783 {8 * 1056, 1}, /* sector 0a: opcode 50h */
2784 {248 * 1056, 1}, /* sector 0b: opcode 7Ch */
2785 {256 * 1056, 63}, /* sectors 1 - 63: opcode 7Ch */
2786 },
2787 .block_erase = spi_erase_at45cs_sector,
2788 }
2789 },
2790 .printlock = spi_prettyprint_status_register_plain,
Stefan Tauner1dd5d3a2013-08-27 18:02:19 +00002791 .write = spi_write_at45db,
2792 .read = spi_read_at45db,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002793 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10002794 .gran = write_gran_1056bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002795 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002796
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002797 {
2798 .vendor = "Atmel",
2799 .name = "AT45DB011D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002800 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002801 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002802 .model_id = ATMEL_AT45DB011D,
Alan Greencbb85c02019-06-25 13:42:34 +10002803 .total_size = 128, /* or 132, determined from status register */
2804 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002805 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002806 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2807 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00002808 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002809 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002810 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002811 .block_erasers =
2812 {
2813 {
2814 .eraseblocks = { {256, 512} },
2815 .block_erase = spi_erase_at45db_page,
2816 }, {
2817 .eraseblocks = { {8 * 256, 512/8} },
2818 .block_erase = spi_erase_at45db_block,
2819 }, {
2820 .eraseblocks = {
2821 {8 * 256, 1},
2822 {120 * 256, 1},
2823 {128 * 256, 3},
2824 },
2825 .block_erase = spi_erase_at45db_sector
2826 }, {
2827 .eraseblocks = { {128 * 1024, 1} },
2828 .block_erase = spi_erase_at45db_chip,
2829 }
2830 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002831 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002832 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002833 /* granularity will be set by the probing function. */
2834 .write = spi_write_at45db,
2835 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002836 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002837 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002838
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002839 {
2840 .vendor = "Atmel",
2841 .name = "AT45DB021D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002842 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002843 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002844 .model_id = ATMEL_AT45DB021D,
Alan Greencbb85c02019-06-25 13:42:34 +10002845 .total_size = 256, /* or 264, determined from status register */
2846 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002847 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002848 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2849 .feature_bits = FEATURE_OTP,
Stefan Tauner6697f712014-08-06 15:09:15 +00002850 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002851 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002852 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002853 .block_erasers =
2854 {
2855 {
2856 .eraseblocks = { {256, 1024} },
2857 .block_erase = spi_erase_at45db_page,
2858 }, {
2859 .eraseblocks = { {8 * 256, 1024/8} },
2860 .block_erase = spi_erase_at45db_block,
2861 }, {
2862 .eraseblocks = {
2863 {8 * 256, 1},
2864 {120 * 256, 1},
2865 {128 * 256, 7},
2866 },
2867 .block_erase = spi_erase_at45db_sector
2868 }, {
2869 .eraseblocks = { {256 * 1024, 1} },
2870 .block_erase = spi_erase_at45db_chip,
2871 }
2872 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002873 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002874 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002875 /* granularity will be set by the probing function. */
2876 .write = spi_write_at45db,
2877 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00002878 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002879 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002880
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002881 {
2882 .vendor = "Atmel",
2883 .name = "AT45DB041D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002884 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002885 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002886 .model_id = ATMEL_AT45DB041D,
Alan Greencbb85c02019-06-25 13:42:34 +10002887 .total_size = 512, /* or 528, determined from status register */
2888 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002889 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002890 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2891 .feature_bits = FEATURE_OTP,
2892 .tested = TEST_OK_PREW,
2893 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002894 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002895 .block_erasers =
2896 {
2897 {
2898 .eraseblocks = { {256, 2048} },
2899 .block_erase = spi_erase_at45db_page,
2900 }, {
2901 .eraseblocks = { {8 * 256, 2048/8} },
2902 .block_erase = spi_erase_at45db_block,
2903 }, {
2904 .eraseblocks = {
2905 {8 * 256, 1},
2906 {248 * 256, 1},
2907 {256 * 256, 7},
2908 },
2909 .block_erase = spi_erase_at45db_sector
2910 }, {
2911 .eraseblocks = { {512 * 1024, 1} },
2912 .block_erase = spi_erase_at45db_chip,
2913 }
2914 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002915 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002916 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002917 /* granularity will be set by the probing function. */
2918 .write = spi_write_at45db,
2919 .read = spi_read_at45db, /* Fast read (0x0B) supported */
2920 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002921 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002922
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002923 {
2924 .vendor = "Atmel",
2925 .name = "AT45DB081D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002926 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002927 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002928 .model_id = ATMEL_AT45DB081D,
Alan Greencbb85c02019-06-25 13:42:34 +10002929 .total_size = 1024, /* or 1056, determined from status register */
2930 .page_size = 256, /* or 264, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002931 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002932 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2933 .feature_bits = FEATURE_OTP,
Angel Pons250aeba2018-09-30 20:28:22 +02002934 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002935 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002936 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002937 .block_erasers =
2938 {
2939 {
2940 .eraseblocks = { {256, 4096} },
2941 .block_erase = spi_erase_at45db_page,
2942 }, {
2943 .eraseblocks = { {8 * 256, 4096/8} },
2944 .block_erase = spi_erase_at45db_block,
2945 }, {
2946 .eraseblocks = {
2947 {8 * 256, 1},
2948 {248 * 256, 1},
2949 {256 * 256, 15},
2950 },
2951 .block_erase = spi_erase_at45db_sector
2952 }, {
2953 .eraseblocks = { {1024 * 1024, 1} },
2954 .block_erase = spi_erase_at45db_chip,
2955 }
2956 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002957 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10002958 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002959 /* granularity will be set by the probing function. */
2960 .write = spi_write_at45db,
2961 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00002962 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00002963 },
FENG yu ningff692fb2008-12-08 18:15:10 +00002964
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002965 {
2966 .vendor = "Atmel",
2967 .name = "AT45DB161D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00002968 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00002969 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00002970 .model_id = ATMEL_AT45DB161D,
Alan Greencbb85c02019-06-25 13:42:34 +10002971 .total_size = 2048, /* or 2112, determined from status register */
2972 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00002973 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002974 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
2975 .feature_bits = FEATURE_OTP,
2976 .tested = TEST_OK_PREW,
2977 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00002978 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002979 .block_erasers =
2980 {
2981 {
2982 .eraseblocks = { {512, 4096} },
2983 .block_erase = spi_erase_at45db_page,
2984 }, {
2985 .eraseblocks = { {8 * 512, 4096/8} },
2986 .block_erase = spi_erase_at45db_block,
2987 }, {
2988 .eraseblocks = {
2989 {8 * 512, 1},
2990 {248 * 512, 1},
2991 {256 * 512, 15},
2992 },
2993 .block_erase = spi_erase_at45db_sector
2994 }, {
2995 .eraseblocks = { {2048 * 1024, 1} },
2996 .block_erase = spi_erase_at45db_chip,
2997 }
2998 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00002999 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003000 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003001 /* granularity will be set by the probing function. */
3002 .write = spi_write_at45db,
3003 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +00003004 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003005 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003006
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003007 {
3008 .vendor = "Atmel",
3009 .name = "AT45DB321C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003010 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003011 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003012 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003013 .total_size = 4224, /* No power of two sizes */
3014 .page_size = 528, /* No power of two sizes */
Steven Zakulec3603a282012-05-02 20:07:57 +00003015 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003016 /* OTP: 128B total, 64B pre-programmed; read 0x77 (4 dummy bytes); write 0x9A (via buffer) */
3017 .feature_bits = FEATURE_OTP,
3018 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003019 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003020 .probe_timing = TIMING_ZERO,
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003021 .block_erasers =
3022 {
3023 {
3024 .eraseblocks = { {528, 8192} },
3025 .block_erase = spi_erase_at45db_page,
3026 }, {
3027 .eraseblocks = { {8 * 528, 8192/8} },
3028 .block_erase = spi_erase_at45db_block,
3029 }, /* Although the datasheets describes sectors (which can be write protected)
3030 * there seems to be no erase functions for them.
Stefan Tauner23e10b82016-01-23 16:16:49 +00003031 {
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003032 .eraseblocks = {
3033 {8 * 528, 1},
3034 {120 * 528, 1},
3035 {128 * 528, 63},
3036 },
3037 .block_erase = spi_erase_at45db_sector
3038 }, */ {
3039 .eraseblocks = { {4224 * 1024, 1} },
3040 .block_erase = spi_erase_at45db_chip,
3041 }
3042 },
3043 .printlock = spi_prettyprint_status_register_at45db, /* Bit 0 is undefined, no lockdown */
Stefan Taunerfdc4f7e2013-08-27 18:02:12 +00003044 .write = spi_write_at45db,
3045 .read = spi_read_at45db_e8, /* 3 address and 4 dummy bytes */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003046 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003047 .gran = write_gran_528bytes,
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003048 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003049
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003050 {
3051 .vendor = "Atmel",
3052 .name = "AT45DB321D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003053 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003054 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003055 .model_id = ATMEL_AT45DB321D,
Alan Greencbb85c02019-06-25 13:42:34 +10003056 .total_size = 4096, /* or 4224, determined from status register */
3057 .page_size = 512, /* or 528, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003058 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003059 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
Daniel Lenski65922a32012-02-15 23:40:23 +00003060 .feature_bits = FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +00003061 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003062 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003063 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003064 .block_erasers =
3065 {
3066 {
3067 .eraseblocks = { {512, 8192} },
3068 .block_erase = spi_erase_at45db_page,
3069 }, {
3070 .eraseblocks = { {8 * 512, 8192/8} },
3071 .block_erase = spi_erase_at45db_block,
3072 }, {
3073 .eraseblocks = {
3074 {8 * 512, 1},
3075 {120 * 512, 1},
3076 {128 * 512, 63},
3077 },
3078 .block_erase = spi_erase_at45db_sector
3079 }, {
3080 .eraseblocks = { {4096 * 1024, 1} },
3081 .block_erase = spi_erase_at45db_chip,
3082 }
3083 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003084 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003085 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003086 /* granularity will be set by the probing function. */
3087 .write = spi_write_at45db,
3088 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3089 .voltage = {2700, 3600}, /* 2.5-3.6V & 2.7-3.6V models available */
3090 },
3091
3092 {
3093 .vendor = "Atmel",
3094 .name = "AT45DB321E",
3095 .bustype = BUS_SPI,
3096 .manufacture_id = ATMEL_ID,
3097 .model_id = ATMEL_AT45DB321C,
Alan Greencbb85c02019-06-25 13:42:34 +10003098 .total_size = 4096, /* or 4224, determined from status register */
3099 .page_size = 512, /* or 528, determined from status register */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003100 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
3101 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3102 .feature_bits = FEATURE_OTP,
3103 .tested = TEST_UNTESTED,
3104 .probe = probe_spi_at45db,
3105 .probe_timing = TIMING_ZERO,
3106 .block_erasers =
3107 {
3108 {
3109 .eraseblocks = { {512, 8192} },
3110 .block_erase = spi_erase_at45db_page,
3111 }, {
3112 .eraseblocks = { {8 * 512, 8192/8} },
3113 .block_erase = spi_erase_at45db_block,
3114 }, {
3115 .eraseblocks = {
3116 {8 * 512, 1},
3117 {120 * 512, 1},
3118 {128 * 512, 63},
3119 },
3120 .block_erase = spi_erase_at45db_sector
3121 }, {
3122 .eraseblocks = { {4096 * 1024, 1} },
3123 .block_erase = spi_erase_at45db_chip,
3124 }
3125 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003126 .printlock = spi_prettyprint_status_register_at45db, /* has a 2nd status register */
Alan Greenc1863ca2019-06-27 15:08:03 +10003127 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003128 /* granularity will be set by the probing function. */
3129 .write = spi_write_at45db,
3130 .read = spi_read_at45db, /* Fast read (0x0B) supported */
3131 .voltage = {2500, 3600}, /* 2.3-3.6V & 2.5-3.6V models available */
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003132 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003133
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003134 {
3135 .vendor = "Atmel",
3136 .name = "AT45DB642D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003137 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003138 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003139 .model_id = ATMEL_AT45DB642D,
Alan Greencbb85c02019-06-25 13:42:34 +10003140 .total_size = 8192, /* or 8448, determined from status register */
3141 .page_size = 1024, /* or 1056, determined from status register */
Steven Zakulec3603a282012-05-02 20:07:57 +00003142 /* does not support EWSR nor WREN and has no writable status register bits whatsoever */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003143 /* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
3144 .feature_bits = FEATURE_OTP,
Stefan Tauner5c316f92015-02-08 21:57:52 +00003145 .tested = TEST_OK_PREW,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003146 .probe = probe_spi_at45db,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00003147 .probe_timing = TIMING_ZERO,
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003148 .block_erasers =
3149 {
3150 {
3151 .eraseblocks = { {1024, 8192} },
3152 .block_erase = spi_erase_at45db_page,
3153 }, {
3154 .eraseblocks = { {8 * 1024, 8192/8} },
3155 .block_erase = spi_erase_at45db_block,
3156 }, {
3157 .eraseblocks = {
3158 {8 * 1024, 1},
3159 {248 * 1024, 1},
3160 {256 * 1024, 31},
3161 },
3162 .block_erase = spi_erase_at45db_sector
3163 }, {
3164 .eraseblocks = { {8192 * 1024, 1} },
3165 .block_erase = spi_erase_at45db_chip,
3166 }
3167 },
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003168 .printlock = spi_prettyprint_status_register_at45db,
Alan Greenc1863ca2019-06-27 15:08:03 +10003169 .unlock = spi_disable_blockprotect_at45db, /* Impossible if locked down or #WP is low */
Aidan Thorntondb4e87d2013-08-27 18:01:53 +00003170 /* granularity will be set by the probing function. */
3171 .write = spi_write_at45db,
3172 .read = spi_read_at45db, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003173 .voltage = {2700, 3600},
Carl-Daniel Hailfinger66afb362009-03-19 12:18:13 +00003174 },
FENG yu ningff692fb2008-12-08 18:15:10 +00003175
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003176 {
3177 .vendor = "Atmel",
Alan Green1f9cc7d2019-07-01 11:10:45 +10003178 .name = "AT49(H)F010",
3179 .bustype = BUS_PARALLEL,
3180 .manufacture_id = ATMEL_ID,
3181 .model_id = ATMEL_AT49F010,
3182 .total_size = 128,
3183 .page_size = 0, /* unused */
3184 .feature_bits = FEATURE_EITHER_RESET,
3185 .tested = TEST_OK_PREW,
3186 .probe = probe_jedec,
3187 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3188 .block_erasers =
3189 {
3190 {
3191 .eraseblocks = { {128 * 1024, 1} },
3192 .block_erase = erase_chip_block_jedec,
3193 }
3194 },
3195 .printlock = printlock_at49f,
3196 .write = write_jedec_1,
3197 .read = read_memmapped,
3198 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003199 .prepare_access = prepare_memory_access,
3200 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003201 },
3202
3203 {
3204 .vendor = "Atmel",
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003205 .name = "AT49BV512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003206 .bustype = BUS_PARALLEL,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003207 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003208 .model_id = ATMEL_AT49BV512,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003209 .total_size = 64,
3210 .page_size = 64,
Sean Nelson35727f72010-01-28 23:55:12 +00003211 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +00003212 .tested = TEST_OK_PREW,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003213 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003214 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003215 .block_erasers =
3216 {
3217 {
3218 .eraseblocks = { {64 * 1024, 1} },
3219 .block_erase = erase_chip_block_jedec,
3220 }
3221 },
Sean Nelson35727f72010-01-28 23:55:12 +00003222 .write = write_jedec_1,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003223 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003224 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01003225 .prepare_access = prepare_memory_access,
3226 .finish_access = finish_memory_access,
Uwe Hermannb4dcb712009-05-13 11:36:06 +00003227 },
3228
3229 {
3230 .vendor = "Atmel",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003231 .name = "AT49F002(N)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003232 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003233 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003234 .model_id = ATMEL_AT49F002N,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003235 .total_size = 256,
3236 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003237 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003238 .tested = TEST_UNTESTED,
3239 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003240 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003241 .block_erasers =
3242 {
3243 {
3244 .eraseblocks = {
3245 {16 * 1024, 1},
3246 {8 * 1024, 2},
3247 {96 * 1024, 1},
3248 {128 * 1024, 1},
3249 },
3250 .block_erase = erase_sector_jedec,
3251 }, {
3252 .eraseblocks = { {256 * 1024, 1} },
3253 .block_erase = erase_chip_block_jedec,
3254 }
3255 },
Sean Nelson35727f72010-01-28 23:55:12 +00003256 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003257 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003258 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003259 .prepare_access = prepare_memory_access,
3260 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003261 },
3262
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003263 {
3264 .vendor = "Atmel",
3265 .name = "AT49F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003266 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003267 .manufacture_id = ATMEL_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003268 .model_id = ATMEL_AT49F002NT,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003269 .total_size = 256,
3270 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00003271 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00003272 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003273 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00003274 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson89187292009-12-23 12:02:55 +00003275 .block_erasers =
3276 {
3277 {
3278 .eraseblocks = {
3279 {128 * 1024, 1},
3280 {96 * 1024, 1},
3281 {8 * 1024, 2},
3282 {16 * 1024, 1},
3283 },
3284 .block_erase = erase_sector_jedec,
3285 }, {
3286 .eraseblocks = { {256 * 1024, 1} },
3287 .block_erase = erase_chip_block_jedec,
3288 }
3289 },
Sean Nelson35727f72010-01-28 23:55:12 +00003290 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00003291 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003292 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003293 .prepare_access = prepare_memory_access,
3294 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00003295 },
3296
Daniel Lenskidf90d3a2010-07-22 11:44:38 +00003297 {
Uwe Hermannc74e9772011-09-08 19:55:18 +00003298 .vendor = "Atmel",
David Borgf5a30f62012-04-15 13:16:32 +00003299 .name = "AT49F020",
3300 .bustype = BUS_PARALLEL,
3301 .manufacture_id = ATMEL_ID,
3302 .model_id = ATMEL_AT49F020,
3303 .total_size = 256,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003304 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003305 .feature_bits = FEATURE_EITHER_RESET,
3306 .tested = TEST_OK_PRE,
3307 .probe = probe_jedec,
3308 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3309 .block_erasers =
3310 {
3311 {
3312 .eraseblocks = { {256 * 1024, 1} },
3313 .block_erase = erase_chip_block_jedec,
3314 }
3315 /* Chip features an optional permanent write protection
3316 * of the first 8 kB. The erase function is the same as
3317 * above, but 00000H to 01FFFH will not be erased.
3318 * FIXME: add another eraser when partial erasers are
3319 * supported.
3320 */
3321 },
3322 .printlock = printlock_at49f,
3323 .write = write_jedec_1,
3324 .read = read_memmapped,
3325 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003326 .prepare_access = prepare_memory_access,
3327 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003328 },
3329
3330 {
3331 .vendor = "Atmel",
3332 .name = "AT49F040",
3333 .bustype = BUS_PARALLEL,
3334 .manufacture_id = ATMEL_ID,
3335 .model_id = ATMEL_AT49F040,
3336 .total_size = 512,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003337 .page_size = 0, /* unused */
David Borgf5a30f62012-04-15 13:16:32 +00003338 .feature_bits = FEATURE_EITHER_RESET,
3339 .tested = TEST_UNTESTED,
3340 .probe = probe_jedec,
3341 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3342 .block_erasers =
3343 {
3344 {
3345 .eraseblocks = { {512 * 1024, 1} },
3346 .block_erase = erase_chip_block_jedec,
3347 }
3348 /* Chip features an optional permanent write protection
3349 * of the first 16 kB. The erase function is the same as
3350 * above, but 00000H to 03FFFH will not be erased.
3351 * FIXME: add another eraser when partial erasers are
3352 * supported.
3353 */
3354 },
3355 .printlock = printlock_at49f,
3356 .write = write_jedec_1,
3357 .read = read_memmapped,
3358 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003359 .prepare_access = prepare_memory_access,
3360 .finish_access = finish_memory_access,
David Borgf5a30f62012-04-15 13:16:32 +00003361 },
3362
3363 {
3364 .vendor = "Atmel",
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003365 .name = "AT49F080",
3366 .bustype = BUS_PARALLEL,
3367 .manufacture_id = ATMEL_ID,
3368 .model_id = ATMEL_AT49F080,
3369 .total_size = 1024,
3370 .page_size = 0, /* unused */
3371 .feature_bits = FEATURE_EITHER_RESET,
3372 .tested = TEST_UNTESTED,
3373 .probe = probe_jedec,
3374 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3375 .block_erasers =
3376 {
3377 {
3378 .eraseblocks = { {1024 * 1024, 1} },
3379 .block_erase = erase_chip_block_jedec,
3380 }
3381 /* Chip features an optional permanent write protection
3382 * of the first 16 kB. The erase function is the same as
3383 * above, but 00000H to 03FFFH will not be erased.
3384 * FIXME: add another eraser when partial erasers are
3385 * supported.
3386 */
3387 },
3388 .printlock = printlock_at49f,
3389 .write = write_jedec_1,
3390 .read = read_memmapped,
3391 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003392 .prepare_access = prepare_memory_access,
3393 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003394 },
3395
3396 {
3397 /* 'top' version of AT49F080. equal in all aspects but the boot block address */
3398 .vendor = "Atmel",
3399 .name = "AT49F080T",
3400 .bustype = BUS_PARALLEL,
3401 .manufacture_id = ATMEL_ID,
3402 .model_id = ATMEL_AT49F080T,
3403 .total_size = 1024,
3404 .page_size = 0, /* unused */
3405 .feature_bits = FEATURE_EITHER_RESET,
3406 .tested = TEST_UNTESTED,
3407 .probe = probe_jedec,
3408 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3409 .block_erasers =
3410 {
3411 {
3412 .eraseblocks = { {1024 * 1024, 1} },
3413 .block_erase = erase_chip_block_jedec,
3414 }
3415 /* Chip features an optional permanent write protection
3416 * of the first 16 kB. The erase function is the same as
3417 * above, but FC000H to FFFFFH will not be erased.
3418 * FIXME: add another eraser when partial erasers are
3419 * supported.
3420 */
3421 },
3422 .printlock = printlock_at49f,
3423 .write = write_jedec_1,
3424 .read = read_memmapped,
3425 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003426 .prepare_access = prepare_memory_access,
3427 .finish_access = finish_memory_access,
Andrew Morgan8dd97f92012-08-13 23:43:46 +00003428 },
3429
3430 {
3431 .vendor = "Atmel",
Uwe Hermannc74e9772011-09-08 19:55:18 +00003432 .name = "AT49LH002",
3433 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3434 .manufacture_id = ATMEL_ID,
3435 .model_id = ATMEL_AT49LH002,
3436 .total_size = 256,
3437 .page_size = 0, /* unused */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003438 .tested = TEST_UNTESTED,
Stefan Tauner7de93932014-08-03 13:05:45 +00003439 .probe = probe_82802ab,
3440 .probe_timing = TIMING_ZERO,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003441 .block_erasers =
3442 {
3443 {
3444 .eraseblocks = {
3445 {64 * 1024, 3},
3446 {32 * 1024, 1},
3447 {8 * 1024, 2},
3448 {16 * 1024, 1},
3449 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003450 .block_erase = NULL, /* TODO: Implement. */
Uwe Hermannc74e9772011-09-08 19:55:18 +00003451 }, {
3452 .eraseblocks = {
3453 {64 * 1024, 4},
3454 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003455 .block_erase = erase_block_82802ab,
3456 },
3457 },
3458 .printlock = printlock_regspace2_block_eraser_0,
3459 .unlock = unlock_regspace2_block_eraser_0,
3460 .write = write_82802ab,
3461 .read = read_memmapped,
3462 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003463 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003464 .finish_access = finish_memory_access,
Stefan Tauner7de93932014-08-03 13:05:45 +00003465 },
3466
3467 {
3468 .vendor = "Atmel",
Stefan Tauner7de93932014-08-03 13:05:45 +00003469 .name = "AT49LH004",
3470 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3471 .manufacture_id = ATMEL_ID,
3472 .model_id = ATMEL_AT49LH004,
3473 .total_size = 512,
3474 .page_size = 0, /* unused */
Stefan Tauner7de93932014-08-03 13:05:45 +00003475 .tested = TEST_UNTESTED,
3476 .probe = probe_82802ab,
3477 .probe_timing = TIMING_ZERO,
3478 .block_erasers =
3479 {
3480 {
3481 .eraseblocks = {
3482 {64 * 1024, 7},
3483 {32 * 1024, 1},
3484 {8 * 1024, 2},
3485 {16 * 1024, 1},
3486 },
3487 .block_erase = erase_block_82802ab,
3488 }, {
3489 .eraseblocks = {
3490 {64 * 1024, 8},
3491 },
Uwe Hermannc74e9772011-09-08 19:55:18 +00003492 .block_erase = NULL, /* TODO: Implement. */
3493 },
3494 },
Stefan Tauner7de93932014-08-03 13:05:45 +00003495 .printlock = printlock_regspace2_block_eraser_0,
3496 .unlock = unlock_regspace2_block_eraser_0,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003497 .write = write_82802ab,
3498 .read = read_memmapped,
3499 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003500 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003501 .finish_access = finish_memory_access,
Uwe Hermannc74e9772011-09-08 19:55:18 +00003502 },
3503
3504 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003505 .vendor = "Atmel",
3506 .name = "AT49LH00B4",
3507 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
3508 .manufacture_id = ATMEL_ID,
3509 .model_id = ATMEL_AT49LH00B4,
3510 .total_size = 512,
Andrew Morganca081462011-09-13 22:05:44 +00003511 .page_size = 0, /* unused */
Alan Green1f9cc7d2019-07-01 11:10:45 +10003512 .tested = TEST_UNTESTED,
3513 .probe = probe_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003514 .probe_timing = TIMING_ZERO,
3515 .block_erasers =
3516 {
3517 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003518 .eraseblocks = {
3519 {8 * 1024, 2},
3520 {16 * 1024, 1},
3521 {32 * 1024, 1},
3522 {64 * 1024, 7},
3523 },
3524 .block_erase = NULL, /* TODO: Implement. */
3525 }, {
3526 .eraseblocks = {
3527 {64 * 1024, 8},
3528 },
3529 .block_erase = erase_block_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003530 },
3531 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003532 .printlock = printlock_regspace2_block_eraser_0,
3533 .unlock = unlock_regspace2_block_eraser_0,
3534 .write = write_82802ab,
Andrew Morganca081462011-09-13 22:05:44 +00003535 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003536 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01003537 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01003538 .finish_access = finish_memory_access,
Andrew Morganca081462011-09-13 22:05:44 +00003539 },
3540
3541 {
Angel Pons1ebda782021-04-20 21:39:11 +02003542 .vendor = "Boya/BoHong Microelectronics",
Christian Kudera475a7ee2021-04-20 22:50:01 +02003543 .name = "B.25D16A",
3544 .bustype = BUS_SPI,
3545 .manufacture_id = BOYA_BOHONG_ID,
3546 .model_id = BOYA_BOHONG_B_25D16A,
3547 .total_size = 2048,
3548 .page_size = 256,
3549 .feature_bits = FEATURE_WRSR_WREN,
3550 .tested = TEST_OK_PR,
3551 .probe = probe_spi_rdid,
3552 .probe_timing = TIMING_ZERO,
3553 .block_erasers =
3554 {
3555 {
3556 .eraseblocks = { {4 * 1024, 512} },
3557 .block_erase = spi_block_erase_20,
3558 }, {
3559 .eraseblocks = { {32 * 1024, 64} },
3560 .block_erase = spi_block_erase_52,
3561 }, {
3562 .eraseblocks = { {64 * 1024, 32} },
3563 .block_erase = spi_block_erase_d8,
3564 }, {
3565 .eraseblocks = { {2 * 1024 * 1024, 1} },
3566 .block_erase = spi_block_erase_60,
3567 }, {
3568 .eraseblocks = { {2 * 1024 * 1024, 1} },
3569 .block_erase = spi_block_erase_c7,
3570 }
3571 },
3572 .printlock = spi_prettyprint_status_register_bp2_srwd,
3573 .unlock = spi_disable_blockprotect_bp2_srwd,
3574 .write = spi_chip_write_256,
3575 .read = spi_chip_read,
3576 .voltage = {2700, 3600},
3577 },
3578
3579 {
3580 .vendor = "Boya/BoHong Microelectronics",
Angel Pons1ebda782021-04-20 21:39:11 +02003581 .name = "B.25Q128AS",
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003582 .bustype = BUS_SPI,
Angel Pons1ebda782021-04-20 21:39:11 +02003583 .manufacture_id = BOYA_BOHONG_ID,
3584 .model_id = BOYA_BOHONG_B_25Q128AS,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003585 .total_size = 16384,
3586 .page_size = 256,
Nico Huber226bb872024-04-09 23:30:34 +02003587 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
3588 FEATURE_OTP | FEATURE_QIO,
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003589 .tested = TEST_OK_PREW,
3590 .probe = probe_spi_rdid,
3591 .probe_timing = TIMING_ZERO,
3592 .block_erasers =
3593 {
3594 {
3595 .eraseblocks = { {4 * 1024, 4096} },
3596 .block_erase = spi_block_erase_20,
3597 }, {
3598 .eraseblocks = { {32 * 1024, 512} },
3599 .block_erase = spi_block_erase_52,
3600 }, {
3601 .eraseblocks = { {64 * 1024, 256} },
3602 .block_erase = spi_block_erase_d8,
3603 }, {
3604 .eraseblocks = { {16 * 1024 * 1024, 1} },
3605 .block_erase = spi_block_erase_60,
3606 }, {
3607 .eraseblocks = { {16 * 1024 * 1024, 1} },
3608 .block_erase = spi_block_erase_c7,
3609 }
3610 },
Nico Huber226bb872024-04-09 23:30:34 +02003611 .reg_bits =
3612 {
3613 .qe = {STATUS2, 1, RW},
3614 },
Jack Olsen73ae5ef2020-08-08 21:12:13 -05003615 .printlock = spi_prettyprint_status_register_plain,
3616 .unlock = spi_disable_blockprotect_at25fs040,
3617 .write = spi_chip_write_256,
3618 .read = spi_chip_read,
3619 .voltage = {2700, 3600},
3620 },
3621
3622 {
Joshua Roysf1324e02010-09-16 00:51:51 +00003623 .vendor = "Bright",
3624 .name = "BM29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003625 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00003626 .manufacture_id = BRIGHT_ID,
3627 .model_id = BRIGHT_BM29F040,
3628 .total_size = 512,
3629 .page_size = 64 * 1024,
3630 .feature_bits = FEATURE_EITHER_RESET,
3631 .tested = TEST_OK_PR,
3632 .probe = probe_jedec,
3633 .probe_timing = TIMING_ZERO,
3634 .block_erasers =
3635 {
3636 {
3637 .eraseblocks = { {64 * 1024, 8} },
3638 .block_erase = erase_sector_jedec,
3639 }, {
3640 .eraseblocks = { {512 * 1024, 1} },
3641 .block_erase = erase_chip_block_jedec,
3642 },
3643 },
3644 .write = write_jedec_1,
3645 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00003646 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003647 .prepare_access = prepare_memory_access,
3648 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00003649 },
3650
3651 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003652 .vendor = "Catalyst",
3653 .name = "CAT28F512",
3654 .bustype = BUS_PARALLEL,
3655 .manufacture_id = CATALYST_ID,
3656 .model_id = CATALYST_CAT28F512,
3657 .total_size = 64,
3658 .page_size = 0, /* unused */
3659 .feature_bits = 0,
Alan Green908adf42019-07-03 15:34:06 +10003660 .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD},
Alan Green1f9cc7d2019-07-01 11:10:45 +10003661 .probe = probe_jedec, /* FIXME! */
3662 .probe_timing = TIMING_ZERO,
3663 .block_erasers =
3664 {
3665 {
3666 .eraseblocks = { {64 * 1024, 1} },
3667 .block_erase = NULL, /* TODO */
3668 },
3669 },
3670 .write = NULL, /* TODO */
3671 .read = read_memmapped,
3672 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003673 .prepare_access = prepare_memory_access,
3674 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003675 },
3676
3677 {
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003678 .vendor = "ENE",
3679 .name = "KB9012 (EDI)",
3680 .bustype = BUS_SPI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003681 .total_size = 128,
3682 .page_size = 128,
3683 .feature_bits = FEATURE_ERASED_ZERO,
3684 .tested = TEST_OK_PREW,
Alan Greenc1863ca2019-06-27 15:08:03 +10003685 .spi_cmd_set = SPI_EDI,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003686 .probe = edi_probe_kb9012,
3687 .probe_timing = TIMING_ZERO,
3688 .block_erasers =
3689 {
3690 {
3691 .eraseblocks = { {128, 1024} },
3692 .block_erase = edi_chip_block_erase,
3693 },
3694 },
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003695 .write = edi_chip_write,
3696 .read = edi_chip_read,
3697 .voltage = {2700, 3600},
Alan Greenc1863ca2019-06-27 15:08:03 +10003698 .gran = write_gran_128bytes,
Paul Kocialkowski80ae14e2018-01-15 01:07:46 +03003699 },
3700
3701 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003702 .vendor = "ESI",
3703 .name = "ES25P16",
3704 .bustype = BUS_SPI,
3705 .manufacture_id = EXCEL_ID_NOPREFIX,
3706 .model_id = EXCEL_ES25P16,
3707 .total_size = 2 * 1024,
3708 .page_size = 256,
3709 /* 256-byte parameter page separate from memory array:
3710 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3711 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003712 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003713 .probe = probe_spi_rdid,
3714 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003715 .block_erasers =
3716 {
3717 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003718 .eraseblocks = { {64 * 1024, 32} },
3719 .block_erase = spi_block_erase_d8,
Sean Nelson54596372010-01-09 05:30:14 +00003720 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003721 .eraseblocks = { {2 * 1024 * 1024, 1} },
3722 .block_erase = spi_block_erase_c7,
Sean Nelson54596372010-01-09 05:30:14 +00003723 }
3724 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10003725 .printlock = spi_prettyprint_status_register_bp2_srwd,
3726 .unlock = spi_disable_blockprotect_bp2_srwd,
3727 .write = spi_chip_write_256,
3728 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3729 .voltage = {2700, 3600},
3730 },
3731
3732 {
3733 .vendor = "ESI",
3734 .name = "ES25P40",
3735 .bustype = BUS_SPI,
3736 .manufacture_id = EXCEL_ID_NOPREFIX,
3737 .model_id = EXCEL_ES25P40,
3738 .total_size = 512,
3739 .page_size = 256,
3740 /* 256-byte parameter page separate from memory array:
3741 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3742 .feature_bits = FEATURE_WRSR_WREN,
3743 .tested = TEST_UNTESTED,
3744 .probe = probe_spi_rdid,
3745 .probe_timing = TIMING_ZERO,
3746 .block_erasers =
3747 {
3748 {
3749 .eraseblocks = { {64 * 1024, 8} },
3750 .block_erase = spi_block_erase_d8,
3751 }, {
3752 .eraseblocks = { {512 * 1024, 1} },
3753 .block_erase = spi_block_erase_c7,
3754 }
3755 },
3756 .printlock = spi_prettyprint_status_register_bp2_srwd,
3757 .unlock = spi_disable_blockprotect_bp2_srwd,
3758 .write = spi_chip_write_256,
3759 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3760 .voltage = {2700, 3600},
3761 },
3762
3763 {
3764 .vendor = "ESI",
3765 .name = "ES25P80",
3766 .bustype = BUS_SPI,
3767 .manufacture_id = EXCEL_ID_NOPREFIX,
3768 .model_id = EXCEL_ES25P80,
3769 .total_size = 1024,
3770 .page_size = 256,
3771 /* 256-byte parameter page separate from memory array:
3772 * supports read (0x53), fast read (0x5B), erase (0xD5) and program (0x52) instructions. */
3773 .feature_bits = FEATURE_WRSR_WREN,
3774 .tested = TEST_UNTESTED,
3775 .probe = probe_spi_rdid,
3776 .probe_timing = TIMING_ZERO,
3777 .block_erasers =
3778 {
3779 {
3780 .eraseblocks = { {64 * 1024, 16} },
3781 .block_erase = spi_block_erase_d8,
3782 }, {
3783 .eraseblocks = { {1024 * 1024, 1} },
3784 .block_erase = spi_block_erase_c7,
3785 }
3786 },
3787 .printlock = spi_prettyprint_status_register_bp2_srwd,
3788 .unlock = spi_disable_blockprotect_bp2_srwd,
3789 .write = spi_chip_write_256,
3790 .read = spi_chip_read, /* Fast Read (0x0B) supported */
3791 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00003792 },
3793
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00003794 {
Stefan Tauner352e50b2013-02-22 15:58:45 +00003795 .vendor = "ESMT",
Michael Karcher80a59ea2010-06-19 22:06:35 +00003796 .name = "F25L008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003797 .bustype = BUS_SPI,
Stefan Tauner352e50b2013-02-22 15:58:45 +00003798 .manufacture_id = ESMT_ID,
3799 .model_id = ESMT_F25L008A,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003800 .total_size = 1024,
3801 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003802 .feature_bits = FEATURE_WRSR_EITHER,
Stefan Taunereb582572012-09-21 12:52:50 +00003803 .tested = TEST_OK_PREW,
Michael Karcher80a59ea2010-06-19 22:06:35 +00003804 .probe = probe_spi_rdid,
3805 .probe_timing = TIMING_ZERO,
3806 .block_erasers =
3807 {
3808 {
3809 .eraseblocks = { {4 * 1024, 256} },
3810 .block_erase = spi_block_erase_20,
3811 }, {
3812 .eraseblocks = { {64 * 1024, 16} },
3813 .block_erase = spi_block_erase_d8,
3814 }, {
3815 .eraseblocks = { {1024 * 1024, 1} },
3816 .block_erase = spi_block_erase_60,
3817 }, {
3818 .eraseblocks = { {1024 * 1024, 1} },
3819 .block_erase = spi_block_erase_c7,
3820 }
3821 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003822 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003823 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger9a795d82010-07-14 16:19:05 +00003824 .write = spi_chip_write_1,
Michael Karcher4497e862010-07-10 19:34:15 +00003825 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003826 .voltage = {2700, 3600},
Michael Karcher80a59ea2010-06-19 22:06:35 +00003827 },
3828
3829 {
Stefan Tauner85f09f72014-05-27 21:27:14 +00003830 .vendor = "ESMT",
3831 .name = "F25L32PA",
3832 .bustype = BUS_SPI,
3833 .manufacture_id = ESMT_ID,
3834 .model_id = ESMT_F25L32PA,
3835 .total_size = 4096,
3836 .page_size = 256,
3837 .feature_bits = FEATURE_WRSR_EITHER | FEATURE_OTP,
3838 .tested = TEST_UNTESTED,
3839 .probe = probe_spi_rdid,
3840 .probe_timing = TIMING_ZERO,
3841 .block_erasers =
3842 {
3843 {
3844 .eraseblocks = { {4 * 1024, 1024} },
3845 .block_erase = spi_block_erase_20,
3846 }, {
3847 .eraseblocks = { {64 * 1024, 64} },
3848 .block_erase = spi_block_erase_d8,
3849 }, {
3850 .eraseblocks = { {4 * 1024 * 1024, 1} },
3851 .block_erase = spi_block_erase_60,
3852 }, {
3853 .eraseblocks = { {4 * 1024 * 1024, 1} },
3854 .block_erase = spi_block_erase_c7,
3855 }
3856 },
3857 .printlock = spi_prettyprint_status_register_bp2_bpl,
3858 .unlock = spi_disable_blockprotect,
3859 .write = spi_chip_write_256,
3860 .read = spi_chip_read,
3861 .voltage = {2700, 3600},
3862 },
3863
3864 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10003865 .vendor = "ESMT",
3866 .name = "F49B002UA",
3867 .bustype = BUS_PARALLEL,
3868 .manufacture_id = ESMT_ID,
3869 .model_id = ESMT_F49B002UA,
3870 .total_size = 256,
3871 .page_size = 4096,
3872 .feature_bits = FEATURE_EITHER_RESET,
3873 .tested = TEST_UNTESTED,
3874 .probe = probe_jedec,
3875 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
3876 .block_erasers =
3877 {
3878 {
3879 .eraseblocks = {
3880 {128 * 1024, 1},
3881 {96 * 1024, 1},
3882 {8 * 1024, 2},
3883 {16 * 1024, 1},
3884 },
3885 .block_erase = erase_sector_jedec,
3886 }, {
3887 .eraseblocks = { {256 * 1024, 1} },
3888 .block_erase = erase_chip_block_jedec,
3889 }
3890 },
3891 .write = write_jedec_1,
3892 .read = read_memmapped,
3893 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01003894 .prepare_access = prepare_memory_access,
3895 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10003896 },
3897
3898 {
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003899 .vendor = "Eon",
3900 .name = "EN25B05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003901 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003902 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003903 .model_id = EON_EN25B05,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003904 .total_size = 64,
3905 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003906 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003907 .tested = TEST_UNTESTED,
3908 .probe = probe_spi_rdid,
3909 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003910 .block_erasers =
3911 {
3912 {
3913 .eraseblocks = {
3914 {4 * 1024, 2},
3915 {8 * 1024, 1},
3916 {16 * 1024, 1},
3917 {32 * 1024, 1},
3918 },
3919 .block_erase = spi_block_erase_d8,
3920 }, {
3921 .eraseblocks = { {64 * 1024, 1} },
3922 .block_erase = spi_block_erase_c7,
3923 }
3924 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003926 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003927 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003928 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003929 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003930 },
3931
3932 {
3933 .vendor = "Eon",
3934 .name = "EN25B05T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003935 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00003936 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003937 .model_id = EON_EN25B05,
Sean Nelson54596372010-01-09 05:30:14 +00003938 .total_size = 64,
3939 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003940 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00003941 .tested = TEST_UNTESTED,
3942 .probe = probe_spi_rdid,
3943 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003944 .block_erasers =
3945 {
3946 {
3947 .eraseblocks = {
3948 {32 * 1024, 1},
3949 {16 * 1024, 1},
3950 {8 * 1024, 1},
3951 {4 * 1024, 2},
3952 },
3953 .block_erase = spi_block_erase_d8,
3954 }, {
3955 .eraseblocks = { {64 * 1024, 1} },
3956 .block_erase = spi_block_erase_c7,
3957 }
3958 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003959 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003960 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003961 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003962 .read = spi_chip_read, /* Fast read (0x0B) supported */
3963 .voltage = {2700, 3600},
3964 },
3965
3966 {
3967 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003968 .name = "EN25B10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00003969 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00003970 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00003971 .model_id = EON_EN25B10,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003972 .total_size = 128,
3973 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00003974 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00003975 .tested = TEST_UNTESTED,
3976 .probe = probe_spi_rdid,
3977 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00003978 .block_erasers =
3979 {
3980 {
3981 .eraseblocks = {
3982 {4 * 1024, 2},
3983 {8 * 1024, 1},
3984 {16 * 1024, 1},
3985 {32 * 1024, 3},
3986 },
3987 .block_erase = spi_block_erase_d8,
3988 }, {
3989 .eraseblocks = { {128 * 1024, 1} },
3990 .block_erase = spi_block_erase_c7,
3991 }
3992 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00003993 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00003994 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00003995 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00003996 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00003997 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00003998 },
3999
4000 {
4001 .vendor = "Eon",
4002 .name = "EN25B10T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004003 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004004 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004005 .model_id = EON_EN25B10,
Sean Nelson54596372010-01-09 05:30:14 +00004006 .total_size = 128,
4007 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004008 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00004009 .tested = TEST_OK_PREW,
Sean Nelson54596372010-01-09 05:30:14 +00004010 .probe = probe_spi_rdid,
4011 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004012 .block_erasers =
4013 {
4014 {
4015 .eraseblocks = {
4016 {32 * 1024, 3},
4017 {16 * 1024, 1},
4018 {8 * 1024, 1},
4019 {4 * 1024, 2},
4020 },
4021 .block_erase = spi_block_erase_d8,
4022 }, {
4023 .eraseblocks = { {128 * 1024, 1} },
4024 .block_erase = spi_block_erase_c7,
4025 }
4026 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004027 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004028 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004029 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004030 .read = spi_chip_read, /* Fast read (0x0B) supported */
4031 .voltage = {2700, 3600},
4032 },
4033
4034 {
4035 .vendor = "Eon",
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004036 .name = "EN25B16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004037 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004038 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004039 .model_id = EON_EN25B16,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004040 .total_size = 2048,
4041 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004042 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004043 .tested = TEST_UNTESTED,
4044 .probe = probe_spi_rdid,
4045 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004046 .block_erasers =
4047 {
4048 {
4049 .eraseblocks = {
4050 {4 * 1024, 2},
4051 {8 * 1024, 1},
4052 {16 * 1024, 1},
4053 {32 * 1024, 1},
4054 {64 * 1024, 31},
4055 },
4056 .block_erase = spi_block_erase_d8,
4057 }, {
4058 .eraseblocks = { {2 * 1024 * 1024, 1} },
4059 .block_erase = spi_block_erase_c7,
4060 }
4061 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004062 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004063 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004064 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004065 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004066 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004067 },
4068
4069 {
4070 .vendor = "Eon",
4071 .name = "EN25B16T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004072 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004073 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004074 .model_id = EON_EN25B16,
Sean Nelson54596372010-01-09 05:30:14 +00004075 .total_size = 2048,
4076 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +00004077 .feature_bits = FEATURE_WRSR_WREN,
Sean Nelson54596372010-01-09 05:30:14 +00004078 .tested = TEST_UNTESTED,
4079 .probe = probe_spi_rdid,
4080 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004081 .block_erasers =
4082 {
4083 {
4084 .eraseblocks = {
4085 {64 * 1024, 31},
4086 {32 * 1024, 1},
4087 {16 * 1024, 1},
4088 {8 * 1024, 1},
4089 {4 * 1024, 2},
4090 },
4091 .block_erase = spi_block_erase_d8,
4092 }, {
4093 .eraseblocks = { {2 * 1024 * 1024, 1} },
4094 .block_erase = spi_block_erase_c7,
4095 }
4096 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004097 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004098 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004099 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004100 .read = spi_chip_read, /* Fast read (0x0B) supported */
4101 .voltage = {2700, 3600},
4102 },
4103
4104 {
4105 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004106 .name = "EN25B20",
Stefan Taunerb175af52015-01-24 15:06:27 +00004107 .bustype = BUS_SPI,
4108 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004109 .model_id = EON_EN25B20,
4110 .total_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004111 .page_size = 256,
4112 .feature_bits = FEATURE_WRSR_WREN,
4113 .tested = TEST_UNTESTED,
4114 .probe = probe_spi_rdid,
4115 .probe_timing = TIMING_ZERO,
4116 .block_erasers =
4117 {
4118 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004119 .eraseblocks = {
4120 {4 * 1024, 2},
4121 {8 * 1024, 1},
4122 {16 * 1024, 1},
4123 {32 * 1024, 1},
4124 {64 * 1024, 3}
4125 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004126 .block_erase = spi_block_erase_d8,
4127 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004128 .eraseblocks = { {256 * 1024, 1} },
4129 .block_erase = spi_block_erase_c7,
4130 }
4131 },
4132 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4133 .unlock = spi_disable_blockprotect,
4134 .write = spi_chip_write_256,
4135 .read = spi_chip_read, /* Fast read (0x0B) supported */
4136 .voltage = {2700, 3600},
4137 },
4138
4139 {
4140 .vendor = "Eon",
4141 .name = "EN25B20T",
4142 .bustype = BUS_SPI,
4143 .manufacture_id = EON_ID_NOPREFIX,
4144 .model_id = EON_EN25B20,
4145 .total_size = 256,
4146 .page_size = 256,
4147 .feature_bits = FEATURE_WRSR_WREN,
4148 .tested = TEST_UNTESTED,
4149 .probe = probe_spi_rdid,
4150 .probe_timing = TIMING_ZERO,
4151 .block_erasers =
4152 {
4153 {
4154 .eraseblocks = {
4155 {64 * 1024, 3},
4156 {32 * 1024, 1},
4157 {16 * 1024, 1},
4158 {8 * 1024, 1},
4159 {4 * 1024, 2},
4160 },
4161 .block_erase = spi_block_erase_d8,
4162 }, {
4163 .eraseblocks = { {256 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004164 .block_erase = spi_block_erase_c7,
4165 }
4166 },
4167 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4168 .unlock = spi_disable_blockprotect,
4169 .write = spi_chip_write_256,
4170 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004171 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004172 },
4173
4174 {
4175 .vendor = "Eon",
4176 .name = "EN25B32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004177 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004178 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004179 .model_id = EON_EN25B32,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004180 .total_size = 4096,
4181 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004182 /* OTP: 512B total; enter 0x3A */
4183 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004184 .tested = TEST_UNTESTED,
4185 .probe = probe_spi_rdid,
4186 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004187 .block_erasers =
4188 {
4189 {
4190 .eraseblocks = {
4191 {4 * 1024, 2},
4192 {8 * 1024, 1},
4193 {16 * 1024, 1},
4194 {32 * 1024, 1},
4195 {64 * 1024, 63},
4196 },
4197 .block_erase = spi_block_erase_d8,
4198 }, {
4199 .eraseblocks = { {4 * 1024 * 1024, 1} },
4200 .block_erase = spi_block_erase_c7,
4201 }
4202 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004203 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004204 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004205 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004206 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004207 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004208 },
4209
4210 {
4211 .vendor = "Eon",
4212 .name = "EN25B32T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004213 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004214 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004215 .model_id = EON_EN25B32,
Sean Nelson54596372010-01-09 05:30:14 +00004216 .total_size = 4096,
4217 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004218 /* OTP: 512B total; enter 0x3A */
4219 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004220 .tested = TEST_UNTESTED,
4221 .probe = probe_spi_rdid,
4222 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004223 .block_erasers =
4224 {
4225 {
4226 .eraseblocks = {
4227 {64 * 1024, 63},
4228 {32 * 1024, 1},
4229 {16 * 1024, 1},
4230 {8 * 1024, 1},
4231 {4 * 1024, 2},
4232 },
4233 .block_erase = spi_block_erase_d8,
4234 }, {
4235 .eraseblocks = { {4 * 1024 * 1024, 1} },
4236 .block_erase = spi_block_erase_c7,
4237 }
4238 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004239 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004240 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004241 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004242 .read = spi_chip_read, /* Fast read (0x0B) supported */
4243 .voltage = {2700, 3600},
4244 },
4245
4246 {
4247 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004248 .name = "EN25B40",
Stefan Taunerb175af52015-01-24 15:06:27 +00004249 .bustype = BUS_SPI,
4250 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004251 .model_id = EON_EN25B40,
4252 .total_size = 512,
Stefan Taunerb175af52015-01-24 15:06:27 +00004253 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004254 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004255 .tested = TEST_UNTESTED,
4256 .probe = probe_spi_rdid,
4257 .probe_timing = TIMING_ZERO,
4258 .block_erasers =
4259 {
4260 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004261 .eraseblocks = {
4262 {4 * 1024, 2},
4263 {8 * 1024, 1},
4264 {16 * 1024, 1},
4265 {32 * 1024, 1},
4266 {64 * 1024, 7}
4267 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004268 .block_erase = spi_block_erase_d8,
4269 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004270 .eraseblocks = { {512 * 1024, 1} },
4271 .block_erase = spi_block_erase_c7,
4272 }
4273 },
4274 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4275 .unlock = spi_disable_blockprotect,
4276 .write = spi_chip_write_256,
4277 .read = spi_chip_read, /* Fast read (0x0B) supported */
4278 .voltage = {2700, 3600},
4279 },
4280
4281 {
4282 .vendor = "Eon",
4283 .name = "EN25B40T",
4284 .bustype = BUS_SPI,
4285 .manufacture_id = EON_ID_NOPREFIX,
4286 .model_id = EON_EN25B40,
4287 .total_size = 512,
4288 .page_size = 256,
4289 .feature_bits = FEATURE_WRSR_WREN,
4290 .tested = TEST_UNTESTED,
4291 .probe = probe_spi_rdid,
4292 .probe_timing = TIMING_ZERO,
4293 .block_erasers =
4294 {
4295 {
4296 .eraseblocks = {
4297 {64 * 1024, 7},
4298 {32 * 1024, 1},
4299 {16 * 1024, 1},
4300 {8 * 1024, 1},
4301 {4 * 1024, 2},
4302 },
4303 .block_erase = spi_block_erase_d8,
4304 }, {
4305 .eraseblocks = { {512 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004306 .block_erase = spi_block_erase_c7,
4307 }
4308 },
4309 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4310 .unlock = spi_disable_blockprotect,
4311 .write = spi_chip_write_256,
4312 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004313 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004314 },
4315
4316 {
4317 .vendor = "Eon",
4318 .name = "EN25B64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004319 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004320 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004321 .model_id = EON_EN25B64,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004322 .total_size = 8192,
4323 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004324 /* OTP: 512B total; enter 0x3A */
4325 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004326 .tested = TEST_UNTESTED,
4327 .probe = probe_spi_rdid,
4328 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004329 .block_erasers =
4330 {
4331 {
4332 .eraseblocks = {
4333 {4 * 1024, 2},
4334 {8 * 1024, 1},
4335 {16 * 1024, 1},
4336 {32 * 1024, 1},
4337 {64 * 1024, 127},
4338 },
4339 .block_erase = spi_block_erase_d8,
4340 }, {
4341 .eraseblocks = { {8 * 1024 * 1024, 1} },
4342 .block_erase = spi_block_erase_c7,
4343 }
4344 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004345 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004346 .unlock = spi_disable_blockprotect,
Sean Nelson54596372010-01-09 05:30:14 +00004347 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004348 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004349 .voltage = {2700, 3600},
Sean Nelson54596372010-01-09 05:30:14 +00004350 },
4351
4352 {
4353 .vendor = "Eon",
4354 .name = "EN25B64T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004355 .bustype = BUS_SPI,
Sean Nelson54596372010-01-09 05:30:14 +00004356 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004357 .model_id = EON_EN25B64,
Sean Nelson54596372010-01-09 05:30:14 +00004358 .total_size = 8192,
4359 .page_size = 256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004360 /* OTP: 512B total; enter 0x3A */
4361 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Sean Nelson54596372010-01-09 05:30:14 +00004362 .tested = TEST_UNTESTED,
4363 .probe = probe_spi_rdid,
4364 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004365 .block_erasers =
4366 {
4367 {
4368 .eraseblocks = {
4369 {64 * 1024, 127},
4370 {32 * 1024, 1},
4371 {16 * 1024, 1},
4372 {8 * 1024, 1},
4373 {4 * 1024, 2},
4374 },
4375 .block_erase = spi_block_erase_d8,
4376 }, {
4377 .eraseblocks = { {8 * 1024 * 1024, 1} },
4378 .block_erase = spi_block_erase_c7,
4379 }
4380 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004381 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004382 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004383 .write = spi_chip_write_256,
Stefan Taunerb175af52015-01-24 15:06:27 +00004384 .read = spi_chip_read, /* Fast read (0x0B) supported */
4385 .voltage = {2700, 3600},
4386 },
4387
4388 {
4389 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004390 .name = "EN25B80",
Stefan Taunerb175af52015-01-24 15:06:27 +00004391 .bustype = BUS_SPI,
4392 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004393 .model_id = EON_EN25B80,
4394 .total_size = 1024,
Stefan Taunerb175af52015-01-24 15:06:27 +00004395 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004396 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerb175af52015-01-24 15:06:27 +00004397 .tested = TEST_UNTESTED,
4398 .probe = probe_spi_rdid,
4399 .probe_timing = TIMING_ZERO,
4400 .block_erasers =
4401 {
4402 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004403 .eraseblocks = {
4404 {4 * 1024, 2},
4405 {8 * 1024, 1},
4406 {16 * 1024, 1},
4407 {32 * 1024, 1},
4408 {64 * 1024, 15}
4409 },
Stefan Taunerb175af52015-01-24 15:06:27 +00004410 .block_erase = spi_block_erase_d8,
4411 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004412 .eraseblocks = { {1024 * 1024, 1} },
4413 .block_erase = spi_block_erase_c7,
4414 }
4415 },
4416 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4417 .unlock = spi_disable_blockprotect,
4418 .write = spi_chip_write_256,
4419 .read = spi_chip_read, /* Fast read (0x0B) supported */
4420 .voltage = {2700, 3600},
4421 },
4422
4423 {
4424 .vendor = "Eon",
4425 .name = "EN25B80T",
4426 .bustype = BUS_SPI,
4427 .manufacture_id = EON_ID_NOPREFIX,
4428 .model_id = EON_EN25B80,
4429 .total_size = 1024,
4430 .page_size = 256,
4431 .feature_bits = FEATURE_WRSR_WREN,
4432 .tested = TEST_UNTESTED,
4433 .probe = probe_spi_rdid,
4434 .probe_timing = TIMING_ZERO,
4435 .block_erasers =
4436 {
4437 {
4438 .eraseblocks = {
4439 {64 * 1024, 15},
4440 {32 * 1024, 1},
4441 {16 * 1024, 1},
4442 {8 * 1024, 1},
4443 {4 * 1024, 2},
4444 },
4445 .block_erase = spi_block_erase_d8,
4446 }, {
4447 .eraseblocks = { {1024 * 1024, 1} },
Stefan Taunerb175af52015-01-24 15:06:27 +00004448 .block_erase = spi_block_erase_c7,
4449 }
4450 },
4451 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4452 .unlock = spi_disable_blockprotect,
4453 .write = spi_chip_write_256,
4454 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004455 .voltage = {2700, 3600},
Carl-Daniel Hailfinger80243c92009-06-05 20:53:07 +00004456 },
4457
4458 {
4459 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004460 .name = "EN25F05",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004461 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004462 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004463 .model_id = EON_EN25F05,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004464 .total_size = 64,
4465 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004466 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner0554ca52013-07-25 22:54:25 +00004467 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004468 .probe = probe_spi_rdid,
4469 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004470 .block_erasers =
4471 {
4472 {
4473 .eraseblocks = { {4 * 1024, 16} },
4474 .block_erase = spi_block_erase_20,
4475 }, {
4476 .eraseblocks = { {32 * 1024, 2} },
4477 .block_erase = spi_block_erase_d8,
4478 }, {
4479 .eraseblocks = { {32 * 1024, 2} },
4480 .block_erase = spi_block_erase_52,
4481 }, {
4482 .eraseblocks = { {64 * 1024, 1} },
4483 .block_erase = spi_block_erase_60,
4484 }, {
4485 .eraseblocks = { {64 * 1024, 1} },
4486 .block_erase = spi_block_erase_c7,
4487 }
4488 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004489 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004490 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004491 .write = spi_chip_write_256,
4492 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004493 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004494 },
4495
4496 {
4497 .vendor = "Eon",
4498 .name = "EN25F10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004499 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004500 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004501 .model_id = EON_EN25F10,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004502 .total_size = 128,
4503 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004504 .feature_bits = FEATURE_WRSR_WREN,
Simon Buhrowd173ed42021-09-29 09:28:07 +02004505 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004506 .probe = probe_spi_rdid,
4507 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004508 .block_erasers =
4509 {
4510 {
4511 .eraseblocks = { {4 * 1024, 32} },
4512 .block_erase = spi_block_erase_20,
4513 }, {
4514 .eraseblocks = { {32 * 1024, 4} },
4515 .block_erase = spi_block_erase_d8,
4516 }, {
4517 .eraseblocks = { {32 * 1024, 4} },
4518 .block_erase = spi_block_erase_52,
4519 }, {
4520 .eraseblocks = { {128 * 1024, 1} },
4521 .block_erase = spi_block_erase_60,
4522 }, {
4523 .eraseblocks = { {128 * 1024, 1} },
4524 .block_erase = spi_block_erase_c7,
4525 }
4526 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004527 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004528 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004529 .write = spi_chip_write_256,
4530 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004531 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004532 },
4533
4534 {
4535 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004536 .name = "EN25F16",
4537 .bustype = BUS_SPI,
4538 .manufacture_id = EON_ID_NOPREFIX,
4539 .model_id = EON_EN25F16,
4540 .total_size = 2048,
4541 .page_size = 256,
4542 .feature_bits = FEATURE_WRSR_WREN,
4543 .tested = TEST_OK_PREW,
4544 .probe = probe_spi_rdid,
4545 .probe_timing = TIMING_ZERO,
4546 .block_erasers =
4547 {
4548 {
4549 .eraseblocks = { {4 * 1024, 512} },
4550 .block_erase = spi_block_erase_20,
4551 }, {
4552 .eraseblocks = { {64 * 1024, 32} },
4553 .block_erase = spi_block_erase_d8,
4554 }, {
4555 .eraseblocks = { {2 * 1024 * 1024, 1} },
4556 .block_erase = spi_block_erase_60,
4557 }, {
4558 .eraseblocks = { {2 * 1024 * 1024, 1} },
4559 .block_erase = spi_block_erase_c7,
4560 }
4561 },
4562 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4563 .unlock = spi_disable_blockprotect,
4564 .write = spi_chip_write_256,
4565 .read = spi_chip_read,
4566 .voltage = {2700, 3600},
4567 },
4568
4569 {
4570 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004571 .name = "EN25F20",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004572 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004573 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004574 .model_id = EON_EN25F20,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004575 .total_size = 256,
4576 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004577 .feature_bits = FEATURE_WRSR_WREN,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004578 .tested = TEST_UNTESTED,
4579 .probe = probe_spi_rdid,
4580 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004581 .block_erasers =
4582 {
4583 {
4584 .eraseblocks = { {4 * 1024, 64} },
4585 .block_erase = spi_block_erase_20,
4586 }, {
4587 .eraseblocks = { {64 * 1024, 4} },
4588 .block_erase = spi_block_erase_d8,
4589 }, {
4590 .eraseblocks = { {64 * 1024, 4} },
4591 .block_erase = spi_block_erase_52,
4592 }, {
4593 .eraseblocks = { {256 * 1024, 1} },
4594 .block_erase = spi_block_erase_60,
4595 }, {
4596 .eraseblocks = { {256 * 1024, 1} },
4597 .block_erase = spi_block_erase_c7,
4598 }
4599 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004600 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004601 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004602 .write = spi_chip_write_256,
4603 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004604 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004605 },
4606
4607 {
4608 .vendor = "Eon",
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004609 .name = "EN25F32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004610 .bustype = BUS_SPI,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004611 .manufacture_id = EON_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00004612 .model_id = EON_EN25F32,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004613 .total_size = 4096,
4614 .page_size = 256,
David Hendricksd6c5dfc2010-09-03 03:18:26 +00004615 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner5c316f92015-02-08 21:57:52 +00004616 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004617 .probe = probe_spi_rdid,
4618 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00004619 .block_erasers =
4620 {
4621 {
4622 .eraseblocks = { {4 * 1024, 1024} },
4623 .block_erase = spi_block_erase_20,
4624 }, {
4625 .eraseblocks = { {64 * 1024, 64} },
4626 .block_erase = spi_block_erase_d8,
4627 }, {
4628 .eraseblocks = { {4 * 1024 * 1024, 1} },
4629 .block_erase = spi_block_erase_60,
4630 }, {
4631 .eraseblocks = { {4 * 1024 * 1024, 1} },
4632 .block_erase = spi_block_erase_c7,
4633 }
4634 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004635 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00004636 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004637 .write = spi_chip_write_256,
4638 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00004639 .voltage = {2700, 3600},
Carl-Daniel Hailfingera0a6ae92009-06-15 12:10:57 +00004640 },
4641
4642 {
Russ Dill3cd5a122010-03-05 08:44:11 +00004643 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004644 .name = "EN25F40",
4645 .bustype = BUS_SPI,
4646 .manufacture_id = EON_ID_NOPREFIX,
4647 .model_id = EON_EN25F40,
4648 .total_size = 512,
4649 .page_size = 256,
4650 .feature_bits = FEATURE_WRSR_WREN,
4651 .tested = TEST_OK_PREW,
4652 .probe = probe_spi_rdid,
4653 .probe_timing = TIMING_ZERO,
4654 .block_erasers =
4655 {
4656 {
4657 .eraseblocks = { {4 * 1024, 128} },
4658 .block_erase = spi_block_erase_20,
4659 }, {
4660 .eraseblocks = { {64 * 1024, 8} },
4661 .block_erase = spi_block_erase_d8,
4662 }, {
4663 .eraseblocks = { {512 * 1024, 1} },
4664 .block_erase = spi_block_erase_60,
4665 }, {
4666 .eraseblocks = { {512 * 1024, 1} },
4667 .block_erase = spi_block_erase_c7,
4668 },
4669 },
4670 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4671 .unlock = spi_disable_blockprotect,
4672 .write = spi_chip_write_256,
4673 .read = spi_chip_read,
4674 .voltage = {2700, 3600},
4675 },
4676
4677 {
4678 .vendor = "Eon",
Stefan Taunerd932fd02012-09-06 17:37:16 +00004679 .name = "EN25F64",
4680 .bustype = BUS_SPI,
4681 .manufacture_id = EON_ID_NOPREFIX,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00004682 .model_id = EON_EN25F64,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004683 .total_size = 8192,
4684 .page_size = 256,
4685 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunere34e3e82013-01-01 00:06:51 +00004686 .tested = TEST_OK_PREW,
Stefan Taunerd932fd02012-09-06 17:37:16 +00004687 .probe = probe_spi_rdid,
4688 .probe_timing = TIMING_ZERO,
4689 .block_erasers =
4690 {
4691 {
4692 .eraseblocks = { {4 * 1024, 2048} },
4693 .block_erase = spi_block_erase_20,
4694 }, {
4695 .eraseblocks = { {64 * 1024, 128} },
4696 .block_erase = spi_block_erase_d8,
4697 }, {
4698 .eraseblocks = { {8 * 1024 * 1024, 1} },
4699 .block_erase = spi_block_erase_60,
4700 }, {
4701 .eraseblocks = { {8 * 1024 * 1024, 1} },
4702 .block_erase = spi_block_erase_c7,
4703 }
4704 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004705 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Stefan Taunerd932fd02012-09-06 17:37:16 +00004706 .unlock = spi_disable_blockprotect,
4707 .write = spi_chip_write_256,
4708 .read = spi_chip_read,
4709 .voltage = {2700, 3600},
4710 },
4711
4712 {
4713 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10004714 .name = "EN25F80",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00004715 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00004716 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004717 .model_id = EON_EN25F80,
David Hendricks6d715302011-07-24 22:21:57 +00004718 .total_size = 1024,
4719 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10004720 .feature_bits = FEATURE_WRSR_WREN,
4721 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00004722 .probe = probe_spi_rdid,
4723 .probe_timing = TIMING_ZERO,
4724 .block_erasers =
4725 {
4726 {
4727 .eraseblocks = { {4 * 1024, 256} },
4728 .block_erase = spi_block_erase_20,
4729 }, {
4730 .eraseblocks = { {64 * 1024, 16} },
4731 .block_erase = spi_block_erase_d8,
4732 }, {
4733 .eraseblocks = { {1024 * 1024, 1} },
4734 .block_erase = spi_block_erase_60,
4735 }, {
4736 .eraseblocks = { {1024 * 1024, 1} },
4737 .block_erase = spi_block_erase_c7,
4738 }
4739 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00004740 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00004741 .unlock = spi_disable_blockprotect,
4742 .write = spi_chip_write_256,
4743 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00004744 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00004745 },
4746
4747 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10004748 .vendor = "Eon",
4749 .name = "EN25P05",
4750 .bustype = BUS_SPI,
4751 .manufacture_id = EON_ID_NOPREFIX,
4752 .model_id = EON_EN25B05,
4753 .total_size = 64,
4754 .page_size = 256,
4755 .feature_bits = FEATURE_WRSR_WREN,
4756 .tested = TEST_UNTESTED,
4757 .probe = probe_spi_rdid,
4758 .probe_timing = TIMING_ZERO,
4759 .block_erasers =
4760 {
4761 {
4762 .eraseblocks = {
4763 {32 * 1024, 2} },
4764 .block_erase = spi_block_erase_d8,
4765 }, {
4766 .eraseblocks = { {64 * 1024, 1} },
4767 .block_erase = spi_block_erase_c7,
4768 }
4769 },
4770 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4771 .unlock = spi_disable_blockprotect,
4772 .write = spi_chip_write_256,
4773 .read = spi_chip_read, /* Fast read (0x0B) supported */
4774 .voltage = {2700, 3600},
4775 },
4776
4777 {
4778 .vendor = "Eon",
4779 .name = "EN25P10",
4780 .bustype = BUS_SPI,
4781 .manufacture_id = EON_ID_NOPREFIX,
4782 .model_id = EON_EN25B10,
4783 .total_size = 128,
4784 .page_size = 256,
4785 .feature_bits = FEATURE_WRSR_WREN,
4786 .tested = TEST_UNTESTED,
4787 .probe = probe_spi_rdid,
4788 .probe_timing = TIMING_ZERO,
4789 .block_erasers =
4790 {
4791 {
4792 .eraseblocks = { {32 * 1024, 4} },
4793 .block_erase = spi_block_erase_d8,
4794 }, {
4795 .eraseblocks = { {128 * 1024, 1} },
4796 .block_erase = spi_block_erase_c7,
4797 }
4798 },
4799 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4800 .unlock = spi_disable_blockprotect,
4801 .write = spi_chip_write_256,
4802 .read = spi_chip_read, /* Fast read (0x0B) supported */
4803 .voltage = {2700, 3600},
4804 },
4805
4806 {
4807 .vendor = "Eon",
4808 .name = "EN25P16",
4809 .bustype = BUS_SPI,
4810 .manufacture_id = EON_ID_NOPREFIX,
4811 .model_id = EON_EN25B16,
4812 .total_size = 2048,
4813 .page_size = 256,
4814 .feature_bits = FEATURE_WRSR_WREN,
4815 .tested = TEST_UNTESTED,
4816 .probe = probe_spi_rdid,
4817 .probe_timing = TIMING_ZERO,
4818 .block_erasers =
4819 {
4820 {
4821 .eraseblocks = { {64 * 1024, 32} },
4822 .block_erase = spi_block_erase_d8,
4823 }, {
4824 .eraseblocks = { {2 * 1024 * 1024, 1} },
4825 .block_erase = spi_block_erase_c7,
4826 }
4827 },
4828 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4829 .unlock = spi_disable_blockprotect,
4830 .write = spi_chip_write_256,
4831 .read = spi_chip_read, /* Fast read (0x0B) supported */
4832 .voltage = {2700, 3600},
4833 },
4834
4835 {
4836 .vendor = "Eon",
4837 .name = "EN25P20",
4838 .bustype = BUS_SPI,
4839 .manufacture_id = EON_ID_NOPREFIX,
4840 .model_id = EON_EN25B20,
4841 .total_size = 256,
4842 .page_size = 256,
4843 .feature_bits = FEATURE_WRSR_WREN,
4844 .tested = TEST_UNTESTED,
4845 .probe = probe_spi_rdid,
4846 .probe_timing = TIMING_ZERO,
4847 .block_erasers =
4848 {
4849 {
4850 .eraseblocks = { {64 * 1024, 4} },
4851 .block_erase = spi_block_erase_d8,
4852 }, {
4853 .eraseblocks = { {256 * 1024, 1} },
4854 .block_erase = spi_block_erase_c7,
4855 }
4856 },
4857 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4858 .unlock = spi_disable_blockprotect,
4859 .write = spi_chip_write_256,
4860 .read = spi_chip_read, /* Fast read (0x0B) supported */
4861 .voltage = {2700, 3600},
4862 },
4863
4864 {
4865 .vendor = "Eon",
4866 .name = "EN25P32", /* Uniform version of EN25B32 */
4867 .bustype = BUS_SPI,
4868 .manufacture_id = EON_ID_NOPREFIX,
4869 .model_id = EON_EN25B32,
4870 .total_size = 4096,
4871 .page_size = 256,
4872 /* OTP: 512B total; enter 0x3A */
4873 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4874 .tested = TEST_UNTESTED,
4875 .probe = probe_spi_rdid,
4876 .probe_timing = TIMING_ZERO,
4877 .block_erasers =
4878 {
4879 {
4880 .eraseblocks = { {64 * 1024, 64} },
4881 .block_erase = spi_block_erase_d8,
4882 }, {
4883 .eraseblocks = { {4 * 1024 * 1024, 1} },
4884 .block_erase = spi_block_erase_c7,
4885 }
4886 },
4887 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4888 .unlock = spi_disable_blockprotect,
4889 .write = spi_chip_write_256,
4890 .read = spi_chip_read, /* Fast read (0x0B) supported */
4891 .voltage = {2700, 3600},
4892 },
4893
4894 {
4895 .vendor = "Eon",
4896 .name = "EN25P40",
4897 .bustype = BUS_SPI,
4898 .manufacture_id = EON_ID_NOPREFIX,
4899 .model_id = EON_EN25B40,
4900 .total_size = 512,
4901 .page_size = 256,
4902 .feature_bits = FEATURE_WRSR_WREN,
4903 .tested = TEST_UNTESTED,
4904 .probe = probe_spi_rdid,
4905 .probe_timing = TIMING_ZERO,
4906 .block_erasers =
4907 {
4908 {
4909 .eraseblocks = { {64 * 1024, 8} },
4910 .block_erase = spi_block_erase_d8,
4911 }, {
4912 .eraseblocks = { {512 * 1024, 1} },
4913 .block_erase = spi_block_erase_c7,
4914 }
4915 },
4916 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4917 .unlock = spi_disable_blockprotect,
4918 .write = spi_chip_write_256,
4919 .read = spi_chip_read, /* Fast read (0x0B) supported */
4920 .voltage = {2700, 3600},
4921 },
4922
4923 {
4924 .vendor = "Eon",
4925 .name = "EN25P64",
4926 .bustype = BUS_SPI,
4927 .manufacture_id = EON_ID_NOPREFIX,
4928 .model_id = EON_EN25B64,
4929 .total_size = 8192,
4930 .page_size = 256,
4931 /* OTP: 512B total; enter 0x3A */
4932 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4933 .tested = TEST_UNTESTED,
4934 .probe = probe_spi_rdid,
4935 .probe_timing = TIMING_ZERO,
4936 .block_erasers =
4937 {
4938 {
4939 .eraseblocks = { {64 * 1024, 128} },
4940 .block_erase = spi_block_erase_d8,
4941 }, {
4942 .eraseblocks = { {8 * 1024 * 1024, 1} },
4943 .block_erase = spi_block_erase_c7,
4944 }
4945 },
4946 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4947 .unlock = spi_disable_blockprotect,
4948 .write = spi_chip_write_256,
4949 .read = spi_chip_read, /* Fast read (0x0B) supported */
4950 .voltage = {2700, 3600},
4951 },
4952
4953 {
4954 .vendor = "Eon",
4955 .name = "EN25P80",
4956 .bustype = BUS_SPI,
4957 .manufacture_id = EON_ID_NOPREFIX,
4958 .model_id = EON_EN25B80,
4959 .total_size = 1024,
4960 .page_size = 256,
4961 .feature_bits = FEATURE_WRSR_WREN,
4962 .tested = TEST_UNTESTED,
4963 .probe = probe_spi_rdid,
4964 .probe_timing = TIMING_ZERO,
4965 .block_erasers =
4966 {
4967 {
4968 .eraseblocks = { {64 * 1024, 16} },
4969 .block_erase = spi_block_erase_d8,
4970 }, {
4971 .eraseblocks = { {1024 * 1024, 1} },
4972 .block_erase = spi_block_erase_c7,
4973 }
4974 },
4975 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
4976 .unlock = spi_disable_blockprotect,
4977 .write = spi_chip_write_256,
4978 .read = spi_chip_read, /* Fast read (0x0B) supported */
4979 .voltage = {2700, 3600},
4980 },
4981
4982 {
4983 .vendor = "Eon",
4984 .name = "EN25Q128",
4985 .bustype = BUS_SPI,
4986 .manufacture_id = EON_ID_NOPREFIX,
4987 .model_id = EON_EN25Q128,
4988 .total_size = 16384,
4989 .page_size = 256,
4990 /* OTP: 512B total; enter 0x3A */
4991 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
4992 .tested = TEST_OK_PREW,
4993 .probe = probe_spi_rdid,
4994 .probe_timing = TIMING_ZERO,
4995 .block_erasers =
4996 {
4997 {
4998 .eraseblocks = { {4 * 1024, 4096} },
4999 .block_erase = spi_block_erase_20,
5000 }, {
5001 .eraseblocks = { {64 * 1024, 256} },
5002 .block_erase = spi_block_erase_d8,
5003 }, {
5004 .eraseblocks = { {16 * 1024 * 1024, 1} },
5005 .block_erase = spi_block_erase_60,
5006 }, {
5007 .eraseblocks = { {16 * 1024 * 1024, 1} },
5008 .block_erase = spi_block_erase_c7,
5009 }
5010 },
5011 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5012 .unlock = spi_disable_blockprotect,
5013 .write = spi_chip_write_256,
5014 .read = spi_chip_read,
5015 },
5016
5017 {
David Hendricks6d715302011-07-24 22:21:57 +00005018 /* Note: EN25D16 is an evil twin which shares the model ID
5019 but has different write protection capabilities */
5020 .vendor = "Eon",
5021 .name = "EN25Q16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005022 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005023 .manufacture_id = EON_ID_NOPREFIX,
5024 .model_id = EON_EN25Q16,
5025 .total_size = 2048,
5026 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005027 /* OTP: D16 512B/Q16 128B total; enter 0x3A */
5028 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks6d715302011-07-24 22:21:57 +00005029 .tested = TEST_UNTESTED,
5030 .probe = probe_spi_rdid,
5031 .probe_timing = TIMING_ZERO,
5032 .block_erasers =
5033 {
5034 {
5035 .eraseblocks = { {4 * 1024, 512} },
5036 .block_erase = spi_block_erase_20,
5037 }, {
5038 .eraseblocks = { {64 * 1024, 32} },
5039 .block_erase = spi_block_erase_d8,
5040 }, {
5041 /* not supported by Q16 version */
5042 .eraseblocks = { {64 * 1024, 32} },
5043 .block_erase = spi_block_erase_52,
5044 }, {
5045 .eraseblocks = { {2 * 1024 * 1024, 1} },
5046 .block_erase = spi_block_erase_60,
5047 }, {
5048 .eraseblocks = { {2 * 1024 * 1024, 1} },
5049 .block_erase = spi_block_erase_c7,
5050 }
5051 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005052 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005053 .unlock = spi_disable_blockprotect,
5054 .write = spi_chip_write_256,
5055 .read = spi_chip_read,
5056 .voltage = {2700, 3600},
5057 },
5058
5059 {
5060 .vendor = "Eon",
5061 .name = "EN25Q32(A/B)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005062 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005063 .manufacture_id = EON_ID_NOPREFIX,
5064 .model_id = EON_EN25Q32,
5065 .total_size = 4096,
5066 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005067 /* OTP: 512B total; enter 0x3A */
5068 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005069 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005070 .probe = probe_spi_rdid,
5071 .probe_timing = TIMING_ZERO,
5072 .block_erasers =
5073 {
5074 {
5075 .eraseblocks = { {4 * 1024, 1024} },
5076 .block_erase = spi_block_erase_20,
5077 }, {
5078 .eraseblocks = { {64 * 1024, 64} },
5079 .block_erase = spi_block_erase_d8,
5080 }, {
5081 .eraseblocks = { {4 * 1024 * 1024, 1} },
5082 .block_erase = spi_block_erase_60,
5083 }, {
5084 .eraseblocks = { {4 * 1024 * 1024, 1} },
5085 .block_erase = spi_block_erase_c7,
5086 }
5087 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005088 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005089 .unlock = spi_disable_blockprotect,
5090 .write = spi_chip_write_256,
5091 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005092 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005093 },
5094
5095 {
5096 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005097 .name = "EN25Q40",
5098 .bustype = BUS_SPI,
5099 .manufacture_id = EON_ID_NOPREFIX,
5100 .model_id = EON_EN25Q40,
5101 .total_size = 512,
5102 .page_size = 256,
5103 /* OTP: 256B total; enter 0x3A */
5104 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5105 .tested = TEST_UNTESTED,
5106 .probe = probe_spi_rdid,
5107 .probe_timing = TIMING_ZERO,
5108 .block_erasers =
5109 {
5110 {
5111 .eraseblocks = { {4 * 1024, 128} },
5112 .block_erase = spi_block_erase_20,
5113 }, {
5114 .eraseblocks = { {64 * 1024, 8} },
5115 .block_erase = spi_block_erase_d8,
5116 }, {
5117 .eraseblocks = { {512 * 1024, 1} },
5118 .block_erase = spi_block_erase_60,
5119 }, {
5120 .eraseblocks = { {512 * 1024, 1} },
5121 .block_erase = spi_block_erase_c7,
5122 }
5123 },
5124 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5125 .unlock = spi_disable_blockprotect,
5126 .write = spi_chip_write_256,
5127 .read = spi_chip_read,
5128 .voltage = {2700, 3600},
5129 },
5130
5131 {
5132 .vendor = "Eon",
David Hendricks6d715302011-07-24 22:21:57 +00005133 .name = "EN25Q64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005134 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005135 .manufacture_id = EON_ID_NOPREFIX,
5136 .model_id = EON_EN25Q64,
5137 .total_size = 8192,
5138 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005139 /* OTP: 512B total; enter 0x3A */
5140 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner352e50b2013-02-22 15:58:45 +00005141 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005142 .probe = probe_spi_rdid,
5143 .probe_timing = TIMING_ZERO,
5144 .block_erasers =
5145 {
5146 {
5147 .eraseblocks = { {4 * 1024, 2048} },
5148 .block_erase = spi_block_erase_20,
5149 }, {
5150 .eraseblocks = { {64 * 1024, 128} },
5151 .block_erase = spi_block_erase_d8,
5152 }, {
5153 .eraseblocks = { {8 * 1024 * 1024, 1} },
5154 .block_erase = spi_block_erase_60,
5155 }, {
5156 .eraseblocks = { {8 * 1024 * 1024, 1} },
5157 .block_erase = spi_block_erase_c7,
5158 }
5159 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00005160 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
David Hendricks6d715302011-07-24 22:21:57 +00005161 .unlock = spi_disable_blockprotect,
5162 .write = spi_chip_write_256,
5163 .read = spi_chip_read,
Stefan Taunereb582572012-09-21 12:52:50 +00005164 .voltage = {2700, 3600},
David Hendricks6d715302011-07-24 22:21:57 +00005165 },
5166
5167 {
5168 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005169 .name = "EN25Q80(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005170 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005171 .manufacture_id = EON_ID_NOPREFIX,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005172 .model_id = EON_EN25Q80,
5173 .total_size = 1024,
5174 .page_size = 256,
5175 /* OTP: 256B total; enter 0x3A */
5176 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5177 .tested = TEST_UNTESTED,
5178 .probe = probe_spi_rdid,
5179 .probe_timing = TIMING_ZERO,
5180 .block_erasers =
5181 {
5182 {
5183 .eraseblocks = { {4 * 1024, 256} },
5184 .block_erase = spi_block_erase_20,
5185 }, {
5186 .eraseblocks = { {64 * 1024, 16} },
5187 .block_erase = spi_block_erase_d8,
5188 }, {
5189 .eraseblocks = { {1024 * 1024, 1} },
5190 .block_erase = spi_block_erase_60,
5191 }, {
5192 .eraseblocks = { {1024 * 1024, 1} },
5193 .block_erase = spi_block_erase_c7,
5194 }
5195 },
5196 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
5197 .unlock = spi_disable_blockprotect,
5198 .write = spi_chip_write_256,
5199 .read = spi_chip_read,
5200 .voltage = {2700, 3600},
5201 },
5202
5203 {
5204 .vendor = "Eon",
5205 .name = "EN25QH128",
5206 .bustype = BUS_SPI,
5207 .manufacture_id = EON_ID_NOPREFIX,
5208 .model_id = EON_EN25QH128,
David Hendricks6d715302011-07-24 22:21:57 +00005209 .total_size = 16384,
5210 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005211 /* supports SFDP */
Daniel Lenski65922a32012-02-15 23:40:23 +00005212 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005213 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5214 .dummy_cycles =
5215 {
5216 .qpi_fast_read = 6,
5217 .qpi_fast_read_qio = 6,
5218 },
Tim Chenbfe149a2020-07-06 14:59:21 +08005219 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005220 .probe = probe_spi_rdid,
5221 .probe_timing = TIMING_ZERO,
5222 .block_erasers =
5223 {
5224 {
5225 .eraseblocks = { {4 * 1024, 4096} },
5226 .block_erase = spi_block_erase_20,
5227 }, {
5228 .eraseblocks = { {64 * 1024, 256} },
5229 .block_erase = spi_block_erase_d8,
5230 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005231 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005232 .block_erase = spi_block_erase_60,
5233 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005234 .eraseblocks = { { 16384 * 1024, 1} },
David Hendricks6d715302011-07-24 22:21:57 +00005235 .block_erase = spi_block_erase_c7,
5236 }
5237 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005238 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5239 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005240 .write = spi_chip_write_256,
5241 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005242 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005243 .reg_bits =
5244 {
5245 .srp = {STATUS1, 7, RW},
5246 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5247 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5248 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005249 .wp_write_cfg = spi_wp_write_cfg,
5250 .wp_read_cfg = spi_wp_read_cfg,
5251 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11005252 .decode_range = decode_range_spi25,
David Hendricks6d715302011-07-24 22:21:57 +00005253 },
5254
5255 {
5256 .vendor = "Eon",
5257 .name = "EN25QH16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005258 .bustype = BUS_SPI,
David Hendricks6d715302011-07-24 22:21:57 +00005259 .manufacture_id = EON_ID_NOPREFIX,
5260 .model_id = EON_EN25QH16,
5261 .total_size = 2048,
5262 .page_size = 256,
Daniel Lenski65922a32012-02-15 23:40:23 +00005263 /* supports SFDP */
5264 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005265 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5266 .dummy_cycles =
5267 {
5268 .qpi_fast_read = 6,
5269 .qpi_fast_read_qio = 6,
5270 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00005271 .tested = TEST_OK_PREW,
David Hendricks6d715302011-07-24 22:21:57 +00005272 .probe = probe_spi_rdid,
5273 .probe_timing = TIMING_ZERO,
5274 .block_erasers =
5275 {
5276 {
5277 .eraseblocks = { {4 * 1024, 512} },
5278 .block_erase = spi_block_erase_20,
5279 }, {
5280 .eraseblocks = { {64 * 1024, 32} },
5281 .block_erase = spi_block_erase_d8,
5282 }, {
5283 .eraseblocks = { {1024 * 2048, 1} },
5284 .block_erase = spi_block_erase_60,
5285 }, {
5286 .eraseblocks = { {1024 * 2048, 1} },
5287 .block_erase = spi_block_erase_c7,
5288 }
5289 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005290 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005291 .unlock = spi_disable_blockprotect_bp3_srwd,
David Hendricks6d715302011-07-24 22:21:57 +00005292 .write = spi_chip_write_256,
5293 .read = spi_chip_read,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005294 .voltage = {2700, 3600},
5295 },
5296
5297 {
5298 .vendor = "Eon",
5299 .name = "EN25QH32",
5300 .bustype = BUS_SPI,
5301 .manufacture_id = EON_ID_NOPREFIX,
5302 .model_id = EON_EN25QH32,
5303 .total_size = 4096,
5304 .page_size = 256,
5305 /* supports SFDP */
5306 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005307 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5308 .dummy_cycles =
5309 {
5310 .qpi_fast_read = 6,
5311 .qpi_fast_read_qio = 6,
5312 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005313 .tested = TEST_OK_PREW,
Stefan Tauner2cef9162012-05-14 01:51:46 +00005314 .probe = probe_spi_rdid,
5315 .probe_timing = TIMING_ZERO,
5316 .block_erasers =
5317 {
5318 {
5319 .eraseblocks = { {4 * 1024, 1024} },
5320 .block_erase = spi_block_erase_20,
5321 }, {
5322 .eraseblocks = { {64 * 1024, 64} },
5323 .block_erase = spi_block_erase_d8,
5324 }, {
5325 .eraseblocks = { {1024 * 4096, 1} },
5326 .block_erase = spi_block_erase_60,
5327 }, {
5328 .eraseblocks = { {1024 * 4096, 1} },
5329 .block_erase = spi_block_erase_c7,
5330 }
5331 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005332 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005333 .unlock = spi_disable_blockprotect_bp3_srwd,
5334 .write = spi_chip_write_256,
5335 .read = spi_chip_read,
5336 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005337 .reg_bits =
5338 {
5339 .srp = {STATUS1, 7, RW},
5340 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5341 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5342 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005343 .wp_write_cfg = spi_wp_write_cfg,
5344 .wp_read_cfg = spi_wp_read_cfg,
5345 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005346 .decode_range = decode_range_spi25,
5347 },
5348
5349 {
5350 .vendor = "Eon",
5351 .name = "EN25QH32B",
5352 .bustype = BUS_SPI,
5353 .manufacture_id = EON_ID_NOPREFIX,
5354 .model_id = EON_EN25QH32,
5355 .total_size = 4096,
5356 .page_size = 256,
5357 /* supports SFDP */
5358 /* OTP: 1536B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005359 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_38,
5360 .dummy_cycles =
5361 {
5362 .qpi_fast_read = 6,
5363 .qpi_fast_read_qio = 6,
5364 },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005365 .tested = TEST_OK_PREW,
5366 .probe = probe_spi_rdid,
5367 .probe_timing = TIMING_ZERO,
5368 .block_erasers =
5369 {
5370 {
5371 .eraseblocks = { {4 * 1024, 1024} },
5372 .block_erase = spi_block_erase_20,
5373 }, {
5374 .eraseblocks = { {32 * 1024, 128} },
5375 .block_erase = spi_block_erase_52,
5376 }, {
5377 .eraseblocks = { {64 * 1024, 64} },
5378 .block_erase = spi_block_erase_d8,
5379 }, {
5380 .eraseblocks = { {1024 * 4096, 1} },
5381 .block_erase = spi_block_erase_60,
5382 }, {
5383 .eraseblocks = { {1024 * 4096, 1} },
5384 .block_erase = spi_block_erase_c7,
5385 }
5386 },
5387 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5388 .unlock = spi_disable_blockprotect_bp3_srwd,
5389 .write = spi_chip_write_256,
5390 .read = spi_chip_read,
5391 .voltage = {2700, 3600},
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005392 },
5393
5394 {
5395 .vendor = "Eon",
5396 .name = "EN25QH64",
5397 .bustype = BUS_SPI,
5398 .manufacture_id = EON_ID_NOPREFIX,
5399 .model_id = EON_EN25QH64,
5400 .total_size = 8192,
5401 .page_size = 256,
5402 /* supports SFDP */
5403 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005404 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5405 .dummy_cycles =
5406 {
5407 .qpi_fast_read = 6,
5408 .qpi_fast_read_qio = 6,
5409 },
Stefan Tauner23e10b82016-01-23 16:16:49 +00005410 .tested = TEST_OK_PREW,
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005411 .probe = probe_spi_rdid,
5412 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005413 .block_erasers =
5414 {
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005415 {
5416 .eraseblocks = { {4 * 1024, 2048} },
5417 .block_erase = spi_block_erase_20,
5418 }, {
5419 .eraseblocks = { {64 * 1024, 128} },
5420 .block_erase = spi_block_erase_d8,
5421 }, {
5422 .eraseblocks = { { 8192 * 1024, 1} },
5423 .block_erase = spi_block_erase_60,
5424 }, {
5425 .eraseblocks = { { 8192 * 1024, 1} },
5426 .block_erase = spi_block_erase_c7,
5427 }
5428 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005429 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005430 .unlock = spi_disable_blockprotect_bp3_srwd,
5431 .write = spi_chip_write_256,
5432 .read = spi_chip_read,
5433 .voltage = {2700, 3600},
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005434 .reg_bits =
5435 {
5436 .srp = {STATUS1, 7, RW},
5437 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
5438 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
5439 },
Nico Huberaabb3e02023-01-13 00:22:30 +01005440 .wp_write_cfg = spi_wp_write_cfg,
5441 .wp_read_cfg = spi_wp_read_cfg,
5442 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005443 .decode_range = decode_range_spi25_64k_block,
5444 },
5445
5446 {
5447 .vendor = "Eon",
5448 .name = "EN25QH64A",
5449 .bustype = BUS_SPI,
5450 .manufacture_id = EON_ID_NOPREFIX,
5451 .model_id = EON_EN25QH64,
5452 .total_size = 8192,
5453 .page_size = 256,
5454 /* supports SFDP */
5455 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005456 /* Has a special, volatile status register 3 that is written with
5457 0xc0 like Set Read Parameters. Hence treating as QPI_SRP. */
5458 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP,
5459 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Sergii Dmytrukc6e8b1a2022-08-14 20:57:48 +03005460 .tested = TEST_OK_PREW,
5461 .probe = probe_spi_rdid,
5462 .probe_timing = TIMING_ZERO,
5463 .block_erasers =
5464 {
5465 {
5466 .eraseblocks = { {4 * 1024, 2048} },
5467 .block_erase = spi_block_erase_20,
5468 }, {
5469 .eraseblocks = { {32 * 1024, 256} },
5470 .block_erase = spi_block_erase_52,
5471 }, {
5472 .eraseblocks = { {64 * 1024, 128} },
5473 .block_erase = spi_block_erase_d8,
5474 }, {
5475 .eraseblocks = { { 8192 * 1024, 1} },
5476 .block_erase = spi_block_erase_60,
5477 }, {
5478 .eraseblocks = { { 8192 * 1024, 1} },
5479 .block_erase = spi_block_erase_c7,
5480 }
5481 },
5482 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
5483 .unlock = spi_disable_blockprotect_bp3_srwd,
5484 .write = spi_chip_write_256,
5485 .read = spi_chip_read,
5486 .voltage = {2700, 3600},
Nikolay Nikolaevc08542b2013-06-28 21:29:14 +00005487 },
5488
5489 {
5490 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005491 .name = "EN25S10",
5492 .bustype = BUS_SPI,
5493 .manufacture_id = EON_ID_NOPREFIX,
5494 .model_id = EON_EN25S10,
5495 .total_size = 128,
5496 .page_size = 256,
5497 /* OTP: 256B total; enter 0x3A */
5498 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5499 .tested = TEST_UNTESTED,
5500 .probe = probe_spi_rdid,
5501 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005502 .block_erasers =
5503 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005504 {
5505 .eraseblocks = { {4 * 1024, 32} },
5506 .block_erase = spi_block_erase_20,
5507 }, {
5508 .eraseblocks = { {32 * 1024, 4} },
5509 .block_erase = spi_block_erase_52,
5510 }, {
5511 .eraseblocks = { {128 * 1024, 1} },
5512 .block_erase = spi_block_erase_60,
5513 }, {
5514 .eraseblocks = { {128 * 1024, 1} },
5515 .block_erase = spi_block_erase_c7,
5516 }
5517 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00005518 .printlock = spi_prettyprint_status_register_bp2_srwd,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005519 .unlock = spi_disable_blockprotect,
5520 .write = spi_chip_write_256,
5521 .read = spi_chip_read,
5522 .voltage = {1650, 1950},
5523 },
5524
5525 {
5526 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005527 .name = "EN25S16",
5528 .bustype = BUS_SPI,
5529 .manufacture_id = EON_ID_NOPREFIX,
5530 .model_id = EON_EN25S16,
5531 .total_size = 2048,
5532 .page_size = 256,
5533 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005534 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5535 .dummy_cycles =
5536 {
5537 .qpi_fast_read = 6,
5538 .qpi_fast_read_qio = 6,
5539 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005540 .tested = TEST_UNTESTED,
5541 .probe = probe_spi_rdid,
5542 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005543 .block_erasers =
5544 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005545 {
5546 .eraseblocks = { {4 * 1024, 512} },
5547 .block_erase = spi_block_erase_20,
5548 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005549 .eraseblocks = { {32 * 1024, 64} },
5550 .block_erase = spi_block_erase_d8,
5551 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05305552 .eraseblocks = { {64 * 1024, 32} },
5553 .block_erase = spi_block_erase_52,
5554 }, {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005555 .eraseblocks = { {2048 * 1024, 1} },
5556 .block_erase = spi_block_erase_60,
5557 }, {
5558 .eraseblocks = { {2048 * 1024, 1} },
5559 .block_erase = spi_block_erase_c7,
5560 }
5561 },
5562 .printlock = spi_prettyprint_status_register_en25s_wp,
5563 .unlock = spi_disable_blockprotect_bp3_srwd,
5564 .write = spi_chip_write_256,
5565 .read = spi_chip_read,
5566 .voltage = {1650, 1950},
5567 },
5568
5569 {
5570 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005571 .name = "EN25S20",
5572 .bustype = BUS_SPI,
5573 .manufacture_id = EON_ID_NOPREFIX,
5574 .model_id = EON_EN25S20,
5575 .total_size = 256,
5576 .page_size = 256,
5577 /* OTP: 256B total; enter 0x3A */
5578 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5579 .tested = TEST_UNTESTED,
5580 .probe = probe_spi_rdid,
5581 .probe_timing = TIMING_ZERO,
5582 .block_erasers =
5583 {
5584 {
5585 .eraseblocks = { {4 * 1024, 64} },
5586 .block_erase = spi_block_erase_20,
5587 }, {
5588 .eraseblocks = { {64 * 1024, 4} },
5589 .block_erase = spi_block_erase_d8,
5590 }, {
5591 .eraseblocks = { {256 * 1024, 1} },
5592 .block_erase = spi_block_erase_60,
5593 }, {
5594 .eraseblocks = { {256 * 1024, 1} },
5595 .block_erase = spi_block_erase_c7,
5596 }
5597 },
5598 .printlock = spi_prettyprint_status_register_bp2_srwd,
5599 .unlock = spi_disable_blockprotect,
5600 .write = spi_chip_write_256,
5601 .read = spi_chip_read,
5602 .voltage = {1650, 1950},
5603 },
5604
5605 {
5606 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005607 .name = "EN25S32",
5608 .bustype = BUS_SPI,
5609 .manufacture_id = EON_ID_NOPREFIX,
5610 .model_id = EON_EN25S32,
5611 .total_size = 4096,
5612 .page_size = 256,
5613 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005614 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5615 .dummy_cycles =
5616 {
5617 .qpi_fast_read = 6,
5618 .qpi_fast_read_qio = 6,
5619 },
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005620 .tested = TEST_UNTESTED,
5621 .probe = probe_spi_rdid,
5622 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005623 .block_erasers =
5624 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005625 {
5626 .eraseblocks = { {4 * 1024, 1024} },
5627 .block_erase = spi_block_erase_20,
5628 }, {
5629 .eraseblocks = { {32 * 1024, 128} },
5630 .block_erase = spi_block_erase_52,
5631 }, {
5632 .eraseblocks = { {64 * 1024, 64} },
5633 .block_erase = spi_block_erase_d8,
5634 }, {
5635 .eraseblocks = { {4096 * 1024, 1} },
5636 .block_erase = spi_block_erase_60,
5637 }, {
5638 .eraseblocks = { {4096 * 1024, 1} },
5639 .block_erase = spi_block_erase_c7,
5640 }
5641 },
5642 .printlock = spi_prettyprint_status_register_en25s_wp,
5643 .unlock = spi_disable_blockprotect_bp3_srwd,
5644 .write = spi_chip_write_256,
5645 .read = spi_chip_read,
5646 .voltage = {1650, 1950},
5647 },
5648
5649 {
5650 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005651 .name = "EN25S40",
5652 .bustype = BUS_SPI,
5653 .manufacture_id = EON_ID_NOPREFIX,
5654 .model_id = EON_EN25S40,
5655 .total_size = 512,
5656 .page_size = 256,
5657 /* OTP: 256B total; enter 0x3A */
5658 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5659 .tested = TEST_OK_PREW,
5660 .probe = probe_spi_rdid,
5661 .probe_timing = TIMING_ZERO,
5662 .block_erasers =
5663 {
5664 {
5665 .eraseblocks = { {4 * 1024, 128} },
5666 .block_erase = spi_block_erase_20,
5667 }, {
5668 .eraseblocks = { {64 * 1024, 8} },
5669 .block_erase = spi_block_erase_d8,
5670 }, {
5671 .eraseblocks = { {512 * 1024, 1} },
5672 .block_erase = spi_block_erase_60,
5673 }, {
5674 .eraseblocks = { {512 * 1024, 1} },
5675 .block_erase = spi_block_erase_c7,
5676 }
5677 },
5678 .printlock = spi_prettyprint_status_register_bp2_srwd,
5679 .unlock = spi_disable_blockprotect,
5680 .write = spi_chip_write_256,
5681 .read = spi_chip_read,
5682 .voltage = {1650, 1950},
5683 },
5684
5685 {
5686 .vendor = "Eon",
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005687 .name = "EN25S64",
5688 .bustype = BUS_SPI,
5689 .manufacture_id = EON_ID_NOPREFIX,
5690 .model_id = EON_EN25S64,
5691 .total_size = 8192,
5692 .page_size = 256,
5693 /* OTP: 512B total; enter 0x3A */
Nico Huber1412d9f2024-01-06 18:25:49 +01005694 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | (FEATURE_QPI_38 & ~FEATURE_FAST_READ_QOUT),
5695 .dummy_cycles =
5696 {
5697 .qpi_fast_read = 6,
5698 .qpi_fast_read_qio = 6,
5699 },
Nikolai Artemievdf889fa2021-03-23 17:10:45 +11005700 .tested = TEST_OK_PREW,
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005701 .probe = probe_spi_rdid,
5702 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10005703 .block_erasers =
5704 {
Nikolay Nikolaevd0e3ea12013-06-28 21:29:08 +00005705 {
5706 .eraseblocks = { {4 * 1024, 2048} },
5707 .block_erase = spi_block_erase_20,
5708 }, {
5709 .eraseblocks = { {64 * 1024, 128} },
5710 .block_erase = spi_block_erase_d8,
5711 }, {
5712 .eraseblocks = { {8192 * 1024, 1} },
5713 .block_erase = spi_block_erase_60,
5714 }, {
5715 .eraseblocks = { {8192 * 1024, 1} },
5716 .block_erase = spi_block_erase_c7,
5717 }
5718 },
5719 .printlock = spi_prettyprint_status_register_en25s_wp,
5720 .unlock = spi_disable_blockprotect_bp3_srwd,
5721 .write = spi_chip_write_256,
5722 .read = spi_chip_read,
5723 .voltage = {1650, 1950},
5724 },
5725
5726 {
5727 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005728 .name = "EN25S80",
5729 .bustype = BUS_SPI,
5730 .manufacture_id = EON_ID_NOPREFIX,
5731 .model_id = EON_EN25S80,
5732 .total_size = 1024,
5733 .page_size = 256,
5734 /* OTP: 256B total; enter 0x3A */
5735 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
5736 .tested = TEST_UNTESTED,
5737 .probe = probe_spi_rdid,
5738 .probe_timing = TIMING_ZERO,
Russ Dill3cd5a122010-03-05 08:44:11 +00005739 .block_erasers =
5740 {
5741 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005742 .eraseblocks = { {4 * 1024, 256} },
5743 .block_erase = spi_block_erase_20,
5744 }, {
5745 .eraseblocks = { {64 * 1024, 16} },
5746 .block_erase = spi_block_erase_d8,
5747 }, {
5748 .eraseblocks = { {1024 * 1024, 1} },
5749 .block_erase = spi_block_erase_60,
5750 }, {
5751 .eraseblocks = { {1024 * 1024, 1} },
5752 .block_erase = spi_block_erase_c7,
5753 }
Russ Dill3cd5a122010-03-05 08:44:11 +00005754 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005755 .printlock = spi_prettyprint_status_register_bp2_srwd,
5756 .unlock = spi_disable_blockprotect,
5757 .write = spi_chip_write_256,
5758 .read = spi_chip_read,
5759 .voltage = {1650, 1950},
Russ Dill3cd5a122010-03-05 08:44:11 +00005760 },
5761
5762 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005763 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005764 .name = "EN29F002(A)(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005765 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005766 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005767 .model_id = EON_EN29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005768 .total_size = 256,
5769 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005770 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Alan Green4362e622019-08-26 15:02:12 +10005771 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005772 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005773 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005774 .block_erasers =
5775 {
5776 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005777 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005778 {16 * 1024, 1},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005779 {8 * 1024, 2},
5780 {32 * 1024, 1},
5781 {64 * 1024, 3},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005782 },
5783 .block_erase = erase_sector_jedec,
5784 }, {
5785 .eraseblocks = { {256 * 1024, 1} },
5786 .block_erase = erase_chip_block_jedec,
5787 },
5788 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005789 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005790 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005791 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005792 .prepare_access = prepare_memory_access,
5793 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005794 },
5795
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005796 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +00005797 .vendor = "Eon",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005798 .name = "EN29F002(A)(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00005799 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005800 .manufacture_id = EON_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00005801 .model_id = EON_EN29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005802 .total_size = 256,
5803 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +00005804 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +00005805 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005806 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00005807 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00005808 .block_erasers =
5809 {
5810 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005811 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00005812 {64 * 1024, 3},
Michael Karchere3cb0a12010-03-13 23:47:09 +00005813 {32 * 1024, 1},
5814 {8 * 1024, 2},
5815 {16 * 1024, 1},
Sean Nelson6b11ad22009-12-23 17:05:59 +00005816 },
5817 .block_erase = erase_sector_jedec,
5818 }, {
5819 .eraseblocks = { {256 * 1024, 1} },
5820 .block_erase = erase_chip_block_jedec,
5821 },
5822 },
Michael Karcher1c296ca2009-11-27 17:49:42 +00005823 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00005824 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00005825 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005826 .prepare_access = prepare_memory_access,
5827 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00005828 },
5829
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00005830 {
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005831 .vendor = "Eon",
Alan Green1f9cc7d2019-07-01 11:10:45 +10005832 .name = "EN29F010",
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005833 .bustype = BUS_PARALLEL,
5834 .manufacture_id = EON_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005835 .model_id = EON_EN29F010,
5836 .total_size = 128,
5837 .page_size = 128,
5838 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
5839 .tested = TEST_OK_PRE,
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005840 .probe = probe_jedec,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005841 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005842 .block_erasers =
5843 {
5844 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005845 .eraseblocks = { {16 * 1024, 8} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005846 .block_erase = erase_sector_jedec,
5847 },
5848 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005849 .eraseblocks = { {128 * 1024, 1} },
Denis 'GNUtoo' Cariklib5f9d5c2014-12-07 21:57:53 +00005850 .block_erase = erase_chip_block_jedec,
5851 },
5852 },
5853 .write = write_jedec_1,
5854 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005855 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01005856 .prepare_access = prepare_memory_access,
5857 .finish_access = finish_memory_access,
Rudolf Marek47eff6b2012-04-14 22:51:40 +00005858 },
5859
5860 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005861 .vendor = "Eon",
5862 .name = "EN29GL064(A)B",
5863 .bustype = BUS_PARALLEL,
5864 .manufacture_id = EON_ID,
5865 .model_id = EON_EN29GL064B,
5866 .total_size = 8192,
5867 .page_size = 128 * 1024, /* actual page size is 16 */
5868 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5869 .tested = TEST_UNTESTED,
5870 .probe = probe_jedec_29gl,
5871 .probe_timing = TIMING_ZERO,
5872 .block_erasers =
5873 {
5874 {
5875 .eraseblocks = {
5876 {8 * 1024, 8},
5877 {64 * 1024, 127},
5878 },
5879 .block_erase = erase_sector_jedec,
5880 }, {
5881 .eraseblocks = { {8 * 1024 * 1024, 1} },
5882 .block_erase = erase_chip_block_jedec,
5883 },
5884 },
5885 .write = write_jedec_1,
5886 .read = read_memmapped,
5887 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005888 .prepare_access = prepare_memory_access,
5889 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005890 },
5891
5892 {
5893 .vendor = "Eon",
5894 .name = "EN29GL064(A)T",
5895 .bustype = BUS_PARALLEL,
5896 .manufacture_id = EON_ID,
5897 .model_id = EON_EN29GL064T,
5898 .total_size = 8192,
5899 .page_size = 128 * 1024, /* actual page size is 16 */
5900 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5901 .tested = TEST_UNTESTED,
5902 .probe = probe_jedec_29gl,
5903 .probe_timing = TIMING_ZERO,
5904 .block_erasers =
5905 {
5906 {
5907 .eraseblocks = {
5908 {64 * 1024, 127},
5909 {8 * 1024, 8},
5910 },
5911 .block_erase = erase_sector_jedec,
5912 }, {
5913 .eraseblocks = { {8 * 1024 * 1024, 1} },
5914 .block_erase = erase_chip_block_jedec,
5915 },
5916 },
5917 .write = write_jedec_1,
5918 .read = read_memmapped,
5919 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005920 .prepare_access = prepare_memory_access,
5921 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005922 },
5923
5924 {
5925 .vendor = "Eon",
5926 .name = "EN29GL064H/L",
5927 .bustype = BUS_PARALLEL,
5928 .manufacture_id = EON_ID,
5929 .model_id = EON_EN29GL064HL,
5930 .total_size = 8192,
5931 .page_size = 128 * 1024, /* actual page size is 16 */
5932 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5933 .tested = TEST_UNTESTED,
5934 .probe = probe_jedec_29gl,
5935 .probe_timing = TIMING_ZERO,
5936 .block_erasers =
5937 {
5938 {
5939 .eraseblocks = { {64 * 1024, 128} },
5940 .block_erase = erase_sector_jedec,
5941 }, {
5942 .eraseblocks = { {8 * 1024 * 1024, 1} },
5943 .block_erase = erase_chip_block_jedec,
5944 },
5945 },
5946 .write = write_jedec_1,
5947 .read = read_memmapped,
5948 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005949 .prepare_access = prepare_memory_access,
5950 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005951 },
5952
5953 {
5954 .vendor = "Eon",
5955 .name = "EN29GL128",
5956 .bustype = BUS_PARALLEL,
5957 .manufacture_id = EON_ID,
5958 .model_id = EON_EN29GL128HL,
5959 .total_size = 16384,
5960 .page_size = 128 * 1024, /* actual page size is 16 */
5961 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
5962 .tested = TEST_UNTESTED,
5963 .probe = probe_jedec_29gl,
5964 .probe_timing = TIMING_ZERO,
5965 .block_erasers =
5966 {
5967 {
5968 .eraseblocks = { {128 * 1024, 128} },
5969 .block_erase = erase_sector_jedec,
5970 }, {
5971 .eraseblocks = { {16 * 1024 * 1024, 1} },
5972 .block_erase = erase_chip_block_jedec,
5973 },
5974 },
5975 .write = write_jedec_1,
5976 .read = read_memmapped,
5977 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01005978 .prepare_access = prepare_memory_access,
5979 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00005980 },
5981
5982 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10005983 .vendor = "Eon",
5984 .name = "EN29LV040(A)",
5985 .bustype = BUS_PARALLEL,
5986 .manufacture_id = EON_ID,
5987 .model_id = EON_EN29LV040,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005988 .total_size = 512,
Alan Green1f9cc7d2019-07-01 11:10:45 +10005989 .page_size = 4 * 1024,
5990 .tested = TEST_OK_PREW,
5991 .probe = probe_jedec,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00005992 .probe_timing = TIMING_ZERO,
5993 .block_erasers =
5994 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00005995 {
5996 .eraseblocks = { {64 * 1024, 8} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10005997 .block_erase = erase_sector_jedec,
5998 },
5999 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006000 .eraseblocks = { {512 * 1024, 1} },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006001 .block_erase = erase_chip_block_jedec,
6002 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006003 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006004 .write = write_jedec_1,
6005 .read = read_memmapped,
6006 .voltage = {3000, 3600}, /* 3.0-3.6V for type -45R and 55R, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006007 .prepare_access = prepare_memory_access,
6008 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006009 },
6010
6011 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006012 .vendor = "Eon",
6013 .name = "EN29LV640B",
6014 .bustype = BUS_PARALLEL,
6015 .manufacture_id = EON_ID,
6016 .model_id = EON_EN29LV640B,
6017 .total_size = 8192,
6018 .page_size = 8192,
6019 .feature_bits = FEATURE_ADDR_SHIFTED,
6020 .tested = TEST_OK_PREW,
6021 .probe = probe_en29lv640b,
6022 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006023 .block_erasers =
6024 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00006025 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006026 .eraseblocks = {
6027 {8 * 1024, 8},
6028 {64 * 1024, 127},
6029 },
6030 .block_erase = erase_block_jedec,
Stefan Tauner0be072c2016-03-13 15:16:30 +00006031 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006032 .eraseblocks = { {8 * 1024 * 1024, 1} },
6033 .block_erase = erase_chip_block_jedec,
6034 },
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006035 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006036 .write = write_en29lv640b,
6037 .read = read_memmapped,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006038 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01006039 .prepare_access = prepare_memory_access,
6040 .finish_access = finish_memory_access,
Hatim Kanchwalab3d7fba2016-02-01 00:27:25 +00006041 },
6042
6043 {
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006044 .vendor = "Fudan",
6045 .name = "FM25F005",
6046 .bustype = BUS_SPI,
6047 .manufacture_id = FUDAN_ID_NOPREFIX,
6048 .model_id = FUDAN_FM25F005,
6049 .total_size = 64,
6050 .page_size = 256,
6051 /* OTP: 256B total; enter 0x3A */
6052 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6053 .tested = TEST_UNTESTED,
6054 .probe = probe_spi_rdid,
6055 .probe_timing = TIMING_ZERO,
6056 .block_erasers = {
6057 {
6058 .eraseblocks = { {4 * 1024, 16} },
6059 .block_erase = spi_block_erase_20,
6060 }, {
6061 .eraseblocks = { {32 * 1024, 2} },
6062 .block_erase = spi_block_erase_52,
6063 }, {
6064 .eraseblocks = { {64 * 1024, 1} },
6065 .block_erase = spi_block_erase_d8,
6066 }, {
6067 .eraseblocks = { {64 * 1024, 1} },
6068 .block_erase = spi_block_erase_60,
6069 }, {
6070 .eraseblocks = { {64 * 1024, 1} },
6071 .block_erase = spi_block_erase_c7,
6072 }
6073 },
6074 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6075 .unlock = spi_disable_blockprotect_bp2_srwd,
6076 .write = spi_chip_write_256,
6077 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6078 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6079 },
6080
6081 {
6082 .vendor = "Fudan",
6083 .name = "FM25F01",
6084 .bustype = BUS_SPI,
6085 .manufacture_id = FUDAN_ID_NOPREFIX,
6086 .model_id = FUDAN_FM25F01,
6087 .total_size = 128,
6088 .page_size = 256,
6089 /* OTP: 256B total; enter 0x3A */
6090 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6091 .tested = TEST_UNTESTED,
6092 .probe = probe_spi_rdid,
6093 .probe_timing = TIMING_ZERO,
6094 .block_erasers = {
6095 {
6096 .eraseblocks = { {4 * 1024, 32} },
6097 .block_erase = spi_block_erase_20,
6098 }, {
6099 .eraseblocks = { {32 * 1024, 4} },
6100 .block_erase = spi_block_erase_52,
6101 }, {
6102 .eraseblocks = { {64 * 1024, 2} },
6103 .block_erase = spi_block_erase_d8,
6104 }, {
6105 .eraseblocks = { {128 * 1024, 1} },
6106 .block_erase = spi_block_erase_60,
6107 }, {
6108 .eraseblocks = { {128 * 1024, 1} },
6109 .block_erase = spi_block_erase_c7,
6110 }
6111 },
6112 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6113 .unlock = spi_disable_blockprotect_bp2_srwd,
6114 .write = spi_chip_write_256,
6115 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6116 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6117 },
6118
6119 {
6120 .vendor = "Fudan",
6121 .name = "FM25F02(A)",
6122 .bustype = BUS_SPI,
6123 .manufacture_id = FUDAN_ID_NOPREFIX,
6124 .model_id = FUDAN_FM25F02,
6125 .total_size = 256,
6126 .page_size = 256,
6127 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6128 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6129 .tested = TEST_UNTESTED,
6130 .probe = probe_spi_rdid,
6131 .probe_timing = TIMING_ZERO,
6132 .block_erasers = {
6133 {
6134 .eraseblocks = { {4 * 1024, 64} },
6135 .block_erase = spi_block_erase_20,
6136 }, {
6137 .eraseblocks = { {32 * 1024, 8} },
6138 .block_erase = spi_block_erase_52,
6139 }, {
6140 .eraseblocks = { {64 * 1024, 4} },
6141 .block_erase = spi_block_erase_d8,
6142 }, {
6143 .eraseblocks = { {1024 * 256, 1} },
6144 .block_erase = spi_block_erase_60,
6145 }, {
6146 .eraseblocks = { {1024 * 256, 1} },
6147 .block_erase = spi_block_erase_c7,
6148 },
6149 },
6150 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6151 .unlock = spi_disable_blockprotect_bp2_srwd,
6152 .write = spi_chip_write_256,
6153 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6154 .voltage = {2700, 3600}, /* 2.3-2.7V acceptable results in lower performance */
6155 },
6156
6157 {
6158 .vendor = "Fudan",
6159 .name = "FM25F04(A)",
6160 .bustype = BUS_SPI,
6161 .manufacture_id = FUDAN_ID_NOPREFIX,
6162 .model_id = FUDAN_FM25F04,
6163 .total_size = 512,
6164 .page_size = 256,
6165 /* OTP: 256B total; enter 0x3A, (A version only:) read ID 0x4B */
6166 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
6167 .tested = TEST_UNTESTED,
6168 .probe = probe_spi_rdid,
6169 .probe_timing = TIMING_ZERO,
6170 .block_erasers = {
6171 {
6172 .eraseblocks = { {4 * 1024, 128} },
6173 .block_erase = spi_block_erase_20,
6174 }, {
6175 .eraseblocks = { {32 * 1024, 16} },
6176 .block_erase = spi_block_erase_52,
6177 }, {
6178 .eraseblocks = { {64 * 1024, 8} },
6179 .block_erase = spi_block_erase_d8,
6180 }, {
6181 .eraseblocks = { {1024 * 512, 1} },
6182 .block_erase = spi_block_erase_60,
6183 }, {
6184 .eraseblocks = { {1024 * 512, 1} },
6185 .block_erase = spi_block_erase_c7,
6186 },
6187 },
6188 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
6189 .unlock = spi_disable_blockprotect_bp2_srwd,
6190 .write = spi_chip_write_256,
6191 .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
6192 .voltage = {2700, 3600},
6193 },
6194
6195 {
6196 .vendor = "Fudan",
6197 .name = "FM25Q08",
6198 .bustype = BUS_SPI,
6199 .manufacture_id = FUDAN_ID_NOPREFIX,
6200 .model_id = FUDAN_FM25Q08,
6201 .total_size = 1024,
6202 .page_size = 256,
6203 /* supports SFDP */
6204 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006205 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6206 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006207 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006208 .tested = TEST_UNTESTED,
6209 .probe = probe_spi_rdid,
6210 .probe_timing = TIMING_ZERO,
6211 .block_erasers = {
6212 {
6213 .eraseblocks = { {4 * 1024, 256} },
6214 .block_erase = spi_block_erase_20,
6215 }, {
6216 .eraseblocks = { {32 * 1024, 32} },
6217 .block_erase = spi_block_erase_52,
6218 }, {
6219 .eraseblocks = { {64 * 1024, 16} },
6220 .block_erase = spi_block_erase_d8,
6221 }, {
6222 .eraseblocks = { {1024 * 1024, 1} },
6223 .block_erase = spi_block_erase_60,
6224 }, {
6225 .eraseblocks = { {1024 * 1024, 1} },
6226 .block_erase = spi_block_erase_c7,
6227 },
6228 },
Nico Huber226bb872024-04-09 23:30:34 +02006229 .reg_bits =
6230 {
6231 .qe = {STATUS2, 1, RW},
6232 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006233 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6234 .unlock = spi_disable_blockprotect_bp2_srwd,
6235 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006236 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006237 .voltage = {2700, 3600},
6238 },
6239
6240 {
6241 .vendor = "Fudan",
6242 .name = "FM25Q16",
6243 .bustype = BUS_SPI,
6244 .manufacture_id = FUDAN_ID_NOPREFIX,
6245 .model_id = FUDAN_FM25Q16,
6246 .total_size = 2048,
6247 .page_size = 256,
6248 /* supports SFDP */
6249 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006250 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6251 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006252 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006253 .tested = TEST_UNTESTED,
6254 .probe = probe_spi_rdid,
6255 .probe_timing = TIMING_ZERO,
6256 .block_erasers = {
6257 {
6258 .eraseblocks = { {4 * 1024, 512} },
6259 .block_erase = spi_block_erase_20,
6260 }, {
6261 .eraseblocks = { {32 * 1024, 64} },
6262 .block_erase = spi_block_erase_52,
6263 }, {
6264 .eraseblocks = { {64 * 1024, 32} },
6265 .block_erase = spi_block_erase_d8,
6266 }, {
6267 .eraseblocks = { {2 * 1024 * 1024, 1} },
6268 .block_erase = spi_block_erase_60,
6269 }, {
6270 .eraseblocks = { {2 * 1024 * 1024, 1} },
6271 .block_erase = spi_block_erase_c7,
6272 }
6273 },
Nico Huber226bb872024-04-09 23:30:34 +02006274 .reg_bits =
6275 {
6276 .qe = {STATUS2, 1, RW},
6277 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006278 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6279 .unlock = spi_disable_blockprotect_bp2_srwd,
6280 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006281 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006282 .voltage = {2700, 3600},
6283 },
6284
6285 {
6286 .vendor = "Fudan",
6287 .name = "FM25Q32",
6288 .bustype = BUS_SPI,
6289 .manufacture_id = FUDAN_ID_NOPREFIX,
6290 .model_id = FUDAN_FM25Q32,
6291 .total_size = 4096,
6292 .page_size = 256,
6293 /* supports SFDP */
6294 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber226bb872024-04-09 23:30:34 +02006295 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 |
6296 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +01006297 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006298 .tested = TEST_UNTESTED,
6299 .probe = probe_spi_rdid,
6300 .probe_timing = TIMING_ZERO,
6301 .block_erasers = {
6302 {
6303 .eraseblocks = { {4 * 1024, 1024} },
6304 .block_erase = spi_block_erase_20,
6305 }, {
6306 .eraseblocks = { {32 * 1024, 128} },
6307 .block_erase = spi_block_erase_52,
6308 }, {
6309 .eraseblocks = { {64 * 1024, 64} },
6310 .block_erase = spi_block_erase_d8,
6311 }, {
6312 .eraseblocks = { {4 * 1024 * 1024, 1} },
6313 .block_erase = spi_block_erase_60,
6314 }, {
6315 .eraseblocks = { {4 * 1024 * 1024, 1} },
6316 .block_erase = spi_block_erase_c7,
6317 },
6318 },
Nico Huber226bb872024-04-09 23:30:34 +02006319 .reg_bits =
6320 {
6321 .qe = {STATUS2, 1, RW},
6322 },
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006323 .printlock = spi_prettyprint_status_register_bp2_tb_bpl, /* bit6 selects size of protected blocks; TODO: SR2 */
6324 .unlock = spi_disable_blockprotect_bp2_srwd,
6325 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006326 .read = spi_chip_read,
Jakob Petersson0cf3e122019-02-18 01:55:43 +01006327 .voltage = {2700, 3600},
6328 },
6329
6330 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006331 .vendor = "Fujitsu",
6332 .name = "MBM29F004BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006333 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006334 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006335 .model_id = FUJITSU_MBM29F004BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006336 .total_size = 512,
6337 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006338 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006339 .tested = TEST_UNTESTED,
6340 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006341 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006342 .block_erasers =
6343 {
6344 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006345 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006346 {16 * 1024, 1},
6347 {8 * 1024, 2},
6348 {32 * 1024, 1},
6349 {64 * 1024, 7},
6350 },
Sean Nelson35727f72010-01-28 23:55:12 +00006351 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006352 }, {
6353 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006354 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006355 },
6356 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006357 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006358 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006359 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006360 .prepare_access = prepare_memory_access,
6361 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006362 },
6363
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006364 {
6365 .vendor = "Fujitsu",
6366 .name = "MBM29F004TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006367 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006368 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006369 .model_id = FUJITSU_MBM29F004TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006370 .total_size = 512,
6371 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +00006372 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006373 .tested = TEST_UNTESTED,
6374 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +00006375 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson6b11ad22009-12-23 17:05:59 +00006376 .block_erasers =
6377 {
6378 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006379 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006380 {64 * 1024, 7},
6381 {32 * 1024, 1},
6382 {8 * 1024, 2},
6383 {16 * 1024, 1},
6384 },
Sean Nelson35727f72010-01-28 23:55:12 +00006385 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006386 }, {
6387 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +00006388 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006389 },
6390 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006391 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006392 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00006393 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01006394 .prepare_access = prepare_memory_access,
6395 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006396 },
6397
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006398 {
Sean Nelson35727f72010-01-28 23:55:12 +00006399 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006400 .vendor = "Fujitsu",
6401 .name = "MBM29F400BC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006402 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006403 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006404 .model_id = FUJITSU_MBM29F400BC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006405 .total_size = 512,
6406 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006407 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +00006408 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006409 .probe = probe_jedec,
6410 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006411 .block_erasers =
6412 {
6413 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006414 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006415 {16 * 1024, 1},
6416 {8 * 1024, 2},
6417 {32 * 1024, 1},
6418 {64 * 1024, 7},
6419 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006420 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006421 }, {
6422 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006423 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006424 },
6425 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006426 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006427 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006428 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006429 .prepare_access = prepare_memory_access,
6430 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006431 },
6432
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006433 {
6434 .vendor = "Fujitsu",
6435 .name = "MBM29F400TC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00006436 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006437 .manufacture_id = FUJITSU_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00006438 .model_id = FUJITSU_MBM29F400TC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006439 .total_size = 512,
6440 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006441 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006442 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006443 .probe = probe_jedec,
6444 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson6b11ad22009-12-23 17:05:59 +00006445 .block_erasers =
6446 {
6447 {
Stefan Tauner0554ca52013-07-25 22:54:25 +00006448 .eraseblocks = {
Sean Nelson6b11ad22009-12-23 17:05:59 +00006449 {64 * 1024, 7},
6450 {32 * 1024, 1},
6451 {8 * 1024, 2},
6452 {16 * 1024, 1},
6453 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006454 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006455 }, {
6456 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006457 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +00006458 },
6459 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006460 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +00006461 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00006462 .voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01006463 .prepare_access = prepare_memory_access,
6464 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +00006465 },
6466
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00006467 {
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006468 .vendor = "Fujitsu",
6469 .name = "MBM29LV160BE",
6470 .bustype = BUS_PARALLEL,
6471 .manufacture_id = FUJITSU_ID,
6472 .model_id = FUJITSU_MBM29LV160BE,
6473 .total_size = 2 * 1024,
6474 .page_size = 0,
6475 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6476 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006477 .probe = probe_jedec,
6478 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006479 .block_erasers =
6480 {
6481 {
6482 .eraseblocks = {
6483 {16 * 1024, 1},
6484 {8 * 1024, 2},
6485 {32 * 1024, 1},
6486 {64 * 1024, 31},
6487 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006488 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006489 }, {
6490 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006491 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006492 },
6493 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006494 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006495 .read = read_memmapped,
6496 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006497 .prepare_access = prepare_memory_access,
6498 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006499 },
6500
6501 {
6502 .vendor = "Fujitsu",
6503 .name = "MBM29LV160TE",
6504 .bustype = BUS_PARALLEL,
6505 .manufacture_id = FUJITSU_ID,
6506 .model_id = FUJITSU_MBM29LV160TE,
6507 .total_size = 2 * 1024,
6508 .page_size = 0,
6509 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
6510 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006511 .probe = probe_jedec,
6512 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006513 .block_erasers =
6514 {
6515 {
6516 .eraseblocks = {
6517 {64 * 1024, 31},
6518 {32 * 1024, 1},
6519 {8 * 1024, 2},
6520 {16 * 1024, 1},
6521 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006522 .block_erase = erase_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006523 }, {
6524 .eraseblocks = { {2048 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006525 .block_erase = erase_chip_block_jedec,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006526 },
6527 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +00006528 .write = write_jedec_1, /* Supports a fast mode too */
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006529 .read = read_memmapped,
6530 .voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
Nico Huber9eec4072023-01-12 01:17:30 +01006531 .prepare_access = prepare_memory_access,
6532 .finish_access = finish_memory_access,
Stefan Tauner6db8bad2013-08-25 13:31:43 +00006533 },
6534
6535 {
Justin Chevrier1525b2a2012-04-14 21:59:23 +00006536 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006537 .name = "GD25B128B/GD25Q128B",
Roman Titov95edc892015-04-03 21:29:04 +00006538 .bustype = BUS_SPI,
6539 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006540 .model_id = GIGADEVICE_GD25Q128,
6541 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006542 .page_size = 256,
6543 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006544 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006545 .tested = TEST_OK_PREW,
Roman Titov95edc892015-04-03 21:29:04 +00006546 .probe = probe_spi_rdid,
6547 .probe_timing = TIMING_ZERO,
6548 .block_erasers =
6549 {
6550 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006551 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006552 .block_erase = spi_block_erase_20,
6553 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006554 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006555 .block_erase = spi_block_erase_52,
6556 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006557 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006558 .block_erase = spi_block_erase_d8,
6559 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006560 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006561 .block_erase = spi_block_erase_60,
6562 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006563 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006564 .block_erase = spi_block_erase_c7,
6565 }
6566 },
Nico Huber4da971f2024-03-27 01:18:12 +01006567 .reg_bits =
6568 {
6569 .qe = {STATUS2, 1, RW}, /* RO 1 in GD25B128B case */
6570 },
Roman Titov95edc892015-04-03 21:29:04 +00006571 .printlock = spi_prettyprint_status_register_bp4_srwd,
6572 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6573 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006574 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006575 .voltage = {2700, 3600},
Roman Titov95edc892015-04-03 21:29:04 +00006576 },
6577
6578 {
6579 .vendor = "GigaDevice",
Edward O'Callaghan981a3442021-06-22 11:16:55 +10006580 .name = "GD25LQ128C/GD25LQ128D/GD25LQ128E",
Roman Titov95edc892015-04-03 21:29:04 +00006581 .bustype = BUS_SPI,
6582 .manufacture_id = GIGADEVICE_ID,
Alan Green188127e2019-08-06 16:10:34 +10006583 .model_id = GIGADEVICE_GD25LQ128CD,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006584 .total_size = 16384,
Roman Titov95edc892015-04-03 21:29:04 +00006585 .page_size = 256,
6586 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006587 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6588 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006589 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006590 .probe = probe_spi_rdid,
6591 .probe_timing = TIMING_ZERO,
6592 .block_erasers =
6593 {
6594 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006595 .eraseblocks = { {4 * 1024, 4096} },
Roman Titov95edc892015-04-03 21:29:04 +00006596 .block_erase = spi_block_erase_20,
6597 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006598 .eraseblocks = { {32 * 1024, 512} },
Roman Titov95edc892015-04-03 21:29:04 +00006599 .block_erase = spi_block_erase_52,
6600 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006601 .eraseblocks = { {64 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006602 .block_erase = spi_block_erase_d8,
6603 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006604 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006605 .block_erase = spi_block_erase_60,
6606 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006607 .eraseblocks = { {16 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006608 .block_erase = spi_block_erase_c7,
6609 }
6610 },
6611 .printlock = spi_prettyprint_status_register_bp4_srwd,
6612 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6613 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006614 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006615 .voltage = {1695, 1950},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006616 .reg_bits =
6617 {
Nico Huber4da971f2024-03-27 01:18:12 +01006618 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11006619 .srp = {STATUS1, 7, RW},
6620 .srl = {STATUS2, 0, RW},
6621 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6622 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6623 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6624 .cmp = {STATUS2, 6, RW},
6625 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006626 .wp_write_cfg = spi_wp_write_cfg,
6627 .wp_read_cfg = spi_wp_read_cfg,
6628 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11006629 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006630 },
6631
6632 {
6633 .vendor = "GigaDevice",
6634 .name = "GD25LQ16",
6635 .bustype = BUS_SPI,
6636 .manufacture_id = GIGADEVICE_ID,
6637 .model_id = GIGADEVICE_GD25LQ16,
6638 .total_size = 2048,
6639 .page_size = 256,
6640 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006641 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ16C */
6642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00006643 .tested = TEST_UNTESTED,
6644 .probe = probe_spi_rdid,
6645 .probe_timing = TIMING_ZERO,
6646 .block_erasers =
6647 {
6648 {
6649 .eraseblocks = { {4 * 1024, 512} },
6650 .block_erase = spi_block_erase_20,
6651 }, {
6652 .eraseblocks = { {32 * 1024, 64} },
6653 .block_erase = spi_block_erase_52,
6654 }, {
6655 .eraseblocks = { {64 * 1024, 32} },
6656 .block_erase = spi_block_erase_d8,
6657 }, {
6658 .eraseblocks = { {2 * 1024 * 1024, 1} },
6659 .block_erase = spi_block_erase_60,
6660 }, {
6661 .eraseblocks = { {2 * 1024 * 1024, 1} },
6662 .block_erase = spi_block_erase_c7,
6663 }
6664 },
Nico Huber4da971f2024-03-27 01:18:12 +01006665 .reg_bits =
6666 {
6667 .qe = {STATUS2, 1, RW},
6668 },
Roman Titov95edc892015-04-03 21:29:04 +00006669 .printlock = spi_prettyprint_status_register_bp4_srwd,
6670 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6671 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006672 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006673 .voltage = {1695, 1950},
6674 },
6675
6676 {
6677 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006678 .name = "GD25LQ32",
6679 .bustype = BUS_SPI,
6680 .manufacture_id = GIGADEVICE_ID,
6681 .model_id = GIGADEVICE_GD25LQ32,
6682 .total_size = 4096,
6683 .page_size = 256,
6684 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6686 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006687 .tested = TEST_OK_PREW,
6688 .probe = probe_spi_rdid,
6689 .probe_timing = TIMING_ZERO,
6690 .block_erasers =
6691 {
6692 {
6693 .eraseblocks = { {4 * 1024, 1024} },
6694 .block_erase = spi_block_erase_20,
6695 }, {
6696 .eraseblocks = { {32 * 1024, 128} },
6697 .block_erase = spi_block_erase_52,
6698 }, {
6699 .eraseblocks = { {64 * 1024, 64} },
6700 .block_erase = spi_block_erase_d8,
6701 }, {
6702 .eraseblocks = { {4 * 1024 * 1024, 1} },
6703 .block_erase = spi_block_erase_60,
6704 }, {
6705 .eraseblocks = { {4 * 1024 * 1024, 1} },
6706 .block_erase = spi_block_erase_c7,
6707 }
6708 },
Nico Huber4da971f2024-03-27 01:18:12 +01006709 .reg_bits =
6710 {
6711 .qe = {STATUS2, 1, RW},
6712 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006713 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006714 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6715 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006716 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006717 .voltage = {1695, 1950},
6718 },
6719
6720 {
6721 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006722 .name = "GD25LQ40",
6723 .bustype = BUS_SPI,
6724 .manufacture_id = GIGADEVICE_ID,
6725 .model_id = GIGADEVICE_GD25LQ40,
6726 .total_size = 512,
6727 .page_size = 256,
6728 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006729 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ40B, LQ40C */
6730 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006731 .tested = TEST_UNTESTED,
6732 .probe = probe_spi_rdid,
6733 .probe_timing = TIMING_ZERO,
6734 .block_erasers =
6735 {
6736 {
6737 .eraseblocks = { {4 * 1024, 128} },
6738 .block_erase = spi_block_erase_20,
6739 }, {
6740 .eraseblocks = { {32 * 1024, 16} },
6741 .block_erase = spi_block_erase_52,
6742 }, {
6743 .eraseblocks = { {64 * 1024, 8} },
6744 .block_erase = spi_block_erase_d8,
6745 }, {
6746 .eraseblocks = { {512 * 1024, 1} },
6747 .block_erase = spi_block_erase_60,
6748 }, {
6749 .eraseblocks = { {512 * 1024, 1} },
6750 .block_erase = spi_block_erase_c7,
6751 }
6752 },
Nico Huber4da971f2024-03-27 01:18:12 +01006753 .reg_bits =
6754 {
6755 .qe = {STATUS2, 1, RW},
6756 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10006757 .printlock = spi_prettyprint_status_register_bp4_srwd,
6758 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6759 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006760 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006761 .voltage = {1695, 1950},
6762 },
6763
6764 {
6765 .vendor = "GigaDevice",
Roman Titov95edc892015-04-03 21:29:04 +00006766 .name = "GD25LQ64(B)",
6767 .bustype = BUS_SPI,
6768 .manufacture_id = GIGADEVICE_ID,
6769 .model_id = GIGADEVICE_GD25LQ64,
6770 .total_size = 8192,
6771 .page_size = 256,
6772 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006773 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
6774 .dummy_cycles = { .qpi_read_params = { 4, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006775 .tested = TEST_OK_PREWB,
Roman Titov95edc892015-04-03 21:29:04 +00006776 .probe = probe_spi_rdid,
6777 .probe_timing = TIMING_ZERO,
6778 .block_erasers =
6779 {
6780 {
6781 .eraseblocks = { {4 * 1024, 2048} },
6782 .block_erase = spi_block_erase_20,
6783 }, {
6784 .eraseblocks = { {32 * 1024, 256} },
6785 .block_erase = spi_block_erase_52,
6786 }, {
6787 .eraseblocks = { {64 * 1024, 128} },
6788 .block_erase = spi_block_erase_d8,
6789 }, {
6790 .eraseblocks = { {8 * 1024 * 1024, 1} },
6791 .block_erase = spi_block_erase_60,
6792 }, {
6793 .eraseblocks = { {8 * 1024 * 1024, 1} },
6794 .block_erase = spi_block_erase_c7,
6795 }
6796 },
6797 .printlock = spi_prettyprint_status_register_bp4_srwd,
6798 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6799 .write = spi_chip_write_256,
6800 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
6801 .voltage = {1695, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006802 .reg_bits =
6803 {
Nico Huber4da971f2024-03-27 01:18:12 +01006804 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006805 .srp = {STATUS1, 7, RW},
6806 .srl = {STATUS2, 0, RW},
6807 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6808 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6809 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6810 .cmp = {STATUS2, 6, RW},
6811 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006812 .wp_write_cfg = spi_wp_write_cfg,
6813 .wp_read_cfg = spi_wp_read_cfg,
6814 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006815 .decode_range = decode_range_spi25,
Roman Titov95edc892015-04-03 21:29:04 +00006816 },
6817
6818 {
6819 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10006820 .name = "GD25LQ80",
Roman Titov95edc892015-04-03 21:29:04 +00006821 .bustype = BUS_SPI,
6822 .manufacture_id = GIGADEVICE_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10006823 .model_id = GIGADEVICE_GD25LQ80,
6824 .total_size = 1024,
Roman Titov95edc892015-04-03 21:29:04 +00006825 .page_size = 256,
6826 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01006827 /* FEATURE_QPI_SRP(4, 4, 6, 8) except for LQ80B, LQ80C */
6828 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Roman Titov95edc892015-04-03 21:29:04 +00006829 .tested = TEST_UNTESTED,
6830 .probe = probe_spi_rdid,
6831 .probe_timing = TIMING_ZERO,
6832 .block_erasers =
6833 {
6834 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006835 .eraseblocks = { {4 * 1024, 256} },
Roman Titov95edc892015-04-03 21:29:04 +00006836 .block_erase = spi_block_erase_20,
6837 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006838 .eraseblocks = { {32 * 1024, 32} },
Roman Titov95edc892015-04-03 21:29:04 +00006839 .block_erase = spi_block_erase_52,
6840 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006841 .eraseblocks = { {64 * 1024, 16} },
Roman Titov95edc892015-04-03 21:29:04 +00006842 .block_erase = spi_block_erase_d8,
6843 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006844 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006845 .block_erase = spi_block_erase_60,
6846 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10006847 .eraseblocks = { {1 * 1024 * 1024, 1} },
Roman Titov95edc892015-04-03 21:29:04 +00006848 .block_erase = spi_block_erase_c7,
6849 }
6850 },
Nico Huber4da971f2024-03-27 01:18:12 +01006851 .reg_bits =
6852 {
6853 .qe = {STATUS2, 1, RW},
6854 },
Roman Titov95edc892015-04-03 21:29:04 +00006855 .printlock = spi_prettyprint_status_register_bp4_srwd,
6856 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6857 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006858 .read = spi_chip_read,
Roman Titov95edc892015-04-03 21:29:04 +00006859 .voltage = {1695, 1950},
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006860 },
6861
6862 {
6863 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006864 .name = "GD25Q10",
6865 .bustype = BUS_SPI,
6866 .manufacture_id = GIGADEVICE_ID,
6867 .model_id = GIGADEVICE_GD25Q10,
6868 .total_size = 128,
6869 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01006870 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006871 .tested = TEST_UNTESTED,
6872 .probe = probe_spi_rdid,
6873 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10006874 .block_erasers =
6875 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006876 {
6877 .eraseblocks = { {4 * 1024, 32} },
6878 .block_erase = spi_block_erase_20,
6879 }, {
6880 .eraseblocks = { {32 * 1024, 4} },
6881 .block_erase = spi_block_erase_52,
6882 }, {
6883 .eraseblocks = { {64 * 1024, 2} },
6884 .block_erase = spi_block_erase_d8,
6885 }, {
6886 .eraseblocks = { {128 * 1024, 1} },
6887 .block_erase = spi_block_erase_60,
6888 }, {
6889 .eraseblocks = { {128 * 1024, 1} },
6890 .block_erase = spi_block_erase_c7,
6891 }
6892 },
Nico Huber4da971f2024-03-27 01:18:12 +01006893 .reg_bits =
6894 {
6895 .qe = {STATUS2, 1, RW},
6896 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00006897 .printlock = spi_prettyprint_status_register_bp4_srwd,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006898 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
6899 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01006900 .read = spi_chip_read,
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00006901 .voltage = {2700, 3600},
6902 },
6903
6904 {
6905 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01006906 .name = "GD25Q127C",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006907 .bustype = BUS_SPI,
6908 .manufacture_id = GIGADEVICE_ID,
6909 .model_id = GIGADEVICE_GD25Q128,
6910 .total_size = 16384,
6911 .page_size = 256,
6912 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
Nico Huber1412d9f2024-01-06 18:25:49 +01006913 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03006914 .tested = TEST_OK_PREWB,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006915 .probe = probe_spi_rdid,
6916 .probe_timing = TIMING_ZERO,
6917 .block_erasers =
6918 {
6919 {
6920 .eraseblocks = { {4 * 1024, 4096} },
6921 .block_erase = spi_block_erase_20,
6922 }, {
6923 .eraseblocks = { {32 * 1024, 512} },
6924 .block_erase = spi_block_erase_52,
6925 }, {
6926 .eraseblocks = { {64 * 1024, 256} },
6927 .block_erase = spi_block_erase_d8,
6928 }, {
6929 .eraseblocks = { {16 * 1024 * 1024, 1} },
6930 .block_erase = spi_block_erase_60,
6931 }, {
6932 .eraseblocks = { {16 * 1024 * 1024, 1} },
6933 .block_erase = spi_block_erase_c7,
6934 }
6935 },
6936 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6937 .printlock = spi_prettyprint_status_register_bp4_srwd,
6938 .unlock = spi_disable_blockprotect_bp4_srwd,
6939 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01006940 .read = spi_chip_read,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006941 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006942 .reg_bits =
6943 {
Nico Huber4da971f2024-03-27 01:18:12 +01006944 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006945 .srp = {STATUS1, 7, RW},
6946 .srl = {STATUS2, 0, RW},
6947 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
6948 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
6949 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
6950 .cmp = {STATUS2, 6, RW},
6951 },
Nico Huberaabb3e02023-01-13 00:22:30 +01006952 .wp_write_cfg = spi_wp_write_cfg,
6953 .wp_read_cfg = spi_wp_read_cfg,
6954 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11006955 .decode_range = decode_range_spi25,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00006956 },
6957
6958 {
6959 .vendor = "GigaDevice",
Nico Huber68573af2024-01-06 18:28:22 +01006960 .name = "GD25Q128C",
6961 .bustype = BUS_SPI,
6962 .manufacture_id = GIGADEVICE_ID,
6963 .model_id = GIGADEVICE_GD25Q128,
6964 .total_size = 16384,
6965 .page_size = 256,
6966 /* OTP: 1536B total; read 0x48; write 0x42, erase 0x44 */
6967 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
6968 .dummy_cycles = { .qpi_read_params = { 4, 6, 8, 8 } },
6969 .tested = TEST_OK_PREWB,
6970 .probe = probe_spi_rdid,
6971 .probe_timing = TIMING_ZERO,
6972 .block_erasers =
6973 {
6974 {
6975 .eraseblocks = { {4 * 1024, 4096} },
6976 .block_erase = spi_block_erase_20,
6977 }, {
6978 .eraseblocks = { {32 * 1024, 512} },
6979 .block_erase = spi_block_erase_52,
6980 }, {
6981 .eraseblocks = { {64 * 1024, 256} },
6982 .block_erase = spi_block_erase_d8,
6983 }, {
6984 .eraseblocks = { {16 * 1024 * 1024, 1} },
6985 .block_erase = spi_block_erase_60,
6986 }, {
6987 .eraseblocks = { {16 * 1024 * 1024, 1} },
6988 .block_erase = spi_block_erase_c7,
6989 }
6990 },
6991 /* TODO: 2nd status reg (read 0x35, write 0x31) and 3rd status reg (read 0x15, write 0x11) */
6992 .printlock = spi_prettyprint_status_register_bp4_srwd,
6993 .unlock = spi_disable_blockprotect_bp4_srwd,
6994 .write = spi_chip_write_256,
6995 .read = spi_chip_read,
6996 .voltage = {2700, 3600},
6997 .reg_bits =
6998 {
6999 .qe = {STATUS2, 1, RW},
7000 .srp = {STATUS1, 7, RW},
7001 .srl = {STATUS2, 0, RW},
7002 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7003 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7004 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7005 .cmp = {STATUS2, 6, RW},
7006 },
7007 .decode_range = decode_range_spi25,
7008 },
7009
7010 {
7011 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007012 .name = "GD25Q16(B)",
7013 .bustype = BUS_SPI,
7014 .manufacture_id = GIGADEVICE_ID,
7015 .model_id = GIGADEVICE_GD25Q16,
7016 .total_size = 2048,
7017 .page_size = 256,
7018 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007019 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007020 .tested = TEST_OK_PREW,
7021 .probe = probe_spi_rdid,
7022 .probe_timing = TIMING_ZERO,
7023 .block_erasers =
7024 {
7025 {
7026 .eraseblocks = { {4 * 1024, 512} },
7027 .block_erase = spi_block_erase_20,
7028 }, {
7029 .eraseblocks = { {32 * 1024, 64} },
7030 .block_erase = spi_block_erase_52,
7031 }, {
7032 .eraseblocks = { {64 * 1024, 32} },
7033 .block_erase = spi_block_erase_d8,
7034 }, {
7035 .eraseblocks = { {2 * 1024 * 1024, 1} },
7036 .block_erase = spi_block_erase_60,
7037 }, {
7038 .eraseblocks = { {2 * 1024 * 1024, 1} },
7039 .block_erase = spi_block_erase_c7,
7040 }
7041 },
Nico Huber4da971f2024-03-27 01:18:12 +01007042 .reg_bits =
7043 {
7044 .qe = {STATUS2, 1, RW},
7045 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007046 .printlock = spi_prettyprint_status_register_bp4_srwd,
7047 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7048 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007049 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007050 .voltage = {2700, 3600},
7051 },
7052
7053 {
7054 .vendor = "GigaDevice",
7055 .name = "GD25Q20(B)",
7056 .bustype = BUS_SPI,
7057 .manufacture_id = GIGADEVICE_ID,
7058 .model_id = GIGADEVICE_GD25Q20,
7059 .total_size = 256,
7060 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007061 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007062 .tested = TEST_OK_PREW,
7063 .probe = probe_spi_rdid,
7064 .probe_timing = TIMING_ZERO,
7065 .block_erasers =
7066 {
7067 {
7068 .eraseblocks = { {4 * 1024, 64} },
7069 .block_erase = spi_block_erase_20,
7070 }, {
7071 .eraseblocks = { {32 * 1024, 8} },
7072 .block_erase = spi_block_erase_52,
7073 }, {
7074 .eraseblocks = { {64 * 1024, 4} },
7075 .block_erase = spi_block_erase_d8,
7076 }, {
7077 .eraseblocks = { {256 * 1024, 1} },
7078 .block_erase = spi_block_erase_60,
7079 }, {
7080 .eraseblocks = { {256 * 1024, 1} },
7081 .block_erase = spi_block_erase_c7,
7082 }
7083 },
Nico Huber4da971f2024-03-27 01:18:12 +01007084 .reg_bits = {
7085 .qe = {STATUS2, 1, RW},
7086 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007087 .printlock = spi_prettyprint_status_register_bp4_srwd,
7088 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7089 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007090 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007091 .voltage = {2700, 3600},
7092 },
7093
7094 {
7095 .vendor = "GigaDevice",
Nikolai Artemiev3ca0af02022-06-17 15:10:18 +10007096 .name = "GD25Q256D/GD25Q256E",
Alan Green86fc9cf2019-08-26 15:02:12 +10007097 .bustype = BUS_SPI,
7098 .manufacture_id = GIGADEVICE_ID,
7099 .model_id = GIGADEVICE_GD25Q256D,
7100 .total_size = 32768,
7101 .page_size = 256,
Nikolai Artemievb931e7a2022-12-05 13:06:14 +11007102 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA |
Nico Huber4da971f2024-03-27 01:18:12 +01007103 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
7104 FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007105 .tested = TEST_OK_PREWB,
Alan Green86fc9cf2019-08-26 15:02:12 +10007106 .probe = probe_spi_rdid,
7107 .probe_timing = TIMING_ZERO,
7108 .block_erasers =
7109 {
7110 {
7111 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber5374dc32019-10-04 16:16:15 +02007112 .block_erase = spi_block_erase_21,
7113 }, {
7114 .eraseblocks = { {4 * 1024, 8192} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007115 .block_erase = spi_block_erase_20,
7116 }, {
7117 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber5374dc32019-10-04 16:16:15 +02007118 .block_erase = spi_block_erase_5c,
7119 }, {
7120 .eraseblocks = { {32 * 1024, 1024} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007121 .block_erase = spi_block_erase_52,
7122 }, {
7123 .eraseblocks = { {64 * 1024, 512} },
Nico Huber5374dc32019-10-04 16:16:15 +02007124 .block_erase = spi_block_erase_dc,
7125 }, {
7126 .eraseblocks = { {64 * 1024, 512} },
Alan Green86fc9cf2019-08-26 15:02:12 +10007127 .block_erase = spi_block_erase_d8,
7128 }, {
7129 .eraseblocks = { {32 * 1024 * 1024, 1} },
7130 .block_erase = spi_block_erase_60,
7131 }, {
7132 .eraseblocks = { {32 * 1024 * 1024, 1} },
7133 .block_erase = spi_block_erase_c7,
7134 }
7135 },
7136 .printlock = spi_prettyprint_status_register_bp3_srwd,
7137 .unlock = spi_disable_blockprotect,
7138 .write = spi_chip_write_256,
7139 .read = spi_chip_read,
7140 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007141 .reg_bits =
7142 {
Nico Huber4da971f2024-03-27 01:18:12 +01007143 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007144 .srp = {STATUS1, 7, RW},
7145 .srl = {STATUS2, 6, RW},
7146 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
7147 .tb = {STATUS1, 6, RW},
7148 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007149 .wp_write_cfg = spi_wp_write_cfg,
7150 .wp_read_cfg = spi_wp_read_cfg,
7151 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007152 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +01007153 .prepare_access = spi_prepare_4ba,
Alan Green86fc9cf2019-08-26 15:02:12 +10007154 },
7155
7156 {
7157 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007158 .name = "GD25Q32(B)",
7159 .bustype = BUS_SPI,
7160 .manufacture_id = GIGADEVICE_ID,
7161 .model_id = GIGADEVICE_GD25Q32,
7162 .total_size = 4096,
7163 .page_size = 256,
7164 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007165 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007166 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007167 .probe = probe_spi_rdid,
7168 .probe_timing = TIMING_ZERO,
7169 .block_erasers =
7170 {
7171 {
7172 .eraseblocks = { {4 * 1024, 1024} },
7173 .block_erase = spi_block_erase_20,
7174 }, {
7175 .eraseblocks = { {32 * 1024, 128} },
7176 .block_erase = spi_block_erase_52,
7177 }, {
7178 .eraseblocks = { {64 * 1024, 64} },
7179 .block_erase = spi_block_erase_d8,
7180 }, {
7181 .eraseblocks = { {4 * 1024 * 1024, 1} },
7182 .block_erase = spi_block_erase_60,
7183 }, {
7184 .eraseblocks = { {4 * 1024 * 1024, 1} },
7185 .block_erase = spi_block_erase_c7,
7186 }
7187 },
7188 .printlock = spi_prettyprint_status_register_bp4_srwd,
7189 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7190 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007191 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007192 .voltage = {2700, 3600},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007193 .reg_bits =
7194 {
Nico Huber4da971f2024-03-27 01:18:12 +01007195 .qe = {STATUS2, 1, RW},
Nikolai Artemievc6c3f282021-10-20 23:34:15 +11007196 .srp = {STATUS1, 7, RW},
7197 .srl = {STATUS2, 0, RW},
7198 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7199 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7200 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7201 .cmp = {STATUS2, 6, RW},
7202 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007203 .wp_write_cfg = spi_wp_write_cfg,
7204 .wp_read_cfg = spi_wp_read_cfg,
7205 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievc9feb1b2021-10-21 01:35:13 +11007206 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007207 },
7208
7209 {
7210 .vendor = "GigaDevice",
7211 .name = "GD25Q40(B)",
7212 .bustype = BUS_SPI,
7213 .manufacture_id = GIGADEVICE_ID,
7214 .model_id = GIGADEVICE_GD25Q40,
7215 .total_size = 512,
7216 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007217 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Simon Buhrow551664c2022-03-09 16:09:08 +01007218 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007219 .probe = probe_spi_rdid,
7220 .probe_timing = TIMING_ZERO,
7221 .block_erasers =
7222 {
7223 {
7224 .eraseblocks = { {4 * 1024, 128} },
7225 .block_erase = spi_block_erase_20,
7226 }, {
7227 .eraseblocks = { {32 * 1024, 16} },
7228 .block_erase = spi_block_erase_52,
7229 }, {
7230 .eraseblocks = { {64 * 1024, 8} },
7231 .block_erase = spi_block_erase_d8,
7232 }, {
7233 .eraseblocks = { {512 * 1024, 1} },
7234 .block_erase = spi_block_erase_60,
7235 }, {
7236 .eraseblocks = { {512 * 1024, 1} },
7237 .block_erase = spi_block_erase_c7,
7238 }
7239 },
Nico Huber4da971f2024-03-27 01:18:12 +01007240 .reg_bits =
7241 {
7242 .qe = {STATUS2, 1, RW},
7243 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007244 .printlock = spi_prettyprint_status_register_bp4_srwd,
7245 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7246 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007247 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007248 .voltage = {2700, 3600},
7249 },
7250
7251 {
7252 .vendor = "GigaDevice",
7253 .name = "GD25Q512",
7254 .bustype = BUS_SPI,
7255 .manufacture_id = GIGADEVICE_ID,
7256 .model_id = GIGADEVICE_GD25Q512,
7257 .total_size = 64,
7258 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007259 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007260 .tested = TEST_OK_PREW,
7261 .probe = probe_spi_rdid,
7262 .probe_timing = TIMING_ZERO,
7263 .block_erasers =
7264 {
7265 {
7266 .eraseblocks = { {4 * 1024, 16} },
7267 .block_erase = spi_block_erase_20,
7268 }, {
7269 .eraseblocks = { {32 * 1024, 2} },
7270 .block_erase = spi_block_erase_52,
7271 }, {
7272 .eraseblocks = { {64 * 1024, 1} },
7273 .block_erase = spi_block_erase_60,
7274 }, {
7275 .eraseblocks = { {64 * 1024, 1} },
7276 .block_erase = spi_block_erase_c7,
7277 }
7278 },
Nico Huber4da971f2024-03-27 01:18:12 +01007279 .reg_bits =
7280 {
7281 .qe = {STATUS2, 1, RW},
7282 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007283 .printlock = spi_prettyprint_status_register_bp4_srwd,
7284 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7285 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007286 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007287 .voltage = {2700, 3600},
7288 },
7289
7290 {
7291 .vendor = "GigaDevice",
7292 .name = "GD25Q64(B)",
7293 .bustype = BUS_SPI,
7294 .manufacture_id = GIGADEVICE_ID,
7295 .model_id = GIGADEVICE_GD25Q64,
7296 .total_size = 8192,
7297 .page_size = 256,
7298 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007299 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +03007300 .tested = TEST_OK_PREWB,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007301 .probe = probe_spi_rdid,
7302 .probe_timing = TIMING_ZERO,
7303 .block_erasers =
7304 {
7305 {
7306 .eraseblocks = { {4 * 1024, 2048} },
7307 .block_erase = spi_block_erase_20,
7308 }, {
7309 .eraseblocks = { {32 * 1024, 256} },
7310 .block_erase = spi_block_erase_52,
7311 }, {
7312 .eraseblocks = { {64 * 1024, 128} },
7313 .block_erase = spi_block_erase_d8,
7314 }, {
7315 .eraseblocks = { {8 * 1024 * 1024, 1} },
7316 .block_erase = spi_block_erase_60,
7317 }, {
7318 .eraseblocks = { {8 * 1024 * 1024, 1} },
7319 .block_erase = spi_block_erase_c7,
7320 }
7321 },
7322 .printlock = spi_prettyprint_status_register_bp4_srwd,
7323 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7324 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007325 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007326 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007327 .reg_bits =
7328 {
Nico Huber4da971f2024-03-27 01:18:12 +01007329 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007330 .srp = {STATUS1, 7, RW},
7331 .srl = {STATUS2, 0, RW},
7332 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
7333 .tb = {STATUS1, 5, RW}, /* Called BP3 in datasheet, acts like TB */
7334 .sec = {STATUS1, 6, RW}, /* Called BP4 in datasheet, acts like SEC */
7335 .cmp = {STATUS2, 6, RW},
7336 },
Nico Huberaabb3e02023-01-13 00:22:30 +01007337 .wp_write_cfg = spi_wp_write_cfg,
7338 .wp_read_cfg = spi_wp_read_cfg,
7339 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +11007340 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007341 },
7342
7343 {
7344 .vendor = "GigaDevice",
7345 .name = "GD25Q80(B)",
7346 .bustype = BUS_SPI,
7347 .manufacture_id = GIGADEVICE_ID,
7348 .model_id = GIGADEVICE_GD25Q80,
7349 .total_size = 1024,
7350 .page_size = 256,
7351 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
Nico Huber4da971f2024-03-27 01:18:12 +01007352 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007353 .tested = TEST_OK_PREW,
7354 .probe = probe_spi_rdid,
7355 .probe_timing = TIMING_ZERO,
7356 .block_erasers =
7357 {
7358 {
7359 .eraseblocks = { {4 * 1024, 256} },
7360 .block_erase = spi_block_erase_20,
7361 }, {
7362 .eraseblocks = { {32 * 1024, 32} },
7363 .block_erase = spi_block_erase_52,
7364 }, {
7365 .eraseblocks = { {64 * 1024, 16} },
7366 .block_erase = spi_block_erase_d8,
7367 }, {
7368 .eraseblocks = { {1024 * 1024, 1} },
7369 .block_erase = spi_block_erase_60,
7370 }, {
7371 .eraseblocks = { {1024 * 1024, 1} },
7372 .block_erase = spi_block_erase_c7,
7373 }
7374 },
Nico Huber4da971f2024-03-27 01:18:12 +01007375 .reg_bits =
7376 {
7377 .qe = {STATUS2, 1, RW},
7378 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007379 .printlock = spi_prettyprint_status_register_bp4_srwd,
7380 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7381 .write = spi_chip_write_256,
Nico Huber4da971f2024-03-27 01:18:12 +01007382 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007383 .voltage = {2700, 3600},
7384 },
7385
7386 {
7387 .vendor = "GigaDevice",
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007388 .name = "GD25T80",
7389 .bustype = BUS_SPI,
7390 .manufacture_id = GIGADEVICE_ID,
7391 .model_id = GIGADEVICE_GD25T80,
7392 .total_size = 1024,
7393 .page_size = 256,
7394 /* OTP: 256B total; enter 0x3A */
7395 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7396 .tested = TEST_UNTESTED,
7397 .probe = probe_spi_rdid,
7398 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +10007399 .block_erasers =
7400 {
Nikolay Nikolaev3f3390b2013-06-28 21:28:56 +00007401 {
7402 .eraseblocks = { {4 * 1024, 256} },
7403 .block_erase = spi_block_erase_20,
7404 }, {
7405 .eraseblocks = { {64 * 1024, 16} },
7406 .block_erase = spi_block_erase_52,
7407 }, {
7408 .eraseblocks = { {64 * 1024, 16} },
7409 .block_erase = spi_block_erase_d8,
7410 }, {
7411 .eraseblocks = { {1024 * 1024, 1} },
7412 .block_erase = spi_block_erase_60,
7413 }, {
7414 .eraseblocks = { {1024 * 1024, 1} },
7415 .block_erase = spi_block_erase_c7,
7416 }
7417 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +00007418 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007419 .unlock = spi_disable_blockprotect,
7420 .write = spi_chip_write_256,
7421 .read = spi_chip_read,
Stefan Tauner352e50b2013-02-22 15:58:45 +00007422 .voltage = {2700, 3600},
Justin Chevrier1525b2a2012-04-14 21:59:23 +00007423 },
7424
7425 {
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007426 .vendor = "GigaDevice",
Alan Green1f9cc7d2019-07-01 11:10:45 +10007427 .name = "GD25VQ16C",
7428 .bustype = BUS_SPI,
7429 .manufacture_id = GIGADEVICE_ID,
7430 .model_id = GIGADEVICE_GD25VQ16C,
7431 .total_size = 2 * 1024,
7432 .page_size = 256,
7433 /* Supports SFDP */
7434 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007435 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007436 .tested = TEST_UNTESTED,
7437 .probe = probe_spi_rdid,
7438 .probe_timing = TIMING_ZERO,
7439 .block_erasers =
7440 {
7441 {
7442 .eraseblocks = { { 4 * 1024, 512} },
7443 .block_erase = spi_block_erase_20,
7444 }, {
7445 .eraseblocks = { { 32 * 1024, 64} },
7446 .block_erase = spi_block_erase_52,
7447 }, {
7448 .eraseblocks = { { 64 * 1024, 32} },
7449 .block_erase = spi_block_erase_d8,
7450 }, {
7451 .eraseblocks = { {2 * 1024 * 1024, 1} },
7452 .block_erase = spi_block_erase_60,
7453 }, {
7454 .eraseblocks = { {2 * 1024 * 1024, 1} },
7455 .block_erase = spi_block_erase_c7,
7456 }
7457 },
Nico Huber4da971f2024-03-27 01:18:12 +01007458 .reg_bits =
7459 {
7460 .qe = {STATUS2, 1, RW},
7461 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007462 .printlock = spi_prettyprint_status_register_bp4_srwd,
7463 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7464 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007465 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007466 .voltage = {2300, 3600},
7467 },
7468
7469 {
7470 .vendor = "GigaDevice",
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007471 .name = "GD25VQ21B",
7472 .bustype = BUS_SPI,
7473 .manufacture_id = GIGADEVICE_ID,
7474 .model_id = GIGADEVICE_GD25VQ21B,
7475 .total_size = 256,
7476 .page_size = 256,
7477 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007478 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
7479 FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007480 .tested = TEST_UNTESTED,
7481 .probe = probe_spi_rdid,
7482 .probe_timing = TIMING_ZERO,
7483 .block_erasers =
7484 {
7485 {
7486 .eraseblocks = { { 4 * 1024, 64} },
7487 .block_erase = spi_block_erase_20,
7488 }, {
7489 .eraseblocks = { { 32 * 1024, 8} },
7490 .block_erase = spi_block_erase_52,
7491 }, {
7492 .eraseblocks = { { 64 * 1024, 4} },
7493 .block_erase = spi_block_erase_d8,
7494 }, {
7495 .eraseblocks = { {256 * 1024, 1} },
7496 .block_erase = spi_block_erase_60,
7497 }, {
7498 .eraseblocks = { {256 * 1024, 1} },
7499 .block_erase = spi_block_erase_c7,
7500 }
7501 },
Nico Huber4da971f2024-03-27 01:18:12 +01007502 .reg_bits =
7503 {
7504 .qe = {STATUS2, 1, RW},
7505 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007506 .printlock = spi_prettyprint_status_register_bp4_srwd,
7507 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7508 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007509 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007510 .voltage = {2300, 3600},
7511 },
7512
7513 {
7514 .vendor = "GigaDevice",
7515 .name = "GD25VQ40C",
7516 .bustype = BUS_SPI,
7517 .manufacture_id = GIGADEVICE_ID,
7518 .model_id = GIGADEVICE_GD25VQ41B,
7519 .total_size = 512,
7520 .page_size = 256,
7521 /* Supports SFDP */
7522 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007523 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007524 .tested = TEST_UNTESTED,
7525 .probe = probe_spi_rdid,
7526 .probe_timing = TIMING_ZERO,
7527 .block_erasers =
7528 {
7529 {
7530 .eraseblocks = { { 4 * 1024, 128} },
7531 .block_erase = spi_block_erase_20,
7532 }, {
7533 .eraseblocks = { { 32 * 1024, 16} },
7534 .block_erase = spi_block_erase_52,
7535 }, {
7536 .eraseblocks = { { 64 * 1024, 8} },
7537 .block_erase = spi_block_erase_d8,
7538 }, {
7539 .eraseblocks = { {512 * 1024, 1} },
7540 .block_erase = spi_block_erase_60,
7541 }, {
7542 .eraseblocks = { {512 * 1024, 1} },
7543 .block_erase = spi_block_erase_c7,
7544 }
7545 },
Nico Huber4da971f2024-03-27 01:18:12 +01007546 .reg_bits =
7547 {
7548 .qe = {STATUS2, 1, RW},
7549 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007550 .printlock = spi_prettyprint_status_register_bp4_srwd,
7551 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7552 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007553 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007554 .voltage = {2300, 3600},
7555 },
7556
7557 {
7558 .vendor = "GigaDevice",
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007559 .name = "GD25VQ41B",
7560 .bustype = BUS_SPI,
7561 .manufacture_id = GIGADEVICE_ID,
7562 .model_id = GIGADEVICE_GD25VQ41B,
7563 .total_size = 512,
7564 .page_size = 256,
7565 /* OTP: 1536B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007566 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
7567 FEATURE_OTP | FEATURE_QIO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007568 .tested = TEST_OK_PREW,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007569 .probe = probe_spi_rdid,
7570 .probe_timing = TIMING_ZERO,
Stefan Tauner0be072c2016-03-13 15:16:30 +00007571 .block_erasers =
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007572 {
Stefan Tauner0be072c2016-03-13 15:16:30 +00007573 {
7574 .eraseblocks = { { 4 * 1024, 128} },
7575 .block_erase = spi_block_erase_20,
7576 }, {
7577 .eraseblocks = { { 32 * 1024, 16} },
7578 .block_erase = spi_block_erase_52,
7579 }, {
7580 .eraseblocks = { { 64 * 1024, 8} },
7581 .block_erase = spi_block_erase_d8,
7582 }, {
7583 .eraseblocks = { {512 * 1024, 1} },
7584 .block_erase = spi_block_erase_60,
7585 }, {
7586 .eraseblocks = { {512 * 1024, 1} },
7587 .block_erase = spi_block_erase_c7,
7588 }
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007589 },
Nico Huber4da971f2024-03-27 01:18:12 +01007590 .reg_bits =
7591 {
7592 .qe = {STATUS2, 1, RW},
7593 },
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007594 .printlock = spi_prettyprint_status_register_bp4_srwd,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007595 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7596 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007597 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007598 .voltage = {2300, 3600},
7599 },
7600
7601 {
7602 .vendor = "GigaDevice",
7603 .name = "GD25VQ80C",
7604 .bustype = BUS_SPI,
7605 .manufacture_id = GIGADEVICE_ID,
7606 .model_id = GIGADEVICE_GD25VQ80C,
7607 .total_size = 1024,
7608 .page_size = 256,
7609 /* Supports SFDP */
7610 /* OTP: 1024B total; read 0x48, write 0x42, erase 0x44 */
Nico Huber4da971f2024-03-27 01:18:12 +01007611 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007612 .tested = TEST_UNTESTED,
7613 .probe = probe_spi_rdid,
7614 .probe_timing = TIMING_ZERO,
7615 .block_erasers =
7616 {
7617 {
7618 .eraseblocks = { { 4 * 1024, 256} },
7619 .block_erase = spi_block_erase_20,
7620 }, {
7621 .eraseblocks = { { 32 * 1024, 32} },
7622 .block_erase = spi_block_erase_52,
7623 }, {
7624 .eraseblocks = { { 64 * 1024, 16} },
7625 .block_erase = spi_block_erase_d8,
7626 }, {
7627 .eraseblocks = { {1024 * 1024, 1} },
7628 .block_erase = spi_block_erase_60,
7629 }, {
7630 .eraseblocks = { {1024 * 1024, 1} },
7631 .block_erase = spi_block_erase_c7,
7632 }
7633 },
Nico Huber4da971f2024-03-27 01:18:12 +01007634 .reg_bits =
7635 {
7636 .qe = {STATUS2, 1, RW},
7637 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007638 .printlock = spi_prettyprint_status_register_bp4_srwd,
7639 .unlock = spi_disable_blockprotect_bp4_srwd, /* TODO: 2nd status reg (read with 0x35) */
7640 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01007641 .read = spi_chip_read,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007642 .voltage = {2300, 3600},
7643 },
7644
7645 {
Dino Li3214f582020-03-25 17:39:53 +08007646 .vendor = "GigaDevice",
7647 .name = "GD25WQ80E",
7648 .bustype = BUS_SPI,
7649 .manufacture_id = GIGADEVICE_ID,
7650 .model_id = GIGADEVICE_GD25WQ80E,
7651 .total_size = 1024,
7652 .page_size = 256,
Nico Huber4da971f2024-03-27 01:18:12 +01007653 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_QIO,
Dino Li3214f582020-03-25 17:39:53 +08007654 .tested = TEST_OK_PREW,
7655 .probe = probe_spi_rdid,
7656 .probe_timing = TIMING_ZERO,
7657 .block_erasers =
7658 {
7659 {
7660 .eraseblocks = { {4 * 1024, 256} },
7661 .block_erase = spi_block_erase_20,
7662 }, {
7663 .eraseblocks = { {32 * 1024, 32} },
7664 .block_erase = spi_block_erase_52,
7665 }, {
7666 .eraseblocks = { {64 * 1024, 16} },
7667 .block_erase = spi_block_erase_d8,
7668 }, {
7669 .eraseblocks = { {1 * 1024 * 1024, 1} },
7670 .block_erase = spi_block_erase_60,
7671 }, {
7672 .eraseblocks = { {1 * 1024 * 1024, 1} },
7673 .block_erase = spi_block_erase_c7,
7674 }
7675 },
Nico Huber4da971f2024-03-27 01:18:12 +01007676 .reg_bits =
7677 {
7678 .qe = {STATUS2, 1, RW},
7679 },
Dino Li3214f582020-03-25 17:39:53 +08007680 .printlock = spi_prettyprint_status_register_bp4_srwd,
7681 .unlock = spi_disable_blockprotect_bp4_srwd,
7682 .write = spi_chip_write_256,
7683 .read = spi_chip_read,
7684 .voltage = {1650, 3600},
7685 },
7686
7687 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007688 .vendor = "Hyundai",
7689 .name = "HY29F002B",
7690 .bustype = BUS_PARALLEL,
7691 .manufacture_id = HYUNDAI_ID,
7692 .model_id = HYUNDAI_HY29F002B,
7693 .total_size = 256,
7694 .page_size = 256 * 1024,
7695 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007696 .tested = TEST_UNTESTED,
Alan Green1f9cc7d2019-07-01 11:10:45 +10007697 .probe = probe_jedec,
7698 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007699 .block_erasers =
7700 {
7701 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007702 .eraseblocks = {
7703 {16 * 1024, 1},
7704 {8 * 1024, 2},
7705 {32 * 1024, 1},
7706 {64 * 1024, 3},
7707 },
7708 .block_erase = erase_sector_jedec,
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007709 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10007710 .eraseblocks = { {256 * 1024, 1} },
7711 .block_erase = erase_chip_block_jedec,
7712 },
Hatim Kanchwalad0595352016-03-06 14:33:49 +00007713 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10007714 .write = write_jedec_1,
7715 .read = read_memmapped,
7716 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007717 .prepare_access = prepare_memory_access,
7718 .finish_access = finish_memory_access,
Hatim Kanchwalae0c7abf2016-02-21 00:21:11 +00007719 },
7720
7721 {
David Borgc96a8bd2010-06-21 16:12:22 +00007722 .vendor = "Hyundai",
7723 .name = "HY29F002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007724 .bustype = BUS_PARALLEL,
David Borgc96a8bd2010-06-21 16:12:22 +00007725 .manufacture_id = HYUNDAI_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00007726 .model_id = HYUNDAI_HY29F002T,
David Borgc96a8bd2010-06-21 16:12:22 +00007727 .total_size = 256,
7728 .page_size = 256 * 1024,
7729 .feature_bits = FEATURE_EITHER_RESET, /* Some revisions may need FEATURE_ADDR_2AA */
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +00007730 .tested = TEST_OK_PRE,
David Borgc96a8bd2010-06-21 16:12:22 +00007731 .probe = probe_jedec,
7732 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
7733 .block_erasers =
7734 {
7735 {
7736 .eraseblocks = {
7737 {64 * 1024, 3},
7738 {32 * 1024, 1},
7739 {8 * 1024, 2},
7740 {16 * 1024, 1},
7741 },
7742 .block_erase = erase_sector_jedec,
7743 }, {
7744 .eraseblocks = { {256 * 1024, 1} },
7745 .block_erase = erase_chip_block_jedec,
7746 },
7747 },
7748 .write = write_jedec_1,
7749 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007750 .voltage = {4750, 5250}, /* 4.75-5.25V for type -45, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +01007751 .prepare_access = prepare_memory_access,
7752 .finish_access = finish_memory_access,
David Borgc96a8bd2010-06-21 16:12:22 +00007753 },
7754
7755 {
7756 .vendor = "Hyundai",
Joshua Roysf1324e02010-09-16 00:51:51 +00007757 .name = "HY29F040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00007758 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +00007759 .manufacture_id = HYUNDAI_ID,
7760 .model_id = HYUNDAI_HY29F040A,
7761 .total_size = 512,
7762 .page_size = 64 * 1024,
7763 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
7764 .tested = TEST_UNTESTED,
7765 .probe = probe_jedec,
7766 .probe_timing = TIMING_ZERO,
7767 .block_erasers =
7768 {
7769 {
7770 .eraseblocks = { {64 * 1024, 8} },
7771 .block_erase = erase_sector_jedec,
7772 }, {
7773 .eraseblocks = { {512 * 1024, 1} },
7774 .block_erase = erase_chip_block_jedec,
7775 },
7776 },
7777 .write = write_jedec_1,
7778 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +00007779 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01007780 .prepare_access = prepare_memory_access,
7781 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +00007782 },
7783
7784 {
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00007785 .vendor = "ISSI",
Angel Pons2ef47f32018-09-30 16:47:30 +02007786 .name = "IS25LP064",
7787 .bustype = BUS_SPI,
7788 .manufacture_id = ISSI_ID_SPI,
7789 .model_id = ISSI_IS25LP064,
7790 .total_size = 8192,
7791 .page_size = 256,
7792 /* OTP: 1024B total; read 0x48; write 0x42 */
7793 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Simon Buhrow9bf829d2021-10-20 17:09:09 +02007794 .tested = TEST_OK_PREW,
Angel Pons2ef47f32018-09-30 16:47:30 +02007795 .probe = probe_spi_rdid,
7796 .probe_timing = TIMING_ZERO,
7797 .block_erasers =
7798 {
7799 {
7800 .eraseblocks = { {4 * 1024, 2048} },
7801 .block_erase = spi_block_erase_20,
7802 }, {
7803 .eraseblocks = { {4 * 1024, 2048} },
7804 .block_erase = spi_block_erase_d7,
7805 }, {
7806 .eraseblocks = { {32 * 1024, 256} },
7807 .block_erase = spi_block_erase_52,
7808 }, {
7809 .eraseblocks = { {64 * 1024, 128} },
7810 .block_erase = spi_block_erase_d8,
7811 }, {
7812 .eraseblocks = { {8 * 1024 * 1024, 1} },
7813 .block_erase = spi_block_erase_60,
7814 }, {
7815 .eraseblocks = { {8 * 1024 * 1024, 1} },
7816 .block_erase = spi_block_erase_c7,
7817 }
7818 },
7819 .unlock = spi_disable_blockprotect,
7820 .write = spi_chip_write_256,
7821 .read = spi_chip_read,
7822 .voltage = {2300, 3600},
7823 },
7824
7825 {
7826 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07007827 .name = "IS25LP128",
7828 .bustype = BUS_SPI,
7829 .manufacture_id = ISSI_ID_SPI,
7830 .model_id = ISSI_IS25LP128,
7831 .total_size = 16384,
7832 .page_size = 256,
7833 /* OTP: 1024B total; read 0x48; write 0x42 */
7834 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
7835 .tested = TEST_OK_PREW,
7836 .probe = probe_spi_rdid,
7837 .probe_timing = TIMING_ZERO,
7838 .block_erasers =
7839 {
7840 {
7841 .eraseblocks = { {4 * 1024, 4096} },
7842 .block_erase = spi_block_erase_20,
7843 }, {
7844 .eraseblocks = { {4 * 1024, 4096} },
7845 .block_erase = spi_block_erase_d7,
7846 }, {
7847 .eraseblocks = { {32 * 1024, 512} },
7848 .block_erase = spi_block_erase_52,
7849 }, {
7850 .eraseblocks = { {64 * 1024, 256} },
7851 .block_erase = spi_block_erase_d8,
7852 }, {
7853 .eraseblocks = { {16 * 1024 * 1024, 1} },
7854 .block_erase = spi_block_erase_60,
7855 }, {
7856 .eraseblocks = { {16 * 1024 * 1024, 1} },
7857 .block_erase = spi_block_erase_c7,
7858 }
7859 },
7860 .unlock = spi_disable_blockprotect,
7861 .write = spi_chip_write_256,
7862 .read = spi_chip_read,
7863 .voltage = {2300, 3600},
7864 },
7865
7866 {
7867 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00007868 .name = "IS25LP256",
7869 .bustype = BUS_SPI,
7870 .manufacture_id = ISSI_ID_SPI,
7871 .model_id = ISSI_IS25LP256,
7872 .total_size = 32768,
7873 .page_size = 256,
7874 /* supports SFDP */
7875 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02007876 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
7877 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00007878 .tested = TEST_OK_PREW,
7879 .probe = probe_spi_rdid,
7880 .probe_timing = TIMING_ZERO,
7881 .block_erasers =
7882 {
7883 {
7884 .eraseblocks = { {4 * 1024, 8192} },
7885 .block_erase = spi_block_erase_21,
7886 }, {
7887 .eraseblocks = { {4 * 1024, 8192} },
7888 .block_erase = spi_block_erase_20,
7889 /* could also use spi_block_erase_d7 */
7890 }, {
7891 .eraseblocks = { {32 * 1024, 1024} },
7892 .block_erase = spi_block_erase_5c,
7893 }, {
7894 .eraseblocks = { {32 * 1024, 1024} },
7895 .block_erase = spi_block_erase_52,
7896 }, {
7897 .eraseblocks = { {64 * 1024, 512} },
7898 .block_erase = spi_block_erase_dc,
7899 }, {
7900 .eraseblocks = { {64 * 1024, 512} },
7901 .block_erase = spi_block_erase_d8,
7902 }, {
7903 .eraseblocks = { {32 * 1024 * 1024, 1} },
7904 .block_erase = spi_block_erase_60,
7905 }, {
7906 .eraseblocks = { {32 * 1024 * 1024, 1} },
7907 .block_erase = spi_block_erase_c7,
7908 }
7909 },
7910 .unlock = spi_disable_blockprotect,
7911 .write = spi_chip_write_256,
7912 .read = spi_chip_read,
7913 .voltage = {2300, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +01007914 .prepare_access = spi_prepare_4ba,
David Hendricks61818dc2018-10-28 01:02:21 +00007915 },
7916
7917 {
7918 .vendor = "ISSI",
Nico Huberb27b8d12018-10-02 20:46:21 +02007919 .name = "IS25WP032",
7920 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007921 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007922 .model_id = ISSI_IS25WP032,
7923 .total_size = 4096,
7924 .page_size = 256,
7925 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01007926 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
7927 dummy cycles; non-volatile read parameters, so disable for now */
7928 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02007929 .tested = TEST_UNTESTED,
7930 .probe = probe_spi_rdid,
7931 .probe_timing = TIMING_ZERO,
7932 .block_erasers =
7933 {
7934 {
7935 .eraseblocks = { {4 * 1024, 1024} },
7936 .block_erase = spi_block_erase_20,
7937 }, {
7938 .eraseblocks = { {4 * 1024, 1024} },
7939 .block_erase = spi_block_erase_d7,
7940 }, {
7941 .eraseblocks = { {32 * 1024, 128} },
7942 .block_erase = spi_block_erase_52,
7943 }, {
7944 .eraseblocks = { {64 * 1024, 64} },
7945 .block_erase = spi_block_erase_d8,
7946 }, {
7947 .eraseblocks = { {4 * 1024 * 1024, 1} },
7948 .block_erase = spi_block_erase_60,
7949 }, {
7950 .eraseblocks = { {4 * 1024 * 1024, 1} },
7951 .block_erase = spi_block_erase_c7,
7952 }
7953 },
7954 .unlock = spi_disable_blockprotect,
7955 .write = spi_chip_write_256,
7956 .read = spi_chip_read,
7957 .voltage = {1650, 1950},
7958 },
7959
7960 {
7961 .vendor = "ISSI",
7962 .name = "IS25WP064",
7963 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +10007964 .manufacture_id = ISSI_ID_SPI,
Nico Huberb27b8d12018-10-02 20:46:21 +02007965 .model_id = ISSI_IS25WP064,
7966 .total_size = 8192,
7967 .page_size = 256,
7968 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01007969 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
7970 dummy cycles; non-volatile read parameters, so disable for now */
7971 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Nico Huberb27b8d12018-10-02 20:46:21 +02007972 .tested = TEST_OK_PREW,
7973 .probe = probe_spi_rdid,
7974 .probe_timing = TIMING_ZERO,
7975 .block_erasers =
7976 {
7977 {
7978 .eraseblocks = { {4 * 1024, 2048} },
7979 .block_erase = spi_block_erase_20,
7980 }, {
7981 .eraseblocks = { {4 * 1024, 2048} },
7982 .block_erase = spi_block_erase_d7,
7983 }, {
7984 .eraseblocks = { {32 * 1024, 256} },
7985 .block_erase = spi_block_erase_52,
7986 }, {
7987 .eraseblocks = { {64 * 1024, 128} },
7988 .block_erase = spi_block_erase_d8,
7989 }, {
7990 .eraseblocks = { {8 * 1024 * 1024, 1} },
7991 .block_erase = spi_block_erase_60,
7992 }, {
7993 .eraseblocks = { {8 * 1024 * 1024, 1} },
7994 .block_erase = spi_block_erase_c7,
7995 }
7996 },
7997 .unlock = spi_disable_blockprotect,
7998 .write = spi_chip_write_256,
7999 .read = spi_chip_read,
8000 .voltage = {1650, 1950},
8001 },
8002
8003 {
8004 .vendor = "ISSI",
David Hendricks3083ed92017-05-02 13:25:56 -07008005 .name = "IS25WP128",
8006 .bustype = BUS_SPI,
8007 .manufacture_id = ISSI_ID_SPI,
8008 .model_id = ISSI_IS25WP128,
8009 .total_size = 16384,
8010 .page_size = 256,
8011 /* OTP: 1024B total; read 0x48; write 0x42 */
Nico Huber1412d9f2024-01-06 18:25:49 +01008012 /* QPI: enter/exit 35/f5, SRP with 4 bits directly specifying
8013 dummy cycles; non-volatile read parameters, so disable for now */
8014 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
David Hendricks3083ed92017-05-02 13:25:56 -07008015 .tested = TEST_OK_PREW,
8016 .probe = probe_spi_rdid,
8017 .probe_timing = TIMING_ZERO,
8018 .block_erasers =
8019 {
8020 {
8021 .eraseblocks = { {4 * 1024, 4096} },
8022 .block_erase = spi_block_erase_20,
8023 }, {
8024 .eraseblocks = { {4 * 1024, 4096} },
8025 .block_erase = spi_block_erase_d7,
8026 }, {
8027 .eraseblocks = { {32 * 1024, 512} },
8028 .block_erase = spi_block_erase_52,
8029 }, {
8030 .eraseblocks = { {64 * 1024, 256} },
8031 .block_erase = spi_block_erase_d8,
8032 }, {
8033 .eraseblocks = { {16 * 1024 * 1024, 1} },
8034 .block_erase = spi_block_erase_60,
8035 }, {
8036 .eraseblocks = { {16 * 1024 * 1024, 1} },
8037 .block_erase = spi_block_erase_c7,
8038 }
8039 },
8040 .unlock = spi_disable_blockprotect,
8041 .write = spi_chip_write_256,
8042 .read = spi_chip_read,
8043 .voltage = {1650, 1950},
8044 },
8045
8046 {
8047 .vendor = "ISSI",
David Hendricks61818dc2018-10-28 01:02:21 +00008048 .name = "IS25WP256",
8049 .bustype = BUS_SPI,
8050 .manufacture_id = ISSI_ID_SPI,
8051 .model_id = ISSI_IS25WP256,
8052 .total_size = 32768,
8053 .page_size = 256,
8054 /* supports SFDP */
8055 /* OTP: 1024B total; read 0x68; write 0x62, erase 0x64, read ID 0x4B */
Nico Huberad55d5a2022-06-20 19:32:16 +02008056 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8057 FEATURE_4BA | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
David Hendricks61818dc2018-10-28 01:02:21 +00008058 .tested = TEST_OK_PREW,
8059 .probe = probe_spi_rdid,
8060 .probe_timing = TIMING_ZERO,
8061 .block_erasers =
8062 {
8063 {
8064 .eraseblocks = { {4 * 1024, 8192} },
8065 .block_erase = spi_block_erase_21,
8066 }, {
8067 .eraseblocks = { {4 * 1024, 8192} },
8068 .block_erase = spi_block_erase_20,
8069 /* could also use spi_block_erase_d7 */
8070 }, {
8071 .eraseblocks = { {32 * 1024, 1024} },
8072 .block_erase = spi_block_erase_5c,
8073 }, {
8074 .eraseblocks = { {32 * 1024, 1024} },
8075 .block_erase = spi_block_erase_52,
8076 }, {
8077 .eraseblocks = { {64 * 1024, 512} },
8078 .block_erase = spi_block_erase_dc,
8079 }, {
8080 .eraseblocks = { {64 * 1024, 512} },
8081 .block_erase = spi_block_erase_d8,
8082 }, {
8083 .eraseblocks = { {32 * 1024 * 1024, 1} },
8084 .block_erase = spi_block_erase_60,
8085 }, {
8086 .eraseblocks = { {32 * 1024 * 1024, 1} },
8087 .block_erase = spi_block_erase_c7,
8088 }
8089 },
8090 .unlock = spi_disable_blockprotect,
8091 .write = spi_chip_write_256,
8092 .read = spi_chip_read,
8093 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +01008094 .prepare_access = spi_prepare_4ba,
David Hendricks61818dc2018-10-28 01:02:21 +00008095 },
8096
8097 {
8098 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008099 .name = "IS29GL064B",
8100 .bustype = BUS_PARALLEL,
8101 .manufacture_id = ISSI_ID,
8102 .model_id = ISSI_PMC_IS29GL064B,
8103 .total_size = 8192,
8104 .page_size = 128 * 1024, /* actual page size is 16 */
8105 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8106 .tested = TEST_UNTESTED,
8107 .probe = probe_jedec_29gl,
8108 .probe_timing = TIMING_ZERO,
8109 .block_erasers =
8110 {
8111 {
8112 .eraseblocks = {
8113 {8 * 1024, 8},
8114 {64 * 1024, 127},
8115 },
8116 .block_erase = erase_sector_jedec,
8117 }, {
8118 .eraseblocks = { {8 * 1024 * 1024, 1} },
8119 .block_erase = erase_chip_block_jedec,
8120 },
8121 },
8122 .write = write_jedec_1,
8123 .read = read_memmapped,
8124 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008125 .prepare_access = prepare_memory_access,
8126 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008127 },
8128
8129 {
8130 .vendor = "ISSI",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008131 .name = "IS29GL064H/L",
8132 .bustype = BUS_PARALLEL,
8133 .manufacture_id = ISSI_ID,
8134 .model_id = ISSI_PMC_IS29GL064HL,
8135 .total_size = 8192,
8136 .page_size = 128 * 1024, /* actual page size is 16 */
8137 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8138 .tested = TEST_UNTESTED,
8139 .probe = probe_jedec_29gl,
8140 .probe_timing = TIMING_ZERO,
8141 .block_erasers =
8142 {
8143 {
8144 .eraseblocks = { {64 * 1024, 128} },
8145 .block_erase = erase_sector_jedec,
8146 }, {
8147 .eraseblocks = { {8 * 1024 * 1024, 1} },
8148 .block_erase = erase_chip_block_jedec,
8149 },
8150 },
8151 .write = write_jedec_1,
8152 .read = read_memmapped,
8153 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008154 .prepare_access = prepare_memory_access,
8155 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008156 },
8157
8158 {
8159 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008160 .name = "IS29GL064T",
8161 .bustype = BUS_PARALLEL,
8162 .manufacture_id = ISSI_ID,
8163 .model_id = ISSI_PMC_IS29GL064T,
8164 .total_size = 8192,
8165 .page_size = 128 * 1024, /* actual page size is 16 */
8166 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8167 .tested = TEST_UNTESTED,
8168 .probe = probe_jedec_29gl,
8169 .probe_timing = TIMING_ZERO,
8170 .block_erasers =
8171 {
8172 {
8173 .eraseblocks = {
8174 {64 * 1024, 127},
8175 {8 * 1024, 8},
8176 },
8177 .block_erase = erase_sector_jedec,
8178 }, {
8179 .eraseblocks = { {8 * 1024 * 1024, 1} },
8180 .block_erase = erase_chip_block_jedec,
8181 },
8182 },
8183 .write = write_jedec_1,
8184 .read = read_memmapped,
8185 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008186 .prepare_access = prepare_memory_access,
8187 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008188 },
8189
8190 {
8191 .vendor = "ISSI",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008192 .name = "IS29GL128H/L",
8193 .bustype = BUS_PARALLEL,
8194 .manufacture_id = ISSI_ID,
8195 .model_id = ISSI_PMC_IS29GL128HL,
8196 .total_size = 16384,
8197 .page_size = 128 * 1024, /* actual page size is 16 */
8198 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
8199 .tested = TEST_UNTESTED,
8200 .probe = probe_jedec_29gl,
8201 .probe_timing = TIMING_ZERO,
8202 .block_erasers =
8203 {
8204 {
8205 .eraseblocks = { {128 * 1024, 128} },
8206 .block_erase = erase_sector_jedec,
8207 }, {
8208 .eraseblocks = { {16 * 1024 * 1024, 1} },
8209 .block_erase = erase_chip_block_jedec,
8210 },
8211 },
8212 .write = write_jedec_1,
8213 .read = read_memmapped,
8214 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +01008215 .prepare_access = prepare_memory_access,
8216 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +00008217 },
8218
8219 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008220 .vendor = "Intel",
8221 .name = "25F160S33B8",
8222 .bustype = BUS_SPI,
8223 .manufacture_id = INTEL_ID,
8224 .model_id = INTEL_25F160S33B8,
8225 .total_size = 2048,
8226 .page_size = 256,
8227 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8228 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8229 .tested = TEST_UNTESTED,
8230 .probe = probe_spi_rdid,
8231 .probe_timing = TIMING_ZERO,
8232 .block_erasers =
8233 {
8234 {
8235 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8236 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8237 * have no effect on the memory contents, but sets a flag in the SR.
8238 .eraseblocks = {
8239 {8 * 1024, 8},
8240 {64 * 1024, 31} // inaccessible
8241 },
8242 .block_erase = spi_block_erase_40,
8243 }, { */
8244 .eraseblocks = { {64 * 1024, 32} },
8245 .block_erase = spi_block_erase_d8,
8246 }, {
8247 .eraseblocks = { {2 * 1024 * 1024, 1} },
8248 .block_erase = spi_block_erase_c7,
8249 }
8250 },
8251 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8252 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8253 .write = spi_chip_write_256,
8254 .read = spi_chip_read, /* also fast read 0x0B */
8255 .voltage = {2700, 3600},
8256 },
8257
8258 {
8259 .vendor = "Intel",
8260 .name = "25F160S33T8",
8261 .bustype = BUS_SPI,
8262 .manufacture_id = INTEL_ID,
8263 .model_id = INTEL_25F160S33T8,
8264 .total_size = 2048,
8265 .page_size = 256,
8266 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8267 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8268 .tested = TEST_UNTESTED,
8269 .probe = probe_spi_rdid,
8270 .probe_timing = TIMING_ZERO,
8271 .block_erasers =
8272 {
8273 {
8274 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8275 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8276 * have no effect on the memory contents, but sets a flag in the SR.
8277 .eraseblocks = {
8278 {64 * 1024, 31}, // inaccessible
8279 {8 * 1024, 8}
8280 },
8281 .block_erase = spi_block_erase_40,
8282 }, { */
8283 .eraseblocks = { {64 * 1024, 32} },
8284 .block_erase = spi_block_erase_d8,
8285 }, {
8286 .eraseblocks = { {2 * 1024 * 1024, 1} },
8287 .block_erase = spi_block_erase_c7,
8288 }
8289 },
8290 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8291 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8292 .write = spi_chip_write_256,
8293 .read = spi_chip_read, /* also fast read 0x0B */
8294 .voltage = {2700, 3600},
8295 },
8296
8297 {
8298 .vendor = "Intel",
8299 .name = "25F320S33B8",
8300 .bustype = BUS_SPI,
8301 .manufacture_id = INTEL_ID,
8302 .model_id = INTEL_25F320S33B8,
8303 .total_size = 4096,
8304 .page_size = 256,
8305 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8306 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8307 .tested = TEST_UNTESTED,
8308 .probe = probe_spi_rdid,
8309 .probe_timing = TIMING_ZERO,
8310 .block_erasers =
8311 {
8312 {
8313 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8314 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8315 * have no effect on the memory contents, but sets a flag in the SR.
8316 .eraseblocks = {
8317 {8 * 1024, 8},
8318 {64 * 1024, 63} // inaccessible
8319 },
8320 .block_erase = spi_block_erase_40,
8321 }, { */
8322 .eraseblocks = { {64 * 1024, 64} },
8323 .block_erase = spi_block_erase_d8,
8324 }, {
8325 .eraseblocks = { {4 * 1024 * 1024, 1} },
8326 .block_erase = spi_block_erase_c7,
8327 }
8328 },
8329 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8330 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8331 .write = spi_chip_write_256,
8332 .read = spi_chip_read, /* also fast read 0x0B */
8333 .voltage = {2700, 3600},
8334 },
8335
8336 {
8337 .vendor = "Intel",
8338 .name = "25F320S33T8",
8339 .bustype = BUS_SPI,
8340 .manufacture_id = INTEL_ID,
8341 .model_id = INTEL_25F320S33T8,
8342 .total_size = 4096,
8343 .page_size = 256,
8344 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8345 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8346 .tested = TEST_UNTESTED,
8347 .probe = probe_spi_rdid,
8348 .probe_timing = TIMING_ZERO,
8349 .block_erasers =
8350 {
8351 {
8352 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8353 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8354 * have no effect on the memory contents, but sets a flag in the SR.
8355 .eraseblocks = {
8356 {64 * 1024, 63}, // inaccessible
8357 {8 * 1024, 8}
8358 },
8359 .block_erase = spi_block_erase_40,
8360 }, { */
8361 .eraseblocks = { {64 * 1024, 64} },
8362 .block_erase = spi_block_erase_d8,
8363 }, {
8364 .eraseblocks = { {4 * 1024 * 1024, 1} },
8365 .block_erase = spi_block_erase_c7,
8366 }
8367 },
8368 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8369 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8370 .write = spi_chip_write_256,
8371 .read = spi_chip_read, /* also fast read 0x0B */
8372 .voltage = {2700, 3600},
8373 },
8374
8375 {
8376 .vendor = "Intel",
8377 .name = "25F640S33B8",
8378 .bustype = BUS_SPI,
8379 .manufacture_id = INTEL_ID,
8380 .model_id = INTEL_25F640S33B8,
8381 .total_size = 8192,
8382 .page_size = 256,
8383 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8384 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Zoltan HERPAIe0e8b2b2020-08-08 16:04:34 +02008385 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008386 .probe = probe_spi_rdid,
8387 .probe_timing = TIMING_ZERO,
8388 .block_erasers =
8389 {
8390 {
8391 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8392 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8393 * have no effect on the memory contents, but sets a flag in the SR.
8394 .eraseblocks = {
8395 {8 * 1024, 8},
8396 {64 * 1024, 127} // inaccessible
8397 },
8398 .block_erase = spi_block_erase_40,
8399 }, { */
8400 .eraseblocks = { {64 * 1024, 128} },
8401 .block_erase = spi_block_erase_d8,
8402 }, {
8403 .eraseblocks = { {8 * 1024 * 1024, 1} },
8404 .block_erase = spi_block_erase_c7,
8405 }
8406 },
8407 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8408 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8409 .write = spi_chip_write_256,
8410 .read = spi_chip_read, /* also fast read 0x0B */
8411 .voltage = {2700, 3600},
8412 },
8413
8414 {
8415 .vendor = "Intel",
8416 .name = "25F640S33T8",
8417 .bustype = BUS_SPI,
8418 .manufacture_id = INTEL_ID,
8419 .model_id = INTEL_25F640S33T8,
8420 .total_size = 8192,
8421 .page_size = 256,
8422 /* OTP: 506B total (2x 8B, 30x 16B, 1x 10B); read 0x4B; write 0x42 */
8423 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
8424 .tested = TEST_UNTESTED,
8425 .probe = probe_spi_rdid,
8426 .probe_timing = TIMING_ZERO,
8427 .block_erasers =
8428 {
8429 {
8430 /* This chip supports erasing of the 8 so-called "parameter blocks" with
8431 * opcode 0x40. Trying to access an address outside these 8 8kB blocks does
8432 * have no effect on the memory contents, but sets a flag in the SR.
8433 .eraseblocks = {
8434 {64 * 1024, 127}, // inaccessible
8435 {8 * 1024, 8}
8436 },
8437 .block_erase = spi_block_erase_40,
8438 }, { */
8439 .eraseblocks = { {64 * 1024, 128} },
8440 .block_erase = spi_block_erase_d8,
8441 }, {
8442 .eraseblocks = { {8 * 1024 * 1024, 1} },
8443 .block_erase = spi_block_erase_c7,
8444 }
8445 },
8446 .printlock = spi_prettyprint_status_register_bp2_ep_srwd,
8447 .unlock = spi_disable_blockprotect_bp2_ep_srwd,
8448 .write = spi_chip_write_256,
8449 .read = spi_chip_read, /* also fast read 0x0B */
8450 .voltage = {2700, 3600},
8451 },
8452
8453 {
8454 .vendor = "Intel",
8455 .name = "28F001BN/BX-B",
8456 .bustype = BUS_PARALLEL,
8457 .manufacture_id = INTEL_ID,
8458 .model_id = INTEL_28F001B,
8459 .total_size = 128,
8460 .page_size = 128 * 1024, /* 8k + 2x4k + 112k */
8461 .tested = TEST_UNTESTED,
8462 .probe = probe_jedec,
8463 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8464 .block_erasers =
8465 {
8466 {
8467 .eraseblocks = {
8468 {8 * 1024, 1},
8469 {4 * 1024, 2},
8470 {112 * 1024, 1},
8471 },
8472 .block_erase = erase_block_82802ab,
8473 },
8474 },
8475 .write = write_82802ab,
8476 .read = read_memmapped,
8477 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008478 .prepare_access = prepare_memory_access,
8479 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008480 },
8481
8482 {
8483 .vendor = "Intel",
8484 .name = "28F001BN/BX-T",
8485 .bustype = BUS_PARALLEL,
8486 .manufacture_id = INTEL_ID,
8487 .model_id = INTEL_28F001T,
8488 .total_size = 128,
8489 .page_size = 128 * 1024, /* 112k + 2x4k + 8k */
8490 .tested = TEST_OK_PREW,
8491 .probe = probe_jedec,
8492 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8493 .block_erasers =
8494 {
8495 {
8496 .eraseblocks = {
8497 {112 * 1024, 1},
8498 {4 * 1024, 2},
8499 {8 * 1024, 1},
8500 },
8501 .block_erase = erase_block_82802ab,
8502 },
8503 },
8504 .write = write_82802ab,
8505 .read = read_memmapped,
8506 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +01008507 .prepare_access = prepare_memory_access,
8508 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008509 },
8510
8511 {
8512 .vendor = "Intel",
8513 .name = "28F002BC/BL/BV/BX-T",
8514 .bustype = BUS_PARALLEL,
8515 .manufacture_id = INTEL_ID,
8516 .model_id = INTEL_28F002T,
8517 .total_size = 256,
8518 .page_size = 256 * 1024,
8519 .tested = TEST_OK_PRE,
8520 .probe = probe_82802ab,
8521 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8522 .block_erasers =
8523 {
8524 {
8525 .eraseblocks = {
8526 {128 * 1024, 1},
8527 {96 * 1024, 1},
8528 {8 * 1024, 2},
8529 {16 * 1024, 1},
8530 },
8531 .block_erase = erase_block_82802ab,
8532 },
8533 },
8534 .write = write_82802ab,
8535 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008536 .prepare_access = prepare_memory_access,
8537 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008538 },
8539
8540 {
8541 .vendor = "Intel",
8542 .name = "28F004B5/BE/BV/BX-B",
8543 .bustype = BUS_PARALLEL,
8544 .manufacture_id = INTEL_ID,
8545 .model_id = INTEL_28F004B,
8546 .total_size = 512,
8547 .page_size = 128 * 1024, /* maximal block size */
8548 .tested = TEST_UNTESTED,
8549 .probe = probe_82802ab,
8550 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8551 .block_erasers =
8552 {
8553 {
8554 .eraseblocks = {
8555 {16 * 1024, 1},
8556 {8 * 1024, 2},
8557 {96 * 1024, 1},
8558 {128 * 1024, 3},
8559 },
8560 .block_erase = erase_block_82802ab,
8561 },
8562 },
8563 .write = write_82802ab,
8564 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008565 .prepare_access = prepare_memory_access,
8566 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008567 },
8568
8569 {
8570 .vendor = "Intel",
8571 .name = "28F004B5/BE/BV/BX-T",
8572 .bustype = BUS_PARALLEL,
8573 .manufacture_id = INTEL_ID,
8574 .model_id = INTEL_28F004T,
8575 .total_size = 512,
8576 .page_size = 128 * 1024, /* maximal block size */
8577 .tested = TEST_UNTESTED,
8578 .probe = probe_82802ab,
8579 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8580 .block_erasers =
8581 {
8582 {
8583 .eraseblocks = {
8584 {128 * 1024, 3},
8585 {96 * 1024, 1},
8586 {8 * 1024, 2},
8587 {16 * 1024, 1},
8588 },
8589 .block_erase = erase_block_82802ab,
8590 },
8591 },
8592 .write = write_82802ab,
8593 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008594 .prepare_access = prepare_memory_access,
8595 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008596 },
8597
8598 {
8599 .vendor = "Intel",
8600 .name = "28F008S3/S5/SC",
8601 .bustype = BUS_PARALLEL,
8602 .manufacture_id = INTEL_ID,
8603 .model_id = INTEL_28F004S3,
8604 .total_size = 512,
8605 .page_size = 256,
8606 .tested = TEST_UNTESTED,
8607 .probe = probe_82802ab,
8608 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8609 .block_erasers =
8610 {
8611 {
8612 .eraseblocks = { {64 * 1024, 8} },
8613 .block_erase = erase_block_82802ab,
8614 },
8615 },
8616 .unlock = unlock_28f004s5,
8617 .write = write_82802ab,
8618 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008619 .prepare_access = prepare_memory_access,
8620 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008621 },
8622
8623 {
8624 .vendor = "Intel",
8625 .name = "28F400BV/BX/CE/CV-B",
8626 .bustype = BUS_PARALLEL,
8627 .manufacture_id = INTEL_ID,
8628 .model_id = INTEL_28F400B,
8629 .total_size = 512,
8630 .page_size = 128 * 1024, /* maximal block size */
8631 .feature_bits = FEATURE_ADDR_SHIFTED,
8632 .tested = TEST_UNTESTED,
8633 .probe = probe_82802ab,
8634 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8635 .block_erasers =
8636 {
8637 {
8638 .eraseblocks = {
8639 {16 * 1024, 1},
8640 {8 * 1024, 2},
8641 {96 * 1024, 1},
8642 {128 * 1024, 3},
8643 },
8644 .block_erase = erase_block_82802ab,
8645 },
8646 },
8647 .write = write_82802ab,
8648 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008649 .prepare_access = prepare_memory_access,
8650 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008651 },
8652
8653 {
8654 .vendor = "Intel",
8655 .name = "28F400BV/BX/CE/CV-T",
8656 .bustype = BUS_PARALLEL,
8657 .manufacture_id = INTEL_ID,
8658 .model_id = INTEL_28F400T,
8659 .total_size = 512,
8660 .page_size = 128 * 1024, /* maximal block size */
8661 .feature_bits = FEATURE_ADDR_SHIFTED,
8662 .tested = TEST_UNTESTED,
8663 .probe = probe_82802ab,
8664 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
8665 .block_erasers =
8666 {
8667 {
8668 .eraseblocks = {
8669 {128 * 1024, 3},
8670 {96 * 1024, 1},
8671 {8 * 1024, 2},
8672 {16 * 1024, 1},
8673 },
8674 .block_erase = erase_block_82802ab,
8675 },
8676 },
8677 .write = write_82802ab,
8678 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +01008679 .prepare_access = prepare_memory_access,
8680 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008681 },
8682
8683 {
8684 .vendor = "Intel",
8685 .name = "82802AB",
8686 .bustype = BUS_FWH,
8687 .manufacture_id = INTEL_ID,
8688 .model_id = INTEL_82802AB,
8689 .total_size = 512,
8690 .page_size = 64 * 1024,
Alan Green88552572019-07-24 13:56:06 +10008691 .tested = TEST_OK_PREW,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008692 .probe = probe_82802ab,
8693 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8694 .block_erasers =
8695 {
8696 {
8697 .eraseblocks = { {64 * 1024, 8} },
8698 .block_erase = erase_block_82802ab,
8699 },
8700 },
8701 .unlock = unlock_regspace2_uniform_64k,
8702 .write = write_82802ab,
8703 .read = read_memmapped,
8704 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008705 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008706 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008707 },
8708
8709 {
8710 .vendor = "Intel",
8711 .name = "82802AC",
8712 .bustype = BUS_FWH,
8713 .manufacture_id = INTEL_ID,
8714 .model_id = INTEL_82802AC,
8715 .total_size = 1024,
8716 .page_size = 64 * 1024,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008717 .tested = TEST_OK_PR,
8718 .probe = probe_82802ab,
8719 .probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
8720 .block_erasers =
8721 {
8722 {
8723 .eraseblocks = { {64 * 1024, 16} },
8724 .block_erase = erase_block_82802ab,
8725 },
8726 },
8727 .unlock = unlock_regspace2_uniform_64k,
8728 .write = write_82802ab,
8729 .read = read_memmapped,
8730 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +01008731 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +01008732 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008733 },
8734
8735 {
8736 .vendor = "Macronix",
8737 .name = "MX23L12854",
8738 .bustype = BUS_SPI,
8739 .manufacture_id = MACRONIX_ID,
8740 .model_id = MACRONIX_MX23L12854,
8741 .total_size = 16384,
8742 .page_size = 256,
8743 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8744 .probe = probe_spi_rdid,
8745 .probe_timing = TIMING_ZERO,
8746 .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
8747 .read = spi_chip_read, /* Fast read (0x0B) supported */
8748 .voltage = {3000, 3600},
8749 },
8750
8751 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008752 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008753 .name = "MX23L1654",
8754 .bustype = BUS_SPI,
8755 .manufacture_id = MACRONIX_ID,
8756 .model_id = MACRONIX_MX23L1654,
8757 .total_size = 2048,
8758 .page_size = 256,
8759 .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
8760 .probe = probe_spi_rdid,
8761 .probe_timing = TIMING_ZERO,
8762 .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
8763 .read = spi_chip_read, /* Fast read (0x0B) supported */
8764 .voltage = {3000, 3600},
8765 },
8766
8767 {
8768 .vendor = "Macronix",
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008769 .name = "MX23L3254",
8770 .bustype = BUS_SPI,
8771 .manufacture_id = MACRONIX_ID,
8772 .model_id = MACRONIX_MX23L3254,
8773 .total_size = 4096,
8774 .page_size = 256,
Stefan Tauner6455dff2014-05-26 00:36:24 +00008775 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola4e7f36e2014-05-03 23:01:18 +00008776 .probe = probe_spi_rdid,
8777 .probe_timing = TIMING_ZERO,
8778 .write = NULL, /* MX23L3254 is a mask ROM, so it is read-only */
8779 .read = spi_chip_read, /* Fast read (0x0B) supported */
8780 .voltage = {3000, 3600},
8781 },
8782
8783 {
8784 .vendor = "Macronix",
Michael Coppola583ea322014-08-20 18:56:35 +00008785 .name = "MX23L6454",
8786 .bustype = BUS_SPI,
8787 .manufacture_id = MACRONIX_ID,
8788 .model_id = MACRONIX_MX23L6454,
8789 .total_size = 8192,
8790 .page_size = 256,
Stefan Tauner23e10b82016-01-23 16:16:49 +00008791 .tested = {.probe = OK, .read = OK, .erase = NA, .write = NA},
Michael Coppola583ea322014-08-20 18:56:35 +00008792 .probe = probe_spi_rdid,
8793 .probe_timing = TIMING_ZERO,
8794 .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
8795 .read = spi_chip_read, /* Fast read (0x0B) supported */
8796 .voltage = {3000, 3600},
8797 },
8798
8799 {
8800 .vendor = "Macronix",
Stefan Taunerf656e802013-02-02 15:35:44 +00008801 .name = "MX25L1005(C)/MX25L1006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008802 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008803 .manufacture_id = MACRONIX_ID,
8804 .model_id = MACRONIX_MX25L1005,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008805 .total_size = 128,
8806 .page_size = 256,
Stefan Taunerf656e802013-02-02 15:35:44 +00008807 /* MX25L1006E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01008808 /* FEATURE_FAST_READ_DOUT: MX25L1006E */
8809 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Stefan Taunerd7d423b2012-10-20 09:13:16 +00008810 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008811 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008812 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008813 .block_erasers =
8814 {
8815 {
8816 .eraseblocks = { {4 * 1024, 32} },
8817 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008818 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008819 .eraseblocks = { {64 * 1024, 2} },
8820 .block_erase = spi_block_erase_d8,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008821 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008822 .eraseblocks = { {128 * 1024, 1} },
8823 .block_erase = spi_block_erase_60,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008824 }, {
Carl-Daniel Hailfingerf38431a2009-09-05 02:30:58 +00008825 .eraseblocks = { {128 * 1024, 1} },
8826 .block_erase = spi_block_erase_c7,
8827 },
8828 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008829 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00008830 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008831 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008832 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008833 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008834 },
8835
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008836 {
8837 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10008838 .name = "MX25L12805D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008839 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008840 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008841 .model_id = MACRONIX_MX25L12805D,
8842 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008843 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008844 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01008845 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008846 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008847 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008848 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008849 .block_erasers =
8850 {
8851 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008852 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008853 .block_erase = spi_block_erase_20,
8854 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008855 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008856 .block_erase = spi_block_erase_d8,
8857 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008858 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008859 .block_erase = spi_block_erase_60,
8860 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008861 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008862 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008863 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008864 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008865 .printlock = spi_prettyprint_status_register_bp3_srwd,
8866 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008867 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008868 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008869 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008870 },
8871
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008872 {
8873 .vendor = "Macronix",
Tao Xia571f6ad2021-07-21 16:41:53 +08008874 .name = "MX25L12833F/MX25L12835F/MX25L12845E/MX25L12865E/MX25L12873F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008875 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008876 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008877 .model_id = MACRONIX_MX25L12805D,
8878 .total_size = 16384,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008879 .page_size = 256,
Tao Xia571f6ad2021-07-21 16:41:53 +08008880 /* OTP: MX25L12833F has 1KB total, others have 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01008881 /* *F versions: FEATURE_QPI_35 + DC bits (6, 4, 8, 10) in configuration register */
8882 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
8883 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stefan Tauner8179be52011-06-04 13:13:34 +00008884 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008885 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008886 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008887 .block_erasers =
8888 {
8889 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008890 .eraseblocks = { {4 * 1024, 4096} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008891 .block_erase = spi_block_erase_20,
8892 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008893 .eraseblocks = { {32 * 1024, 512} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008894 .block_erase = spi_block_erase_52,
8895 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008896 .eraseblocks = { {64 * 1024, 256} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008897 .block_erase = spi_block_erase_d8,
8898 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008899 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008900 .block_erase = spi_block_erase_60,
8901 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10008902 .eraseblocks = { {16 * 1024 * 1024, 1} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008903 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008904 }
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008905 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10008906 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01008907 .reg_bits =
8908 {
8909 .qe = {STATUS1, 6, RW},
8910 },
8911 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10008912 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008913 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008914 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00008915 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00008916 },
8917
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008918 {
8919 .vendor = "Macronix",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008920 .name = "MX25L1605",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00008921 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00008922 .manufacture_id = MACRONIX_ID,
8923 .model_id = MACRONIX_MX25L1605,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008924 .total_size = 2048,
8925 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01008926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Sven Schnelle4bd8a402011-03-07 10:59:06 +00008927 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00008928 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00008929 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008930 .block_erasers =
8931 {
8932 {
Stefan Tauner226037d2013-03-16 01:22:12 +00008933 .eraseblocks = { {64 * 1024, 32} },
8934 .block_erase = spi_block_erase_20,
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008935 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00008936 .eraseblocks = { {64 * 1024, 32} },
8937 .block_erase = spi_block_erase_d8,
8938 }, {
8939 .eraseblocks = { {2 * 1024 * 1024, 1} },
8940 .block_erase = spi_block_erase_60,
8941 }, {
8942 .eraseblocks = { {2 * 1024 * 1024, 1} },
8943 .block_erase = spi_block_erase_c7,
8944 },
8945 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008946 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Stefan Tauner226037d2013-03-16 01:22:12 +00008947 .unlock = spi_disable_blockprotect,
8948 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008949 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00008950 .voltage = {2700, 3600},
8951 },
8952
8953 {
8954 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008955 .name = "MX25L1605A/MX25L1606E/MX25L1608E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008956 .bustype = BUS_SPI,
8957 .manufacture_id = MACRONIX_ID,
8958 .model_id = MACRONIX_MX25L1605,
8959 .total_size = 2048,
8960 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00008961 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
Nico Huber46552c82024-03-27 01:18:12 +01008962 /* FEATURE_FAST_READ_DOUT: MX25L1606E & MX25L1608E */
8963 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +00008964 .tested = TEST_OK_PREW,
8965 .probe = probe_spi_rdid,
8966 .probe_timing = TIMING_ZERO,
8967 .block_erasers =
8968 {
8969 {
8970 .eraseblocks = { {4 * 1024, 512} },
8971 .block_erase = spi_block_erase_20,
8972 }, {
8973 .eraseblocks = { {64 * 1024, 32} },
Carl-Daniel Hailfinger40107122009-10-01 13:15:01 +00008974 .block_erase = spi_block_erase_52,
8975 }, {
8976 .eraseblocks = { {64 * 1024, 32} },
8977 .block_erase = spi_block_erase_d8,
8978 }, {
8979 .eraseblocks = { {2 * 1024 * 1024, 1} },
8980 .block_erase = spi_block_erase_60,
8981 }, {
8982 .eraseblocks = { {2 * 1024 * 1024, 1} },
8983 .block_erase = spi_block_erase_c7,
8984 },
8985 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00008986 .printlock = spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
Stefan Tauner5c316f92015-02-08 21:57:52 +00008987 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00008988 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01008989 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00008990 .voltage = {2700, 3600},
8991 },
8992
8993 {
8994 .vendor = "Macronix",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00008995 .name = "MX25L1605D/MX25L1608D/MX25L1673E",
Stefan Tauner226037d2013-03-16 01:22:12 +00008996 .bustype = BUS_SPI,
8997 .manufacture_id = MACRONIX_ID,
8998 .model_id = MACRONIX_MX25L1605,
8999 .total_size = 2048,
9000 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009001 /* FEATURE_QIO: MX25L1673E */
9002 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009003 .tested = TEST_OK_PREW,
9004 .probe = probe_spi_rdid,
9005 .probe_timing = TIMING_ZERO,
9006 .block_erasers =
9007 {
9008 {
9009 .eraseblocks = { {4 * 1024, 512} },
9010 .block_erase = spi_block_erase_20,
9011 }, {
9012 .eraseblocks = { {64 * 1024, 32} },
9013 .block_erase = spi_block_erase_d8,
9014 }, {
9015 .eraseblocks = { {2 * 1024 * 1024, 1} },
9016 .block_erase = spi_block_erase_60,
9017 }, {
9018 .eraseblocks = { {2 * 1024 * 1024, 1} },
9019 .block_erase = spi_block_erase_c7,
9020 },
9021 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009022 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode, for 73E is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009023 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009024 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009025 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009026 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009027 },
9028
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009029 {
9030 .vendor = "Macronix",
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009031 .name = "MX25L1635D",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009032 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009033 .manufacture_id = MACRONIX_ID,
9034 .model_id = MACRONIX_MX25L1635D,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009035 .total_size = 2048,
9036 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009037 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009038 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9039 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Angel Ponsc2054872021-01-15 18:57:32 +01009040 .tested = TEST_OK_PREW,
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009041 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009042 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009043 .block_erasers =
9044 {
9045 {
9046 .eraseblocks = { {4 * 1024, 512} },
9047 .block_erase = spi_block_erase_20,
9048 }, {
9049 .eraseblocks = { {64 * 1024, 32} },
9050 .block_erase = spi_block_erase_d8,
9051 }, {
9052 .eraseblocks = { {2 * 1024 * 1024, 1} },
9053 .block_erase = spi_block_erase_60,
9054 }, {
9055 .eraseblocks = { {2 * 1024 * 1024, 1} },
9056 .block_erase = spi_block_erase_c7,
9057 }
9058 },
Nico Huber46552c82024-03-27 01:18:12 +01009059 .reg_bits =
9060 {
9061 .qe = {STATUS1, 6, RW},
9062 },
9063 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009064 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009065 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009066 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009067 .voltage = {2700, 3600},
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009068 },
Stephan Guillouxfd315502009-04-20 22:54:13 +00009069
Stephan Guillouxf5c70902009-04-19 23:04:00 +00009070 {
9071 .vendor = "Macronix",
Stephan Guilloux3611b802010-09-13 19:59:28 +00009072 .name = "MX25L1635E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009073 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009074 .manufacture_id = MACRONIX_ID,
9075 .model_id = MACRONIX_MX25L1635E,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009076 .total_size = 2048,
9077 .page_size = 256,
Stefan Tauner226037d2013-03-16 01:22:12 +00009078 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009079 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9080 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009081 .tested = TEST_UNTESTED,
9082 .probe = probe_spi_rdid,
9083 .probe_timing = TIMING_ZERO,
9084 .block_erasers =
9085 {
9086 {
9087 .eraseblocks = { {4 * 1024, 512} },
9088 .block_erase = spi_block_erase_20,
9089 }, {
9090 .eraseblocks = { {64 * 1024, 32} },
9091 .block_erase = spi_block_erase_d8,
9092 }, {
9093 .eraseblocks = { {2 * 1024 * 1024, 1} },
9094 .block_erase = spi_block_erase_60,
9095 }, {
9096 .eraseblocks = { {2 * 1024 * 1024, 1} },
9097 .block_erase = spi_block_erase_c7,
9098 }
9099 },
Nico Huber46552c82024-03-27 01:18:12 +01009100 .reg_bits =
9101 {
9102 .qe = {STATUS1, 6, RW},
9103 },
9104 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009105 .unlock = spi_disable_blockprotect_bp3_srwd,
Stephan Guilloux3611b802010-09-13 19:59:28 +00009106 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009107 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +00009108 .voltage = {2700, 3600},
Stephan Guilloux3611b802010-09-13 19:59:28 +00009109 },
9110
9111 {
9112 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009113 .name = "MX25L2005(C)/MX25L2006E",
9114 .bustype = BUS_SPI,
9115 .manufacture_id = MACRONIX_ID,
9116 .model_id = MACRONIX_MX25L2005,
9117 .total_size = 256,
9118 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009119 /* FEATURE_FAST_READ_DOUT: MX25L2006E */
9120 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009121 .tested = TEST_OK_PREW,
9122 .probe = probe_spi_rdid,
9123 .probe_timing = TIMING_ZERO,
9124 .block_erasers =
9125 {
9126 {
9127 .eraseblocks = { {4 * 1024, 64} },
9128 .block_erase = spi_block_erase_20,
9129 }, {
9130 .eraseblocks = { {64 * 1024, 4} },
9131 .block_erase = spi_block_erase_52,
9132 }, {
9133 .eraseblocks = { {64 * 1024, 4} },
9134 .block_erase = spi_block_erase_d8,
9135 }, {
9136 .eraseblocks = { {256 * 1024, 1} },
9137 .block_erase = spi_block_erase_60,
9138 }, {
9139 .eraseblocks = { {256 * 1024, 1} },
9140 .block_erase = spi_block_erase_c7,
9141 },
9142 },
9143 .printlock = spi_prettyprint_status_register_bp1_srwd,
9144 .unlock = spi_disable_blockprotect,
9145 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009146 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009147 .voltage = {2700, 3600},
9148 },
9149
9150 {
9151 .vendor = "Macronix",
Alan Green03707302019-08-26 12:50:43 +10009152 .name = "MX25L25635F/MX25L25645G",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009153 .bustype = BUS_SPI,
9154 .manufacture_id = MACRONIX_ID,
9155 .model_id = MACRONIX_MX25L25635F,
9156 .total_size = 32768,
9157 .page_size = 256,
9158 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009159 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
9160 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
9161 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009162 .tested = TEST_OK_PREW,
9163 .probe = probe_spi_rdid,
9164 .probe_timing = TIMING_ZERO,
9165 .block_erasers =
9166 {
9167 {
9168 .eraseblocks = { {4 * 1024, 8192} },
9169 .block_erase = spi_block_erase_21,
9170 }, {
9171 .eraseblocks = { {4 * 1024, 8192} },
9172 .block_erase = spi_block_erase_20,
9173 }, {
9174 .eraseblocks = { {32 * 1024, 1024} },
9175 .block_erase = spi_block_erase_5c,
9176 }, {
9177 .eraseblocks = { {32 * 1024, 1024} },
9178 .block_erase = spi_block_erase_52,
9179 }, {
9180 .eraseblocks = { {64 * 1024, 512} },
9181 .block_erase = spi_block_erase_dc,
9182 }, {
9183 .eraseblocks = { {64 * 1024, 512} },
9184 .block_erase = spi_block_erase_d8,
9185 }, {
9186 .eraseblocks = { {32 * 1024 * 1024, 1} },
9187 .block_erase = spi_block_erase_60,
9188 }, {
9189 .eraseblocks = { {32 * 1024 * 1024, 1} },
9190 .block_erase = spi_block_erase_c7,
9191 }
9192 },
9193 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
Nico Huber46552c82024-03-27 01:18:12 +01009194 .reg_bits = {
9195 .qe = {STATUS1, 6, RW},
9196 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
9197 },
9198 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009199 .unlock = spi_disable_blockprotect_bp3_srwd,
9200 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009201 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009202 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +01009203 .prepare_access = spi_prepare_4ba,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009204 },
9205
9206 {
9207 .vendor = "Macronix",
Stefan Tauner226037d2013-03-16 01:22:12 +00009208 .name = "MX25L3205(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009209 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009210 .manufacture_id = MACRONIX_ID,
9211 .model_id = MACRONIX_MX25L3205,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009212 .total_size = 4096,
9213 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009214 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
David Hendricks22e05322010-12-13 23:54:59 +00009215 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009216 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009217 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +00009218 .block_erasers =
9219 {
9220 {
Stefan Tauner226037d2013-03-16 01:22:12 +00009221 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009222 .block_erase = spi_block_erase_20,
9223 }, {
Stefan Tauner226037d2013-03-16 01:22:12 +00009224 .eraseblocks = { {64 * 1024, 64} },
Sean Nelson6b11ad22009-12-23 17:05:59 +00009225 .block_erase = spi_block_erase_d8,
9226 }, {
9227 .eraseblocks = { {4 * 1024 * 1024, 1} },
9228 .block_erase = spi_block_erase_60,
9229 }, {
9230 .eraseblocks = { {4 * 1024 * 1024, 1} },
9231 .block_erase = spi_block_erase_c7,
9232 },
9233 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009234 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +00009235 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009236 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009237 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009238 .voltage = {2700, 3600},
9239 },
9240
9241 {
9242 .vendor = "Macronix",
9243 .name = "MX25L3205D/MX25L3208D",
9244 .bustype = BUS_SPI,
9245 .manufacture_id = MACRONIX_ID,
9246 .model_id = MACRONIX_MX25L3205,
9247 .total_size = 4096,
9248 .page_size = 256,
9249 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009250 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009251 .tested = TEST_OK_PREW,
9252 .probe = probe_spi_rdid,
9253 .probe_timing = TIMING_ZERO,
9254 .block_erasers =
9255 {
9256 {
9257 .eraseblocks = { {4 * 1024, 1024} },
9258 .block_erase = spi_block_erase_20,
9259 }, {
9260 .eraseblocks = { {64 * 1024, 64} },
9261 .block_erase = spi_block_erase_d8,
9262 }, {
9263 .eraseblocks = { {4 * 1024 * 1024, 1} },
9264 .block_erase = spi_block_erase_60,
9265 }, {
9266 .eraseblocks = { {4 * 1024 * 1024, 1} },
9267 .block_erase = spi_block_erase_c7,
9268 },
9269 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009270 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009271 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009272 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009273 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009274 .voltage = {2700, 3600},
9275 },
9276
9277 {
9278 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009279 .name = "MX25L3206E/MX25L3208E",
Stefan Tauner226037d2013-03-16 01:22:12 +00009280 .bustype = BUS_SPI,
9281 .manufacture_id = MACRONIX_ID,
9282 .model_id = MACRONIX_MX25L3205,
9283 .total_size = 4096,
9284 .page_size = 256,
9285 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009286 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner226037d2013-03-16 01:22:12 +00009287 .tested = TEST_OK_PREW,
9288 .probe = probe_spi_rdid,
9289 .probe_timing = TIMING_ZERO,
9290 .block_erasers =
9291 {
9292 {
9293 .eraseblocks = { {4 * 1024, 1024} },
9294 .block_erase = spi_block_erase_20,
9295 }, {
9296 .eraseblocks = { {64 * 1024, 64} },
9297 .block_erase = spi_block_erase_d8,
9298 }, {
9299 .eraseblocks = { {64 * 1024, 64} },
9300 .block_erase = spi_block_erase_52,
9301 }, {
9302 .eraseblocks = { {4 * 1024 * 1024, 1} },
9303 .block_erase = spi_block_erase_60,
9304 }, {
9305 .eraseblocks = { {4 * 1024 * 1024, 1} },
9306 .block_erase = spi_block_erase_c7,
9307 },
9308 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009309 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009310 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009311 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009312 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009313 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009314 },
9315
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009316 {
9317 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009318 .name = "MX25L3235D",
9319 .bustype = BUS_SPI,
9320 .manufacture_id = MACRONIX_ID,
9321 .model_id = MACRONIX_MX25L3235D,
9322 .total_size = 4096,
9323 .page_size = 256,
9324 /* OTP: 256B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009325 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
9326 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009327 .tested = TEST_UNTESTED,
9328 .probe = probe_spi_rdid,
9329 .probe_timing = TIMING_ZERO,
9330 .block_erasers =
9331 {
9332 {
9333 .eraseblocks = { {4 * 1024, 1024} },
9334 .block_erase = spi_block_erase_20,
9335 }, {
9336 .eraseblocks = { {64 * 1024, 64} },
9337 .block_erase = spi_block_erase_d8,
9338 }, {
9339 .eraseblocks = { {4 * 1024 * 1024, 1} },
9340 .block_erase = spi_block_erase_60,
9341 }, {
9342 .eraseblocks = { {4 * 1024 * 1024, 1} },
9343 .block_erase = spi_block_erase_c7,
9344 }
9345 },
Nico Huber46552c82024-03-27 01:18:12 +01009346 .reg_bits =
9347 {
9348 .qe = {STATUS1, 6, RW},
9349 },
9350 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009351 .unlock = spi_disable_blockprotect_bp3_srwd,
9352 .write = spi_chip_write_256,
9353 .read = spi_chip_read,
9354 .voltage = {2700, 3600},
9355 },
9356
9357 {
9358 .vendor = "Macronix",
Nico Huberb6683e02021-04-21 13:04:29 +02009359 .name = "MX25L3233F/MX25L3273E",
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009360 .bustype = BUS_SPI,
9361 .manufacture_id = MACRONIX_ID,
9362 .model_id = MACRONIX_MX25L3205,
9363 .total_size = 4096,
9364 .page_size = 256,
Nico Huber6e69e2b2021-04-21 13:03:13 +02009365 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009366 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Stefan Tauner23e10b82016-01-23 16:16:49 +00009367 .tested = TEST_OK_PREW,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009368 .probe = probe_spi_rdid,
9369 .probe_timing = TIMING_ZERO,
9370 .block_erasers =
9371 {
9372 {
9373 .eraseblocks = { {4 * 1024, 1024} },
9374 .block_erase = spi_block_erase_20,
9375 }, {
9376 .eraseblocks = { {32 * 1024, 128} },
9377 .block_erase = spi_block_erase_52,
9378 }, {
9379 .eraseblocks = { {64 * 1024, 64} },
9380 .block_erase = spi_block_erase_d8,
9381 }, {
9382 .eraseblocks = { {4 * 1024 * 1024, 1} },
9383 .block_erase = spi_block_erase_60,
9384 }, {
9385 .eraseblocks = { {4 * 1024 * 1024, 1} },
9386 .block_erase = spi_block_erase_c7,
9387 },
9388 },
Nico Huber46552c82024-03-27 01:18:12 +01009389 .reg_bits =
9390 {
9391 .qe = {STATUS1, 6, RW},
9392 },
Stefan Tauner12f3d512014-05-27 21:27:27 +00009393 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009394 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009395 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009396 .read = spi_chip_read,
Nico Huberb6683e02021-04-21 13:04:29 +02009397 .voltage = {2700, 3600}, /* 33F 2.65V..3.6V */
Stefan Taunerc2eec2c2014-05-03 21:33:01 +00009398 },
9399
9400 {
9401 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009402 .name = "MX25L4005(A/C)/MX25L4006E",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009403 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009404 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009405 .model_id = MACRONIX_MX25L4005,
9406 .total_size = 512,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009407 .page_size = 256,
Nico Huber46552c82024-03-27 01:18:12 +01009408 /* FEATURE_FAST_READ_DOUT: MX25L4006E */
9409 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009410 .tested = TEST_OK_PREW,
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009411 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009412 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009413 .block_erasers =
9414 {
9415 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009416 .eraseblocks = { {4 * 1024, 128} },
Sean Nelson54596372010-01-09 05:30:14 +00009417 .block_erase = spi_block_erase_20,
9418 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009419 .eraseblocks = { {64 * 1024, 8} },
9420 .block_erase = spi_block_erase_52,
9421 }, {
9422 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson54596372010-01-09 05:30:14 +00009423 .block_erase = spi_block_erase_d8,
9424 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009425 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009426 .block_erase = spi_block_erase_60,
9427 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009428 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009429 .block_erase = spi_block_erase_c7,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009430 },
Sean Nelson54596372010-01-09 05:30:14 +00009431 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009432 .printlock = spi_prettyprint_status_register_bp2_srwd,
9433 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009434 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009435 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009436 .voltage = {2700, 3600},
Stephan Guilloux70ea9a32009-04-23 22:51:56 +00009437 },
9438
9439 {
9440 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009441 .name = "MX25L512(E)/MX25V512(C)",
9442 .bustype = BUS_SPI,
9443 .manufacture_id = MACRONIX_ID,
9444 .model_id = MACRONIX_MX25L512,
9445 .total_size = 64,
9446 .page_size = 256,
9447 /* MX25L512E supports SFDP */
Nico Huber46552c82024-03-27 01:18:12 +01009448 /* FEATURE_FAST_READ_DOUT: MX25L512E */
9449 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009450 .tested = TEST_OK_PREW,
9451 .probe = probe_spi_rdid,
9452 .probe_timing = TIMING_ZERO,
9453 .block_erasers =
9454 {
9455 {
9456 .eraseblocks = { {4 * 1024, 16} },
9457 .block_erase = spi_block_erase_20,
9458 }, {
9459 .eraseblocks = { {64 * 1024, 1} },
9460 .block_erase = spi_block_erase_52,
9461 }, {
9462 .eraseblocks = { {64 * 1024, 1} },
9463 .block_erase = spi_block_erase_d8,
9464 }, {
9465 .eraseblocks = { {64 * 1024, 1} },
9466 .block_erase = spi_block_erase_60,
9467 }, {
9468 .eraseblocks = { {64 * 1024, 1} },
9469 .block_erase = spi_block_erase_c7,
9470 },
9471 },
9472 .printlock = spi_prettyprint_status_register_bp1_srwd,
9473 .unlock = spi_disable_blockprotect,
9474 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009475 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009476 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V512(C) */
9477 },
9478
9479 {
9480 .vendor = "Macronix",
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009481 .name = "MX25L5121E",
9482 .bustype = BUS_SPI,
9483 .manufacture_id = MACRONIX_ID,
9484 .model_id = MACRONIX_MX25L5121E,
9485 .total_size = 64,
9486 .page_size = 32,
Nico Huber46552c82024-03-27 01:18:12 +01009487 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009488 .tested = TEST_OK_PREW,
9489 .probe = probe_spi_rdid,
9490 .probe_timing = TIMING_ZERO,
9491 .block_erasers =
9492 {
9493 {
9494 .eraseblocks = { {4 * 1024, 16} },
9495 .block_erase = spi_block_erase_20,
9496 }, {
9497 .eraseblocks = { {64 * 1024, 1} },
9498 .block_erase = spi_block_erase_52,
9499 }, {
9500 .eraseblocks = { {64 * 1024, 1} },
9501 .block_erase = spi_block_erase_d8,
9502 }, {
9503 .eraseblocks = { {64 * 1024, 1} },
9504 .block_erase = spi_block_erase_60,
9505 }, {
9506 .eraseblocks = { {64 * 1024, 1} },
9507 .block_erase = spi_block_erase_c7,
9508 },
9509 },
9510 .printlock = spi_prettyprint_status_register_bp1_srwd,
9511 .unlock = spi_disable_blockprotect,
9512 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009513 .read = spi_chip_read,
Steve Markgraf7e6f3a72020-07-13 18:22:56 +02009514 .voltage = {2700, 3600},
9515 },
9516
9517 {
9518 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009519 .name = "MX25L6405",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009520 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009521 .manufacture_id = MACRONIX_ID,
9522 .model_id = MACRONIX_MX25L6405,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009523 .total_size = 8192,
9524 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009525 /* Has an additional 512B EEPROM sector */
9526 .feature_bits = FEATURE_WRSR_WREN,
Paul Menzelac427b22012-02-16 21:07:07 +00009527 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009528 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009529 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009530 .block_erasers =
9531 {
9532 {
9533 .eraseblocks = { {64 * 1024, 128} },
9534 .block_erase = spi_block_erase_20,
9535 }, {
9536 .eraseblocks = { {64 * 1024, 128} },
9537 .block_erase = spi_block_erase_d8,
9538 }, {
9539 .eraseblocks = { {8 * 1024 * 1024, 1} },
9540 .block_erase = spi_block_erase_60,
9541 }, {
9542 .eraseblocks = { {8 * 1024 * 1024, 1} },
9543 .block_erase = spi_block_erase_c7,
9544 }
9545 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009546 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009547 .unlock = spi_disable_blockprotect_bp3_srwd,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009548 .write = spi_chip_write_256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009549 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +00009550 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +00009551 },
9552
Stephan Guilloux5c5b5252009-01-08 03:40:17 +00009553 {
9554 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009555 .name = "MX25L6405D",
Stefan Tauner226037d2013-03-16 01:22:12 +00009556 .bustype = BUS_SPI,
9557 .manufacture_id = MACRONIX_ID,
9558 .model_id = MACRONIX_MX25L6405,
9559 .total_size = 8192,
9560 .page_size = 256,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009561 /* OTP: 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009562 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DIO,
Stefan Tauner226037d2013-03-16 01:22:12 +00009563 .tested = TEST_OK_PREW,
9564 .probe = probe_spi_rdid,
9565 .probe_timing = TIMING_ZERO,
9566 .block_erasers =
9567 {
9568 {
9569 .eraseblocks = { {4 * 1024, 2048} },
9570 .block_erase = spi_block_erase_20,
9571 }, {
9572 .eraseblocks = { {64 * 1024, 128} },
9573 .block_erase = spi_block_erase_d8,
9574 }, {
9575 .eraseblocks = { {8 * 1024 * 1024, 1} },
9576 .block_erase = spi_block_erase_60,
9577 }, {
9578 .eraseblocks = { {8 * 1024 * 1024, 1} },
9579 .block_erase = spi_block_erase_c7,
9580 }
9581 },
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009582 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: continuously program mode */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009583 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009584 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009585 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009586 .voltage = {2700, 3600},
9587 },
9588
9589 {
9590 .vendor = "Macronix",
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009591 .name = "MX25L6406E/MX25L6408E",
9592 .bustype = BUS_SPI,
9593 .manufacture_id = MACRONIX_ID,
9594 .model_id = MACRONIX_MX25L6405,
9595 .total_size = 8192,
9596 .page_size = 256,
9597 /* MX25L6406E supports SFDP */
9598 /* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009599 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ | FEATURE_FAST_READ_DOUT,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009600 .tested = TEST_OK_PREW,
9601 .probe = probe_spi_rdid,
9602 .probe_timing = TIMING_ZERO,
9603 .block_erasers =
9604 {
9605 {
9606 .eraseblocks = { {4 * 1024, 2048} },
9607 .block_erase = spi_block_erase_20,
9608 }, {
9609 .eraseblocks = { {64 * 1024, 128} },
9610 .block_erase = spi_block_erase_52,
9611 }, {
9612 .eraseblocks = { {64 * 1024, 128} },
9613 .block_erase = spi_block_erase_d8,
9614 }, {
9615 .eraseblocks = { {8 * 1024 * 1024, 1} },
9616 .block_erase = spi_block_erase_60,
9617 }, {
9618 .eraseblocks = { {8 * 1024 * 1024, 1} },
9619 .block_erase = spi_block_erase_c7,
9620 }
9621 },
9622 .printlock = spi_prettyprint_status_register_bp3_srwd,
9623 .unlock = spi_disable_blockprotect_bp3_srwd,
9624 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009625 .read = spi_chip_read,
Stefan Tauner74dc73f2015-03-01 22:04:38 +00009626 .voltage = {2700, 3600},
9627 },
9628
9629 {
9630 .vendor = "Macronix",
Nico Huberb0072782017-12-06 21:02:57 +01009631 .name = "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E/MX25L6473F",
Stefan Tauner226037d2013-03-16 01:22:12 +00009632 .bustype = BUS_SPI,
9633 .manufacture_id = MACRONIX_ID,
9634 .model_id = MACRONIX_MX25L6405,
9635 .total_size = 8192,
9636 .page_size = 256,
9637 /* supports SFDP */
9638 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber46552c82024-03-27 01:18:12 +01009639 /* FEATURE_QIO: MX25L6473E, MX25L6473F */
9640 /* FEATURE_FAST_READ_DOUT, _QOUT: MX25L6436E */
9641 /* FEATURE_FAST_READ_DIO, _QIO: MX25L6445E, MX25L6465E */
9642 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ,
Stefan Tauner226037d2013-03-16 01:22:12 +00009643 .tested = TEST_OK_PREW,
9644 .probe = probe_spi_rdid,
9645 .probe_timing = TIMING_ZERO,
9646 .block_erasers =
9647 {
9648 {
9649 .eraseblocks = { {4 * 1024, 2048} },
9650 .block_erase = spi_block_erase_20,
9651 }, {
9652 .eraseblocks = { {32 * 1024, 256} },
9653 .block_erase = spi_block_erase_52,
9654 }, {
9655 .eraseblocks = { {64 * 1024, 128} },
9656 .block_erase = spi_block_erase_d8,
9657 }, {
9658 .eraseblocks = { {8 * 1024 * 1024, 1} },
9659 .block_erase = spi_block_erase_60,
9660 }, {
9661 .eraseblocks = { {8 * 1024 * 1024, 1} },
9662 .block_erase = spi_block_erase_c7,
9663 }
9664 },
Nico Huber46552c82024-03-27 01:18:12 +01009665 .reg_bits =
9666 {
9667 .qe = {STATUS1, 6, RW},
9668 },
9669 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009670 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner226037d2013-03-16 01:22:12 +00009671 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009672 .read = spi_chip_read,
Stefan Tauner226037d2013-03-16 01:22:12 +00009673 .voltage = {2700, 3600},
9674 },
9675
9676 {
9677 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009678 .name = "MX25L6495F",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +00009679 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +00009680 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009681 .model_id = MACRONIX_MX25L6495F,
9682 .total_size = 8192,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009683 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009684 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Stefan Tauner226037d2013-03-16 01:22:12 +00009685 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner0554ca52013-07-25 22:54:25 +00009686 .tested = TEST_OK_PREW,
Stephan Guilloux2f132fe2009-04-21 01:47:16 +00009687 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +00009688 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +00009689 .block_erasers =
9690 {
9691 {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009692 .eraseblocks = { {4 * 1024, 2048} },
Sean Nelson54596372010-01-09 05:30:14 +00009693 .block_erase = spi_block_erase_20,
9694 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009695 .eraseblocks = { {32 * 1024, 256} },
9696 .block_erase = spi_block_erase_52,
9697 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309698 .eraseblocks = { {64 * 1024, 128} },
9699 .block_erase = spi_block_erase_d8,
9700 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009701 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009702 .block_erase = spi_block_erase_60,
9703 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009704 .eraseblocks = { {8 * 1024 * 1024, 1} },
Sean Nelson54596372010-01-09 05:30:14 +00009705 .block_erase = spi_block_erase_c7,
9706 }
9707 },
Alan Green1f9cc7d2019-07-01 11:10:45 +10009708 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +00009709 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009710 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
Stefan Tauner5c316f92015-02-08 21:57:52 +00009711 .voltage = {2700, 3600},
9712 },
9713
9714 {
9715 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009716 .name = "MX25L8005/MX25L8006E/MX25L8008E/MX25V8005",
Stefan Tauner5c316f92015-02-08 21:57:52 +00009717 .bustype = BUS_SPI,
9718 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009719 .model_id = MACRONIX_MX25L8005,
9720 .total_size = 1024,
9721 .page_size = 256,
9722 /* MX25L8006E, MX25L8008E support SFDP */
9723 /* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L8006E, MX25L8008E only) */
Nico Huber46552c82024-03-27 01:18:12 +01009724 /* FEATURE_FAST_READ_DOUT: MX25L8006E, MX25L8008E */
9725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009726 .tested = TEST_OK_PREW,
9727 .probe = probe_spi_rdid,
9728 .probe_timing = TIMING_ZERO,
9729 .block_erasers =
9730 {
9731 {
9732 .eraseblocks = { {4 * 1024, 256} },
9733 .block_erase = spi_block_erase_20,
9734 }, {
9735 .eraseblocks = { {64 * 1024, 16} },
9736 .block_erase = spi_block_erase_52,
9737 }, {
9738 .eraseblocks = { {64 * 1024, 16} },
9739 .block_erase = spi_block_erase_d8,
9740 }, {
9741 .eraseblocks = { {1024 * 1024, 1} },
9742 .block_erase = spi_block_erase_60,
9743 }, {
9744 .eraseblocks = { {1024 * 1024, 1} },
9745 .block_erase = spi_block_erase_c7,
9746 },
9747 },
9748 .printlock = spi_prettyprint_status_register_bp2_srwd,
9749 .unlock = spi_disable_blockprotect,
9750 .write = spi_chip_write_256,
Nico Huber46552c82024-03-27 01:18:12 +01009751 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009752 .voltage = {2700, 3600}, /* 2.35-3.6V for MX25V8005 */
9753 },
9754
9755 {
9756 .vendor = "Macronix",
sibradzicf62623c2020-03-14 17:21:34 +09009757 .name = "MX25R3235F",
9758 .bustype = BUS_SPI,
9759 .manufacture_id = MACRONIX_ID,
9760 .model_id = MACRONIX_MX25R3235F,
9761 .total_size = 4096,
9762 .page_size = 256,
9763 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +01009764 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
sibradzicf62623c2020-03-14 17:21:34 +09009765 .tested = TEST_OK_PREW,
9766 .probe = probe_spi_rdid,
9767 .probe_timing = TIMING_ZERO,
9768 .block_erasers =
9769 {
9770 {
9771 .eraseblocks = { {4 * 1024, 1024} },
9772 .block_erase = spi_block_erase_20,
9773 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009774 .eraseblocks = { {32 * 1024, 128} },
9775 .block_erase = spi_block_erase_52,
9776 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309777 .eraseblocks = { {64 * 1024, 64} },
9778 .block_erase = spi_block_erase_d8,
9779 }, {
sibradzicf62623c2020-03-14 17:21:34 +09009780 .eraseblocks = { {4 * 1024 * 1024, 1} },
9781 .block_erase = spi_block_erase_60,
9782 }, {
9783 .eraseblocks = { {4 * 1024 * 1024, 1} },
9784 .block_erase = spi_block_erase_c7,
9785 }
9786 },
Nico Huber5f509992024-03-27 01:18:12 +01009787 .reg_bits =
9788 {
9789 .qe = {STATUS1, 6, RW},
9790 },
9791 .printlock = spi_prettyprint_status_register_bp3_srwd,
sibradzicf62623c2020-03-14 17:21:34 +09009792 .unlock = spi_disable_blockprotect_bp3_srwd,
9793 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +01009794 .read = spi_chip_read,
sibradzicf62623c2020-03-14 17:21:34 +09009795 .voltage = {1650, 3600},
9796 },
9797
9798 {
9799 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +10009800 .name = "MX25R6435F",
9801 .bustype = BUS_SPI,
9802 .manufacture_id = MACRONIX_ID,
9803 .model_id = MACRONIX_MX25R6435F,
9804 .total_size = 8192,
9805 .page_size = 256,
9806 /* OTP: 1024B total; enter 0xB1, exit 0xC1 */
Nico Huber5f509992024-03-27 01:18:12 +01009807 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009808 .tested = TEST_OK_PREW,
9809 .probe = probe_spi_rdid,
9810 .probe_timing = TIMING_ZERO,
9811 .block_erasers =
9812 {
9813 {
9814 .eraseblocks = { {4 * 1024, 2048} },
9815 .block_erase = spi_block_erase_20,
9816 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009817 .eraseblocks = { {32 * 1024, 256} },
9818 .block_erase = spi_block_erase_52,
9819 }, {
Aarya Chaumal478e1792022-06-04 01:34:44 +05309820 .eraseblocks = { {64 * 1024, 128} },
9821 .block_erase = spi_block_erase_d8,
9822 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +10009823 .eraseblocks = { {8 * 1024 * 1024, 1} },
9824 .block_erase = spi_block_erase_60,
9825 }, {
9826 .eraseblocks = { {8 * 1024 * 1024, 1} },
9827 .block_erase = spi_block_erase_c7,
9828 }
9829 },
Nico Huber5f509992024-03-27 01:18:12 +01009830 .reg_bits =
9831 {
9832 .qe = {STATUS1, 6, RW},
9833 },
9834 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009835 .unlock = spi_disable_blockprotect_bp3_srwd,
9836 .write = spi_chip_write_256,
Nico Huber5f509992024-03-27 01:18:12 +01009837 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009838 .voltage = {1650, 3600},
9839 },
9840
9841 {
9842 .vendor = "Macronix",
9843 .name = "MX25U12835F",
9844 .bustype = BUS_SPI,
9845 .manufacture_id = MACRONIX_ID,
9846 .model_id = MACRONIX_MX25U12835E,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009847 .total_size = 16384,
9848 .page_size = 256,
9849 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +01009850 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_35,
9851 .dummy_cycles =
9852 {
9853 /* 133MHz version has configuration register
9854 bit to toggle 8 dummy cycles for QIO, defaults: */
9855 .qpi_fast_read = 4,
9856 .qpi_fast_read_qio = 6,
9857 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00009858 .tested = TEST_OK_PREW,
9859 .probe = probe_spi_rdid,
9860 .probe_timing = TIMING_ZERO,
9861 .block_erasers =
9862 {
9863 {
9864 .eraseblocks = { {4 * 1024, 4096} },
9865 .block_erase = spi_block_erase_20,
9866 }, {
9867 .eraseblocks = { {32 * 1024, 512} },
9868 .block_erase = spi_block_erase_52,
9869 }, {
9870 .eraseblocks = { {64 * 1024, 256} },
9871 .block_erase = spi_block_erase_d8,
9872 }, {
9873 .eraseblocks = { {16 * 1024 * 1024, 1} },
9874 .block_erase = spi_block_erase_60,
9875 }, {
9876 .eraseblocks = { {16 * 1024 * 1024, 1} },
9877 .block_erase = spi_block_erase_c7,
9878 }
9879 },
Angel Ponsf112e242018-09-30 20:14:17 +02009880 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +01009881 .reg_bits =
9882 {
9883 .qe = {STATUS1, 6, RW},
9884 },
9885 .printlock = spi_prettyprint_status_register_bp3_srwd,
Angel Ponsf112e242018-09-30 20:14:17 +02009886 .unlock = spi_disable_blockprotect_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +10009887 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +01009888 .read = spi_chip_read,
Angel Ponsf112e242018-09-30 20:14:17 +02009889 .voltage = {1650, 2000},
9890 },
9891
9892 {
9893 .vendor = "Macronix",
Vincent Palatinf800f552013-03-15 02:03:16 +00009894 .name = "MX25U1635E",
9895 .bustype = BUS_SPI,
9896 .manufacture_id = MACRONIX_ID,
9897 .model_id = MACRONIX_MX25U1635E,
9898 .total_size = 2048,
9899 .page_size = 256,
9900 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +01009901 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
9902 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
9903 .dummy_cycles =
9904 {
9905 .qpi_fast_read = 4,
9906 .qpi_fast_read_qio = 6,
9907 },
Stefan Tauner5c316f92015-02-08 21:57:52 +00009908 .tested = TEST_OK_PR,
Vincent Palatinf800f552013-03-15 02:03:16 +00009909 .probe = probe_spi_rdid,
9910 .probe_timing = TIMING_ZERO,
9911 .block_erasers =
9912 {
9913 {
9914 .eraseblocks = { {4 * 1024, 512} },
9915 .block_erase = spi_block_erase_20,
9916 }, {
9917 .eraseblocks = { {32 * 1024, 64} },
9918 .block_erase = spi_block_erase_52,
9919 }, {
9920 .eraseblocks = { {64 * 1024, 32} },
9921 .block_erase = spi_block_erase_d8,
9922 }, {
9923 .eraseblocks = { {2 * 1024 * 1024, 1} },
9924 .block_erase = spi_block_erase_60,
9925 }, {
9926 .eraseblocks = { {2 * 1024 * 1024, 1} },
9927 .block_erase = spi_block_erase_c7,
9928 }
9929 },
9930 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +01009931 .reg_bits =
9932 {
9933 .qe = {STATUS1, 6, RW},
9934 },
9935 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Tauner5c316f92015-02-08 21:57:52 +00009936 .unlock = spi_disable_blockprotect_bp3_srwd,
Vincent Palatinf800f552013-03-15 02:03:16 +00009937 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +01009938 .read = spi_chip_read,
Vincent Palatinf800f552013-03-15 02:03:16 +00009939 .voltage = {1650, 2000},
9940 },
9941
9942 {
9943 .vendor = "Macronix",
David Tomaschikf75d8c52019-06-20 09:49:01 -07009944 .name = "MX25U25635F",
9945 .bustype = BUS_SPI,
9946 .manufacture_id = MACRONIX_ID,
9947 .model_id = MACRONIX_MX25U25635F,
9948 .total_size = 32768,
9949 .page_size = 256,
9950 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +01009951 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
9952 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
9953 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Nikolai Artemiev148254b2021-03-23 17:21:10 +11009954 .tested = TEST_OK_PREW,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009955 .probe = probe_spi_rdid,
9956 .probe_timing = TIMING_ZERO,
9957 .block_erasers =
9958 {
9959 {
9960 .eraseblocks = { {4 * 1024, 8192} },
9961 .block_erase = spi_block_erase_21,
9962 }, {
9963 .eraseblocks = { {4 * 1024, 8192} },
9964 .block_erase = spi_block_erase_20,
9965 }, {
9966 .eraseblocks = { {32 * 1024, 1024} },
9967 .block_erase = spi_block_erase_5c,
9968 }, {
9969 .eraseblocks = { {32 * 1024, 1024} },
9970 .block_erase = spi_block_erase_52,
9971 }, {
9972 .eraseblocks = { {64 * 1024, 512} },
9973 .block_erase = spi_block_erase_dc,
9974 }, {
9975 .eraseblocks = { {64 * 1024, 512} },
9976 .block_erase = spi_block_erase_d8,
9977 }, {
9978 .eraseblocks = { {32 * 1024 * 1024, 1} },
9979 .block_erase = spi_block_erase_60,
9980 }, {
9981 .eraseblocks = { {32 * 1024 * 1024, 1} },
9982 .block_erase = spi_block_erase_c7,
9983 }
9984 },
9985 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +01009986 .reg_bits =
9987 {
Nico Huber4fa39c52024-03-27 01:18:12 +01009988 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +01009989 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
9990 },
Nico Huber4fa39c52024-03-27 01:18:12 +01009991 .printlock = spi_prettyprint_status_register_bp3_srwd,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009992 .unlock = spi_disable_blockprotect_bp3_srwd,
9993 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +01009994 .read = spi_chip_read,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009995 .voltage = {1650, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +01009996 .prepare_access = spi_prepare_4ba,
David Tomaschikf75d8c52019-06-20 09:49:01 -07009997 },
9998
9999 {
10000 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010001 .name = "MX25U3235E/F",
10002 .bustype = BUS_SPI,
10003 .manufacture_id = MACRONIX_ID,
10004 .model_id = MACRONIX_MX25U3235E,
10005 .total_size = 4096,
10006 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010007 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010008 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010009 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10010 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10011 .dummy_cycles =
10012 {
10013 .qpi_fast_read = 4,
10014 .qpi_fast_read_qio = 6,
10015 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010016 .tested = TEST_OK_PREW,
10017 .probe = probe_spi_rdid,
10018 .probe_timing = TIMING_ZERO,
10019 .block_erasers =
10020 {
10021 {
10022 .eraseblocks = { {4 * 1024, 1024} },
10023 .block_erase = spi_block_erase_20,
10024 }, {
10025 .eraseblocks = { {32 * 1024, 128} },
10026 .block_erase = spi_block_erase_52,
10027 }, {
10028 .eraseblocks = { {64 * 1024, 64} },
10029 .block_erase = spi_block_erase_d8,
10030 }, {
10031 .eraseblocks = { {4 * 1024 * 1024, 1} },
10032 .block_erase = spi_block_erase_60,
10033 }, {
10034 .eraseblocks = { {4 * 1024 * 1024, 1} },
10035 .block_erase = spi_block_erase_c7,
10036 }
10037 },
10038 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010039 .reg_bits =
10040 {
10041 .qe = {STATUS1, 6, RW},
10042 },
10043 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010044 .unlock = spi_disable_blockprotect_bp3_srwd,
10045 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010046 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010047 .voltage = {1650, 2000},
10048 },
10049
10050 {
10051 .vendor = "Macronix",
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010052 .name = "MX25U51245G",
10053 .bustype = BUS_SPI,
10054 .manufacture_id = MACRONIX_ID,
10055 .model_id = MACRONIX_MX25U51245G,
10056 .total_size = 65536,
10057 .page_size = 256,
10058 /* OTP: 512B factory programmed and 512B customer programmed; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010059 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP |
10060 FEATURE_4BA | FEATURE_QPI_35 | FEATURE_FAST_READ_QPI4B,
10061 .dummy_cycles = { .qpi_read_params = { 6, 4, 8, 10 } },
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010062 .tested = TEST_OK_PREW,
10063 .probe = probe_spi_rdid,
10064 .probe_timing = TIMING_ZERO,
10065 .block_erasers =
10066 {
10067 {
10068 .eraseblocks = { {4 * 1024, 16384} },
10069 .block_erase = spi_block_erase_21,
10070 }, {
10071 .eraseblocks = { {4 * 1024, 16384} },
10072 .block_erase = spi_block_erase_20,
10073 }, {
10074 .eraseblocks = { {32 * 1024, 2048} },
10075 .block_erase = spi_block_erase_5c,
10076 }, {
10077 .eraseblocks = { {32 * 1024, 2048} },
10078 .block_erase = spi_block_erase_52,
10079 }, {
10080 .eraseblocks = { {64 * 1024, 1024} },
10081 .block_erase = spi_block_erase_dc,
10082 }, {
10083 .eraseblocks = { {64 * 1024, 1024} },
10084 .block_erase = spi_block_erase_d8,
10085 }, {
10086 .eraseblocks = { {64 * 1024 * 1024, 1} },
10087 .block_erase = spi_block_erase_60,
10088 }, {
10089 .eraseblocks = { {64 * 1024 * 1024, 1} },
10090 .block_erase = spi_block_erase_c7,
10091 }
10092 },
10093 /* TODO: security register */
Nico Huber1412d9f2024-01-06 18:25:49 +010010094 .reg_bits =
10095 {
Nico Huber4fa39c52024-03-27 01:18:12 +010010096 .qe = {STATUS1, 6, RW},
Nico Huber1412d9f2024-01-06 18:25:49 +010010097 .dc = {{CONFIG, 6, RW}, {CONFIG, 7, RW}},
10098 },
Nico Huber4fa39c52024-03-27 01:18:12 +010010099 .printlock = spi_prettyprint_status_register_bp3_srwd,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010100 .unlock = spi_disable_blockprotect_bp3_srwd,
10101 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber1412d9f2024-01-06 18:25:49 +010010102 .read = spi_chip_read,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010103 .voltage = {1650, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010010104 .prepare_access = spi_prepare_4ba,
Daniel Thompsoncadd4202018-06-04 13:52:22 +010010105 },
10106
10107 {
10108 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010109 .name = "MX25U6435E/F",
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010110 .bustype = BUS_SPI,
10111 .manufacture_id = MACRONIX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010112 .model_id = MACRONIX_MX25U6435E,
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010113 .total_size = 8192,
10114 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010115 /* F model supports SFDP, FAST_READ_DOUT/_QOUT */
Alan Green1f9cc7d2019-07-01 11:10:45 +100010116 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber1412d9f2024-01-06 18:25:49 +010010117 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_FAST_READ |
10118 FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO | FEATURE_QPI_35_F5,
10119 .dummy_cycles =
10120 {
10121 .qpi_fast_read = 4,
10122 .qpi_fast_read_qio = 6,
10123 },
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010124 .tested = TEST_OK_PREW,
10125 .probe = probe_spi_rdid,
10126 .probe_timing = TIMING_ZERO,
10127 .block_erasers =
10128 {
10129 {
10130 .eraseblocks = { {4 * 1024, 2048} },
10131 .block_erase = spi_block_erase_20,
10132 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010133 .eraseblocks = { {32 * 1024, 256} },
10134 .block_erase = spi_block_erase_52,
10135 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010136 .eraseblocks = { {64 * 1024, 128} },
10137 .block_erase = spi_block_erase_d8,
10138 }, {
Stefan Tauner40bc96f2015-01-10 09:33:14 +000010139 .eraseblocks = { {8 * 1024 * 1024, 1} },
10140 .block_erase = spi_block_erase_60,
10141 }, {
10142 .eraseblocks = { {8 * 1024 * 1024, 1} },
10143 .block_erase = spi_block_erase_c7,
10144 }
10145 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010146 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010147 .reg_bits =
10148 {
10149 .qe = {STATUS1, 6, RW},
10150 },
10151 .printlock = spi_prettyprint_status_register_bp3_srwd,
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010152 .unlock = spi_disable_blockprotect_bp3_srwd,
10153 .write = spi_chip_write_256,
Nico Huber1412d9f2024-01-06 18:25:49 +010010154 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010155 .voltage = {1650, 2000},
10156 },
10157
10158 {
10159 .vendor = "Macronix",
10160 .name = "MX25U8032E",
10161 .bustype = BUS_SPI,
10162 .manufacture_id = MACRONIX_ID,
10163 .model_id = MACRONIX_MX25U8032E,
10164 .total_size = 1024,
10165 .page_size = 256,
10166 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
Nico Huber4fa39c52024-03-27 01:18:12 +010010167 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
10168 FEATURE_FAST_READ | FEATURE_FAST_READ_DIO | FEATURE_FAST_READ_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010169 .tested = TEST_OK_PREW,
10170 .probe = probe_spi_rdid,
10171 .probe_timing = TIMING_ZERO,
10172 .block_erasers =
10173 {
10174 {
10175 .eraseblocks = { {4 * 1024, 256} },
10176 .block_erase = spi_block_erase_20,
10177 }, {
10178 .eraseblocks = { {32 * 1024, 32} },
10179 .block_erase = spi_block_erase_52,
10180 }, {
10181 .eraseblocks = { {64 * 1024, 16} },
10182 .block_erase = spi_block_erase_d8,
10183 }, {
10184 .eraseblocks = { {1024 * 1024, 1} },
10185 .block_erase = spi_block_erase_60,
10186 }, {
10187 .eraseblocks = { {1024 * 1024, 1} },
10188 .block_erase = spi_block_erase_c7,
10189 }
10190 },
10191 /* TODO: security register */
Nico Huber4fa39c52024-03-27 01:18:12 +010010192 .reg_bits =
10193 {
10194 .qe = {STATUS1, 6, RW},
10195 },
10196 .printlock = spi_prettyprint_status_register_bp3_srwd,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010197 .unlock = spi_disable_blockprotect_bp3_srwd,
10198 .write = spi_chip_write_256,
Nico Huber4fa39c52024-03-27 01:18:12 +010010199 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010200 .voltage = {1650, 2000},
Nathan Rennie-Waldock5a7f9422018-08-10 15:35:23 +010010201 },
10202
10203 {
10204 .vendor = "Macronix",
Mark Panajotovic502a9132009-08-24 01:42:24 +000010205 .name = "MX29F001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010206 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010207 .manufacture_id = MACRONIX_ID,
10208 .model_id = MACRONIX_MX29F001B,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010209 .total_size = 128,
10210 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010211 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10212 .tested = TEST_UNTESTED,
10213 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010214 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010215 .block_erasers =
10216 {
10217 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010218 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010219 {8 * 1024, 1},
10220 {4 * 1024, 2},
10221 {8 * 1024, 2},
10222 {32 * 1024, 1},
10223 {64 * 1024, 1},
10224 },
Sean Nelson35727f72010-01-28 23:55:12 +000010225 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010226 }, {
10227 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010228 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010229 }
10230 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010231 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010232 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010233 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010234 .prepare_access = prepare_memory_access,
10235 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010236 },
10237
10238 {
10239 .vendor = "Macronix",
10240 .name = "MX29F001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010241 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010242 .manufacture_id = MACRONIX_ID,
10243 .model_id = MACRONIX_MX29F001T,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010244 .total_size = 128,
10245 .page_size = 32 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010246 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stefan Tauner74c6ec62011-05-18 01:31:46 +000010247 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010248 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010249 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010250 .block_erasers =
10251 {
10252 {
Stefan Tauner0554ca52013-07-25 22:54:25 +000010253 .eraseblocks = {
Sean Nelson54596372010-01-09 05:30:14 +000010254 {64 * 1024, 1},
10255 {32 * 1024, 1},
10256 {8 * 1024, 2},
10257 {4 * 1024, 2},
10258 {8 * 1024, 1},
10259 },
Sean Nelson35727f72010-01-28 23:55:12 +000010260 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010261 }, {
10262 .eraseblocks = { {128 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010263 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010264 }
10265 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010266 .write = write_jedec_1,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010267 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010268 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010269 .prepare_access = prepare_memory_access,
10270 .finish_access = finish_memory_access,
Mark Panajotovic502a9132009-08-24 01:42:24 +000010271 },
10272
10273 {
10274 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010275 .name = "MX29F002(N)B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010276 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010277 .manufacture_id = MACRONIX_ID,
10278 .model_id = MACRONIX_MX29F002B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010279 .total_size = 256,
10280 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010281 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010282 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000010283 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010284 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010285 .block_erasers =
10286 {
10287 {
10288 .eraseblocks = {
10289 {16 * 1024, 1},
10290 {8 * 1024, 2},
10291 {32 * 1024, 1},
10292 {64 * 1024, 3},
10293 },
Sean Nelson35727f72010-01-28 23:55:12 +000010294 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010295 }, {
10296 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010297 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010298 },
10299 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010300 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010301 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010302 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010303 .prepare_access = prepare_memory_access,
10304 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010305 },
10306
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010307 {
10308 .vendor = "Macronix",
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000010309 .name = "MX29F002(N)T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010310 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010311 .manufacture_id = MACRONIX_ID,
10312 .model_id = MACRONIX_MX29F002T,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010313 .total_size = 256,
10314 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010315 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000010316 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000010317 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010318 .probe_timing = TIMING_ZERO,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010319 .block_erasers =
10320 {
10321 {
10322 .eraseblocks = {
10323 {64 * 1024, 3},
10324 {32 * 1024, 1},
10325 {8 * 1024, 2},
10326 {16 * 1024, 1},
10327 },
Sean Nelson35727f72010-01-28 23:55:12 +000010328 .block_erase = erase_sector_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010329 }, {
10330 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010331 .block_erase = erase_chip_block_jedec,
Sean Nelson6b11ad22009-12-23 17:05:59 +000010332 },
10333 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010334 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010335 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010336 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010337 .prepare_access = prepare_memory_access,
10338 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000010339 },
10340
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010341 {
10342 .vendor = "Macronix",
Daniele Forsi6a18a932014-07-13 14:53:45 +000010343 .name = "MX29F022(N)B",
10344 .bustype = BUS_PARALLEL,
10345 .manufacture_id = MACRONIX_ID,
10346 .model_id = MACRONIX_MX29F022B,
10347 .total_size = 256,
10348 .page_size = 0, /* unused */
10349 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10350 .tested = TEST_UNTESTED,
10351 .probe = probe_jedec,
10352 .probe_timing = TIMING_ZERO,
10353 .block_erasers =
10354 {
10355 {
10356 .eraseblocks = {
10357 {16 * 1024, 1},
10358 {8 * 1024, 2},
10359 {32 * 1024, 1},
10360 {64 * 1024, 3},
10361 },
10362 .block_erase = erase_sector_jedec,
10363 }, {
10364 .eraseblocks = { {256 * 1024, 1} },
10365 .block_erase = erase_chip_block_jedec,
10366 }
10367 },
10368 .write = write_jedec_1,
10369 .read = read_memmapped,
10370 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010371 .prepare_access = prepare_memory_access,
10372 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010373 },
10374
10375 {
10376 .vendor = "Macronix",
10377 .name = "MX29F022(N)T",
10378 .bustype = BUS_PARALLEL,
10379 .manufacture_id = MACRONIX_ID,
10380 .model_id = MACRONIX_MX29F022T,
10381 .total_size = 256,
10382 .page_size = 0, /* unused */
10383 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10384 .tested = TEST_OK_PREW,
10385 .probe = probe_jedec,
10386 .probe_timing = TIMING_ZERO,
10387 .block_erasers =
10388 {
10389 {
10390 .eraseblocks = {
10391 {64 * 1024, 3},
10392 {32 * 1024, 1},
10393 {8 * 1024, 2},
10394 {16 * 1024, 1},
10395 },
10396 .block_erase = erase_sector_jedec,
10397 }, {
10398 .eraseblocks = { {256 * 1024, 1} },
10399 .block_erase = erase_chip_block_jedec,
10400 }
10401 },
10402 .write = write_jedec_1,
10403 .read = read_memmapped,
10404 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010405 .prepare_access = prepare_memory_access,
10406 .finish_access = finish_memory_access,
Daniele Forsi6a18a932014-07-13 14:53:45 +000010407 },
10408
10409 {
10410 .vendor = "Macronix",
Joshua Roysf1324e02010-09-16 00:51:51 +000010411 .name = "MX29F040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010412 .bustype = BUS_PARALLEL,
Joshua Roysf1324e02010-09-16 00:51:51 +000010413 .manufacture_id = MACRONIX_ID,
10414 .model_id = MACRONIX_MX29F040,
10415 .total_size = 512,
10416 .page_size = 64 * 1024,
10417 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10418 .tested = TEST_UNTESTED,
10419 .probe = probe_jedec,
10420 .probe_timing = TIMING_ZERO,
10421 .block_erasers =
10422 {
10423 {
10424 .eraseblocks = { {64 * 1024, 8} },
10425 .block_erase = erase_sector_jedec,
10426 }, {
10427 .eraseblocks = { {512 * 1024, 1} },
10428 .block_erase = erase_chip_block_jedec,
10429 },
10430 },
10431 .write = write_jedec_1,
10432 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000010433 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010010434 .prepare_access = prepare_memory_access,
10435 .finish_access = finish_memory_access,
Joshua Roysf1324e02010-09-16 00:51:51 +000010436 },
10437
10438 {
10439 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010440 .name = "MX29GL128F",
10441 .bustype = BUS_PARALLEL,
10442 .manufacture_id = MACRONIX_ID,
10443 .model_id = MACRONIX_MX29GL128F,
10444 .total_size = 16384,
10445 .page_size = 128 * 1024, /* actual page size is 16 */
10446 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10447 .tested = TEST_UNTESTED,
10448 .probe = probe_jedec_29gl,
10449 .probe_timing = TIMING_ZERO,
10450 .block_erasers =
10451 {
10452 {
10453 .eraseblocks = { {128 * 1024, 128} },
10454 .block_erase = erase_sector_jedec,
10455 }, {
10456 .eraseblocks = { {16 * 1024 * 1024, 1} },
10457 .block_erase = erase_chip_block_jedec,
10458 },
10459 },
10460 .write = write_jedec_1,
10461 .read = read_memmapped,
10462 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010463 .prepare_access = prepare_memory_access,
10464 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010465 },
10466
10467 {
10468 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010469 .name = "MX29GL320EB",
10470 .bustype = BUS_PARALLEL,
10471 .manufacture_id = MACRONIX_ID,
10472 .model_id = MACRONIX_MX29GL320EB,
10473 .total_size = 4096,
10474 .page_size = 128 * 1024, /* actual page size is 16 */
10475 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10476 .tested = TEST_UNTESTED,
10477 .probe = probe_jedec_29gl,
10478 .probe_timing = TIMING_ZERO,
10479 .block_erasers =
10480 {
10481 {
10482 .eraseblocks = {
10483 {8 * 1024, 8},
10484 {64 * 1024, 63},
10485 },
10486 .block_erase = erase_sector_jedec,
10487 }, {
10488 .eraseblocks = { {4 * 1024 * 1024, 1} },
10489 .block_erase = erase_chip_block_jedec,
10490 },
10491 },
10492 .write = write_jedec_1,
10493 .read = read_memmapped,
10494 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010495 .prepare_access = prepare_memory_access,
10496 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010497 },
10498
10499 {
10500 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010501 .name = "MX29GL320EH/L",
10502 .bustype = BUS_PARALLEL,
10503 .manufacture_id = MACRONIX_ID,
10504 .model_id = MACRONIX_MX29GL320EHL,
10505 .total_size = 4096,
10506 .page_size = 128 * 1024, /* actual page size is 16 */
10507 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10508 .tested = TEST_UNTESTED,
10509 .probe = probe_jedec_29gl,
10510 .probe_timing = TIMING_ZERO,
10511 .block_erasers =
10512 {
10513 {
10514 .eraseblocks = { {64 * 1024, 64} },
10515 .block_erase = erase_sector_jedec,
10516 }, {
10517 .eraseblocks = { {4 * 1024 * 1024, 1} },
10518 .block_erase = erase_chip_block_jedec,
10519 },
10520 },
10521 .write = write_jedec_1,
10522 .read = read_memmapped,
10523 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010524 .prepare_access = prepare_memory_access,
10525 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010526 },
10527
10528 {
10529 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010530 .name = "MX29GL320ET",
10531 .bustype = BUS_PARALLEL,
10532 .manufacture_id = MACRONIX_ID,
10533 .model_id = MACRONIX_MX29GL320ET,
10534 .total_size = 4096,
10535 .page_size = 128 * 1024, /* actual page size is 16 */
10536 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10537 .tested = TEST_UNTESTED,
10538 .probe = probe_jedec_29gl,
10539 .probe_timing = TIMING_ZERO,
10540 .block_erasers =
10541 {
10542 {
10543 .eraseblocks = {
10544 {64 * 1024, 63},
10545 {8 * 1024, 8},
10546 },
10547 .block_erase = erase_sector_jedec,
10548 }, {
10549 .eraseblocks = { {4 * 1024 * 1024, 1} },
10550 .block_erase = erase_chip_block_jedec,
10551 },
10552 },
10553 .write = write_jedec_1,
10554 .read = read_memmapped,
10555 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010556 .prepare_access = prepare_memory_access,
10557 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010558 },
10559
10560 {
10561 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010562 .name = "MX29GL640EB",
10563 .bustype = BUS_PARALLEL,
10564 .manufacture_id = MACRONIX_ID,
10565 .model_id = MACRONIX_MX29GL640EB,
10566 .total_size = 8192,
10567 .page_size = 128 * 1024, /* actual page size is 16 */
10568 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10569 .tested = TEST_UNTESTED,
10570 .probe = probe_jedec_29gl,
10571 .probe_timing = TIMING_ZERO,
10572 .block_erasers =
10573 {
10574 {
10575 .eraseblocks = {
10576 {8 * 1024, 8},
10577 {64 * 1024, 127},
10578 },
10579 .block_erase = erase_sector_jedec,
10580 }, {
10581 .eraseblocks = { {8 * 1024 * 1024, 1} },
10582 .block_erase = erase_chip_block_jedec,
10583 },
10584 },
10585 .write = write_jedec_1,
10586 .read = read_memmapped,
10587 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010588 .prepare_access = prepare_memory_access,
10589 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010590 },
10591
10592 {
10593 .vendor = "Macronix",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010594 .name = "MX29GL640EH/L",
10595 .bustype = BUS_PARALLEL,
10596 .manufacture_id = MACRONIX_ID,
10597 .model_id = MACRONIX_MX29GL640EHL,
10598 .total_size = 8192,
10599 .page_size = 128 * 1024, /* actual page size is 16 */
10600 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10601 .tested = TEST_UNTESTED,
10602 .probe = probe_jedec_29gl,
10603 .probe_timing = TIMING_ZERO,
10604 .block_erasers =
10605 {
10606 {
10607 .eraseblocks = { {64 * 1024, 128} },
10608 .block_erase = erase_sector_jedec,
10609 }, {
10610 .eraseblocks = { {8 * 1024 * 1024, 1} },
10611 .block_erase = erase_chip_block_jedec,
10612 },
10613 },
10614 .write = write_jedec_1,
10615 .read = read_memmapped,
10616 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010617 .prepare_access = prepare_memory_access,
10618 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010619 },
10620
10621 {
10622 .vendor = "Macronix",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010623 .name = "MX29GL640ET",
10624 .bustype = BUS_PARALLEL,
10625 .manufacture_id = MACRONIX_ID,
10626 .model_id = MACRONIX_MX29GL640ET,
10627 .total_size = 8192,
10628 .page_size = 128 * 1024, /* actual page size is 16 */
10629 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10630 .tested = TEST_UNTESTED,
10631 .probe = probe_jedec_29gl,
10632 .probe_timing = TIMING_ZERO,
10633 .block_erasers =
10634 {
10635 {
10636 .eraseblocks = {
10637 {64 * 1024, 127},
10638 {8 * 1024, 8},
10639 },
10640 .block_erase = erase_sector_jedec,
10641 }, {
10642 .eraseblocks = { {8 * 1024 * 1024, 1} },
10643 .block_erase = erase_chip_block_jedec,
10644 },
10645 },
10646 .write = write_jedec_1,
10647 .read = read_memmapped,
10648 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010649 .prepare_access = prepare_memory_access,
10650 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000010651 },
10652
10653 {
10654 .vendor = "Macronix",
Carl-Daniel Hailfinger350a0c32009-07-24 13:59:27 +000010655 .name = "MX29LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000010656 .bustype = BUS_PARALLEL,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000010657 .manufacture_id = MACRONIX_ID,
10658 .model_id = MACRONIX_MX29LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010659 .total_size = 512,
10660 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000010661 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
10662 .tested = TEST_UNTESTED,
10663 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000010664 .probe_timing = TIMING_ZERO,
Sean Nelson54596372010-01-09 05:30:14 +000010665 .block_erasers =
10666 {
10667 {
Stefan Tauner6697f712014-08-06 15:09:15 +000010668 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000010669 .block_erase = erase_sector_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010670 }, {
10671 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000010672 .block_erase = erase_chip_block_jedec,
Sean Nelson54596372010-01-09 05:30:14 +000010673 },
10674 },
Michael Karcher1c296ca2009-11-27 17:49:42 +000010675 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000010676 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000010677 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010010678 .prepare_access = prepare_memory_access,
10679 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger7de86392008-12-10 10:32:05 +000010680 },
10681
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000010682 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010683 .vendor = "Macronix",
Hemanth Guruva Reddya136d422019-07-11 11:08:27 +020010684 .name = "MX66L51235F/MX25L51245G",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010685 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010686 .manufacture_id = MACRONIX_ID,
10687 .model_id = MACRONIX_MX66L51235F,
10688 .total_size = 65536,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010689 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010690 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10691 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010692 .tested = TEST_OK_PREW,
10693 .probe = probe_spi_rdid,
10694 .probe_timing = TIMING_ZERO,
10695 .block_erasers =
10696 {
10697 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010698 .eraseblocks = { {4 * 1024, 16384} },
10699 .block_erase = spi_block_erase_21,
10700 }, {
10701 .eraseblocks = { {4 * 1024, 16384} },
10702 .block_erase = spi_block_erase_20,
10703 }, {
10704 .eraseblocks = { {32 * 1024, 2048} },
10705 .block_erase = spi_block_erase_5c,
10706 }, {
10707 .eraseblocks = { {32 * 1024, 2048} },
10708 .block_erase = spi_block_erase_52,
10709 }, {
10710 .eraseblocks = { {64 * 1024, 1024} },
10711 .block_erase = spi_block_erase_dc,
10712 }, {
10713 .eraseblocks = { {64 * 1024, 1024} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010714 .block_erase = spi_block_erase_d8,
10715 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010716 .eraseblocks = { {64 * 1024 * 1024, 1} },
10717 .block_erase = spi_block_erase_60,
10718 }, {
10719 .eraseblocks = { {64 * 1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010720 .block_erase = spi_block_erase_c7,
10721 }
10722 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100010723 /* TODO: security register and SBLK/SBULK; MX25L12835F: configuration register */
10724 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010725 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010726 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010727 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010728 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010010729 .prepare_access = spi_prepare_4ba,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010730 },
10731
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010732 {
10733 .vendor = "Macronix",
10734 .name = "MX66L1G45G",
10735 .bustype = BUS_SPI,
10736 .manufacture_id = MACRONIX_ID,
10737 .model_id = MACRONIX_MX66L1G45G,
10738 .total_size = 131072,
10739 .page_size = 256,
10740 /* OTP: 512B total; enter 0xB1, exit 0xC1 */
10741 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA,
10742 .tested = TEST_OK_PREW,
10743 .probe = probe_spi_rdid,
10744 .probe_timing = TIMING_ZERO,
10745 .block_erasers =
10746 {
10747 {
10748 .eraseblocks = { {4 * 1024, 32768} },
10749 .block_erase = spi_block_erase_21,
10750 }, {
10751 .eraseblocks = { {4 * 1024, 32768} },
10752 .block_erase = spi_block_erase_20,
10753 }, {
10754 .eraseblocks = { {32 * 1024, 4096} },
10755 .block_erase = spi_block_erase_5c,
10756 }, {
10757 .eraseblocks = { {32 * 1024, 4096} },
10758 .block_erase = spi_block_erase_52,
10759 }, {
10760 .eraseblocks = { {64 * 1024, 2048} },
10761 .block_erase = spi_block_erase_dc,
10762 }, {
10763 .eraseblocks = { {64 * 1024, 2048} },
10764 .block_erase = spi_block_erase_d8,
10765 }, {
10766 .eraseblocks = { {128 * 1024 * 1024, 1} },
10767 .block_erase = spi_block_erase_60,
10768 }, {
10769 .eraseblocks = { {128 * 1024 * 1024, 1} },
10770 .block_erase = spi_block_erase_c7,
10771 }
10772 },
10773 /* TODO: security register and SBLK/SBULK, configuration register */
10774 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
10775 .unlock = spi_disable_blockprotect_bp3_srwd,
10776 .write = spi_chip_write_256,
10777 .read = spi_chip_read, /* Fast read (0x0B) supported */
10778 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010010779 .prepare_access = spi_prepare_4ba,
Patrick Rudolph3ba83152021-06-08 10:52:19 +020010780 },
10781
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010782 /* The ST M25P05 is a bit of a problem. It has the same ID as the
10783 * ST M25P05-A in RES mode, but supports only 128 byte writes instead
10784 * of 256 byte writes. We rely heavily on the fact that probe_spi_res1
10785 * only is successful if RDID does not work.
10786 */
10787 {
10788 .vendor = "Micron/Numonyx/ST",
10789 .name = "M25P05",
10790 .bustype = BUS_SPI,
10791 .manufacture_id = 0, /* Not used. */
10792 .model_id = ST_M25P05_RES,
10793 .total_size = 64,
10794 .page_size = 256,
10795 .feature_bits = FEATURE_WRSR_WREN,
10796 .tested = TEST_UNTESTED,
10797 .probe = probe_spi_res1,
10798 .probe_timing = TIMING_ZERO,
10799 .block_erasers =
10800 {
10801 {
10802 .eraseblocks = { {32 * 1024, 2} },
10803 .block_erase = spi_block_erase_d8,
10804 }, {
10805 .eraseblocks = { {64 * 1024, 1} },
10806 .block_erase = spi_block_erase_c7,
10807 }
10808 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010809 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010810 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010811 .write = spi_chip_write_1, /* 128 */
10812 .read = spi_chip_read,
10813 .voltage = {2700, 3600},
10814 },
10815
10816 {
10817 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100010818 .name = "M25P05-A",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010819 .bustype = BUS_SPI,
10820 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100010821 .model_id = ST_M25P05A,
10822 .total_size = 64,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010823 .page_size = 256,
10824 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000010825 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010826 .probe = probe_spi_rdid,
10827 .probe_timing = TIMING_ZERO,
10828 .block_erasers =
10829 {
10830 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010831 .eraseblocks = { {32 * 1024, 2} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010832 .block_erase = spi_block_erase_d8,
10833 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010834 .eraseblocks = { {64 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010835 .block_erase = spi_block_erase_c7,
10836 }
10837 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010838 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010839 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010840 .write = spi_chip_write_256,
10841 .read = spi_chip_read,
10842 .voltage = {2700, 3600},
10843 },
10844
10845 /* The ST M25P10 has the same problem as the M25P05. */
10846 {
10847 .vendor = "Micron/Numonyx/ST",
10848 .name = "M25P10",
10849 .bustype = BUS_SPI,
10850 .manufacture_id = 0, /* Not used. */
10851 .model_id = ST_M25P10_RES,
10852 .total_size = 128,
10853 .page_size = 256,
10854 .feature_bits = FEATURE_WRSR_WREN,
10855 .tested = TEST_UNTESTED,
10856 .probe = probe_spi_res1,
10857 .probe_timing = TIMING_ZERO,
10858 .block_erasers =
10859 {
10860 {
10861 .eraseblocks = { {32 * 1024, 4} },
10862 .block_erase = spi_block_erase_d8,
10863 }, {
10864 .eraseblocks = { {128 * 1024, 1} },
10865 .block_erase = spi_block_erase_c7,
10866 }
10867 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010868 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000010869 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010870 .write = spi_chip_write_1, /* 128 */
10871 .read = spi_chip_read,
10872 .voltage = {2700, 3600},
10873 },
10874
10875 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100010876 .vendor = "Micron/Numonyx/ST",
10877 .name = "M25P10-A",
10878 .bustype = BUS_SPI,
10879 .manufacture_id = ST_ID,
10880 .model_id = ST_M25P10A,
10881 .total_size = 128,
10882 .page_size = 256,
10883 .feature_bits = FEATURE_WRSR_WREN,
10884 .tested = TEST_OK_PREW,
10885 .probe = probe_spi_rdid,
10886 .probe_timing = TIMING_ZERO,
10887 .block_erasers =
10888 {
10889 {
10890 .eraseblocks = { {32 * 1024, 4} },
10891 .block_erase = spi_block_erase_d8,
10892 }, {
10893 .eraseblocks = { {128 * 1024, 1} },
10894 .block_erase = spi_block_erase_c7,
10895 }
10896 },
10897 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10898 .unlock = spi_disable_blockprotect_bp3_srwd,
10899 .write = spi_chip_write_256,
10900 .read = spi_chip_read,
10901 .voltage = {2700, 3600},
10902 },
10903
10904 {
10905 .vendor = "Micron/Numonyx/ST",
10906 .name = "M25P128",
10907 .bustype = BUS_SPI,
10908 .manufacture_id = ST_ID,
10909 .model_id = ST_M25P128,
10910 .total_size = 16384,
10911 .page_size = 256,
10912 .feature_bits = FEATURE_WRSR_WREN,
10913 .tested = TEST_OK_PREW,
10914 .probe = probe_spi_rdid,
10915 .probe_timing = TIMING_ZERO,
10916 .block_erasers =
10917 {
10918 {
10919 .eraseblocks = { {256 * 1024, 64} },
10920 .block_erase = spi_block_erase_d8,
10921 }, {
10922 .eraseblocks = { {16 * 1024 * 1024, 1} },
10923 .block_erase = spi_block_erase_c7,
10924 }
10925 },
10926 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10927 .unlock = spi_disable_blockprotect_bp3_srwd,
10928 .write = spi_chip_write_256,
10929 .read = spi_chip_read,
10930 .voltage = {2700, 3600},
10931 },
10932
10933 {
10934 .vendor = "Micron/Numonyx/ST",
10935 .name = "M25P16",
10936 .bustype = BUS_SPI,
10937 .manufacture_id = ST_ID,
10938 .model_id = ST_M25P16,
10939 .total_size = 2048,
10940 .page_size = 256,
10941 .feature_bits = FEATURE_WRSR_WREN,
10942 .tested = TEST_OK_PREW,
10943 .probe = probe_spi_rdid,
10944 .probe_timing = TIMING_ZERO,
10945 .block_erasers =
10946 {
10947 {
10948 .eraseblocks = { {64 * 1024, 32} },
10949 .block_erase = spi_block_erase_d8,
10950 }, {
10951 .eraseblocks = { {2 * 1024 * 1024, 1} },
10952 .block_erase = spi_block_erase_c7,
10953 }
10954 },
10955 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
10956 .unlock = spi_disable_blockprotect_bp3_srwd,
10957 .write = spi_chip_write_256,
10958 .read = spi_chip_read,
10959 .voltage = {2700, 3600},
10960 },
10961
10962 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010963 .vendor = "Micron/Numonyx/ST", /* Numonyx */
10964 .name = "M25P20",
10965 .bustype = BUS_SPI,
10966 .manufacture_id = ST_ID,
10967 .model_id = ST_M25P20,
10968 .total_size = 256,
10969 .page_size = 256,
10970 .feature_bits = FEATURE_WRSR_WREN,
10971 .tested = TEST_UNTESTED,
10972 .probe = probe_spi_rdid,
10973 .probe_timing = TIMING_ZERO,
10974 .block_erasers =
10975 {
10976 {
10977 .eraseblocks = { {64 * 1024, 4} },
10978 .block_erase = spi_block_erase_d8,
10979 }, {
10980 .eraseblocks = { {256 * 1024, 1} },
10981 .block_erase = spi_block_erase_c7,
10982 }
10983 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000010984 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000010985 .unlock = spi_disable_blockprotect,
10986 .write = spi_chip_write_256,
10987 .read = spi_chip_read, /* Fast read (0x0B) supported */
10988 .voltage = {2700, 3600},
10989 },
10990
10991 {
10992 .vendor = "Micron/Numonyx/ST",
10993 .name = "M25P20-old",
10994 .bustype = BUS_SPI,
10995 .manufacture_id = 0, /* Not used. */
10996 .model_id = ST_M25P20_RES,
10997 .total_size = 256,
10998 .page_size = 256,
10999 .feature_bits = FEATURE_WRSR_WREN,
11000 .tested = TEST_OK_PREW,
11001 .probe = probe_spi_res1,
11002 .probe_timing = TIMING_ZERO,
11003 .block_erasers =
11004 {
11005 {
11006 .eraseblocks = { {64 * 1024, 4} },
11007 .block_erase = spi_block_erase_d8,
11008 }, {
11009 .eraseblocks = { {256 * 1024, 1} },
11010 .block_erase = spi_block_erase_c7,
11011 }
11012 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011013 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011014 .unlock = spi_disable_blockprotect,
11015 .write = spi_chip_write_256,
11016 .read = spi_chip_read, /* Fast read (0x0B) supported */
11017 .voltage = {2700, 3600},
11018 },
11019
11020 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011021 .vendor = "Micron/Numonyx/ST",
11022 .name = "M25P32",
11023 .bustype = BUS_SPI,
11024 .manufacture_id = ST_ID,
11025 .model_id = ST_M25P32,
11026 .total_size = 4096,
11027 .page_size = 256,
11028 .feature_bits = FEATURE_WRSR_WREN,
11029 .tested = TEST_OK_PREW,
11030 .probe = probe_spi_rdid,
11031 .probe_timing = TIMING_ZERO,
11032 .block_erasers =
11033 {
11034 {
11035 .eraseblocks = { {64 * 1024, 64} },
11036 .block_erase = spi_block_erase_d8,
11037 }, {
11038 .eraseblocks = { {4 * 1024 * 1024, 1} },
11039 .block_erase = spi_block_erase_c7,
11040 }
11041 },
11042 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
11043 .unlock = spi_disable_blockprotect_bp3_srwd,
11044 .write = spi_chip_write_256,
11045 .read = spi_chip_read,
11046 .voltage = {2700, 3600},
11047 },
11048
11049 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011050 .vendor = "Micron/Numonyx/ST", /* Numonyx */
11051 .name = "M25P40",
11052 .bustype = BUS_SPI,
11053 .manufacture_id = ST_ID,
11054 .model_id = ST_M25P40,
11055 .total_size = 512,
11056 .page_size = 256,
11057 .feature_bits = FEATURE_WRSR_WREN,
11058 .tested = TEST_OK_PREW,
11059 .probe = probe_spi_rdid,
11060 .probe_timing = TIMING_ZERO,
11061 .block_erasers =
11062 {
11063 {
11064 .eraseblocks = { {64 * 1024, 8} },
11065 .block_erase = spi_block_erase_d8,
11066 }, {
11067 .eraseblocks = { {512 * 1024, 1} },
11068 .block_erase = spi_block_erase_c7,
11069 }
11070 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011071 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011072 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011073 .write = spi_chip_write_256,
11074 .read = spi_chip_read,
11075 .voltage = {2700, 3600},
11076 },
11077
11078 {
11079 .vendor = "Micron/Numonyx/ST",
11080 .name = "M25P40-old",
11081 .bustype = BUS_SPI,
11082 .manufacture_id = 0, /* Not used. */
11083 .model_id = ST_M25P40_RES,
11084 .total_size = 512,
11085 .page_size = 256,
11086 .feature_bits = FEATURE_WRSR_WREN,
11087 .tested = TEST_UNTESTED,
11088 .probe = probe_spi_res1,
11089 .probe_timing = TIMING_ZERO,
11090 .block_erasers =
11091 {
11092 {
11093 .eraseblocks = { {64 * 1024, 8} },
11094 .block_erase = spi_block_erase_d8,
11095 }, {
11096 .eraseblocks = { {512 * 1024, 1} },
11097 .block_erase = spi_block_erase_c7,
11098 }
11099 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011100 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011101 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011102 .write = spi_chip_write_256,
11103 .read = spi_chip_read,
11104 },
11105
11106 {
11107 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011108 .name = "M25P64",
11109 .bustype = BUS_SPI,
11110 .manufacture_id = ST_ID,
11111 .model_id = ST_M25P64,
11112 .total_size = 8192,
11113 .page_size = 256,
11114 .feature_bits = FEATURE_WRSR_WREN,
11115 .tested = TEST_OK_PREW,
11116 .probe = probe_spi_rdid,
11117 .probe_timing = TIMING_ZERO,
11118 .block_erasers =
11119 {
11120 {
11121 .eraseblocks = { {64 * 1024, 128} },
11122 .block_erase = spi_block_erase_d8,
11123 }, {
11124 .eraseblocks = { {8 * 1024 * 1024, 1} },
11125 .block_erase = spi_block_erase_c7,
11126 }
11127 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011128 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011129 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011130 .write = spi_chip_write_256,
11131 .read = spi_chip_read,
11132 .voltage = {2700, 3600},
11133 },
11134
11135 {
11136 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011137 .name = "M25P80",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011138 .bustype = BUS_SPI,
11139 .manufacture_id = ST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100011140 .model_id = ST_M25P80,
11141 .total_size = 1024,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011142 .page_size = 256,
11143 .feature_bits = FEATURE_WRSR_WREN,
11144 .tested = TEST_OK_PREW,
11145 .probe = probe_spi_rdid,
11146 .probe_timing = TIMING_ZERO,
11147 .block_erasers =
11148 {
11149 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011150 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011151 .block_erase = spi_block_erase_d8,
11152 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100011153 .eraseblocks = { {1024 * 1024, 1} },
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011154 .block_erase = spi_block_erase_c7,
11155 }
11156 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011157 .printlock = spi_prettyprint_status_register_bp3_srwd, /* TODO: check */
Stefan Tauner5c316f92015-02-08 21:57:52 +000011158 .unlock = spi_disable_blockprotect_bp3_srwd,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011159 .write = spi_chip_write_256,
11160 .read = spi_chip_read,
11161 .voltage = {2700, 3600},
11162 },
11163
11164 {
11165 .vendor = "Micron/Numonyx/ST",
11166 .name = "M25PE10",
11167 .bustype = BUS_SPI,
11168 .manufacture_id = ST_ID,
11169 .model_id = ST_M25PE10,
11170 .total_size = 128,
11171 .page_size = 256,
11172 .feature_bits = FEATURE_WRSR_WREN,
11173 .tested = TEST_UNTESTED,
11174 .probe = probe_spi_rdid,
11175 .probe_timing = TIMING_ZERO,
11176 .block_erasers =
11177 {
11178 {
11179 .eraseblocks = { {4 * 1024, 32} },
11180 .block_erase = spi_block_erase_20,
11181 }, {
11182 .eraseblocks = { {64 * 1024, 2} },
11183 .block_erase = spi_block_erase_d8,
11184 }, {
11185 .eraseblocks = { {128 * 1024, 1} },
11186 .block_erase = spi_block_erase_c7,
11187 }
11188 },
11189 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11190 .unlock = spi_disable_blockprotect,
11191 .write = spi_chip_write_256,
11192 .read = spi_chip_read,
11193 .voltage = {2700, 3600},
11194 },
11195
11196 {
11197 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011198 .name = "M25PE16",
11199 .bustype = BUS_SPI,
11200 .manufacture_id = ST_ID,
11201 .model_id = ST_M25PE16,
11202 .total_size = 2048,
11203 .page_size = 256,
11204 .feature_bits = FEATURE_WRSR_WREN,
11205 .tested = TEST_UNTESTED,
11206 .probe = probe_spi_rdid,
11207 .probe_timing = TIMING_ZERO,
11208 .block_erasers =
11209 {
11210 {
11211 .eraseblocks = { {4 * 1024, 512} },
11212 .block_erase = spi_block_erase_20,
11213 }, {
11214 .eraseblocks = { {64 * 1024, 32} },
11215 .block_erase = spi_block_erase_d8,
11216 }, {
11217 .eraseblocks = { {2 * 1024 * 1024, 1} },
11218 .block_erase = spi_block_erase_c7,
11219 }
11220 },
11221 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11222 .unlock = spi_disable_blockprotect,
11223 .write = spi_chip_write_256,
11224 .read = spi_chip_read,
11225 .voltage = {2700, 3600},
11226 },
11227
11228 {
11229 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011230 .name = "M25PE20",
11231 .bustype = BUS_SPI,
11232 .manufacture_id = ST_ID,
11233 .model_id = ST_M25PE20,
11234 .total_size = 256,
11235 .page_size = 256,
11236 .feature_bits = FEATURE_WRSR_WREN,
11237 .tested = TEST_UNTESTED,
11238 .probe = probe_spi_rdid,
11239 .probe_timing = TIMING_ZERO,
11240 .block_erasers =
11241 {
11242 {
11243 .eraseblocks = { {4 * 1024, 64} },
11244 .block_erase = spi_block_erase_20,
11245 }, {
11246 .eraseblocks = { {64 * 1024, 4} },
11247 .block_erase = spi_block_erase_d8,
11248 }, {
11249 .eraseblocks = { {256 * 1024, 1} },
11250 .block_erase = spi_block_erase_c7,
11251 }
11252 },
11253 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11254 .unlock = spi_disable_blockprotect,
11255 .write = spi_chip_write_256,
11256 .read = spi_chip_read,
11257 .voltage = {2700, 3600},
11258 },
11259
11260 {
11261 .vendor = "Micron/Numonyx/ST",
11262 .name = "M25PE40",
11263 .bustype = BUS_SPI,
11264 .manufacture_id = ST_ID,
11265 .model_id = ST_M25PE40,
11266 .total_size = 512,
11267 .page_size = 256,
11268 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011269 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011270 .probe = probe_spi_rdid,
11271 .probe_timing = TIMING_ZERO,
11272 .block_erasers =
11273 {
11274 {
11275 .eraseblocks = { {4 * 1024, 128} },
11276 .block_erase = spi_block_erase_20,
11277 }, {
11278 .eraseblocks = { {64 * 1024, 8} },
11279 .block_erase = spi_block_erase_d8,
11280 }, {
11281 .eraseblocks = { {512 * 1024, 1} },
11282 .block_erase = spi_block_erase_c7,
11283 }
11284 },
11285 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11286 .unlock = spi_disable_blockprotect,
11287 .write = spi_chip_write_256,
11288 .read = spi_chip_read,
11289 .voltage = {2700, 3600},
11290 },
11291
11292 {
11293 .vendor = "Micron/Numonyx/ST",
11294 .name = "M25PE80",
11295 .bustype = BUS_SPI,
11296 .manufacture_id = ST_ID,
11297 .model_id = ST_M25PE80,
11298 .total_size = 1024,
11299 .page_size = 256,
11300 .feature_bits = FEATURE_WRSR_WREN,
11301 .tested = TEST_OK_PREW,
11302 .probe = probe_spi_rdid,
11303 .probe_timing = TIMING_ZERO,
11304 .block_erasers =
11305 {
11306 {
11307 .eraseblocks = { {4 * 1024, 256} },
11308 .block_erase = spi_block_erase_20,
11309 }, {
11310 .eraseblocks = { {64 * 1024, 16} },
11311 .block_erase = spi_block_erase_d8,
11312 }, {
11313 .eraseblocks = { {1024 * 1024, 1} },
11314 .block_erase = spi_block_erase_c7,
11315 }
11316 },
11317 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
11318 .unlock = spi_disable_blockprotect,
11319 .write = spi_chip_write_256,
11320 .read = spi_chip_read,
11321 .voltage = {2700, 3600},
11322 },
11323
11324 {
11325 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011326 .name = "M25PX16",
11327 .bustype = BUS_SPI,
11328 .manufacture_id = ST_ID,
11329 .model_id = ST_M25PX16,
11330 .total_size = 2048,
11331 .page_size = 256,
11332 /* OTP: 64B total; read 0x4B; write 0x42 */
11333 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11334 .tested = TEST_OK_PREW,
11335 .probe = probe_spi_rdid,
11336 .probe_timing = TIMING_ZERO,
11337 .block_erasers =
11338 {
11339 {
11340 .eraseblocks = { { 4 * 1024, 512 } },
11341 .block_erase = spi_block_erase_20,
11342 }, {
11343 .eraseblocks = { {64 * 1024, 32} },
11344 .block_erase = spi_block_erase_d8,
11345 }, {
11346 .eraseblocks = { {2 * 1024 * 1024, 1} },
11347 .block_erase = spi_block_erase_c7,
11348 }
11349 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011350 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011351 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11352 .write = spi_chip_write_256,
11353 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011354 .voltage = {2300, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011355 },
11356
11357 {
11358 .vendor = "Micron/Numonyx/ST",
11359 .name = "M25PX32",
11360 .bustype = BUS_SPI,
11361 .manufacture_id = ST_ID,
11362 .model_id = ST_M25PX32,
11363 .total_size = 4096,
11364 .page_size = 256,
11365 /* OTP: 64B total; read 0x4B; write 0x42 */
11366 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11367 .tested = TEST_OK_PRE,
11368 .probe = probe_spi_rdid,
11369 .probe_timing = TIMING_ZERO,
11370 .block_erasers =
11371 {
11372 {
11373 .eraseblocks = { { 4 * 1024, 1024 } },
11374 .block_erase = spi_block_erase_20,
11375 }, {
11376 .eraseblocks = { {64 * 1024, 64} },
11377 .block_erase = spi_block_erase_d8,
11378 }, {
11379 .eraseblocks = { {4 * 1024 * 1024, 1} },
11380 .block_erase = spi_block_erase_c7,
11381 }
11382 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011383 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011384 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11385 .write = spi_chip_write_256,
11386 .read = spi_chip_read,
11387 .voltage = {2700, 3600},
11388 },
11389
11390 {
11391 .vendor = "Micron/Numonyx/ST",
11392 .name = "M25PX64",
11393 .bustype = BUS_SPI,
11394 .manufacture_id = ST_ID,
11395 .model_id = ST_M25PX64,
11396 .total_size = 8192,
11397 .page_size = 256,
11398 /* OTP: 64B total; read 0x4B; write 0x42 */
11399 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011400 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011401 .probe = probe_spi_rdid,
11402 .probe_timing = TIMING_ZERO,
11403 .block_erasers =
11404 {
11405 {
11406 .eraseblocks = { { 4 * 1024, 2048 } },
11407 .block_erase = spi_block_erase_20,
11408 }, {
11409 .eraseblocks = { {64 * 1024, 128} },
11410 .block_erase = spi_block_erase_d8,
11411 }, {
11412 .eraseblocks = { {8 * 1024 * 1024, 1} },
11413 .block_erase = spi_block_erase_c7,
11414 }
11415 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000011416 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011417 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11418 .write = spi_chip_write_256,
11419 .read = spi_chip_read,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011420 .voltage = {2700, 3600},
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011421 },
11422
11423 {
11424 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011425 .name = "M25PX80",
11426 .bustype = BUS_SPI,
11427 .manufacture_id = ST_ID,
11428 .model_id = ST_M25PX80,
11429 .total_size = 1024,
11430 .page_size = 256,
11431 /* OTP: 64B total; read 0x4B, write 0x42 */
11432 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11433 .tested = TEST_OK_PREW,
11434 .probe = probe_spi_rdid,
11435 .probe_timing = TIMING_ZERO,
11436 .block_erasers =
11437 {
11438 {
11439 .eraseblocks = { { 4 * 1024, 256 } },
11440 .block_erase = spi_block_erase_20,
11441 }, {
11442 .eraseblocks = { {64 * 1024, 16} },
11443 .block_erase = spi_block_erase_d8,
11444 }, {
11445 .eraseblocks = { {1024 * 1024, 1} },
11446 .block_erase = spi_block_erase_c7,
11447 }
11448 },
11449 .printlock = spi_prettyprint_status_register_bp2_srwd, /* bit5: T/B */
11450 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: per 64kB sector lock registers */
11451 .write = spi_chip_write_256,
11452 .read = spi_chip_read,
11453 .voltage = {2700, 3600},
11454 },
11455
11456 {
11457 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011458 .name = "M45PE10",
11459 .bustype = BUS_SPI,
11460 .manufacture_id = ST_ID,
11461 .model_id = ST_M45PE10,
11462 .total_size = 128,
11463 .page_size = 256,
11464 .tested = TEST_UNTESTED,
11465 .probe = probe_spi_rdid,
11466 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011467 .block_erasers =
11468 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011469 {
11470 .eraseblocks = { {256, 512} },
11471 .block_erase = spi_block_erase_db,
11472 }, {
11473 .eraseblocks = { {64 * 1024, 2} },
11474 .block_erase = spi_block_erase_d8,
11475 }
11476 },
11477 .printlock = spi_prettyprint_status_register_default_welwip,
11478 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11479 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11480 .read = spi_chip_read, /* Fast read (0x0B) supported */
11481 .voltage = {2700, 3600},
11482 },
11483
11484 {
11485 .vendor = "Micron/Numonyx/ST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100011486 .name = "M45PE16",
11487 .bustype = BUS_SPI,
11488 .manufacture_id = ST_ID,
11489 .model_id = ST_M45PE16,
11490 .total_size = 2048,
11491 .page_size = 256,
11492 .tested = TEST_UNTESTED,
11493 .probe = probe_spi_rdid,
11494 .probe_timing = TIMING_ZERO,
11495 .block_erasers =
11496 {
11497 {
11498 .eraseblocks = { {256, 8192} },
11499 .block_erase = spi_block_erase_db,
11500 }, {
11501 .eraseblocks = { {64 * 1024, 32} },
11502 .block_erase = spi_block_erase_d8,
11503 }
11504 },
11505 .printlock = spi_prettyprint_status_register_default_welwip,
11506 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11507 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11508 .read = spi_chip_read, /* Fast read (0x0B) supported */
11509 .voltage = {2700, 3600},
11510 },
11511
11512 {
11513 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011514 .name = "M45PE20",
11515 .bustype = BUS_SPI,
11516 .manufacture_id = ST_ID,
11517 .model_id = ST_M45PE20,
11518 .total_size = 256,
11519 .page_size = 256,
11520 .tested = TEST_UNTESTED,
11521 .probe = probe_spi_rdid,
11522 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011523 .block_erasers =
11524 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011525 {
11526 .eraseblocks = { {256, 1024} },
11527 .block_erase = spi_block_erase_db,
11528 }, {
11529 .eraseblocks = { {64 * 1024, 4} },
11530 .block_erase = spi_block_erase_d8,
11531 }
11532 },
11533 .printlock = spi_prettyprint_status_register_default_welwip,
11534 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11535 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11536 .read = spi_chip_read, /* Fast read (0x0B) supported */
11537 .voltage = {2700, 3600},
11538 },
11539
11540 {
11541 .vendor = "Micron/Numonyx/ST",
11542 .name = "M45PE40",
11543 .bustype = BUS_SPI,
11544 .manufacture_id = ST_ID,
11545 .model_id = ST_M45PE40,
11546 .total_size = 512,
11547 .page_size = 256,
11548 .tested = TEST_UNTESTED,
11549 .probe = probe_spi_rdid,
11550 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011551 .block_erasers =
11552 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011553 {
11554 .eraseblocks = { {256, 2048} },
11555 .block_erase = spi_block_erase_db,
11556 }, {
11557 .eraseblocks = { {64 * 1024, 8} },
11558 .block_erase = spi_block_erase_d8,
11559 }
11560 },
11561 .printlock = spi_prettyprint_status_register_default_welwip,
11562 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
Stefan Tauner23e10b82016-01-23 16:16:49 +000011563 .write = spi_chip_write_256, /* Page write supported (similar to PP but allows 0->1 changes) */
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011564 .read = spi_chip_read, /* Fast read (0x0B) supported */
11565 .voltage = {2700, 3600},
11566 },
11567
11568 {
11569 .vendor = "Micron/Numonyx/ST",
11570 .name = "M45PE80",
11571 .bustype = BUS_SPI,
11572 .manufacture_id = ST_ID,
11573 .model_id = ST_M45PE80,
11574 .total_size = 1024,
11575 .page_size = 256,
11576 .tested = TEST_UNTESTED,
11577 .probe = probe_spi_rdid,
11578 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011579 .block_erasers =
11580 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011581 {
11582 .eraseblocks = { {256, 4096} },
11583 .block_erase = spi_block_erase_db,
11584 }, {
11585 .eraseblocks = { {64 * 1024, 16} },
11586 .block_erase = spi_block_erase_d8,
11587 }
11588 },
11589 .printlock = spi_prettyprint_status_register_default_welwip,
11590 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
11591 .write = spi_chip_write_256, /* Page write (similar to PP but allows 0->1 changes) */
11592 .read = spi_chip_read, /* Fast read (0x0B) supported */
11593 .voltage = {2700, 3600},
11594 },
11595
11596 {
11597 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011598 .name = "N25Q00A..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
11599 .bustype = BUS_SPI,
11600 .manufacture_id = ST_ID,
11601 .model_id = ST_N25Q00A__1G,
11602 .total_size = 131072,
11603 .page_size = 256,
11604 /* supports SFDP */
11605 /* OTP: 64B total; read 0x4B, write 0x42 */
11606 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11607 .tested = TEST_UNTESTED,
11608 .probe = probe_spi_rdid,
11609 .probe_timing = TIMING_ZERO,
11610 .block_erasers =
11611 {
11612 {
11613 .eraseblocks = { {4 * 1024, 32768} },
11614 .block_erase = spi_block_erase_21,
11615 }, {
11616 .eraseblocks = { {4 * 1024, 32768} },
11617 .block_erase = spi_block_erase_20,
11618 }, {
11619 .eraseblocks = { {64 * 1024, 2048} },
11620 .block_erase = spi_block_erase_dc,
11621 }, {
11622 .eraseblocks = { {64 * 1024, 2048} },
11623 .block_erase = spi_block_erase_d8,
11624 }, {
11625 .eraseblocks = { {32768 * 1024, 4} },
11626 .block_erase = spi_block_erase_c4,
11627 }
11628 },
11629 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11630 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11631 .write = spi_chip_write_256, /* Multi I/O supported */
11632 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11633 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010011634 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011635 },
11636
11637 {
11638 .vendor = "Micron/Numonyx/ST",
11639 .name = "N25Q00A..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
11640 .bustype = BUS_SPI,
11641 .manufacture_id = ST_ID,
11642 .model_id = ST_N25Q00A__3G,
11643 .total_size = 131072,
11644 .page_size = 256,
11645 /* supports SFDP */
11646 /* OTP: 64B total; read 0x4B, write 0x42 */
11647 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11648 .tested = TEST_UNTESTED,
11649 .probe = probe_spi_rdid,
11650 .probe_timing = TIMING_ZERO,
11651 .block_erasers =
11652 {
11653 {
11654 .eraseblocks = { {4 * 1024, 32768} },
11655 .block_erase = spi_block_erase_21,
11656 }, {
11657 .eraseblocks = { {4 * 1024, 32768} },
11658 .block_erase = spi_block_erase_20,
11659 }, {
11660 .eraseblocks = { {64 * 1024, 2048} },
11661 .block_erase = spi_block_erase_dc,
11662 }, {
11663 .eraseblocks = { {64 * 1024, 2048} },
11664 .block_erase = spi_block_erase_d8,
11665 }, {
11666 .eraseblocks = { {32768 * 1024, 4} },
11667 .block_erase = spi_block_erase_c4,
11668 }
11669 },
11670 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11671 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11672 .write = spi_chip_write_256, /* Multi I/O supported */
11673 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11674 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010011675 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011676 },
11677
11678 {
11679 .vendor = "Micron/Numonyx/ST",
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011680 .name = "N25Q016",
11681 .bustype = BUS_SPI,
11682 .manufacture_id = ST_ID,
11683 .model_id = ST_N25Q016__1E,
11684 .total_size = 2048,
11685 .page_size = 256,
11686 /* supports SFDP */
11687 /* OTP: 64B total; read 0x4B, write 0x42 */
11688 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11689 .tested = TEST_UNTESTED,
11690 .probe = probe_spi_rdid,
11691 .probe_timing = TIMING_ZERO,
11692 .block_erasers =
11693 {
11694 {
11695 .eraseblocks = { {4 * 1024, 512} },
11696 .block_erase = spi_block_erase_20,
11697 }, {
11698 .eraseblocks = { {32 * 1024, 64} },
11699 .block_erase = spi_block_erase_52,
11700 }, {
11701 .eraseblocks = { {64 * 1024, 32} },
11702 .block_erase = spi_block_erase_d8,
11703 }, {
11704 .eraseblocks = { {2 * 1024 * 1024, 1} },
11705 .block_erase = spi_block_erase_c7,
11706 }
11707 },
11708 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11709 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11710 .write = spi_chip_write_256, /* Multi I/O supported */
11711 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11712 .voltage = {1700, 2000},
11713 },
11714
11715 {
11716 .vendor = "Micron/Numonyx/ST",
11717 .name = "N25Q032..1E",
11718 .bustype = BUS_SPI,
11719 .manufacture_id = ST_ID,
11720 .model_id = ST_N25Q032__1E,
11721 .total_size = 4096,
11722 .page_size = 256,
11723 /* supports SFDP */
11724 /* OTP: 64B total; read 0x4B, write 0x42 */
11725 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11726 .tested = TEST_UNTESTED,
11727 .probe = probe_spi_rdid,
11728 .probe_timing = TIMING_ZERO,
11729 .block_erasers =
11730 {
11731 {
11732 .eraseblocks = { {4 * 1024, 1024} },
11733 .block_erase = spi_block_erase_20,
11734 }, {
11735 .eraseblocks = { {64 * 1024, 64} },
11736 .block_erase = spi_block_erase_d8,
11737 }, {
11738 .eraseblocks = { {4 * 1024 * 1024, 1} },
11739 .block_erase = spi_block_erase_c7,
11740 }
11741 },
11742 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11743 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11744 .write = spi_chip_write_256, /* Multi I/O supported */
11745 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11746 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011747 .reg_bits =
11748 {
11749 /*
11750 * There is also a volatile lock register per 64KiB sector, which is not
11751 * mutually exclusive with BP-based protection.
11752 */
11753 .srp = {STATUS1, 7, RW},
11754 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11755 .tb = {STATUS1, 5, RW},
11756 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011757 .wp_write_cfg = spi_wp_write_cfg,
11758 .wp_read_cfg = spi_wp_read_cfg,
11759 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011760 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011761 },
11762
11763 {
11764 .vendor = "Micron/Numonyx/ST",
11765 .name = "N25Q032..3E",
11766 .bustype = BUS_SPI,
11767 .manufacture_id = ST_ID,
11768 .model_id = ST_N25Q032__3E,
11769 .total_size = 4096,
11770 .page_size = 256,
11771 /* supports SFDP */
11772 /* OTP: 64B total; read 0x4B, write 0x42 */
11773 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11774 .tested = TEST_OK_PREW,
11775 .probe = probe_spi_rdid,
11776 .probe_timing = TIMING_ZERO,
11777 .block_erasers =
11778 {
11779 {
11780 .eraseblocks = { {4 * 1024, 1024} },
11781 .block_erase = spi_block_erase_20,
11782 }, {
11783 .eraseblocks = { {64 * 1024, 64} },
11784 .block_erase = spi_block_erase_d8,
11785 }, {
11786 .eraseblocks = { {4 * 1024 * 1024, 1} },
11787 .block_erase = spi_block_erase_c7,
11788 }
11789 },
11790 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11791 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11792 .write = spi_chip_write_256, /* Multi I/O supported */
11793 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11794 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011795 .reg_bits =
11796 {
11797 /*
11798 * There is also a volatile lock register per 64KiB sector, which is not
11799 * mutually exclusive with BP-based protection.
11800 */
11801 .srp = {STATUS1, 7, RW},
11802 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
11803 .tb = {STATUS1, 5, RW},
11804 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011805 .wp_write_cfg = spi_wp_write_cfg,
11806 .wp_read_cfg = spi_wp_read_cfg,
11807 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011808 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011809 },
11810
11811 {
11812 .vendor = "Micron/Numonyx/ST",
11813 .name = "N25Q064..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11814 .bustype = BUS_SPI,
11815 .manufacture_id = ST_ID,
11816 .model_id = ST_N25Q064__1E,
11817 .total_size = 8192,
11818 .page_size = 256,
11819 /* supports SFDP */
11820 /* OTP: 64B total; read 0x4B, write 0x42 */
11821 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000011822 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011823 .probe = probe_spi_rdid,
11824 .probe_timing = TIMING_ZERO,
11825 .block_erasers =
11826 {
11827 {
11828 .eraseblocks = { {4 * 1024, 2048 } },
11829 .block_erase = spi_block_erase_20,
11830 }, {
11831 .eraseblocks = { {64 * 1024, 128} },
11832 .block_erase = spi_block_erase_d8,
11833 }, {
11834 .eraseblocks = { {8 * 1024 * 1024, 1} },
11835 .block_erase = spi_block_erase_c7,
11836 }
11837 },
11838 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11839 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11840 .write = spi_chip_write_256, /* Multi I/O supported */
11841 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11842 .voltage = {1700, 2000},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011843 .reg_bits =
11844 {
11845 /*
11846 * There is also a volatile lock register per 64KiB sector, which is not
11847 * mutually exclusive with BP-based protection.
11848 */
11849 .srp = {STATUS1, 7, RW},
11850 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
11851 .tb = {STATUS1, 5, RW},
11852 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011853 .wp_write_cfg = spi_wp_write_cfg,
11854 .wp_read_cfg = spi_wp_read_cfg,
11855 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011856 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011857 },
11858
11859 {
11860 .vendor = "Micron/Numonyx/ST",
11861 .name = "N25Q064..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11862 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011863 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011864 .model_id = ST_N25Q064__3E,
11865 .total_size = 8192,
11866 .page_size = 256,
11867 /* supports SFDP */
11868 /* OTP: 64B total; read 0x4B, write 0x42 */
11869 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11870 .tested = TEST_OK_PREW,
11871 .probe = probe_spi_rdid,
11872 .probe_timing = TIMING_ZERO,
11873 .block_erasers =
11874 {
11875 {
11876 .eraseblocks = { {4 * 1024, 2048 } },
11877 .block_erase = spi_block_erase_20,
11878 }, {
11879 .eraseblocks = { {64 * 1024, 128} },
11880 .block_erase = spi_block_erase_d8,
11881 }, {
11882 .eraseblocks = { {8 * 1024 * 1024, 1} },
11883 .block_erase = spi_block_erase_c7,
11884 }
11885 },
11886 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11887 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11888 .write = spi_chip_write_256, /* Multi I/O supported */
11889 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11890 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011891 .reg_bits =
11892 {
11893 /*
11894 * There is also a volatile lock register per 64KiB sector, which is not
11895 * mutually exclusive with BP-based protection.
11896 */
11897 .srp = {STATUS1, 7, RW},
11898 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
11899 .tb = {STATUS1, 5, RW},
11900 },
Nico Huberaabb3e02023-01-13 00:22:30 +010011901 .wp_write_cfg = spi_wp_write_cfg,
11902 .wp_read_cfg = spi_wp_read_cfg,
11903 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030011904 .decode_range = decode_range_spi25,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011905 },
11906
11907 {
11908 .vendor = "Micron/Numonyx/ST",
11909 .name = "N25Q128..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11910 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011911 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011912 .model_id = ST_N25Q128__1E,
11913 .total_size = 16384,
11914 .page_size = 256,
11915 /* supports SFDP */
11916 /* OTP: 64B total; read 0x4B, write 0x42 */
11917 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Stefan Tauner23e10b82016-01-23 16:16:49 +000011918 .tested = TEST_OK_PREW,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011919 .probe = probe_spi_rdid,
11920 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011921 .block_erasers =
11922 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011923 {
11924 .eraseblocks = { {4 * 1024, 4096 } },
11925 .block_erase = spi_block_erase_20,
11926 }, {
11927 .eraseblocks = { {64 * 1024, 256} },
11928 .block_erase = spi_block_erase_d8,
11929 }, {
11930 .eraseblocks = { {16384 * 1024, 1} },
11931 .block_erase = spi_block_erase_c7,
11932 }
11933 },
11934 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11935 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11936 .write = spi_chip_write_256, /* Multi I/O supported */
11937 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11938 .voltage = {1700, 2000},
11939 },
11940
11941 {
11942 .vendor = "Micron/Numonyx/ST",
11943 .name = "N25Q128..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
11944 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100011945 .manufacture_id = ST_ID,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011946 .model_id = ST_N25Q128__3E,
11947 .total_size = 16384,
11948 .page_size = 256,
11949 /* supports SFDP */
11950 /* OTP: 64B total; read 0x4B, write 0x42 */
11951 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
11952 .tested = TEST_OK_PREW,
11953 .probe = probe_spi_rdid,
11954 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100011955 .block_erasers =
11956 {
Stefan Tauner1aa80b02013-07-25 22:58:51 +000011957 {
11958 .eraseblocks = { {4 * 1024, 4096 } },
11959 .block_erase = spi_block_erase_20,
11960 }, {
11961 .eraseblocks = { {64 * 1024, 256} },
11962 .block_erase = spi_block_erase_d8,
11963 }, {
11964 .eraseblocks = { {16384 * 1024, 1} },
11965 .block_erase = spi_block_erase_c7,
11966 }
11967 },
11968 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
11969 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
11970 .write = spi_chip_write_256, /* Multi I/O supported */
11971 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
11972 .voltage = {2700, 3600},
11973 },
11974
11975 {
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070011976 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070011977 .name = "N25Q256..1E", /* ..1E = 1.8V, uniform 64KB/4KB blocks/sectors */
11978 .bustype = BUS_SPI,
11979 .manufacture_id = ST_ID,
11980 .model_id = ST_N25Q256__1E,
11981 .total_size = 32768,
11982 .page_size = 256,
11983 /* supports SFDP */
11984 /* OTP: 64B total; read 0x4B, write 0x42 */
11985 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
11986 .tested = TEST_UNTESTED,
11987 .probe = probe_spi_rdid,
11988 .probe_timing = TIMING_ZERO,
11989 .block_erasers =
11990 {
11991 {
11992 .eraseblocks = { {4 * 1024, 8192} },
11993 .block_erase = spi_block_erase_21,
11994 }, {
11995 .eraseblocks = { {4 * 1024, 8192} },
11996 .block_erase = spi_block_erase_20,
11997 }, {
11998 .eraseblocks = { {64 * 1024, 512} },
11999 .block_erase = spi_block_erase_dc,
12000 }, {
12001 .eraseblocks = { {64 * 1024, 512} },
12002 .block_erase = spi_block_erase_d8,
12003 }, {
12004 .eraseblocks = { {32768 * 1024, 1} },
12005 .block_erase = spi_block_erase_c7,
12006 }
12007 },
12008 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12009 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12010 .write = spi_chip_write_256, /* Multi I/O supported */
12011 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12012 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012013 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012014 },
12015
12016 {
12017 .vendor = "Micron/Numonyx/ST",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012018 .name = "N25Q256..3E", /* ..3E = 3V, uniform 64KB/4KB blocks/sectors */
12019 .bustype = BUS_SPI,
12020 .manufacture_id = ST_ID,
12021 .model_id = ST_N25Q256__3E,
12022 .total_size = 32768,
12023 .page_size = 256,
12024 /* supports SFDP */
12025 /* OTP: 64B total; read 0x4B, write 0x42 */
12026 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12027 .tested = TEST_UNTESTED,
12028 .probe = probe_spi_rdid,
12029 .probe_timing = TIMING_ZERO,
12030 .block_erasers =
12031 {
12032 {
12033 .eraseblocks = { {4 * 1024, 8192} },
12034 .block_erase = spi_block_erase_21,
12035 }, {
12036 .eraseblocks = { {4 * 1024, 8192} },
12037 .block_erase = spi_block_erase_20,
12038 }, {
12039 .eraseblocks = { {64 * 1024, 512} },
12040 .block_erase = spi_block_erase_dc,
12041 }, {
12042 .eraseblocks = { {64 * 1024, 512} },
12043 .block_erase = spi_block_erase_d8,
12044 }, {
12045 .eraseblocks = { {32768 * 1024, 1} },
12046 .block_erase = spi_block_erase_c7,
12047 }
12048 },
12049 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12050 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12051 .write = spi_chip_write_256, /* Multi I/O supported */
12052 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12053 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012054 .prepare_access = spi_prepare_4ba,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012055 },
12056
12057 {
12058 .vendor = "Micron/Numonyx/ST",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012059 .name = "N25Q512..1G", /* ..1G = 1.8V, uniform 64KB/4KB blocks/sectors */
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012060 .bustype = BUS_SPI,
12061 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012062 .model_id = ST_N25Q512__1G,
12063 .total_size = 65536,
12064 .page_size = 256,
12065 /* supports SFDP */
12066 /* OTP: 64B total; read 0x4B, write 0x42 */
12067 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12068 .tested = TEST_UNTESTED,
12069 .probe = probe_spi_rdid,
12070 .probe_timing = TIMING_ZERO,
12071 .block_erasers =
12072 {
12073 {
12074 .eraseblocks = { {4 * 1024, 16384} },
12075 .block_erase = spi_block_erase_21,
12076 }, {
12077 .eraseblocks = { {4 * 1024, 16384} },
12078 .block_erase = spi_block_erase_20,
12079 }, {
12080 .eraseblocks = { {64 * 1024, 1024} },
12081 .block_erase = spi_block_erase_dc,
12082 }, {
12083 .eraseblocks = { {64 * 1024, 1024} },
12084 .block_erase = spi_block_erase_d8,
12085 }, {
12086 .eraseblocks = { {32768 * 1024, 2} },
12087 .block_erase = spi_block_erase_c4,
12088 }
12089 },
12090 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12091 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12092 .write = spi_chip_write_256, /* Multi I/O supported */
12093 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12094 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012095 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012096 },
12097
12098 {
12099 .vendor = "Micron/Numonyx/ST",
12100 .name = "N25Q512..3G", /* ..3G = 3V, uniform 64KB/4KB blocks/sectors */
12101 .bustype = BUS_SPI,
12102 .manufacture_id = ST_ID,
12103 .model_id = ST_N25Q512__3G,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012104 .total_size = 65536,
12105 .page_size = 256,
12106 /* supports SFDP */
12107 /* OTP: 64B total; read 0x4B, write 0x42 */
12108 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12109 .tested = TEST_OK_PREW,
12110 .probe = probe_spi_rdid,
12111 .probe_timing = TIMING_ZERO,
12112 .block_erasers =
12113 {
12114 {
12115 .eraseblocks = { {4 * 1024, 16384} },
12116 .block_erase = spi_block_erase_21,
12117 }, {
12118 .eraseblocks = { {4 * 1024, 16384} },
12119 .block_erase = spi_block_erase_20,
12120 }, {
12121 .eraseblocks = { {64 * 1024, 1024} },
12122 .block_erase = spi_block_erase_dc,
12123 }, {
12124 .eraseblocks = { {64 * 1024, 1024} },
12125 .block_erase = spi_block_erase_d8,
12126 }, {
Jacob Creedone8e7b0e2019-07-22 12:21:22 -070012127 .eraseblocks = { {32768 * 1024, 2} },
12128 .block_erase = spi_block_erase_c4,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012129 }
12130 },
12131 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12132 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12133 .write = spi_chip_write_256, /* Multi I/O supported */
12134 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12135 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012136 .prepare_access = spi_prepare_4ba,
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012137 },
12138
12139 {
Ed Swierk199ab392017-07-03 13:33:44 -070012140 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012141 .name = "MT25QL01G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12142 .bustype = BUS_SPI,
12143 .manufacture_id = ST_ID,
12144 .model_id = ST_N25Q00A__3G,
12145 .total_size = 131072,
12146 .page_size = 256,
12147 /* supports SFDP */
12148 /* OTP: 64B total; read 0x4B, write 0x42 */
12149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12150 .tested = TEST_OK_PREW,
12151 .probe = probe_spi_rdid,
12152 .probe_timing = TIMING_ZERO,
12153 .block_erasers =
12154 {
12155 {
12156 .eraseblocks = { {4 * 1024, 32768} },
12157 .block_erase = spi_block_erase_21,
12158 }, {
12159 .eraseblocks = { {4 * 1024, 32768} },
12160 .block_erase = spi_block_erase_20,
12161 }, {
12162 .eraseblocks = { {32 * 1024, 4096} },
12163 .block_erase = spi_block_erase_5c,
12164 }, {
12165 .eraseblocks = { {32 * 1024, 4096} },
12166 .block_erase = spi_block_erase_52,
12167 }, {
12168 .eraseblocks = { {64 * 1024, 2048} },
12169 .block_erase = spi_block_erase_dc,
12170 }, {
12171 .eraseblocks = { {64 * 1024, 2048} },
12172 .block_erase = spi_block_erase_d8,
12173 }, {
12174 .eraseblocks = { {65536 * 1024, 2} },
12175 .block_erase = spi_block_erase_c4,
12176 }
12177 },
12178 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12179 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12180 .write = spi_chip_write_256, /* Multi I/O supported */
12181 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12182 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012183 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012184 },
12185
12186 {
12187 .vendor = "Micron",
12188 .name = "MT25QU01G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12189 .bustype = BUS_SPI,
12190 .manufacture_id = ST_ID,
12191 .model_id = ST_N25Q00A__1G,
12192 .total_size = 131072,
12193 .page_size = 256,
12194 /* supports SFDP */
12195 /* OTP: 64B total; read 0x4B, write 0x42 */
12196 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12197 .tested = TEST_UNTESTED,
12198 .probe = probe_spi_rdid,
12199 .probe_timing = TIMING_ZERO,
12200 .block_erasers =
12201 {
12202 {
12203 .eraseblocks = { {4 * 1024, 32768} },
12204 .block_erase = spi_block_erase_21,
12205 }, {
12206 .eraseblocks = { {4 * 1024, 32768} },
12207 .block_erase = spi_block_erase_20,
12208 }, {
12209 .eraseblocks = { {32 * 1024, 4096} },
12210 .block_erase = spi_block_erase_5c,
12211 }, {
12212 .eraseblocks = { {32 * 1024, 4096} },
12213 .block_erase = spi_block_erase_52,
12214 }, {
12215 .eraseblocks = { {64 * 1024, 2048} },
12216 .block_erase = spi_block_erase_dc,
12217 }, {
12218 .eraseblocks = { {64 * 1024, 2048} },
12219 .block_erase = spi_block_erase_d8,
12220 }, {
12221 .eraseblocks = { {65536 * 1024, 2} },
12222 .block_erase = spi_block_erase_c4,
12223 }
12224 },
12225 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12226 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12227 .write = spi_chip_write_256, /* Multi I/O supported */
12228 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12229 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012230 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012231 },
12232
12233 {
12234 .vendor = "Micron",
12235 .name = "MT25QL02G", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12236 .bustype = BUS_SPI,
12237 .manufacture_id = ST_ID,
12238 .model_id = ST_MT25QL02G,
12239 .total_size = 262144,
12240 .page_size = 256,
12241 /* supports SFDP */
12242 /* OTP: 64B total; read 0x4B, write 0x42 */
12243 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12244 .tested = TEST_UNTESTED,
12245 .probe = probe_spi_rdid,
12246 .probe_timing = TIMING_ZERO,
12247 .block_erasers =
12248 {
12249 {
12250 .eraseblocks = { {4 * 1024, 65536} },
12251 .block_erase = spi_block_erase_21,
12252 }, {
12253 .eraseblocks = { {4 * 1024, 65536} },
12254 .block_erase = spi_block_erase_20,
12255 }, {
12256 .eraseblocks = { {32 * 1024, 8192} },
12257 .block_erase = spi_block_erase_5c,
12258 }, {
12259 .eraseblocks = { {32 * 1024, 8192} },
12260 .block_erase = spi_block_erase_52,
12261 }, {
12262 .eraseblocks = { {64 * 1024, 4096} },
12263 .block_erase = spi_block_erase_dc,
12264 }, {
12265 .eraseblocks = { {64 * 1024, 4096} },
12266 .block_erase = spi_block_erase_d8,
12267 }, {
12268 .eraseblocks = { {65536 * 1024, 4} },
12269 .block_erase = spi_block_erase_c4,
12270 }
12271 },
12272 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12273 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12274 .write = spi_chip_write_256, /* Multi I/O supported */
12275 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12276 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012277 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012278 },
12279
12280 {
12281 .vendor = "Micron",
12282 .name = "MT25QU02G", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12283 .bustype = BUS_SPI,
12284 .manufacture_id = ST_ID,
12285 .model_id = ST_MT25QU02G,
12286 .total_size = 262144,
12287 .page_size = 256,
12288 /* supports SFDP */
12289 /* OTP: 64B total; read 0x4B, write 0x42 */
12290 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12291 .tested = TEST_UNTESTED,
12292 .probe = probe_spi_rdid,
12293 .probe_timing = TIMING_ZERO,
12294 .block_erasers =
12295 {
12296 {
12297 .eraseblocks = { {4 * 1024, 65536} },
12298 .block_erase = spi_block_erase_21,
12299 }, {
12300 .eraseblocks = { {4 * 1024, 65536} },
12301 .block_erase = spi_block_erase_20,
12302 }, {
12303 .eraseblocks = { {32 * 1024, 8192} },
12304 .block_erase = spi_block_erase_5c,
12305 }, {
12306 .eraseblocks = { {32 * 1024, 8192} },
12307 .block_erase = spi_block_erase_52,
12308 }, {
12309 .eraseblocks = { {64 * 1024, 4096} },
12310 .block_erase = spi_block_erase_dc,
12311 }, {
12312 .eraseblocks = { {64 * 1024, 4096} },
12313 .block_erase = spi_block_erase_d8,
12314 }, {
12315 .eraseblocks = { {65536 * 1024, 4} },
12316 .block_erase = spi_block_erase_c4,
12317 }
12318 },
12319 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12320 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12321 .write = spi_chip_write_256, /* Multi I/O supported */
12322 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12323 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012324 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012325 },
12326
12327 {
12328 .vendor = "Micron",
12329 .name = "MT25QU128", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12330 .bustype = BUS_SPI,
12331 .manufacture_id = ST_ID,
12332 .model_id = ST_N25Q128__1E,
12333 .total_size = 16384,
12334 .page_size = 256,
12335 /* supports SFDP */
12336 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huber48dc0902023-03-05 17:20:55 +010012337 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012338 .tested = TEST_UNTESTED,
12339 .probe = probe_spi_rdid,
12340 .probe_timing = TIMING_ZERO,
12341 .block_erasers =
12342 {
12343 {
12344 .eraseblocks = { {4 * 1024, 4096} },
12345 .block_erase = spi_block_erase_20,
12346 }, {
12347 .eraseblocks = { {32 * 1024, 512} },
12348 .block_erase = spi_block_erase_52,
12349 }, {
12350 .eraseblocks = { {64 * 1024, 256} },
12351 .block_erase = spi_block_erase_d8,
12352 }, {
12353 .eraseblocks = { {16384 * 1024, 1} },
12354 .block_erase = spi_block_erase_c7,
12355 }, {
12356 .eraseblocks = { {16384 * 1024, 1} },
12357 .block_erase = spi_block_erase_60,
12358 }
12359 },
12360 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12361 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12362 .write = spi_chip_write_256, /* Multi I/O supported */
12363 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12364 .voltage = {1700, 2000},
12365 },
12366
12367 {
12368 .vendor = "Micron",
12369 .name = "MT25QL128", /* L = 3V, uniform 64KB/4KB blocks/sectors */
12370 .bustype = BUS_SPI,
12371 .manufacture_id = ST_ID,
12372 .model_id = ST_N25Q128__3E,
12373 .total_size = 16384,
12374 .page_size = 256,
12375 /* supports SFDP */
12376 /* OTP: 64B total; read 0x4B, write 0x42 */
Rick Altherr1e563602022-12-22 10:25:34 -080012377 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
12378 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012379 .probe = probe_spi_rdid,
12380 .probe_timing = TIMING_ZERO,
12381 .block_erasers =
12382 {
12383 {
12384 .eraseblocks = { {4 * 1024, 4096} },
12385 .block_erase = spi_block_erase_20,
12386 }, {
12387 .eraseblocks = { {32 * 1024, 512} },
12388 .block_erase = spi_block_erase_52,
12389 }, {
12390 .eraseblocks = { {64 * 1024, 256} },
12391 .block_erase = spi_block_erase_d8,
12392 }, {
12393 .eraseblocks = { {16384 * 1024, 1} },
12394 .block_erase = spi_block_erase_c7,
12395 }, {
12396 .eraseblocks = { {16384 * 1024, 1} },
12397 .block_erase = spi_block_erase_60,
12398 }
12399 },
12400 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12401 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12402 .write = spi_chip_write_256, /* Multi I/O supported */
12403 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12404 .voltage = {2700, 3600},
12405 },
12406
12407 {
12408 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012409 .name = "MT25QL256", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012410 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012411 .manufacture_id = ST_ID,
Ed Swierk199ab392017-07-03 13:33:44 -070012412 .model_id = ST_N25Q256__3E,
12413 .total_size = 32768,
12414 .page_size = 256,
12415 /* supports SFDP */
12416 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012417 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Simon Buhrowb7014f92021-02-15 13:16:57 +010012418 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012419 .probe = probe_spi_rdid,
12420 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012421 .block_erasers =
12422 {
Ed Swierk199ab392017-07-03 13:33:44 -070012423 {
12424 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012425 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012426 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012427 .eraseblocks = { {4 * 1024, 8192} },
12428 .block_erase = spi_block_erase_20,
12429 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012430 .eraseblocks = { {32 * 1024, 1024} },
12431 .block_erase = spi_block_erase_5c,
12432 }, {
12433 .eraseblocks = { {32 * 1024, 1024} },
12434 .block_erase = spi_block_erase_52,
12435 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012436 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012437 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012438 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012439 .eraseblocks = { {64 * 1024, 512} },
12440 .block_erase = spi_block_erase_d8,
12441 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012442 .eraseblocks = { {32768 * 1024, 1} },
12443 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012444 }, {
12445 .eraseblocks = { {32768 * 1024, 1} },
12446 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012447 }
12448 },
12449 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12450 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12451 .write = spi_chip_write_256, /* Multi I/O supported */
12452 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12453 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010012454 .prepare_access = spi_prepare_4ba,
Ed Swierk199ab392017-07-03 13:33:44 -070012455 },
12456
12457 {
12458 .vendor = "Micron",
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012459 .name = "MT25QU256", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12460 .bustype = BUS_SPI,
12461 .manufacture_id = ST_ID,
12462 .model_id = ST_N25Q256__1E,
12463 .total_size = 32768,
12464 .page_size = 256,
12465 /* supports SFDP */
12466 /* OTP: 64B total; read 0x4B, write 0x42 */
12467 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons59052582022-03-08 15:23:58 +010012468 .tested = TEST_OK_PREW,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012469 .probe = probe_spi_rdid,
12470 .probe_timing = TIMING_ZERO,
12471 .block_erasers =
12472 {
12473 {
12474 .eraseblocks = { {4 * 1024, 8192} },
12475 .block_erase = spi_block_erase_21,
12476 }, {
12477 .eraseblocks = { {4 * 1024, 8192} },
12478 .block_erase = spi_block_erase_20,
12479 }, {
12480 .eraseblocks = { {32 * 1024, 1024} },
12481 .block_erase = spi_block_erase_5c,
12482 }, {
12483 .eraseblocks = { {32 * 1024, 1024} },
12484 .block_erase = spi_block_erase_52,
12485 }, {
12486 .eraseblocks = { {64 * 1024, 512} },
12487 .block_erase = spi_block_erase_dc,
12488 }, {
12489 .eraseblocks = { {64 * 1024, 512} },
12490 .block_erase = spi_block_erase_d8,
12491 }, {
12492 .eraseblocks = { {32768 * 1024, 1} },
12493 .block_erase = spi_block_erase_c7,
12494 }, {
12495 .eraseblocks = { {32768 * 1024, 1} },
12496 .block_erase = spi_block_erase_60,
12497 }
12498 },
12499 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12500 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12501 .write = spi_chip_write_256, /* Multi I/O supported */
12502 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12503 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012504 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012505 },
12506
12507 {
12508 .vendor = "Micron",
Jacob Creedon08e9d1d2019-07-22 12:04:40 -070012509 .name = "MT25QL512", /* L = 3V, uniform 64KB/4KB blocks/sectors */
Ed Swierk199ab392017-07-03 13:33:44 -070012510 .bustype = BUS_SPI,
Alan Greenfa3fcd32019-06-27 15:41:50 +100012511 .manufacture_id = ST_ID,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012512 .model_id = ST_N25Q512__3G,
Ed Swierk199ab392017-07-03 13:33:44 -070012513 .total_size = 65536,
12514 .page_size = 256,
12515 /* supports SFDP */
12516 /* OTP: 64B total; read 0x4B, write 0x42 */
Nico Huberaac81422017-11-10 22:54:13 +010012517 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
Angel Pons3ed5a352018-09-30 16:31:09 +020012518 .tested = TEST_OK_PREW,
Ed Swierk199ab392017-07-03 13:33:44 -070012519 .probe = probe_spi_rdid,
12520 .probe_timing = TIMING_ZERO,
Alan Greenfdf5da42019-06-27 16:56:52 +100012521 .block_erasers =
12522 {
Ed Swierk199ab392017-07-03 13:33:44 -070012523 {
12524 .eraseblocks = { {4 * 1024, 16384} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012525 .block_erase = spi_block_erase_21,
Ed Swierk199ab392017-07-03 13:33:44 -070012526 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012527 .eraseblocks = { {4 * 1024, 16384} },
12528 .block_erase = spi_block_erase_20,
12529 }, {
Jacob Creedon045b97e2019-07-22 12:26:56 -070012530 .eraseblocks = { {32 * 1024, 2048} },
12531 .block_erase = spi_block_erase_5c,
12532 }, {
12533 .eraseblocks = { {32 * 1024, 2048} },
12534 .block_erase = spi_block_erase_52,
12535 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012536 .eraseblocks = { {64 * 1024, 1024} },
Nico Huber7e3c81a2017-10-14 18:56:50 +020012537 .block_erase = spi_block_erase_dc,
Ed Swierk199ab392017-07-03 13:33:44 -070012538 }, {
Nico Huberaac81422017-11-10 22:54:13 +010012539 .eraseblocks = { {64 * 1024, 1024} },
12540 .block_erase = spi_block_erase_d8,
12541 }, {
Ed Swierk199ab392017-07-03 13:33:44 -070012542 .eraseblocks = { {65536 * 1024, 1} },
12543 .block_erase = spi_block_erase_c7,
Jacob Creedon045b97e2019-07-22 12:26:56 -070012544 }, {
12545 .eraseblocks = { {65536 * 1024, 1} },
12546 .block_erase = spi_block_erase_60,
Ed Swierk199ab392017-07-03 13:33:44 -070012547 }
12548 },
12549 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12550 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12551 .write = spi_chip_write_256, /* Multi I/O supported */
12552 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12553 .voltage = {2700, 3600},
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012554 .reg_bits =
12555 {
12556 .srp = {STATUS1, 7, RW},
12557 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 6, RW}},
12558 .tb = {STATUS1, 5, RW},
12559 },
Nico Huberaabb3e02023-01-13 00:22:30 +010012560 .wp_write_cfg = spi_wp_write_cfg,
12561 .wp_read_cfg = spi_wp_read_cfg,
12562 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd5ba24c2022-07-25 00:28:35 +030012563 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010012564 .prepare_access = spi_prepare_4ba,
Ed Swierk199ab392017-07-03 13:33:44 -070012565 },
12566
12567 {
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012568 .vendor = "Micron",
12569 .name = "MT25QU512", /* U = 1.8V, uniform 64KB/4KB blocks/sectors */
12570 .bustype = BUS_SPI,
12571 .manufacture_id = ST_ID,
12572 .model_id = ST_N25Q512__1G,
12573 .total_size = 65536,
12574 .page_size = 256,
12575 /* supports SFDP */
12576 /* OTP: 64B total; read 0x4B, write 0x42 */
12577 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_4BA_WREN,
12578 .tested = TEST_OK_PREW,
12579 .probe = probe_spi_rdid,
12580 .probe_timing = TIMING_ZERO,
12581 .block_erasers =
12582 {
12583 {
12584 .eraseblocks = { {4 * 1024, 16384} },
12585 .block_erase = spi_block_erase_21,
12586 }, {
12587 .eraseblocks = { {4 * 1024, 16384} },
12588 .block_erase = spi_block_erase_20,
12589 }, {
12590 .eraseblocks = { {32 * 1024, 2048} },
12591 .block_erase = spi_block_erase_5c,
12592 }, {
12593 .eraseblocks = { {32 * 1024, 2048} },
12594 .block_erase = spi_block_erase_52,
12595 }, {
12596 .eraseblocks = { {64 * 1024, 1024} },
12597 .block_erase = spi_block_erase_dc,
12598 }, {
12599 .eraseblocks = { {64 * 1024, 1024} },
12600 .block_erase = spi_block_erase_d8,
12601 }, {
12602 .eraseblocks = { {65536 * 1024, 1} },
12603 .block_erase = spi_block_erase_c7,
12604 }, {
12605 .eraseblocks = { {65536 * 1024, 1} },
12606 .block_erase = spi_block_erase_60,
12607 }
12608 },
12609 .printlock = spi_prettyprint_status_register_n25q, /* TODO: config, lock, flag regs */
12610 .unlock = spi_disable_blockprotect_n25q, /* TODO: per 64kB sector lock registers */
12611 .write = spi_chip_write_256, /* Multi I/O supported */
12612 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
12613 .voltage = {1700, 2000},
Nico Huberab6b18f2023-01-11 23:38:20 +010012614 .prepare_access = spi_prepare_4ba,
Jacob Creedon80e8dc42019-07-22 12:35:30 -070012615 },
12616
12617 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000012618 .vendor = "MoselVitelic",
12619 .name = "V29C51000B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012620 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012621 .manufacture_id = SYNCMOS_MVC_ID,
12622 .model_id = MVC_V29C51000B,
12623 .total_size = 64,
12624 .page_size = 512,
12625 .feature_bits = FEATURE_EITHER_RESET,
12626 .tested = TEST_UNTESTED,
12627 .probe = probe_jedec,
12628 .probe_timing = TIMING_ZERO,
12629 .block_erasers =
12630 {
12631 {
12632 .eraseblocks = { {512, 128} },
12633 .block_erase = erase_sector_jedec,
12634 }, {
12635 .eraseblocks = { {64 * 1024, 1} },
12636 .block_erase = erase_chip_block_jedec,
12637 },
12638 },
12639 .write = write_jedec_1,
12640 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012641 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012642 .prepare_access = prepare_memory_access,
12643 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012644 },
12645
12646 {
12647 .vendor = "MoselVitelic",
12648 .name = "V29C51000T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012649 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012650 .manufacture_id = SYNCMOS_MVC_ID,
12651 .model_id = MVC_V29C51000T,
12652 .total_size = 64,
12653 .page_size = 512,
12654 .feature_bits = FEATURE_EITHER_RESET,
12655 .tested = TEST_UNTESTED,
12656 .probe = probe_jedec,
12657 .probe_timing = TIMING_ZERO,
12658 .block_erasers =
12659 {
12660 {
12661 .eraseblocks = { {512, 128} },
12662 .block_erase = erase_sector_jedec,
12663 }, {
12664 .eraseblocks = { {64 * 1024, 1} },
12665 .block_erase = erase_chip_block_jedec,
12666 },
12667 },
12668 .write = write_jedec_1,
12669 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012670 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012671 .prepare_access = prepare_memory_access,
12672 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012673 },
12674
12675 {
12676 .vendor = "MoselVitelic",
12677 .name = "V29C51400B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012678 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012679 .manufacture_id = SYNCMOS_MVC_ID,
12680 .model_id = MVC_V29C51400B,
12681 .total_size = 512,
12682 .page_size = 1024,
12683 .feature_bits = FEATURE_EITHER_RESET,
12684 .tested = TEST_UNTESTED,
12685 .probe = probe_jedec,
12686 .probe_timing = TIMING_ZERO,
12687 .block_erasers =
12688 {
12689 {
12690 .eraseblocks = { {1024, 512} },
12691 .block_erase = erase_sector_jedec,
12692 }, {
12693 .eraseblocks = { {512 * 1024, 1} },
12694 .block_erase = erase_chip_block_jedec,
12695 },
12696 },
12697 .write = write_jedec_1,
12698 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012699 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012700 .prepare_access = prepare_memory_access,
12701 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012702 },
12703
12704 {
12705 .vendor = "MoselVitelic",
12706 .name = "V29C51400T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012707 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012708 .manufacture_id = SYNCMOS_MVC_ID,
12709 .model_id = MVC_V29C51400T,
12710 .total_size = 512,
12711 .page_size = 1024,
12712 .feature_bits = FEATURE_EITHER_RESET,
12713 .tested = TEST_UNTESTED,
12714 .probe = probe_jedec,
12715 .probe_timing = TIMING_ZERO,
12716 .block_erasers =
12717 {
12718 {
12719 .eraseblocks = { {1024, 512} },
12720 .block_erase = erase_sector_jedec,
12721 }, {
12722 .eraseblocks = { {512 * 1024, 1} },
12723 .block_erase = erase_chip_block_jedec,
12724 },
12725 },
12726 .write = write_jedec_1,
12727 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012728 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012729 .prepare_access = prepare_memory_access,
12730 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012731 },
12732
12733 {
12734 .vendor = "MoselVitelic",
12735 .name = "V29LC51000",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012736 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012737 .manufacture_id = SYNCMOS_MVC_ID,
12738 .model_id = MVC_V29LC51000,
12739 .total_size = 64,
12740 .page_size = 512,
12741 .feature_bits = FEATURE_EITHER_RESET,
12742 .tested = TEST_UNTESTED,
12743 .probe = probe_jedec,
12744 .probe_timing = TIMING_ZERO,
12745 .block_erasers =
12746 {
12747 {
12748 .eraseblocks = { {512, 128} },
12749 .block_erase = erase_sector_jedec,
12750 }, {
12751 .eraseblocks = { {64 * 1024, 1} },
12752 .block_erase = erase_chip_block_jedec,
12753 },
12754 },
12755 .write = write_jedec_1,
12756 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012757 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012758 .prepare_access = prepare_memory_access,
12759 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012760 },
12761
12762 {
12763 .vendor = "MoselVitelic",
12764 .name = "V29LC51001",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012765 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012766 .manufacture_id = SYNCMOS_MVC_ID,
12767 .model_id = MVC_V29LC51001,
12768 .total_size = 128,
12769 .page_size = 512,
12770 .feature_bits = FEATURE_EITHER_RESET,
12771 .tested = TEST_UNTESTED,
12772 .probe = probe_jedec,
12773 .probe_timing = TIMING_ZERO,
12774 .block_erasers =
12775 {
12776 {
12777 .eraseblocks = { {512, 256} },
12778 .block_erase = erase_sector_jedec,
12779 }, {
12780 .eraseblocks = { {128 * 1024, 1} },
12781 .block_erase = erase_chip_block_jedec,
12782 },
12783 },
12784 .write = write_jedec_1,
12785 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012786 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012787 .prepare_access = prepare_memory_access,
12788 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012789 },
12790
12791 {
12792 .vendor = "MoselVitelic",
12793 .name = "V29LC51002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000012794 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012795 .manufacture_id = SYNCMOS_MVC_ID,
12796 .model_id = MVC_V29LC51002,
12797 .total_size = 256,
12798 .page_size = 512,
12799 .feature_bits = FEATURE_EITHER_RESET,
12800 .tested = TEST_UNTESTED,
12801 .probe = probe_jedec,
12802 .probe_timing = TIMING_ZERO,
12803 .block_erasers =
12804 {
12805 {
12806 .eraseblocks = { {512, 512} },
12807 .block_erase = erase_sector_jedec,
12808 }, {
12809 .eraseblocks = { {256 * 1024, 1} },
12810 .block_erase = erase_chip_block_jedec,
12811 },
12812 },
12813 .write = write_jedec_1,
12814 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000012815 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010012816 .prepare_access = prepare_memory_access,
12817 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000012818 },
12819
12820 {
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012821 .vendor = "Nantronics",
12822 .name = "N25S10",
12823 .bustype = BUS_SPI,
12824 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12825 .model_id = NANTRONICS_N25S10,
12826 .total_size = 128,
12827 .page_size = 256,
12828 .feature_bits = FEATURE_WRSR_WREN,
12829 .tested = TEST_UNTESTED,
12830 .probe = probe_spi_rdid,
12831 .probe_timing = TIMING_ZERO,
12832 .block_erasers =
12833 {
12834 {
12835 .eraseblocks = { {4 * 1024, 32} },
12836 .block_erase = spi_block_erase_20,
12837 }, {
12838 .eraseblocks = { {4 * 1024, 32} },
12839 .block_erase = spi_block_erase_d7,
12840 }, {
12841 .eraseblocks = { {32 * 1024, 4} },
12842 .block_erase = spi_block_erase_52,
12843 }, {
12844 .eraseblocks = { {64 * 1024, 2} },
12845 .block_erase = spi_block_erase_d8,
12846 }, {
12847 .eraseblocks = { {128 * 1024, 1} },
12848 .block_erase = spi_block_erase_60,
12849 }, {
12850 .eraseblocks = { {128 * 1024, 1} },
12851 .block_erase = spi_block_erase_c7,
12852 }
12853 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012854 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012855 .unlock = spi_disable_blockprotect_bp3_srwd,
12856 .write = spi_chip_write_256,
12857 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12858 .voltage = {2700, 3600},
12859 },
12860
12861 {
12862 .vendor = "Nantronics",
Alan Green1f9cc7d2019-07-01 11:10:45 +100012863 .name = "N25S16",
12864 .bustype = BUS_SPI,
12865 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12866 .model_id = NANTRONICS_N25S16,
12867 .total_size = 2048,
12868 .page_size = 256,
12869 .feature_bits = FEATURE_WRSR_WREN,
12870 .tested = TEST_UNTESTED,
12871 .probe = probe_spi_rdid,
12872 .probe_timing = TIMING_ZERO,
12873 .block_erasers =
12874 {
12875 {
12876 .eraseblocks = { {4 * 1024, 512} },
12877 .block_erase = spi_block_erase_20,
12878 }, {
12879 .eraseblocks = { {64 * 1024, 32} },
12880 .block_erase = spi_block_erase_d8,
12881 }, {
12882 .eraseblocks = { {2048 * 1024, 1} },
12883 .block_erase = spi_block_erase_60,
12884 }, {
12885 .eraseblocks = { {2048 * 1024, 1} },
12886 .block_erase = spi_block_erase_c7,
12887 }
12888 },
12889 .printlock = spi_prettyprint_status_register_bp3_srwd,
12890 .unlock = spi_disable_blockprotect_bp3_srwd,
12891 .write = spi_chip_write_256,
12892 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12893 .voltage = {2700, 3600},
12894 },
12895
12896 {
12897 .vendor = "Nantronics",
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012898 .name = "N25S20",
12899 .bustype = BUS_SPI,
12900 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12901 .model_id = NANTRONICS_N25S20,
12902 .total_size = 256,
12903 .page_size = 256,
12904 .feature_bits = FEATURE_WRSR_WREN,
12905 .tested = TEST_UNTESTED,
12906 .probe = probe_spi_rdid,
12907 .probe_timing = TIMING_ZERO,
12908 .block_erasers =
12909 {
12910 {
12911 .eraseblocks = { {4 * 1024, 64} },
12912 .block_erase = spi_block_erase_20,
12913 }, {
12914 .eraseblocks = { {4 * 1024, 64} },
12915 .block_erase = spi_block_erase_d7,
12916 }, {
12917 .eraseblocks = { {32 * 1024, 8} },
12918 .block_erase = spi_block_erase_52,
12919 }, {
12920 .eraseblocks = { {64 * 1024, 4} },
12921 .block_erase = spi_block_erase_d8,
12922 }, {
12923 .eraseblocks = { {256 * 1024, 1} },
12924 .block_erase = spi_block_erase_60,
12925 }, {
12926 .eraseblocks = { {256 * 1024, 1} },
12927 .block_erase = spi_block_erase_c7,
12928 }
12929 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012930 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012931 .unlock = spi_disable_blockprotect_bp3_srwd,
12932 .write = spi_chip_write_256,
12933 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12934 .voltage = {2700, 3600},
12935 },
12936
12937 {
12938 .vendor = "Nantronics",
12939 .name = "N25S40",
12940 .bustype = BUS_SPI,
12941 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12942 .model_id = NANTRONICS_N25S40,
12943 .total_size = 512,
12944 .page_size = 256,
12945 .feature_bits = FEATURE_WRSR_WREN,
12946 .tested = TEST_UNTESTED,
12947 .probe = probe_spi_rdid,
12948 .probe_timing = TIMING_ZERO,
12949 .block_erasers =
12950 {
12951 {
12952 .eraseblocks = { {4 * 1024, 128} },
12953 .block_erase = spi_block_erase_20,
12954 }, {
12955 .eraseblocks = { {4 * 1024, 128} },
12956 .block_erase = spi_block_erase_d7,
12957 }, {
12958 .eraseblocks = { {32 * 1024, 16} },
12959 .block_erase = spi_block_erase_52,
12960 }, {
12961 .eraseblocks = { {64 * 1024, 8} },
12962 .block_erase = spi_block_erase_d8,
12963 }, {
12964 .eraseblocks = { {512 * 1024, 1} },
12965 .block_erase = spi_block_erase_60,
12966 }, {
12967 .eraseblocks = { {512 * 1024, 1} },
12968 .block_erase = spi_block_erase_c7,
12969 }
12970 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000012971 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000012972 .unlock = spi_disable_blockprotect_bp3_srwd,
12973 .write = spi_chip_write_256,
12974 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
12975 .voltage = {2700, 3600},
12976 },
12977
12978 {
12979 .vendor = "Nantronics",
12980 .name = "N25S80",
12981 .bustype = BUS_SPI,
12982 .manufacture_id = NANTRONICS_ID_NOPREFIX,
12983 .model_id = NANTRONICS_N25S80,
12984 .total_size = 1024,
12985 .page_size = 256,
12986 .feature_bits = FEATURE_WRSR_WREN,
12987 .tested = TEST_UNTESTED,
12988 .probe = probe_spi_rdid,
12989 .probe_timing = TIMING_ZERO,
12990 .block_erasers =
12991 {
12992 {
12993 .eraseblocks = { {4 * 1024, 256} },
12994 .block_erase = spi_block_erase_20,
12995 }, {
12996 .eraseblocks = { {32 * 1024, 32} },
12997 .block_erase = spi_block_erase_52,
12998 }, {
12999 .eraseblocks = { {64 * 1024, 16} },
13000 .block_erase = spi_block_erase_d8,
13001 }, {
13002 .eraseblocks = { {1024 * 1024, 1} },
13003 .block_erase = spi_block_erase_60,
13004 }, {
13005 .eraseblocks = { {1024 * 1024, 1} },
13006 .block_erase = spi_block_erase_c7,
13007 }
13008 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013009 .printlock = spi_prettyprint_status_register_bp3_srwd,
Stefan Taunerb6b00e92013-06-28 21:28:43 +000013010 .unlock = spi_disable_blockprotect_bp3_srwd,
13011 .write = spi_chip_write_256,
13012 .read = spi_chip_read, /* Fast read (0x0B), dual I/O read (0x3B) supported */
13013 .voltage = {2700, 3600},
13014 },
13015
13016 {
Stefan Taunerf4451612013-04-19 01:59:15 +000013017 .vendor = "PMC",
13018 .name = "Pm25LD010(C)",
13019 .bustype = BUS_SPI,
13020 .manufacture_id = PMC_ID,
13021 .model_id = PMC_PM25LD010,
13022 .total_size = 128,
13023 .page_size = 256,
13024 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000013025 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013026 .probe = probe_spi_rdid,
13027 .probe_timing = TIMING_ZERO,
13028 .block_erasers =
13029 {
13030 {
13031 .eraseblocks = { {4 * 1024, 32} },
13032 .block_erase = spi_block_erase_20,
13033 }, {
13034 .eraseblocks = { {4 * 1024, 32} },
13035 .block_erase = spi_block_erase_d7,
13036 }, {
13037 .eraseblocks = { {32 * 1024, 4} },
13038 .block_erase = spi_block_erase_d8,
13039 }, {
13040 .eraseblocks = { {128 * 1024, 1} },
13041 .block_erase = spi_block_erase_60,
13042 }, {
13043 .eraseblocks = { {128 * 1024, 1} },
13044 .block_erase = spi_block_erase_c7,
13045 }
13046 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013047 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013048 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13049 .write = spi_chip_write_256,
13050 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13051 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD010 */
13052 },
13053
13054 {
13055 .vendor = "PMC",
13056 .name = "Pm25LD020(C)",
13057 .bustype = BUS_SPI,
13058 .manufacture_id = PMC_ID,
13059 .model_id = PMC_PM25LD020,
13060 .total_size = 256,
13061 .page_size = 256,
13062 .feature_bits = FEATURE_WRSR_WREN,
Angel Ponsf5822a82018-09-30 20:09:58 +020013063 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013064 .probe = probe_spi_rdid,
13065 .probe_timing = TIMING_ZERO,
13066 .block_erasers =
13067 {
13068 {
13069 .eraseblocks = { {4 * 1024, 64} },
13070 .block_erase = spi_block_erase_20,
13071 }, {
13072 .eraseblocks = { {4 * 1024, 64} },
13073 .block_erase = spi_block_erase_d7,
13074 }, {
13075 .eraseblocks = { {64 * 1024, 4} },
13076 .block_erase = spi_block_erase_d8,
13077 }, {
13078 .eraseblocks = { {256 * 1024, 1} },
13079 .block_erase = spi_block_erase_60,
13080 }, {
13081 .eraseblocks = { {256 * 1024, 1} },
13082 .block_erase = spi_block_erase_c7,
13083 }
13084 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013085 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013086 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13087 .write = spi_chip_write_256,
13088 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13089 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD020 */
13090 },
13091
13092 {
13093 .vendor = "PMC",
13094 .name = "Pm25LD040(C)",
13095 .bustype = BUS_SPI,
13096 .manufacture_id = PMC_ID,
13097 .model_id = PMC_PM25LV040,
13098 .total_size = 512,
13099 .page_size = 256,
13100 .feature_bits = FEATURE_WRSR_WREN,
Angel Pons05127bf2018-09-30 20:23:24 +020013101 .tested = TEST_OK_PREW,
Stefan Taunerf4451612013-04-19 01:59:15 +000013102 .probe = probe_spi_rdid,
13103 .probe_timing = TIMING_ZERO,
13104 .block_erasers =
13105 {
13106 {
13107 .eraseblocks = { {4 * 1024, 128} },
13108 .block_erase = spi_block_erase_20,
13109 }, {
13110 .eraseblocks = { {4 * 1024, 128} },
13111 .block_erase = spi_block_erase_d7,
13112 }, {
13113 .eraseblocks = { {64 * 1024, 8} },
13114 .block_erase = spi_block_erase_d8,
13115 }, {
13116 .eraseblocks = { {512 * 1024, 1} },
13117 .block_erase = spi_block_erase_60,
13118 }, {
13119 .eraseblocks = { {512 * 1024, 1} },
13120 .block_erase = spi_block_erase_c7,
13121 }
13122 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013123 .printlock = spi_prettyprint_status_register_bp2_srwd,
Stefan Taunerf4451612013-04-19 01:59:15 +000013124 .unlock = spi_disable_blockprotect,
13125 .write = spi_chip_write_256,
13126 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13127 .voltage = {2700, 3600}, /* 2.3-3.6V for Pm25LD040 */
13128 },
13129
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013130 {
13131 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013132 .name = "Pm25LD256C",
13133 .bustype = BUS_SPI,
13134 .manufacture_id = PMC_ID,
13135 .model_id = PMC_PM25LD256C,
13136 .total_size = 32,
13137 .page_size = 256,
13138 .feature_bits = FEATURE_WRSR_WREN,
13139 .tested = TEST_UNTESTED,
13140 .probe = probe_spi_rdid,
13141 .probe_timing = TIMING_ZERO,
13142 .block_erasers =
13143 {
13144 {
13145 .eraseblocks = { {4 * 1024, 8} },
13146 .block_erase = spi_block_erase_20,
13147 }, {
13148 .eraseblocks = { {4 * 1024, 8} },
13149 .block_erase = spi_block_erase_d7,
13150 }, {
13151 .eraseblocks = { {32 * 1024, 1} },
13152 .block_erase = spi_block_erase_d8,
13153 }, {
13154 .eraseblocks = { {32 * 1024, 1} },
13155 .block_erase = spi_block_erase_60,
13156 }, {
13157 .eraseblocks = { {32 * 1024, 1} },
13158 .block_erase = spi_block_erase_c7,
13159 }
13160 },
13161 .printlock = spi_prettyprint_status_register_bp2_srwd,
13162 .unlock = spi_disable_blockprotect,
13163 .write = spi_chip_write_256,
13164 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13165 .voltage = {2700, 3600},
13166 },
13167
13168 {
13169 .vendor = "PMC",
13170 .name = "Pm25LD512(C)",
13171 .bustype = BUS_SPI,
13172 .manufacture_id = PMC_ID,
13173 .model_id = PMC_PM25LD512,
13174 .total_size = 64,
13175 .page_size = 256,
13176 .feature_bits = FEATURE_WRSR_WREN,
13177 .tested = TEST_OK_PREW,
13178 .probe = probe_spi_rdid,
13179 .probe_timing = TIMING_ZERO,
13180 .block_erasers =
13181 {
13182 {
13183 .eraseblocks = { {4 * 1024, 16} },
13184 .block_erase = spi_block_erase_20,
13185 }, {
13186 .eraseblocks = { {4 * 1024, 16} },
13187 .block_erase = spi_block_erase_d7,
13188 }, {
13189 .eraseblocks = { {32 * 1024, 2} },
13190 .block_erase = spi_block_erase_d8,
13191 }, {
13192 .eraseblocks = { {64 * 1024, 1} },
13193 .block_erase = spi_block_erase_60,
13194 }, {
13195 .eraseblocks = { {64 * 1024, 1} },
13196 .block_erase = spi_block_erase_c7,
13197 }
13198 },
13199 .printlock = spi_prettyprint_status_register_bp2_srwd,
13200 .unlock = spi_disable_blockprotect, /* FIXME: C version supports "Safe Guard" */
13201 .write = spi_chip_write_256,
13202 .read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
13203 .voltage = {2300, 3600},
13204 },
13205
13206 {
13207 .vendor = "PMC",
13208 .name = "Pm25LQ016",
13209 .bustype = BUS_SPI,
13210 .manufacture_id = PMC_ID,
13211 .model_id = PMC_PM25LQ016,
13212 .total_size = 2048,
13213 .page_size = 256,
13214 /* OTP: 256B total; read 0x4B, write 0xB1 */
13215 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13216 .tested = TEST_UNTESTED,
13217 .probe = probe_spi_rdid,
13218 .probe_timing = TIMING_ZERO,
13219 .block_erasers =
13220 {
13221 {
13222 .eraseblocks = { {4 * 1024, 512} },
13223 .block_erase = spi_block_erase_20,
13224 }, {
13225 .eraseblocks = { {4 * 1024, 512} },
13226 .block_erase = spi_block_erase_d7,
13227 }, {
13228 .eraseblocks = { {64 * 1024, 32} },
13229 .block_erase = spi_block_erase_d8,
13230 }, {
13231 .eraseblocks = { {2048 * 1024, 1} },
13232 .block_erase = spi_block_erase_60,
13233 }, {
13234 .eraseblocks = { {2048 * 1024, 1} },
13235 .block_erase = spi_block_erase_c7,
13236 }
13237 },
13238 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13239 .unlock = spi_disable_blockprotect_bp3_srwd,
13240 .write = spi_chip_write_256,
13241 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13242 .voltage = {2300, 3600},
13243 },
13244
13245 {
13246 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013247 .name = "Pm25LQ020",
13248 .bustype = BUS_SPI,
13249 .manufacture_id = PMC_ID,
13250 .model_id = PMC_PM25LQ020,
13251 .total_size = 256,
13252 .page_size = 256,
13253 /* OTP: 256B total; read 0x4B, write 0xB1 */
13254 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13255 .tested = TEST_UNTESTED,
13256 .probe = probe_spi_rdid,
13257 .probe_timing = TIMING_ZERO,
13258 .block_erasers =
13259 {
13260 {
13261 .eraseblocks = { {4 * 1024, 64} },
13262 .block_erase = spi_block_erase_20,
13263 }, {
13264 .eraseblocks = { {4 * 1024, 64} },
13265 .block_erase = spi_block_erase_d7,
13266 }, {
13267 .eraseblocks = { {64 * 1024, 4} },
13268 .block_erase = spi_block_erase_d8,
13269 }, {
13270 .eraseblocks = { {256 * 1024, 1} },
13271 .block_erase = spi_block_erase_60,
13272 }, {
13273 .eraseblocks = { {256 * 1024, 1} },
13274 .block_erase = spi_block_erase_c7,
13275 }
13276 },
13277 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13278 .unlock = spi_disable_blockprotect_bp3_srwd,
13279 .write = spi_chip_write_256,
13280 .read = spi_chip_read,
13281 .voltage = {2300, 3600},
13282 },
13283
13284 {
13285 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013286 .name = "Pm25LQ032C",
13287 .bustype = BUS_SPI,
13288 .manufacture_id = PMC_ID,
13289 .model_id = PMC_PM25LQ032C,
13290 .total_size = 4096,
13291 .page_size = 256,
13292 /* OTP: 64B total; read 0x4B, write 0xB1 */
13293 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13294 .tested = TEST_OK_PREW,
13295 .probe = probe_spi_rdid,
13296 .probe_timing = TIMING_ZERO,
13297 .block_erasers =
13298 {
13299 {
13300 .eraseblocks = { {4 * 1024, 1024} },
13301 .block_erase = spi_block_erase_20,
13302 }, {
13303 .eraseblocks = { {4 * 1024, 1024} },
13304 .block_erase = spi_block_erase_d7,
13305 }, {
13306 .eraseblocks = { {64 * 1024, 64} },
13307 .block_erase = spi_block_erase_d8,
13308 }, {
13309 .eraseblocks = { {4096 * 1024, 1} },
13310 .block_erase = spi_block_erase_60,
13311 }, {
13312 .eraseblocks = { {4096 * 1024, 1} },
13313 .block_erase = spi_block_erase_c7,
13314 }
13315 },
13316 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13317 .unlock = spi_disable_blockprotect_bp3_srwd,
13318 .write = spi_chip_write_256,
13319 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13320 .voltage = {2700, 3600},
13321 },
13322
13323 {
13324 .vendor = "PMC",
Steven Honeyman81a8fb72015-06-02 22:32:24 +000013325 .name = "Pm25LQ040",
13326 .bustype = BUS_SPI,
13327 .manufacture_id = PMC_ID,
13328 .model_id = PMC_PM25LQ040,
13329 .total_size = 512,
13330 .page_size = 256,
13331 /* OTP: 256B total; read 0x4B, write 0xB1 */
13332 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13333 .tested = TEST_UNTESTED,
13334 .probe = probe_spi_rdid,
13335 .probe_timing = TIMING_ZERO,
13336 .block_erasers =
13337 {
13338 {
13339 .eraseblocks = { {4 * 1024, 128} },
13340 .block_erase = spi_block_erase_20,
13341 }, {
13342 .eraseblocks = { {4 * 1024, 128} },
13343 .block_erase = spi_block_erase_d7,
13344 }, {
13345 .eraseblocks = { {64 * 1024, 8} },
13346 .block_erase = spi_block_erase_d8,
13347 }, {
13348 .eraseblocks = { {512 * 1024, 1} },
13349 .block_erase = spi_block_erase_60,
13350 }, {
13351 .eraseblocks = { {512 * 1024, 1} },
13352 .block_erase = spi_block_erase_c7,
13353 }
13354 },
13355 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13356 .unlock = spi_disable_blockprotect_bp3_srwd,
13357 .write = spi_chip_write_256,
13358 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13359 .voltage = {2300, 3600},
13360 },
13361
13362 {
13363 .vendor = "PMC",
13364 .name = "Pm25LQ080",
13365 .bustype = BUS_SPI,
13366 .manufacture_id = PMC_ID,
13367 .model_id = PMC_PM25LQ080,
13368 .total_size = 1024,
13369 .page_size = 256,
13370 /* OTP: 64B total; read 0x4B, write 0xB1 */
13371 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
13372 .tested = TEST_UNTESTED,
13373 .probe = probe_spi_rdid,
13374 .probe_timing = TIMING_ZERO,
13375 .block_erasers =
13376 {
13377 {
13378 .eraseblocks = { {4 * 1024, 256} },
13379 .block_erase = spi_block_erase_20,
13380 }, {
13381 .eraseblocks = { {4 * 1024, 256} },
13382 .block_erase = spi_block_erase_d7,
13383 }, {
13384 .eraseblocks = { {64 * 1024, 16} },
13385 .block_erase = spi_block_erase_d8,
13386 }, {
13387 .eraseblocks = { {1024 * 1024, 1} },
13388 .block_erase = spi_block_erase_60,
13389 }, {
13390 .eraseblocks = { {1024 * 1024, 1} },
13391 .block_erase = spi_block_erase_c7,
13392 }
13393 },
13394 .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
13395 .unlock = spi_disable_blockprotect_bp3_srwd,
13396 .write = spi_chip_write_256,
13397 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
13398 .voltage = {2300, 3600},
13399 },
13400
13401 {
13402 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013403 .name = "Pm25LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013404 .bustype = BUS_SPI,
Stefan Taunerbecda742014-05-30 19:34:00 +000013405 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013406 .model_id = PMC_PM25LV010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013407 .total_size = 128,
13408 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013409 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerbecda742014-05-30 19:34:00 +000013410 .tested = TEST_OK_PREW,
13411 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013412 .probe_timing = TIMING_ZERO,
13413 .block_erasers =
13414 {
13415 {
13416 .eraseblocks = { {4 * 1024, 32} },
13417 .block_erase = spi_block_erase_d7,
13418 }, {
13419 .eraseblocks = { {32 * 1024, 4} },
13420 .block_erase = spi_block_erase_d8,
13421 }, {
13422 .eraseblocks = { {128 * 1024, 1} },
13423 .block_erase = spi_block_erase_c7,
13424 }
13425 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013426 .printlock = spi_prettyprint_status_register_bp1_srwd,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013427 .unlock = spi_disable_blockprotect,
13428 .write = spi_chip_write_256,
13429 .read = spi_chip_read, /* Fast read (0x0B) supported */
13430 .voltage = {2700, 3600},
13431 },
13432
13433 {
13434 .vendor = "PMC",
13435 .name = "Pm25LV010A",
13436 .bustype = BUS_SPI,
13437 .manufacture_id = PMC_ID,
13438 .model_id = PMC_PM25LV010,
13439 .total_size = 128,
13440 .page_size = 256,
13441 .feature_bits = FEATURE_WRSR_WREN,
13442 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013443 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013444 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013445 .block_erasers =
13446 {
13447 {
13448 .eraseblocks = { {4 * 1024, 32} },
13449 .block_erase = spi_block_erase_d7,
13450 }, {
13451 .eraseblocks = { {32 * 1024, 4} },
13452 .block_erase = spi_block_erase_d8,
13453 }, {
13454 .eraseblocks = { {128 * 1024, 1} },
13455 .block_erase = spi_block_erase_c7,
13456 }
13457 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013458 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013459 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013460 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013461 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013462 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013463 },
13464
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013465 {
13466 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013467 .name = "Pm25LV016B",
13468 .bustype = BUS_SPI,
13469 .manufacture_id = PMC_ID,
13470 .model_id = PMC_PM25LV016B,
13471 .total_size = 2048,
13472 .page_size = 256,
13473 .feature_bits = FEATURE_WRSR_WREN,
13474 .tested = TEST_UNTESTED,
13475 .probe = probe_spi_rdid,
13476 .probe_timing = TIMING_ZERO,
13477 .block_erasers =
13478 {
13479 {
13480 .eraseblocks = { {4 * 1024, 512} },
13481 .block_erase = spi_block_erase_d7,
13482 }, {
13483 .eraseblocks = { {4 * 1024, 512} },
13484 .block_erase = spi_block_erase_20,
13485 }, {
13486 .eraseblocks = { {64 * 1024, 32} },
13487 .block_erase = spi_block_erase_d8,
13488 }, {
13489 .eraseblocks = { {2 * 1024 * 1024, 1} },
13490 .block_erase = spi_block_erase_60,
13491 }, {
13492 .eraseblocks = { {2 * 1024 * 1024, 1} },
13493 .block_erase = spi_block_erase_c7,
13494 }
13495 },
13496 .printlock = spi_prettyprint_status_register_bp2_srwd,
13497 .unlock = spi_disable_blockprotect,
13498 .write = spi_chip_write_256,
13499 .read = spi_chip_read, /* Fast read (0x0B) supported */
13500 .voltage = {2700, 3600},
13501 },
13502
13503 {
13504 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013505 .name = "Pm25LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013506 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013507 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013508 .model_id = PMC_PM25LV020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013509 .total_size = 256,
13510 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013511 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013512 .tested = TEST_UNTESTED,
13513 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013514 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013515 .block_erasers =
13516 {
13517 {
13518 .eraseblocks = { {4 * 1024, 64} },
13519 .block_erase = spi_block_erase_d7,
13520 }, {
13521 .eraseblocks = { {64 * 1024, 4} },
13522 .block_erase = spi_block_erase_d8,
13523 }, {
13524 .eraseblocks = { {256 * 1024, 1} },
13525 .block_erase = spi_block_erase_c7,
13526 }
13527 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013528 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013529 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013530 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013531 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013532 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013533 },
13534
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013535 {
13536 .vendor = "PMC",
13537 .name = "Pm25LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013538 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013539 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013540 .model_id = PMC_PM25LV040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013541 .total_size = 512,
13542 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013543 .feature_bits = FEATURE_WRSR_WREN,
Stefan Tauner716e0982011-07-25 20:38:52 +000013544 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013545 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013546 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013547 .block_erasers =
13548 {
13549 {
13550 .eraseblocks = { {4 * 1024, 128} },
13551 .block_erase = spi_block_erase_d7,
13552 }, {
13553 .eraseblocks = { {64 * 1024, 8} },
13554 .block_erase = spi_block_erase_d8,
13555 }, {
13556 .eraseblocks = { {512 * 1024, 1} },
13557 .block_erase = spi_block_erase_c7,
13558 }
13559 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013560 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013561 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013562 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013563 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013564 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013565 },
13566
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013567 {
13568 .vendor = "PMC",
13569 .name = "Pm25LV080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013570 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013571 .manufacture_id = PMC_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013572 .model_id = PMC_PM25LV080B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013573 .total_size = 1024,
13574 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013575 .feature_bits = FEATURE_WRSR_WREN,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013576 .tested = TEST_UNTESTED,
13577 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013578 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013579 .block_erasers =
13580 {
13581 {
13582 .eraseblocks = { {4 * 1024, 256} },
13583 .block_erase = spi_block_erase_d7,
13584 }, {
13585 .eraseblocks = { {4 * 1024, 256} },
13586 .block_erase = spi_block_erase_20,
13587 }, {
13588 .eraseblocks = { {64 * 1024, 16} },
13589 .block_erase = spi_block_erase_d8,
13590 }, {
13591 .eraseblocks = { {1024 * 1024, 1} },
13592 .block_erase = spi_block_erase_60,
13593 }, {
13594 .eraseblocks = { {1024 * 1024, 1} },
13595 .block_erase = spi_block_erase_c7,
13596 }
13597 },
Stefan Tauner12f3d512014-05-27 21:27:27 +000013598 .printlock = spi_prettyprint_status_register_bp2_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013599 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013600 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013601 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013602 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013603 },
13604
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013605 {
13606 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013607 .name = "Pm25LV512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013608 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013609 .manufacture_id = PMC_ID_NOPREFIX,
13610 .model_id = PMC_PM25LV512,
13611 .total_size = 64,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013612 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013613 .feature_bits = FEATURE_WRSR_WREN,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013614 .tested = TEST_OK_PREW,
13615 .probe = probe_spi_res2, /* The continuation code is transferred as the 3rd byte m( */
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000013616 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013617 .block_erasers =
13618 {
13619 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013620 .eraseblocks = { {4 * 1024, 16} },
Sean Nelson5643c072010-01-19 03:23:07 +000013621 .block_erase = spi_block_erase_d7,
13622 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013623 .eraseblocks = { {32 * 1024, 2} },
Sean Nelson5643c072010-01-19 03:23:07 +000013624 .block_erase = spi_block_erase_d8,
13625 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100013626 .eraseblocks = { {64 * 1024, 1} },
Sean Nelson5643c072010-01-19 03:23:07 +000013627 .block_erase = spi_block_erase_c7,
13628 }
13629 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100013630 .printlock = spi_prettyprint_status_register_bp1_srwd,
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000013631 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000013632 .write = spi_chip_write_256,
Stefan Tauner3f5e35d2013-04-19 01:58:33 +000013633 .read = spi_chip_read, /* Fast read (0x0B) supported */
Steven Zakulec7d257b42011-07-19 08:50:18 +000013634 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000013635 },
13636
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013637 {
13638 .vendor = "PMC",
Sean Nelson72a9a022009-12-22 22:15:33 +000013639 .name = "Pm29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013640 .bustype = BUS_PARALLEL,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013641 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013642 .model_id = PMC_PM29F002B,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013643 .total_size = 256,
Sean Nelson72a9a022009-12-22 22:15:33 +000013644 .page_size = 8 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000013645 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013646 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000013647 .probe = probe_jedec,
Stefan Tauner1aa80b02013-07-25 22:58:51 +000013648 .probe_timing = TIMING_FIXME,
Sean Nelson72a9a022009-12-22 22:15:33 +000013649 .block_erasers =
13650 {
13651 {
13652 .eraseblocks = {
13653 {16 * 1024, 1},
13654 {8 * 1024, 2},
13655 {96 * 1024, 1},
13656 {128 * 1024, 1},
13657 },
Sean Nelson35727f72010-01-28 23:55:12 +000013658 .block_erase = erase_sector_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013659 }, {
13660 .eraseblocks = { {256 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000013661 .block_erase = erase_chip_block_jedec,
Sean Nelson72a9a022009-12-22 22:15:33 +000013662 },
13663 },
Sean Nelson35727f72010-01-28 23:55:12 +000013664 .write = write_jedec_1,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013665 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013666 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013667 .prepare_access = prepare_memory_access,
13668 .finish_access = finish_memory_access,
Uwe Hermannf983d9f2009-06-14 21:53:26 +000013669 },
13670
13671 {
13672 .vendor = "PMC",
Alan Green1f9cc7d2019-07-01 11:10:45 +100013673 .name = "Pm29F002T",
13674 .bustype = BUS_PARALLEL,
13675 .manufacture_id = PMC_ID_NOPREFIX,
13676 .model_id = PMC_PM29F002T,
13677 .total_size = 256,
13678 .page_size = 8 * 1024,
13679 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13680 .tested = TEST_OK_PREW,
13681 .probe = probe_jedec,
13682 .probe_timing = TIMING_FIXME,
13683 .block_erasers =
13684 {
13685 {
13686 .eraseblocks = {
13687 {128 * 1024, 1},
13688 {96 * 1024, 1},
13689 {8 * 1024, 2},
13690 {16 * 1024, 1},
13691 },
13692 .block_erase = erase_sector_jedec,
13693 }, {
13694 .eraseblocks = { {256 * 1024, 1} },
13695 .block_erase = erase_chip_block_jedec,
13696 },
13697 },
13698 .write = write_jedec_1,
13699 .read = read_memmapped,
13700 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010013701 .prepare_access = prepare_memory_access,
13702 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100013703 },
13704
13705 {
13706 .vendor = "PMC",
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013707 .name = "Pm39LV010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013708 .bustype = BUS_PARALLEL,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013709 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013710 .model_id = PMC_PM39F010, /* Pm39LV010 and Pm39F010 have identical IDs but different voltage */
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013711 .total_size = 128,
13712 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000013713 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013714 .tested = TEST_OK_PREW,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013715 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013716 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson5643c072010-01-19 03:23:07 +000013717 .block_erasers =
13718 {
13719 {
13720 .eraseblocks = { {4 * 1024, 32} },
13721 .block_erase = erase_sector_jedec,
13722 }, {
13723 .eraseblocks = { {64 * 1024, 2} },
13724 .block_erase = erase_block_jedec,
13725 }, {
13726 .eraseblocks = { {128 * 1024, 1} },
13727 .block_erase = erase_chip_block_jedec,
13728 }
13729 },
Sean Nelson35727f72010-01-28 23:55:12 +000013730 .write = write_jedec_1,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013731 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013732 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013733 .prepare_access = prepare_memory_access,
13734 .finish_access = finish_memory_access,
Rudolf Marek50fdf3b2009-05-17 17:02:07 +000013735 },
13736
13737 {
13738 .vendor = "PMC",
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013739 .name = "Pm39LV020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013740 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013741 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013742 .model_id = PMC_PM39LV020,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013743 .total_size = 256,
13744 .page_size = 4096,
13745 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13746 .tested = TEST_UNTESTED,
13747 .probe = probe_jedec,
13748 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013749 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013750 {
13751 {
13752 .eraseblocks = { {4 * 1024, 64} },
13753 .block_erase = erase_sector_jedec,
13754 }, {
13755 .eraseblocks = { {64 * 1024, 4} },
13756 .block_erase = erase_block_jedec,
13757 }, {
13758 .eraseblocks = { {256 * 1024, 1} },
13759 .block_erase = erase_chip_block_jedec,
13760 }
13761 },
13762 .write = write_jedec_1,
13763 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013764 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013765 .prepare_access = prepare_memory_access,
13766 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013767 },
13768
13769 {
13770 .vendor = "PMC",
13771 .name = "Pm39LV040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013772 .bustype = BUS_PARALLEL,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013773 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013774 .model_id = PMC_PM39LV040,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013775 .total_size = 512,
13776 .page_size = 4096,
13777 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000013778 .tested = TEST_OK_PR,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013779 .probe = probe_jedec,
13780 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Alan Greenfa3fcd32019-06-27 15:41:50 +100013781 .block_erasers =
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013782 {
13783 {
13784 .eraseblocks = { {4 * 1024, 128} },
13785 .block_erase = erase_sector_jedec,
13786 }, {
13787 .eraseblocks = { {64 * 1024, 8} },
13788 .block_erase = erase_block_jedec,
13789 }, {
13790 .eraseblocks = { {512 * 1024, 1} },
13791 .block_erase = erase_chip_block_jedec,
13792 }
13793 },
13794 .write = write_jedec_1,
13795 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013796 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013797 .prepare_access = prepare_memory_access,
13798 .finish_access = finish_memory_access,
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013799 },
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013800
13801 {
13802 .vendor = "PMC",
13803 .name = "Pm39LV512",
13804 .bustype = BUS_PARALLEL,
13805 .manufacture_id = PMC_ID_NOPREFIX,
13806 .model_id = PMC_PM39LV512,
13807 .total_size = 64,
13808 .page_size = 4096,
13809 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
13810 .tested = TEST_OK_PREW,
13811 .probe = probe_jedec,
13812 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
13813 .block_erasers =
13814 {
13815 {
13816 .eraseblocks = { {4 * 1024, 16} },
13817 .block_erase = erase_sector_jedec,
13818 }, {
13819 .eraseblocks = { {64 * 1024, 1} },
13820 .block_erase = erase_block_jedec,
13821 }, {
13822 .eraseblocks = { {64 * 1024, 1} },
13823 .block_erase = erase_chip_block_jedec,
13824 }
13825 },
13826 .write = write_jedec_1,
13827 .read = read_memmapped,
13828 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010013829 .prepare_access = prepare_memory_access,
13830 .finish_access = finish_memory_access,
Kyösti Mälkkiedab1d22012-05-20 23:32:33 +000013831 },
13832
Anders Juel Jensendfdc56f2010-03-27 23:25:14 +000013833 {
13834 .vendor = "PMC",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013835 .name = "Pm49FL002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013836 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013837 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013838 .model_id = PMC_PM49FL002,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013839 .total_size = 256,
13840 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010013841 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013842 .tested = TEST_OK_PR,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013843 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000013844 .probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
Sean Nelson5643c072010-01-19 03:23:07 +000013845 .block_erasers =
13846 {
13847 {
13848 .eraseblocks = { {4 * 1024, 64} },
13849 .block_erase = erase_sector_jedec,
13850 }, {
13851 .eraseblocks = { {16 * 1024, 16} },
13852 .block_erase = erase_block_jedec,
13853 }, {
13854 .eraseblocks = { {256 * 1024, 1} },
13855 .block_erase = erase_chip_block_jedec,
13856 }
13857 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013858 .unlock = unlock_regspace2_uniform_32k,
Sean Nelson36172342010-02-27 18:01:15 +000013859 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013860 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013861 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010013862 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010013863 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000013864 },
13865
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013866 {
13867 .vendor = "PMC",
13868 .name = "Pm49FL004",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013869 .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013870 .manufacture_id = PMC_ID_NOPREFIX,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000013871 .model_id = PMC_PM49FL004,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013872 .total_size = 512,
13873 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010013874 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013875 .tested = TEST_OK_PREW,
Carl-Daniel Hailfingere9404662010-01-09 02:24:17 +000013876 .probe = probe_jedec,
Stefan Tauner74dc73f2015-03-01 22:04:38 +000013877 .probe_timing = TIMING_ZERO,
Sean Nelson5643c072010-01-19 03:23:07 +000013878 .block_erasers =
13879 {
13880 {
13881 .eraseblocks = { {4 * 1024, 128} },
13882 .block_erase = erase_sector_jedec,
13883 }, {
13884 .eraseblocks = { {64 * 1024, 8} },
13885 .block_erase = erase_block_jedec,
13886 }, {
13887 .eraseblocks = { {512 * 1024, 1} },
13888 .block_erase = erase_chip_block_jedec,
13889 }
13890 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000013891 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson36172342010-02-27 18:01:15 +000013892 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000013893 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000013894 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010013895 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010013896 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000013897 },
13898
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013899 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000013900 .vendor = "SST",
Idwer Volleringf3607d12014-05-07 15:25:04 +000013901 .name = "SST25LF020A",
13902 .bustype = BUS_SPI,
13903 .manufacture_id = SST_ID,
13904 .model_id = SST_SST25VF020_REMS,
13905 .total_size = 256,
13906 .page_size = 256,
13907 .feature_bits = FEATURE_WRSR_EWSR,
13908 .tested = TEST_OK_PREW,
13909 .probe = probe_spi_rems,
13910 .probe_timing = TIMING_ZERO,
13911 .block_erasers =
13912 {
13913 {
13914 .eraseblocks = { {4 * 1024, 64} },
13915 .block_erase = spi_block_erase_20,
13916 }, {
13917 .eraseblocks = { {32 * 1024, 8} },
13918 .block_erase = spi_block_erase_52,
13919 }, {
13920 .eraseblocks = { {256 * 1024, 1} },
13921 .block_erase = spi_block_erase_60,
13922 },
13923 },
13924 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
13925 .unlock = spi_disable_blockprotect,
13926 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13927 .read = spi_chip_read, /* Fast read (0x0B) supported */
13928 .voltage = {2700, 3600},
13929 },
13930
13931 {
13932 .vendor = "SST",
Zeus Castro33670ba2011-08-17 09:50:11 +000013933 .name = "SST25LF040A",
13934 .bustype = BUS_SPI,
13935 .manufacture_id = SST_ID,
13936 .model_id = SST_SST25VF040_REMS,
13937 .total_size = 512,
13938 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000013939 .feature_bits = FEATURE_WRSR_EWSR,
Uwe Hermann4335ec82011-09-07 20:20:25 +000013940 .tested = TEST_OK_PREW,
Zeus Castro33670ba2011-08-17 09:50:11 +000013941 .probe = probe_spi_res2,
13942 .probe_timing = TIMING_ZERO,
13943 .block_erasers =
13944 {
13945 {
13946 .eraseblocks = { {4 * 1024, 128} },
13947 .block_erase = spi_block_erase_20,
13948 }, {
13949 .eraseblocks = { {32 * 1024, 16} },
13950 .block_erase = spi_block_erase_52,
13951 }, {
13952 .eraseblocks = { {512 * 1024, 1} },
13953 .block_erase = spi_block_erase_60,
13954 },
13955 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013956 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013957 .unlock = spi_disable_blockprotect,
13958 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13959 .read = spi_chip_read,
13960 .voltage = {3000, 3600},
13961 },
13962
13963 {
13964 .vendor = "SST",
Stefan Taunere34e3e82013-01-01 00:06:51 +000013965 .name = "SST25LF080(A)",
Zeus Castro33670ba2011-08-17 09:50:11 +000013966 .bustype = BUS_SPI,
13967 .manufacture_id = SST_ID,
13968 .model_id = SST_SST25VF080_REMS,
13969 .total_size = 1024,
13970 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000013971 .feature_bits = FEATURE_WRSR_EITHER,
Zeus Castro33670ba2011-08-17 09:50:11 +000013972 .tested = TEST_UNTESTED,
13973 .probe = probe_spi_res2,
13974 .probe_timing = TIMING_ZERO,
13975 .block_erasers =
13976 {
13977 {
13978 .eraseblocks = { {4 * 1024, 256} },
13979 .block_erase = spi_block_erase_20,
13980 }, {
13981 .eraseblocks = { {32 * 1024, 32} },
13982 .block_erase = spi_block_erase_52,
13983 }, {
13984 .eraseblocks = { {1024 * 1024, 1} },
13985 .block_erase = spi_block_erase_60,
13986 },
13987 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000013988 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Zeus Castro33670ba2011-08-17 09:50:11 +000013989 .unlock = spi_disable_blockprotect,
13990 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
13991 .read = spi_chip_read,
13992 .voltage = {3000, 3600},
13993 },
13994
13995 {
13996 .vendor = "SST",
Stefan Tauner6697f712014-08-06 15:09:15 +000013997 .name = "SST25VF010(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000013998 .bustype = BUS_SPI,
Mark Marshall90021f22010-12-03 14:48:11 +000013999 .manufacture_id = SST_ID,
14000 .model_id = SST_SST25VF010_REMS,
14001 .total_size = 128,
14002 .page_size = 256,
Steven Zakulec3603a282012-05-02 20:07:57 +000014003 .feature_bits = FEATURE_WRSR_EWSR,
Mark Marshall90021f22010-12-03 14:48:11 +000014004 .tested = TEST_OK_PREW,
14005 .probe = probe_spi_rems,
14006 .probe_timing = TIMING_ZERO,
14007 .block_erasers =
14008 {
14009 {
14010 .eraseblocks = { {4 * 1024, 32} },
14011 .block_erase = spi_block_erase_20,
14012 }, {
14013 .eraseblocks = { {32 * 1024, 4} },
14014 .block_erase = spi_block_erase_52,
14015 }, {
Cory Henderson370f5822013-10-19 23:09:16 +000014016 .eraseblocks = { {32 * 1024, 4} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014017 .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014018 }, {
Mark Marshall90021f22010-12-03 14:48:11 +000014019 .eraseblocks = { {128 * 1024, 1} },
14020 .block_erase = spi_block_erase_60,
Cory Henderson370f5822013-10-19 23:09:16 +000014021 }, {
14022 .eraseblocks = { {128 * 1024, 1} },
Stefan Tauner6697f712014-08-06 15:09:15 +000014023 .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014024 },
14025 },
14026 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14027 .unlock = spi_disable_blockprotect,
14028 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
Stefan Tauner6697f712014-08-06 15:09:15 +000014029 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
Cory Henderson370f5822013-10-19 23:09:16 +000014030 .voltage = {2700, 3600},
14031 },
14032
14033 {
14034 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014035 .name = "SST25VF016B",
14036 .bustype = BUS_SPI,
14037 .manufacture_id = SST_ID,
14038 .model_id = SST_SST25VF016B,
14039 .total_size = 2048,
14040 .page_size = 256,
14041 .feature_bits = FEATURE_WRSR_EITHER,
14042 .tested = TEST_OK_PREW,
14043 .probe = probe_spi_rdid,
14044 .probe_timing = TIMING_ZERO,
14045 .block_erasers =
14046 {
14047 {
14048 .eraseblocks = { {4 * 1024, 512} },
14049 .block_erase = spi_block_erase_20,
14050 }, {
14051 .eraseblocks = { {32 * 1024, 64} },
14052 .block_erase = spi_block_erase_52,
14053 }, {
14054 .eraseblocks = { {64 * 1024, 32} },
14055 .block_erase = spi_block_erase_d8,
14056 }, {
14057 .eraseblocks = { {2 * 1024 * 1024, 1} },
14058 .block_erase = spi_block_erase_60,
14059 }, {
14060 .eraseblocks = { {2 * 1024 * 1024, 1} },
14061 .block_erase = spi_block_erase_c7,
14062 },
14063 },
14064 .printlock = spi_prettyprint_status_register_sst25vf016,
14065 .unlock = spi_disable_blockprotect,
14066 .write = spi_aai_write,
14067 .read = spi_chip_read,
14068 .voltage = {2700, 3600},
14069 },
14070
14071 {
14072 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014073 .name = "SST25VF020",
14074 .bustype = BUS_SPI,
14075 .manufacture_id = SST_ID,
14076 .model_id = SST_SST25VF020_REMS,
14077 .total_size = 256,
14078 .page_size = 256,
14079 .feature_bits = FEATURE_WRSR_EWSR,
14080 .tested = TEST_UNTESTED,
14081 .probe = probe_spi_rems,
14082 .probe_timing = TIMING_ZERO,
14083 .block_erasers =
14084 {
14085 {
14086 .eraseblocks = { {4 * 1024, 64} },
14087 .block_erase = spi_block_erase_20,
14088 }, {
14089 .eraseblocks = { {32 * 1024, 8} },
14090 .block_erase = spi_block_erase_52,
14091 }, {
14092 .eraseblocks = { {256 * 1024, 1} },
14093 .block_erase = spi_block_erase_60,
14094 },
14095 },
14096 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14097 .unlock = spi_disable_blockprotect,
14098 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14099 .read = spi_chip_read, /* only */
14100 .voltage = {2700, 3600},
14101 },
14102
14103 {
14104 .vendor = "SST",
14105 .name = "SST25VF020B",
14106 .bustype = BUS_SPI,
14107 .manufacture_id = SST_ID,
14108 .model_id = SST_SST25VF020B,
14109 .total_size = 256,
14110 .page_size = 256,
14111 .feature_bits = FEATURE_WRSR_EWSR,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000014112 .tested = TEST_OK_PREW,
Cory Henderson370f5822013-10-19 23:09:16 +000014113 .probe = probe_spi_rdid,
14114 .probe_timing = TIMING_ZERO,
14115 .block_erasers =
14116 {
14117 {
14118 .eraseblocks = { {4 * 1024, 64} },
14119 .block_erase = spi_block_erase_20,
14120 }, {
14121 .eraseblocks = { {32 * 1024, 8} },
14122 .block_erase = spi_block_erase_52,
14123 }, {
14124 .eraseblocks = { {64 * 1024, 4} },
14125 .block_erase = spi_block_erase_d8,
14126 }, {
14127 .eraseblocks = { {256 * 1024, 1} },
14128 .block_erase = spi_block_erase_60,
14129 }, {
14130 .eraseblocks = { {256 * 1024, 1} },
14131 .block_erase = spi_block_erase_c7,
14132 },
14133 },
14134 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 and 2nd SR */
14135 .unlock = spi_disable_blockprotect, /* FIXME: 2nd SR */
14136 .write = spi_aai_write, /* AAI supported (0xAD) */
14137 .read = spi_chip_read, /* Fast read (0x0B) supported */
14138 .voltage = {2700, 3600},
14139 },
14140
14141 {
14142 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014143 .name = "SST25VF032B",
14144 .bustype = BUS_SPI,
14145 .manufacture_id = SST_ID,
14146 .model_id = SST_SST25VF032B,
14147 .total_size = 4096,
14148 .page_size = 256,
14149 .feature_bits = FEATURE_WRSR_EWSR,
14150 .tested = TEST_OK_PREW,
14151 .probe = probe_spi_rdid,
14152 .probe_timing = TIMING_ZERO,
14153 .block_erasers =
14154 {
14155 {
14156 .eraseblocks = { {4 * 1024, 1024} },
14157 .block_erase = spi_block_erase_20,
14158 }, {
14159 .eraseblocks = { {32 * 1024, 128} },
14160 .block_erase = spi_block_erase_52,
14161 }, {
14162 .eraseblocks = { {64 * 1024, 64} },
14163 .block_erase = spi_block_erase_d8,
14164 }, {
14165 .eraseblocks = { {4 * 1024 * 1024, 1} },
14166 .block_erase = spi_block_erase_60,
14167 }, {
14168 .eraseblocks = { {4 * 1024 * 1024, 1} },
14169 .block_erase = spi_block_erase_c7,
14170 },
14171 },
14172 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14173 .unlock = spi_disable_blockprotect,
14174 .write = spi_aai_write,
14175 .read = spi_chip_read,
14176 .voltage = {2700, 3600},
14177 },
14178
14179 {
14180 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014181 .name = "SST25VF040",
14182 .bustype = BUS_SPI,
14183 .manufacture_id = SST_ID,
14184 .model_id = SST_SST25VF040_REMS,
14185 .total_size = 512,
14186 .page_size = 256,
14187 .feature_bits = FEATURE_WRSR_EWSR,
14188 .tested = TEST_OK_PR,
14189 .probe = probe_spi_rems,
14190 .probe_timing = TIMING_ZERO,
14191 .block_erasers =
14192 {
14193 {
14194 .eraseblocks = { {4 * 1024, 128} },
14195 .block_erase = spi_block_erase_20,
14196 }, {
14197 .eraseblocks = { {32 * 1024, 16} },
14198 .block_erase = spi_block_erase_52,
14199 }, {
14200 .eraseblocks = { {512 * 1024, 1} },
14201 .block_erase = spi_block_erase_60,
Mark Marshall90021f22010-12-03 14:48:11 +000014202 },
14203 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000014204 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
Mark Marshall90021f22010-12-03 14:48:11 +000014205 .unlock = spi_disable_blockprotect,
Cory Henderson370f5822013-10-19 23:09:16 +000014206 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14207 .read = spi_chip_read,
14208 .voltage = {2700, 3600},
14209 },
14210
14211 {
14212 .vendor = "SST",
14213 .name = "SST25VF040B",
14214 .bustype = BUS_SPI,
14215 .manufacture_id = SST_ID,
14216 .model_id = SST_SST25VF040B,
14217 .total_size = 512,
14218 .page_size = 256,
14219 .feature_bits = FEATURE_WRSR_EWSR,
14220 .tested = TEST_OK_PREW,
14221 .probe = probe_spi_rdid,
14222 .probe_timing = TIMING_ZERO,
14223 .block_erasers =
14224 {
14225 {
14226 .eraseblocks = { {4 * 1024, 128} },
14227 .block_erase = spi_block_erase_20,
14228 }, {
14229 .eraseblocks = { {32 * 1024, 16} },
14230 .block_erase = spi_block_erase_52,
14231 }, {
14232 .eraseblocks = { {64 * 1024, 8} },
14233 .block_erase = spi_block_erase_d8,
14234 }, {
14235 .eraseblocks = { {512 * 1024, 1} },
14236 .block_erase = spi_block_erase_60,
14237 }, {
14238 .eraseblocks = { {512 * 1024, 1} },
14239 .block_erase = spi_block_erase_c7,
14240 },
14241 },
14242 .printlock = spi_prettyprint_status_register_sst25vf040b,
14243 .unlock = spi_disable_blockprotect,
14244 .write = spi_aai_write, /* AAI supported (0xAD) */
14245 .read = spi_chip_read, /* Fast read (0x0B) supported */
14246 .voltage = {2700, 3600},
14247 },
14248
14249 {
14250 .vendor = "SST",
14251 .name = "SST25VF040B.REMS",
14252 .bustype = BUS_SPI,
14253 .manufacture_id = SST_ID,
14254 .model_id = SST_SST25VF040B_REMS,
14255 .total_size = 512,
14256 .page_size = 256,
14257 .feature_bits = FEATURE_WRSR_EWSR,
14258 .tested = TEST_OK_PREW,
14259 .probe = probe_spi_rems,
14260 .probe_timing = TIMING_ZERO,
14261 .block_erasers =
14262 {
14263 {
14264 .eraseblocks = { {4 * 1024, 128} },
14265 .block_erase = spi_block_erase_20,
14266 }, {
14267 .eraseblocks = { {32 * 1024, 16} },
14268 .block_erase = spi_block_erase_52,
14269 }, {
14270 .eraseblocks = { {64 * 1024, 8} },
14271 .block_erase = spi_block_erase_d8,
14272 }, {
14273 .eraseblocks = { {512 * 1024, 1} },
14274 .block_erase = spi_block_erase_60,
14275 }, {
14276 .eraseblocks = { {512 * 1024, 1} },
14277 .block_erase = spi_block_erase_c7,
14278 },
14279 },
14280 .printlock = spi_prettyprint_status_register_sst25vf040b,
14281 .unlock = spi_disable_blockprotect,
14282 .write = spi_aai_write,
14283 .read = spi_chip_read,
14284 .voltage = {2700, 3600},
14285 },
14286
14287 {
14288 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014289 .name = "SST25VF064C",
Ben Gardnerbcf61092015-11-22 02:23:31 +000014290 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014291 .manufacture_id = SST_ID,
14292 .model_id = SST_SST25VF064C,
14293 .total_size = 8192,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014294 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014295 .feature_bits = FEATURE_WRSR_EWSR,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014296 .tested = TEST_OK_PREW,
14297 .probe = probe_spi_rdid,
14298 .probe_timing = TIMING_ZERO,
14299 .block_erasers =
14300 {
14301 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014302 .eraseblocks = { {4 * 1024, 2048} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014303 .block_erase = spi_block_erase_20,
14304 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014305 .eraseblocks = { {32 * 1024, 256} },
14306 .block_erase = spi_block_erase_52,
14307 }, {
14308 .eraseblocks = { {64 * 1024, 128} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014309 .block_erase = spi_block_erase_d8,
14310 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014311 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014312 .block_erase = spi_block_erase_60,
14313 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014314 .eraseblocks = { {8 * 1024 * 1024, 1} },
Ben Gardnerbcf61092015-11-22 02:23:31 +000014315 .block_erase = spi_block_erase_c7,
14316 },
14317 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014318 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14319 .unlock = spi_disable_blockprotect,
Ben Gardnerbcf61092015-11-22 02:23:31 +000014320 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014321 .read = spi_chip_read,
14322 .voltage = {2700, 3600},
Ben Gardnerbcf61092015-11-22 02:23:31 +000014323 },
14324
14325 {
14326 .vendor = "SST",
Cory Henderson370f5822013-10-19 23:09:16 +000014327 .name = "SST25VF080B",
14328 .bustype = BUS_SPI,
14329 .manufacture_id = SST_ID,
14330 .model_id = SST_SST25VF080B,
14331 .total_size = 1024,
14332 .page_size = 256,
14333 .feature_bits = FEATURE_WRSR_EWSR,
14334 .tested = TEST_OK_PREW,
14335 .probe = probe_spi_rdid,
14336 .probe_timing = TIMING_ZERO,
14337 .block_erasers =
14338 {
14339 {
14340 .eraseblocks = { {4 * 1024, 256} },
14341 .block_erase = spi_block_erase_20,
14342 }, {
14343 .eraseblocks = { {32 * 1024, 32} },
14344 .block_erase = spi_block_erase_52,
14345 }, {
14346 .eraseblocks = { {64 * 1024, 16} },
14347 .block_erase = spi_block_erase_d8,
14348 }, {
14349 .eraseblocks = { {1024 * 1024, 1} },
14350 .block_erase = spi_block_erase_60,
14351 }, {
14352 .eraseblocks = { {1024 * 1024, 1} },
14353 .block_erase = spi_block_erase_c7,
14354 },
14355 },
14356 .printlock = spi_prettyprint_status_register_sst25, /* TODO: check */
14357 .unlock = spi_disable_blockprotect,
14358 .write = spi_aai_write,
Mark Marshall90021f22010-12-03 14:48:11 +000014359 .read = spi_chip_read,
Steven Zakulec7d257b42011-07-19 08:50:18 +000014360 .voltage = {2700, 3600},
Mark Marshall90021f22010-12-03 14:48:11 +000014361 },
14362
14363 {
14364 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014365 .name = "SST25VF512(A)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014366 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014367 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014368 .model_id = SST_SST25VF512_REMS,
14369 .total_size = 64,
14370 .page_size = 256,
14371 .feature_bits = FEATURE_WRSR_EWSR,
14372 .tested = TEST_OK_PREW,
14373 .probe = probe_spi_rems,
14374 .probe_timing = TIMING_ZERO,
14375 .block_erasers =
14376 {
14377 {
14378 .eraseblocks = { {4 * 1024, 16} },
14379 .block_erase = spi_block_erase_20,
14380 }, {
14381 .eraseblocks = { {32 * 1024, 2} },
14382 .block_erase = spi_block_erase_52,
14383 }, {
14384 .eraseblocks = { {32 * 1024, 2} },
14385 .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
14386 }, {
14387 .eraseblocks = { {64 * 1024, 1} },
14388 .block_erase = spi_block_erase_60,
14389 }, {
14390 .eraseblocks = { {64 * 1024, 1} },
14391 .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
14392 },
14393 },
14394 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
14395 .unlock = spi_disable_blockprotect,
14396 .write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
14397 .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
14398 .voltage = {2700, 3600},
14399 },
14400
14401 {
14402 .vendor = "SST",
14403 .name = "SST25WF010",
14404 .bustype = BUS_SPI,
14405 .manufacture_id = SST_ID,
14406 .model_id = SST_SST25WF010,
14407 .total_size = 128,
14408 .page_size = 256,
14409 .feature_bits = FEATURE_WRSR_EITHER,
14410 .tested = TEST_UNTESTED,
14411 .probe = probe_spi_rdid,
14412 .probe_timing = TIMING_ZERO,
14413 .block_erasers =
14414 {
14415 {
14416 .eraseblocks = { {4 * 1024, 32} },
14417 .block_erase = spi_block_erase_20,
14418 }, {
14419 .eraseblocks = { {32 * 1024, 4} },
14420 .block_erase = spi_block_erase_52,
14421 }, {
14422 .eraseblocks = { {1024 * 128, 1} },
14423 .block_erase = spi_block_erase_60,
14424 }, {
14425 .eraseblocks = { {1024 * 128, 1} },
14426 .block_erase = spi_block_erase_c7,
14427 },
14428 },
14429 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14430 .unlock = spi_disable_blockprotect_bp2_srwd,
14431 .write = spi_aai_write,
14432 .read = spi_chip_read, /* Fast read (0x0B) supported */
14433 .voltage = {1650, 1950},
14434 },
14435
14436 {
14437 .vendor = "SST",
14438 .name = "SST25WF020",
14439 .bustype = BUS_SPI,
14440 .manufacture_id = SST_ID,
14441 .model_id = SST_SST25WF020,
14442 .total_size = 256,
14443 .page_size = 256,
14444 .feature_bits = FEATURE_WRSR_EITHER,
14445 .tested = TEST_UNTESTED,
14446 .probe = probe_spi_rdid,
14447 .probe_timing = TIMING_ZERO,
14448 .block_erasers =
14449 {
14450 {
14451 .eraseblocks = { {4 * 1024, 64} },
14452 .block_erase = spi_block_erase_20,
14453 }, {
14454 .eraseblocks = { {32 * 1024, 8} },
14455 .block_erase = spi_block_erase_52,
14456 }, {
14457 .eraseblocks = { {64 * 1024, 4} },
14458 .block_erase = spi_block_erase_d8,
14459 }, {
14460 .eraseblocks = { {1024 * 256, 1} },
14461 .block_erase = spi_block_erase_60,
14462 }, {
14463 .eraseblocks = { {1024 * 256, 1} },
14464 .block_erase = spi_block_erase_c7,
14465 },
14466 },
14467 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14468 .unlock = spi_disable_blockprotect_bp2_srwd,
14469 .write = spi_aai_write,
14470 .read = spi_chip_read, /* Fast read (0x0B) supported */
14471 .voltage = {1650, 1950},
14472 },
14473
14474 {
14475 .vendor = "SST",
14476 .name = "SST25WF020A",
14477 .bustype = BUS_SPI,
14478 .manufacture_id = SANYO_ID, /* See flashchips.h */
14479 .model_id = SST_SST25WF020A,
14480 .total_size = 256,
14481 .page_size = 256,
14482 .feature_bits = FEATURE_WRSR_WREN,
14483 .tested = TEST_UNTESTED,
14484 .probe = probe_spi_rdid,
14485 .probe_timing = TIMING_ZERO,
14486 .block_erasers =
14487 {
14488 {
14489 .eraseblocks = { {4 * 1024, 64} },
14490 .block_erase = spi_block_erase_20,
14491 }, {
14492 .eraseblocks = { {64 * 1024, 4} },
14493 .block_erase = spi_block_erase_d8,
14494 }, {
14495 .eraseblocks = { {256 * 1024, 1} },
14496 .block_erase = spi_block_erase_60,
14497 }, {
14498 .eraseblocks = { {256 * 1024, 1} },
14499 .block_erase = spi_block_erase_c7,
14500 },
14501 },
14502 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14503 .unlock = spi_disable_blockprotect_bp2_srwd,
14504 .write = spi_chip_write_256,
14505 .read = spi_chip_read, /* Fast read (0x0B) supported */
14506 .voltage = {1650, 1950},
14507 },
14508
14509 {
14510 .vendor = "SST",
14511 .name = "SST25WF040",
14512 .bustype = BUS_SPI,
14513 .manufacture_id = SST_ID,
14514 .model_id = SST_SST25WF040,
14515 .total_size = 512,
14516 .page_size = 256,
14517 .feature_bits = FEATURE_WRSR_EITHER,
14518 .tested = TEST_UNTESTED,
14519 .probe = probe_spi_rdid,
14520 .probe_timing = TIMING_ZERO,
14521 .block_erasers =
14522 {
14523 {
14524 .eraseblocks = { {4 * 1024, 128} },
14525 .block_erase = spi_block_erase_20,
14526 }, {
14527 .eraseblocks = { {32 * 1024, 16} },
14528 .block_erase = spi_block_erase_52,
14529 }, {
14530 .eraseblocks = { {64 * 1024, 8} },
14531 .block_erase = spi_block_erase_d8,
14532 }, {
14533 .eraseblocks = { {1024 * 512, 1} },
14534 .block_erase = spi_block_erase_60,
14535 }, {
14536 .eraseblocks = { {1024 * 512, 1} },
14537 .block_erase = spi_block_erase_c7,
14538 },
14539 },
14540 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14541 .unlock = spi_disable_blockprotect_bp2_srwd,
14542 .write = spi_aai_write,
14543 .read = spi_chip_read, /* Fast read (0x0B) supported */
14544 .voltage = {1650, 1950},
14545 },
14546
14547 {
14548 .vendor = "SST",
14549 .name = "SST25WF040B",
14550 .bustype = BUS_SPI,
14551 .manufacture_id = SANYO_ID, /* See flashchips.h */
14552 .model_id = SST_SST25WF040B,
14553 .total_size = 512,
14554 .page_size = 256,
14555 .feature_bits = FEATURE_WRSR_WREN,
14556 .tested = TEST_UNTESTED,
14557 .probe = probe_spi_rdid,
14558 .probe_timing = TIMING_ZERO,
14559 .block_erasers =
14560 {
14561 {
14562 .eraseblocks = { {4 * 1024, 128} },
14563 .block_erase = spi_block_erase_20,
14564 }, {
14565 .eraseblocks = { {64 * 1024, 8} },
14566 .block_erase = spi_block_erase_d8,
14567 }, {
14568 .eraseblocks = { {512 * 1024, 1} },
14569 .block_erase = spi_block_erase_60,
14570 }, {
14571 .eraseblocks = { {512 * 1024, 1} },
14572 .block_erase = spi_block_erase_c7,
14573 },
14574 },
14575 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14576 .unlock = spi_disable_blockprotect_bp2_srwd,
14577 .write = spi_chip_write_256,
14578 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14579 .voltage = {1650, 1950},
14580 },
14581
14582 {
14583 .vendor = "SST",
14584 .name = "SST25WF080",
14585 .bustype = BUS_SPI,
14586 .manufacture_id = SST_ID,
14587 .model_id = SST_SST25WF080,
14588 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014589 .page_size = 256,
Stefan Taunere34e3e82013-01-01 00:06:51 +000014590 .feature_bits = FEATURE_WRSR_EITHER,
Mark Marshall90021f22010-12-03 14:48:11 +000014591 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014592 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014593 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014594 .block_erasers =
14595 {
14596 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014597 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014598 .block_erase = spi_block_erase_20,
14599 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014600 .eraseblocks = { {32 * 1024, 32} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014601 .block_erase = spi_block_erase_52,
14602 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014603 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014604 .block_erase = spi_block_erase_d8,
14605 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014606 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014607 .block_erase = spi_block_erase_60,
14608 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014609 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014610 .block_erase = spi_block_erase_c7,
14611 },
14612 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014613 .printlock = spi_prettyprint_status_register_sst25, /* *does* have a BP3 but it is useless */
14614 .unlock = spi_disable_blockprotect_bp3_srwd,
Joshua Roys87955bf2011-08-01 18:39:28 +000014615 .write = spi_aai_write,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014616 .read = spi_chip_read, /* Fast read (0x0B) supported */
14617 .voltage = {1650, 1950},
FENG yu ningff692fb2008-12-08 18:15:10 +000014618 },
14619
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014620 {
14621 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014622 .name = "SST25WF080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014623 .bustype = BUS_SPI,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014624 .manufacture_id = SANYO_ID, /* See flashchips.h */
14625 .model_id = SST_SST25WF080B,
14626 .total_size = 1024,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014627 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014628 .feature_bits = FEATURE_WRSR_WREN,
Stefan Taunerfcf6a8c2011-05-18 01:32:00 +000014629 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014630 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000014631 .probe_timing = TIMING_ZERO,
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014632 .block_erasers =
14633 {
14634 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014635 .eraseblocks = { {4 * 1024, 256} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014636 .block_erase = spi_block_erase_20,
14637 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014638 .eraseblocks = { {64 * 1024, 16} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014639 .block_erase = spi_block_erase_d8,
14640 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014641 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014642 .block_erase = spi_block_erase_60,
14643 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100014644 .eraseblocks = { {1024 * 1024, 1} },
Carl-Daniel Hailfingerbbfeb702009-12-23 12:16:47 +000014645 .block_erase = spi_block_erase_c7,
14646 },
14647 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100014648 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
14649 .unlock = spi_disable_blockprotect_bp2_srwd,
Helge Wagner1db7a442010-10-05 22:29:08 +000014650 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014651 .read = spi_chip_read, /* Fast read (0x0B), dual O (0x3B), dual I/O read (0xBB) supported */
14652 .voltage = {1650, 1950},
14653 },
14654
14655 {
14656 .vendor = "SST",
14657 .name = "SST25WF512",
14658 .bustype = BUS_SPI,
14659 .manufacture_id = SST_ID,
14660 .model_id = SST_SST25WF512,
14661 .total_size = 64,
14662 .page_size = 256,
14663 .feature_bits = FEATURE_WRSR_EITHER,
14664 .tested = TEST_UNTESTED,
14665 .probe = probe_spi_rdid,
14666 .probe_timing = TIMING_ZERO,
14667 .block_erasers =
14668 {
14669 {
14670 .eraseblocks = { {4 * 1024, 16} },
14671 .block_erase = spi_block_erase_20,
14672 }, {
14673 .eraseblocks = { {32 * 1024, 2} },
14674 .block_erase = spi_block_erase_52,
14675 }, {
14676 .eraseblocks = { {1024 * 64, 1} },
14677 .block_erase = spi_block_erase_60,
14678 }, {
14679 .eraseblocks = { {1024 * 64, 1} },
14680 .block_erase = spi_block_erase_c7,
14681 },
14682 },
14683 .printlock = spi_prettyprint_status_register_sst25, /* FIXME: does not have a BP3 */
14684 .unlock = spi_disable_blockprotect_bp2_srwd,
14685 .write = spi_aai_write,
14686 .read = spi_chip_read, /* Fast read (0x0B) supported */
14687 .voltage = {1650, 1950},
Ed Swierk86f4e6d2010-07-21 15:02:22 +000014688 },
14689
14690 {
14691 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014692 .name = "SST26VF016",
14693 .bustype = BUS_SPI,
14694 .manufacture_id = SST_ID,
14695 .model_id = SST_SST26VF016,
14696 .total_size = 2048,
14697 .page_size = 256,
14698 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14699 .tested = TEST_UNTESTED,
14700 .probe = probe_spi_rdid,
14701 .probe_timing = TIMING_ZERO,
14702 .block_erasers =
14703 {
14704 {
14705 .eraseblocks = { {4 * 1024, 512} },
14706 .block_erase = spi_block_erase_20,
14707 }, {
14708 .eraseblocks = {
14709 {8 * 1024, 4},
14710 {32 * 1024, 1},
14711 {64 * 1024, 30},
14712 {32 * 1024, 1},
14713 {8 * 1024, 4},
14714 },
14715 .block_erase = spi_block_erase_d8,
14716 }, {
14717 .eraseblocks = { {2 * 1024 * 1024, 1} },
14718 .block_erase = spi_block_erase_c7,
14719 },
14720 },
14721 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14722 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14723 .write = spi_chip_write_256, /* Multi I/O supported */
14724 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14725 .voltage = {2700, 3600},
14726 },
14727
14728 {
14729 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014730 .name = "SST26VF016B(A)",
14731 .bustype = BUS_SPI,
14732 .manufacture_id = SST_ID,
14733 .model_id = SST_SST26VF016B,
14734 .total_size = 2048,
14735 .page_size = 256,
14736 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14737 .tested = TEST_OK_PREW,
14738 .probe = probe_spi_rdid,
14739 .probe_timing = TIMING_ZERO,
14740 .block_erasers =
14741 {
14742 {
14743 .eraseblocks = { {4 * 1024, 512} },
14744 .block_erase = spi_block_erase_20,
14745 }, {
14746 .eraseblocks = {
14747 {8 * 1024, 4},
14748 {32 * 1024, 1},
14749 {64 * 1024, 30},
14750 {32 * 1024, 1},
14751 {8 * 1024, 4},
14752 },
14753 .block_erase = spi_block_erase_d8,
14754 }, {
14755 .eraseblocks = { {2 * 1024 * 1024, 1} },
14756 .block_erase = spi_block_erase_c7,
14757 },
14758 },
14759 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14760 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14761 .write = spi_chip_write_256, /* Multi I/O supported */
14762 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14763 .voltage = {2700, 3600},
14764 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100014765
Wei Hu25584de2018-04-30 14:02:08 -070014766 {
14767 .vendor = "SST",
Nico Hubera2eaf4a2023-02-15 22:56:53 +010014768 .name = "SST26VF032",
14769 .bustype = BUS_SPI,
14770 .manufacture_id = SST_ID,
14771 .model_id = SST_SST26VF032,
14772 .total_size = 4096,
14773 .page_size = 256,
14774 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14775 .tested = TEST_UNTESTED,
14776 .probe = probe_spi_rdid,
14777 .probe_timing = TIMING_ZERO,
14778 .block_erasers =
14779 {
14780 {
14781 .eraseblocks = { {4 * 1024, 1024} },
14782 .block_erase = spi_block_erase_20,
14783 }, {
14784 .eraseblocks = {
14785 {8 * 1024, 4},
14786 {32 * 1024, 1},
14787 {64 * 1024, 62},
14788 {32 * 1024, 1},
14789 {8 * 1024, 4},
14790 },
14791 .block_erase = spi_block_erase_d8,
14792 }, {
14793 .eraseblocks = { {4 * 1024 * 1024, 1} },
14794 .block_erase = spi_block_erase_c7,
14795 },
14796 },
14797 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14798 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14799 .write = spi_chip_write_256, /* Multi I/O supported */
14800 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14801 .voltage = {2700, 3600},
14802 },
14803
14804 {
14805 .vendor = "SST",
Wei Hu25584de2018-04-30 14:02:08 -070014806 .name = "SST26VF032B(A)",
14807 .bustype = BUS_SPI,
14808 .manufacture_id = SST_ID,
14809 .model_id = SST_SST26VF032B,
14810 .total_size = 4096,
14811 .page_size = 256,
14812 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14813 .tested = TEST_UNTESTED,
14814 .probe = probe_spi_rdid,
14815 .probe_timing = TIMING_ZERO,
14816 .block_erasers =
14817 {
14818 {
14819 .eraseblocks = { {4 * 1024, 1024} },
14820 .block_erase = spi_block_erase_20,
14821 }, {
14822 .eraseblocks = {
14823 {8 * 1024, 4},
14824 {32 * 1024, 1},
14825 {64 * 1024, 62},
14826 {32 * 1024, 1},
14827 {8 * 1024, 4},
14828 },
14829 .block_erase = spi_block_erase_d8,
14830 }, {
14831 .eraseblocks = { {4 * 1024 * 1024, 1} },
14832 .block_erase = spi_block_erase_c7,
14833 },
14834 },
14835 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14836 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14837 .write = spi_chip_write_256, /* Multi I/O supported */
14838 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14839 .voltage = {2700, 3600},
14840 },
14841
Wei Hu25584de2018-04-30 14:02:08 -070014842 {
14843 .vendor = "SST",
14844 .name = "SST26VF064B(A)",
14845 .bustype = BUS_SPI,
14846 .manufacture_id = SST_ID,
14847 .model_id = SST_SST26VF064B,
14848 .total_size = 8192,
14849 .page_size = 256,
14850 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
14851 .tested = TEST_OK_PREW,
14852 .probe = probe_spi_rdid,
14853 .probe_timing = TIMING_ZERO,
14854 .block_erasers =
14855 {
14856 {
14857 .eraseblocks = { {4 * 1024, 2048} },
14858 .block_erase = spi_block_erase_20,
14859 }, {
14860 .eraseblocks = {
14861 {8 * 1024, 4},
14862 {32 * 1024, 1},
14863 {64 * 1024, 126},
14864 {32 * 1024, 1},
14865 {8 * 1024, 4},
14866 },
14867 .block_erase = spi_block_erase_d8,
14868 }, {
14869 .eraseblocks = { {8 * 1024 * 1024, 1} },
14870 .block_erase = spi_block_erase_c7,
14871 },
14872 },
14873 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
14874 .unlock = spi_disable_blockprotect_sst26_global_unprotect,
14875 .write = spi_chip_write_256, /* Multi I/O supported */
14876 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
14877 .voltage = {2700, 3600},
14878 },
14879
14880 {
14881 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014882 .name = "SST28SF040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014883 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014884 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014885 .model_id = SST_SST28SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014886 .total_size = 512,
14887 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000014888 .feature_bits = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014889 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000014890 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000014891 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst28sf040.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000014892 .block_erasers =
14893 {
14894 {
14895 .eraseblocks = { {128, 4096} },
14896 .block_erase = erase_sector_28sf040,
14897 }, {
14898 .eraseblocks = { {512 * 1024, 1} },
14899 .block_erase = erase_chip_28sf040,
14900 }
14901 },
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000014902 .unlock = unprotect_28sf040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014903 .write = write_28sf040,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014904 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014905 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014906 .prepare_access = prepare_memory_access,
14907 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014908 },
14909
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014910 {
14911 .vendor = "SST",
14912 .name = "SST29EE010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014913 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014914 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014915 .model_id = SST_SST29EE010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014916 .total_size = 128,
14917 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014918 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014919 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014920 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014921 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014922 .block_erasers =
14923 {
14924 {
14925 .eraseblocks = { {128 * 1024, 1} },
14926 .block_erase = erase_chip_block_jedec,
14927 }
14928 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014929 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014930 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014931 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014932 .prepare_access = prepare_memory_access,
14933 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014934 },
14935
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014936 {
14937 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014938 .name = "SST29EE020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014939 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014940 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014941 .model_id = SST_SST29EE020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014942 .total_size = 256,
14943 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014944 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014945 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014946 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000014947 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000014948 .block_erasers =
14949 {
14950 {
14951 .eraseblocks = { {256 * 1024, 1} },
14952 .block_erase = erase_chip_block_jedec,
14953 }
14954 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014955 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000014956 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000014957 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010014958 .prepare_access = prepare_memory_access,
14959 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000014960 },
14961
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014962 {
14963 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100014964 .name = "SST29LE010",
14965 .bustype = BUS_PARALLEL,
14966 .manufacture_id = SST_ID,
14967 .model_id = SST_SST29LE010,
14968 .total_size = 128,
14969 .page_size = 128,
14970 .feature_bits = FEATURE_LONG_RESET,
14971 .tested = TEST_UNTESTED,
14972 .probe = probe_jedec,
14973 .probe_timing = 10,
14974 .block_erasers =
14975 {
14976 {
14977 .eraseblocks = { {128 * 1024, 1} },
14978 .block_erase = erase_chip_block_jedec,
14979 }
14980 },
14981 .write = write_jedec,
14982 .read = read_memmapped,
14983 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010014984 .prepare_access = prepare_memory_access,
14985 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100014986 },
14987
14988 {
14989 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014990 .name = "SST29LE020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000014991 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014992 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000014993 .model_id = SST_SST29LE020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014994 .total_size = 256,
14995 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000014996 .feature_bits = FEATURE_LONG_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000014997 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000014998 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000014999 .probe_timing = 10,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015000 .block_erasers =
15001 {
15002 {
15003 .eraseblocks = { {256 * 1024, 1} },
15004 .block_erase = erase_chip_block_jedec,
15005 }
15006 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015007 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015008 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015009 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015010 .prepare_access = prepare_memory_access,
15011 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015012 },
15013
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015014 {
15015 .vendor = "SST",
15016 .name = "SST39SF010A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015017 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015018 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015019 .model_id = SST_SST39SF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015020 .total_size = 128,
15021 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015022 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000015023 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015024 .probe = probe_jedec,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015025 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015026 .block_erasers =
15027 {
15028 {
15029 .eraseblocks = { {4 * 1024, 32} },
15030 .block_erase = erase_sector_jedec,
15031 }, {
15032 .eraseblocks = { {128 * 1024, 1} },
15033 .block_erase = erase_chip_block_jedec,
15034 }
15035 },
Sean Nelson35727f72010-01-28 23:55:12 +000015036 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015037 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015038 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015039 .prepare_access = prepare_memory_access,
15040 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015041 },
15042
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015043 {
15044 .vendor = "SST",
15045 .name = "SST39SF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015046 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015047 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015048 .model_id = SST_SST39SF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015049 .total_size = 256,
15050 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015051 .feature_bits = FEATURE_EITHER_RESET,
Uwe Hermann19f46f22011-06-18 22:56:14 +000015052 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015053 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015054 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015055 .block_erasers =
15056 {
15057 {
15058 .eraseblocks = { {4 * 1024, 64} },
15059 .block_erase = erase_sector_jedec,
15060 }, {
15061 .eraseblocks = { {256 * 1024, 1} },
15062 .block_erase = erase_chip_block_jedec,
15063 }
15064 },
Sean Nelson35727f72010-01-28 23:55:12 +000015065 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015067 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015068 .prepare_access = prepare_memory_access,
15069 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015070 },
15071
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015072 {
15073 .vendor = "SST",
15074 .name = "SST39SF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015075 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015076 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015077 .model_id = SST_SST39SF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015078 .total_size = 512,
15079 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015080 .feature_bits = FEATURE_EITHER_RESET,
Sylvain "ythier" Hitier3093f8f2011-09-03 11:22:27 +000015081 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015082 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015083 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015084 .block_erasers =
15085 {
15086 {
15087 .eraseblocks = { {4 * 1024, 128} },
15088 .block_erase = erase_sector_jedec,
15089 }, {
15090 .eraseblocks = { {512 * 1024, 1} },
15091 .block_erase = erase_chip_block_jedec,
15092 }
15093 },
Sean Nelson35727f72010-01-28 23:55:12 +000015094 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015095 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015096 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015097 .prepare_access = prepare_memory_access,
15098 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015099 },
15100
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015101 {
15102 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015103 .name = "SST39SF512",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015104 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015105 .manufacture_id = SST_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015106 .model_id = SST_SST39SF512,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015107 .total_size = 64,
15108 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015109 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd7d423b2012-10-20 09:13:16 +000015110 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015111 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015112 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015113 .block_erasers =
15114 {
15115 {
15116 .eraseblocks = { {4 * 1024, 16} },
15117 .block_erase = erase_sector_jedec,
15118 }, {
15119 .eraseblocks = { {64 * 1024, 1} },
15120 .block_erase = erase_chip_block_jedec,
15121 }
15122 },
Sean Nelson35727f72010-01-28 23:55:12 +000015123 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015124 .read = read_memmapped,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015125 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015126 .prepare_access = prepare_memory_access,
15127 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015128 },
15129
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015130 {
15131 .vendor = "SST",
15132 .name = "SST39VF010",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015133 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015134 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015135 .model_id = SST_SST39VF010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015136 .total_size = 128,
15137 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015138 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerd94d25d2012-07-28 03:17:15 +000015139 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015140 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015141 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015142 .block_erasers =
15143 {
15144 {
15145 .eraseblocks = { {4 * 1024, 32} },
15146 .block_erase = erase_sector_jedec,
15147 }, {
15148 .eraseblocks = { {128 * 1024, 1} },
15149 .block_erase = erase_chip_block_jedec,
15150 }
15151 },
Sean Nelson35727f72010-01-28 23:55:12 +000015152 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015153 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015154 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015155 .prepare_access = prepare_memory_access,
15156 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015157 },
15158
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015159 {
15160 .vendor = "SST",
15161 .name = "SST39VF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015162 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015163 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015164 .model_id = SST_SST39VF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015165 .total_size = 256,
15166 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015167 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner5c316f92015-02-08 21:57:52 +000015168 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015169 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015170 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015171 .block_erasers =
15172 {
15173 {
15174 .eraseblocks = { {4 * 1024, 64} },
15175 .block_erase = erase_sector_jedec,
15176 }, {
15177 .eraseblocks = { {256 * 1024, 1} },
15178 .block_erase = erase_chip_block_jedec,
15179 }
15180 },
Sean Nelson35727f72010-01-28 23:55:12 +000015181 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015182 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015183 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015184 .prepare_access = prepare_memory_access,
15185 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015186 },
15187
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015188 {
15189 .vendor = "SST",
15190 .name = "SST39VF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015191 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015192 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015193 .model_id = SST_SST39VF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015194 .total_size = 512,
15195 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015196 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015197 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015198 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015199 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015200 .block_erasers =
15201 {
15202 {
15203 .eraseblocks = { {4 * 1024, 128} },
15204 .block_erase = erase_sector_jedec,
15205 }, {
15206 .eraseblocks = { {512 * 1024, 1} },
15207 .block_erase = erase_chip_block_jedec,
15208 }
15209 },
Sean Nelson35727f72010-01-28 23:55:12 +000015210 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015211 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015212 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015213 .prepare_access = prepare_memory_access,
15214 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger90eff152008-12-08 23:51:45 +000015215 },
FENG yu ningff692fb2008-12-08 18:15:10 +000015216
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015217 {
15218 .vendor = "SST",
Peter Stuge8440cc02009-01-25 23:55:12 +000015219 .name = "SST39VF080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015220 .bustype = BUS_PARALLEL,
Mateusz Murawskie33890d2009-06-12 11:45:10 +000015221 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015222 .model_id = SST_SST39VF080,
Peter Stuge8440cc02009-01-25 23:55:12 +000015223 .total_size = 1024,
15224 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015225 .feature_bits = FEATURE_EITHER_RESET,
Peter Stuge8440cc02009-01-25 23:55:12 +000015226 .tested = TEST_UNTESTED,
15227 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015228 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015229 .block_erasers =
15230 {
15231 {
15232 .eraseblocks = { {4 * 1024, 256} },
15233 .block_erase = erase_sector_jedec,
15234 }, {
15235 .eraseblocks = { {64 * 1024, 16} },
15236 .block_erase = erase_block_jedec,
15237 }, {
15238 .eraseblocks = { {1024 * 1024, 1} },
15239 .block_erase = erase_chip_block_jedec,
15240 }
15241 },
Sean Nelson35727f72010-01-28 23:55:12 +000015242 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015243 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015244 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015245 .prepare_access = prepare_memory_access,
15246 .finish_access = finish_memory_access,
Peter Stuge8440cc02009-01-25 23:55:12 +000015247 },
15248
15249 {
15250 .vendor = "SST",
Alan Green1f9cc7d2019-07-01 11:10:45 +100015251 .name = "SST39VF512",
15252 .bustype = BUS_PARALLEL,
15253 .manufacture_id = SST_ID,
15254 .model_id = SST_SST39VF512,
15255 .total_size = 64,
15256 .page_size = 4096,
15257 .feature_bits = FEATURE_EITHER_RESET,
15258 .tested = TEST_OK_PREW,
15259 .probe = probe_jedec,
15260 .probe_timing = 1, /* 150 ns */
15261 .block_erasers =
15262 {
15263 {
15264 .eraseblocks = { {4 * 1024, 16} },
15265 .block_erase = erase_sector_jedec,
15266 }, {
15267 .eraseblocks = { {64 * 1024, 1} },
15268 .block_erase = erase_chip_block_jedec,
15269 }
15270 },
15271 .write = write_jedec_1,
15272 .read = read_memmapped,
15273 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015274 .prepare_access = prepare_memory_access,
15275 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100015276 },
15277
15278 {
15279 .vendor = "SST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015280 .name = "SST49LF002A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015281 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015282 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015283 .model_id = SST_SST49LF002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015284 .total_size = 256,
15285 .page_size = 16 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015286 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015287 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015288 .probe = probe_jedec,
15289 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015290 .block_erasers =
15291 {
15292 {
15293 .eraseblocks = { {4 * 1024, 64} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015294 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015295 }, {
15296 .eraseblocks = { {16 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015297 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015298 }, {
15299 .eraseblocks = { {256 * 1024, 1} },
15300 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15301 }
15302 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015303 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015304 .unlock = unlock_sst_fwhub,
15305 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015306 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015307 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015308 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015309 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015310 },
15311
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015312 {
15313 .vendor = "SST",
15314 .name = "SST49LF003A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015315 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015316 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015317 .model_id = SST_SST49LF003A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015318 .total_size = 384,
15319 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015320 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000015321 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015322 .probe = probe_jedec,
15323 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015324 .block_erasers =
15325 {
15326 {
15327 .eraseblocks = { {4 * 1024, 96} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015328 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015329 }, {
15330 .eraseblocks = { {64 * 1024, 6} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015331 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015332 }, {
15333 .eraseblocks = { {384 * 1024, 1} },
15334 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15335 }
15336 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015337 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015338 .unlock = unlock_sst_fwhub,
15339 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015340 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015341 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015342 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015343 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015344 },
15345
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015346 {
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015347 /* Contrary to the data sheet, TBL# on the SST49LF004B affects the top 128kB (instead of 64kB)
15348 * and is only honored for 64k block erase, but not 4k sector erase.
15349 */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015350 .vendor = "SST",
15351 .name = "SST49LF004A/B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015352 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015353 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015354 .model_id = SST_SST49LF004A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015355 .total_size = 512,
15356 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015357 .feature_bits = FEATURE_EITHER_RESET,
Idwer Vollering67f28142011-03-06 22:26:23 +000015358 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015359 .probe = probe_jedec,
15360 .probe_timing = 1, /* 150 ns */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015361 .block_erasers =
15362 {
15363 {
15364 .eraseblocks = { {4 * 1024, 128} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015365 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015366 }, {
15367 .eraseblocks = { {64 * 1024, 8} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015368 .block_erase = erase_block_jedec,
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015369 }, {
15370 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson51c83fb2010-01-20 20:55:53 +000015371 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
Carl-Daniel Hailfingera06287c2009-09-23 22:01:33 +000015372 },
15373 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015374 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015375 .unlock = unlock_sst_fwhub,
15376 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015377 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015378 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015379 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015380 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015381 },
15382
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015383 {
15384 .vendor = "SST",
15385 .name = "SST49LF004C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015386 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015387 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015388 .model_id = SST_SST49LF004C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015389 .total_size = 512,
15390 .page_size = 4 * 1024,
15391 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015392 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015393 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015394 .block_erasers =
15395 {
15396 {
15397 .eraseblocks = { {4 * 1024, 128} },
15398 .block_erase = erase_sector_49lfxxxc,
15399 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015400 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015401 {64 * 1024, 7},
15402 {32 * 1024, 1},
15403 {8 * 1024, 2},
15404 {16 * 1024, 1},
15405 },
Sean Nelson69e58112010-03-23 17:10:28 +000015406 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015407 }
15408 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015409 .printlock = printlock_regspace2_block_eraser_1,
15410 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015411 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015412 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015413 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015414 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015415 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015416 },
15417
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015418 {
15419 .vendor = "SST",
15420 .name = "SST49LF008A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015421 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015422 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015423 .model_id = SST_SST49LF008A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015424 .total_size = 1024,
15425 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015426 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000015427 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015428 .probe = probe_jedec,
15429 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015430 .block_erasers =
15431 {
15432 {
15433 .eraseblocks = { {4 * 1024, 256} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015434 .block_erase = erase_sector_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015435 }, {
15436 .eraseblocks = { {64 * 1024, 16} },
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015437 .block_erase = erase_block_jedec,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015438 }, {
15439 .eraseblocks = { {1024 * 1024, 1} },
15440 .block_erase = NULL, /* AA 55 80 AA 55 10, only in A/A mux mode */
15441 }
15442 },
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015443 .printlock = printlock_sst_fwhub,
Sean Nelsonccf7a2a2010-03-16 03:09:10 +000015444 .unlock = unlock_sst_fwhub,
15445 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015446 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015447 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015448 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015449 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015450 },
15451
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015452 {
15453 .vendor = "SST",
15454 .name = "SST49LF008C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015455 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015456 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015457 .model_id = SST_SST49LF008C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015458 .total_size = 1024,
15459 .page_size = 4 * 1024,
15460 .tested = TEST_UNTESTED,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015461 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015462 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015463 .block_erasers =
15464 {
15465 {
15466 .eraseblocks = { {4 * 1024, 256} },
15467 .block_erase = erase_sector_49lfxxxc,
15468 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015469 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015470 {64 * 1024, 15},
15471 {32 * 1024, 1},
15472 {8 * 1024, 2},
15473 {16 * 1024, 1},
15474 },
Sean Nelson69e58112010-03-23 17:10:28 +000015475 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015476 }
15477 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015478 .printlock = printlock_regspace2_block_eraser_1,
15479 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015480 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015481 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015482 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015483 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015484 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015485 },
15486
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015487 {
15488 .vendor = "SST",
15489 .name = "SST49LF016C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015490 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015491 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015492 .model_id = SST_SST49LF016C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015493 .total_size = 2048,
15494 .page_size = 4 * 1024,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015495 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015496 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015497 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015498 .block_erasers =
15499 {
15500 {
15501 .eraseblocks = { {4 * 1024, 512} },
15502 .block_erase = erase_sector_49lfxxxc,
15503 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015504 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015505 {64 * 1024, 31},
15506 {32 * 1024, 1},
15507 {8 * 1024, 2},
15508 {16 * 1024, 1},
15509 },
Sean Nelson69e58112010-03-23 17:10:28 +000015510 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015511 }
15512 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015513 .printlock = printlock_regspace2_block_eraser_1,
15514 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015515 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015516 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015517 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015518 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015519 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015520 },
15521
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015522 {
15523 .vendor = "SST",
15524 .name = "SST49LF020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015525 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015526 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015527 .model_id = SST_SST49LF020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015528 .total_size = 256,
15529 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015530 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner8179be52011-06-04 13:13:34 +000015531 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015532 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015533 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015534 .block_erasers =
15535 {
15536 {
15537 .eraseblocks = { {4 * 1024, 64} },
15538 .block_erase = erase_sector_jedec,
15539 }, {
15540 .eraseblocks = { {16 * 1024, 16} },
15541 .block_erase = erase_block_jedec,
15542 }, {
15543 .eraseblocks = { {256 * 1024, 1} },
15544 .block_erase = NULL,
15545 }
15546 },
Sean Nelson35727f72010-01-28 23:55:12 +000015547 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015548 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015549 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015550 .prepare_access = prepare_memory_access,
15551 .finish_access = finish_memory_access,
Sven Schnellec208dfb2009-01-07 12:35:09 +000015552 },
15553
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015554 {
15555 .vendor = "SST",
15556 .name = "SST49LF020A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015557 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015558 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015559 .model_id = SST_SST49LF020A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015560 .total_size = 256,
Carl-Daniel Hailfingerda654322009-07-23 01:44:38 +000015561 .page_size = 4 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015562 .feature_bits = FEATURE_EITHER_RESET,
Carl-Daniel Hailfingerf52f7842010-10-08 18:52:29 +000015563 .tested = TEST_OK_PRE,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015564 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015565 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015566 .block_erasers =
15567 {
15568 {
15569 .eraseblocks = { {4 * 1024, 64} },
15570 .block_erase = erase_sector_jedec,
15571 }, {
15572 .eraseblocks = { {16 * 1024, 16} },
15573 .block_erase = erase_block_jedec,
15574 }, {
15575 .eraseblocks = { {256 * 1024, 1} },
15576 .block_erase = NULL,
15577 }
15578 },
Sean Nelson35727f72010-01-28 23:55:12 +000015579 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015580 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015581 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015582 .prepare_access = prepare_memory_access,
15583 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015584 },
15585
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015586 {
15587 .vendor = "SST",
15588 .name = "SST49LF040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015589 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015590 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015591 .model_id = SST_SST49LF040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015592 .total_size = 512,
15593 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015594 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000015595 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015596 .probe = probe_jedec,
Uwe Hermann431f4f72010-09-05 12:41:25 +000015597 .probe_timing = 1, /* 150 ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015598 .block_erasers =
15599 {
15600 {
15601 .eraseblocks = { {4 * 1024, 128} },
15602 .block_erase = erase_sector_jedec,
15603 }, {
15604 .eraseblocks = { {64 * 1024, 8} },
15605 .block_erase = erase_block_jedec,
15606 }, {
15607 .eraseblocks = { {512 * 1024, 1} },
15608 .block_erase = NULL,
15609 }
15610 },
Sean Nelson35727f72010-01-28 23:55:12 +000015611 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015612 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015613 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015614 .prepare_access = prepare_memory_access,
15615 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015616 },
15617
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015618 {
15619 .vendor = "SST",
15620 .name = "SST49LF040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015621 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015622 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015623 .model_id = SST_SST49LF040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015624 .total_size = 512,
15625 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010015626 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000015627 .tested = TEST_OK_PREW,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015628 .probe = probe_jedec,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015629 .probe_timing = 1, /* 150ns */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015630 .block_erasers =
15631 {
15632 {
15633 .eraseblocks = { {4 * 1024, 128} },
15634 .block_erase = erase_sector_jedec,
15635 }, {
15636 .eraseblocks = { {64 * 1024, 8} },
15637 .block_erase = erase_block_jedec,
15638 }, {
15639 .eraseblocks = { {512 * 1024, 1} },
15640 .block_erase = NULL,
15641 }
15642 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015643 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000015644 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015645 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015646 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015647 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015648 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015649 },
15650
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015651 {
15652 .vendor = "SST",
15653 .name = "SST49LF080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015654 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015655 .manufacture_id = SST_ID,
Elyes HAOUAS124ef382018-03-27 12:15:09 +020015656 .model_id = SST_SST49LF080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015657 .total_size = 1024,
15658 .page_size = 4096,
Sean Nelson35727f72010-01-28 23:55:12 +000015659 .feature_bits = FEATURE_EITHER_RESET,
Brandon Dowdyf07bf322011-03-06 18:31:11 +000015660 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015661 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015662 .probe_timing = TIMING_FIXME,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015663 .block_erasers =
15664 {
15665 {
15666 .eraseblocks = { {4 * 1024, 256} },
15667 .block_erase = erase_sector_jedec,
15668 }, {
15669 .eraseblocks = { {64 * 1024, 16} },
15670 .block_erase = erase_block_jedec,
15671 }, {
15672 .eraseblocks = { {1024 * 1024, 1} },
15673 .block_erase = NULL,
15674 }
15675 },
Sean Nelson35727f72010-01-28 23:55:12 +000015676 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015677 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015678 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015679 .prepare_access = prepare_memory_access,
15680 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015681 },
15682
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015683 {
15684 .vendor = "SST",
15685 .name = "SST49LF160C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015686 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015687 .manufacture_id = SST_ID,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000015688 .model_id = SST_SST49LF160C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015689 .total_size = 2048,
15690 .page_size = 4 * 1024,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015691 .tested = TEST_OK_PR,
Carl-Daniel Hailfinger81449a22010-03-15 03:48:42 +000015692 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000015693 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
Sean Nelson51c83fb2010-01-20 20:55:53 +000015694 .block_erasers =
15695 {
15696 {
15697 .eraseblocks = { {4 * 1024, 512} },
15698 .block_erase = erase_sector_49lfxxxc,
15699 }, {
Stefan Tauner0554ca52013-07-25 22:54:25 +000015700 .eraseblocks = {
Sean Nelson51c83fb2010-01-20 20:55:53 +000015701 {64 * 1024, 31},
15702 {32 * 1024, 1},
15703 {8 * 1024, 2},
15704 {16 * 1024, 1},
15705 },
Sean Nelson69e58112010-03-23 17:10:28 +000015706 .block_erase = erase_block_82802ab,
Sean Nelson51c83fb2010-01-20 20:55:53 +000015707 }
15708 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015709 .printlock = printlock_regspace2_block_eraser_1,
15710 .unlock = unlock_regspace2_block_eraser_1,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015711 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015712 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015713 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010015714 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010015715 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015716 },
15717
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015718 {
15719 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015720 .name = "M29F002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015721 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015722 .manufacture_id = ST_ID,
15723 .model_id = ST_M29F002B,
15724 .total_size = 256,
15725 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015726 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015727 .tested = TEST_UNTESTED,
15728 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015729 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015730 .block_erasers =
15731 {
15732 {
15733 .eraseblocks = {
15734 {16 * 1024, 1},
15735 {8 * 1024, 2},
15736 {32 * 1024, 1},
15737 {64 * 1024, 3},
15738 },
15739 .block_erase = erase_sector_jedec,
15740 }, {
15741 .eraseblocks = { {256 * 1024, 1} },
15742 .block_erase = erase_chip_block_jedec,
15743 }
15744 },
Sean Nelson35727f72010-01-28 23:55:12 +000015745 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015746 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015747 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015748 .prepare_access = prepare_memory_access,
15749 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015750 },
15751
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015752 {
15753 .vendor = "ST",
15754 .name = "M29F002T/NT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015755 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015756 .manufacture_id = ST_ID,
15757 .model_id = ST_M29F002T,
15758 .total_size = 256,
15759 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015760 .feature_bits = FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
Stefan Taunere34e3e82013-01-01 00:06:51 +000015761 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015762 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015763 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015764 .block_erasers =
15765 {
15766 {
15767 .eraseblocks = {
15768 {64 * 1024, 3},
15769 {32 * 1024, 1},
15770 {8 * 1024, 2},
15771 {16 * 1024, 1},
15772 },
15773 .block_erase = erase_sector_jedec,
15774 }, {
15775 .eraseblocks = { {256 * 1024, 1} },
15776 .block_erase = erase_chip_block_jedec,
15777 }
15778 },
Sean Nelson35727f72010-01-28 23:55:12 +000015779 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015780 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000015781 .voltage = {4750, 5250}, /* 4.75-5.25V for type -X, others 4.5-5.5V */
Nico Huber9eec4072023-01-12 01:17:30 +010015782 .prepare_access = prepare_memory_access,
15783 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015784 },
15785
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015786 {
15787 .vendor = "ST",
15788 .name = "M29F040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015789 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015790 .manufacture_id = ST_ID,
15791 .model_id = ST_M29F040B,
15792 .total_size = 512,
15793 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015794 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
15795 .tested = TEST_UNTESTED,
15796 .probe = probe_jedec,
David Borg204f4652010-12-04 03:26:40 +000015797 .probe_timing = TIMING_ZERO, /* datasheet specifies no timing */
Sean Nelson56358aa2010-01-19 16:08:51 +000015798 .block_erasers =
15799 {
15800 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015801 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson35727f72010-01-28 23:55:12 +000015802 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015803 }, {
15804 .eraseblocks = { {512 * 1024, 1} },
Sean Nelson35727f72010-01-28 23:55:12 +000015805 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015806 }
15807 },
Sean Nelson35727f72010-01-28 23:55:12 +000015808 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015809 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015810 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015811 .prepare_access = prepare_memory_access,
15812 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015813 },
15814
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015815 {
Sean Nelson35727f72010-01-28 23:55:12 +000015816 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015817 .vendor = "ST",
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015818 .name = "M29F400BB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015819 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015820 .manufacture_id = ST_ID,
15821 .model_id = ST_M29F400BB,
15822 .total_size = 512,
15823 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015824 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger79e67572010-10-13 21:49:30 +000015825 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015826 .probe = probe_jedec,
15827 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015828 .block_erasers =
15829 {
15830 {
15831 .eraseblocks = {
15832 {16 * 1024, 1},
15833 {8 * 1024, 2},
15834 {32 * 1024, 1},
15835 {64 * 1024, 7},
15836 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015837 .block_erase = erase_sector_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015838 }, {
15839 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015840 .block_erase = erase_chip_block_jedec,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015841 }
15842 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015843 .write = write_jedec_1,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015844 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015845 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015846 .prepare_access = prepare_memory_access,
15847 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015848 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100015849
Carl-Daniel Hailfinger420cf6f2010-07-16 22:07:20 +000015850 {
15851 /* FIXME: this has WORD/BYTE sequences; 2AA for word, 555 for byte */
15852 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015853 .name = "M29F400BT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015854 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015855 .manufacture_id = ST_ID,
15856 .model_id = ST_M29F400BT,
15857 .total_size = 512,
15858 .page_size = 64 * 1024,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015859 .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015860 .tested = TEST_UNTESTED,
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015861 .probe = probe_jedec,
15862 .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
Sean Nelson56358aa2010-01-19 16:08:51 +000015863 .block_erasers =
15864 {
15865 {
15866 .eraseblocks = {
15867 {64 * 1024, 7},
15868 {32 * 1024, 1},
15869 {8 * 1024, 2},
15870 {16 * 1024, 1},
15871 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015872 .block_erase = erase_sector_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015873 }, {
15874 .eraseblocks = { {512 * 1024, 1} },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015875 .block_erase = erase_chip_block_jedec,
Sean Nelson56358aa2010-01-19 16:08:51 +000015876 }
15877 },
Carl-Daniel Hailfingera8cf3622014-08-08 08:33:01 +000015878 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015879 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015880 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010015881 .prepare_access = prepare_memory_access,
15882 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015883 },
15884
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015885 {
15886 .vendor = "ST",
15887 .name = "M29W010B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015888 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015889 .manufacture_id = ST_ID,
15890 .model_id = ST_M29W010B,
15891 .total_size = 128,
15892 .page_size = 16 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015893 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015894 .tested = TEST_UNTESTED,
15895 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015896 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015897 .block_erasers =
15898 {
15899 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015900 .eraseblocks = { {16 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015901 .block_erase = erase_sector_jedec,
15902 }, {
15903 .eraseblocks = { {128 * 1024, 1} },
15904 .block_erase = erase_chip_block_jedec,
15905 }
15906 },
Sean Nelson35727f72010-01-28 23:55:12 +000015907 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015908 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015909 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015910 .prepare_access = prepare_memory_access,
15911 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015912 },
15913
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015914 {
15915 .vendor = "ST",
15916 .name = "M29W040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015917 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015918 .manufacture_id = ST_ID,
15919 .model_id = ST_M29W040B,
15920 .total_size = 512,
15921 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000015922 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015923 .tested = TEST_UNTESTED,
15924 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000015925 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000015926 .block_erasers =
15927 {
15928 {
Stefan Tauner6697f712014-08-06 15:09:15 +000015929 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson56358aa2010-01-19 16:08:51 +000015930 .block_erase = erase_sector_jedec,
15931 }, {
15932 .eraseblocks = { {512 * 1024, 1} },
15933 .block_erase = erase_chip_block_jedec,
15934 }
15935 },
Sean Nelson35727f72010-01-28 23:55:12 +000015936 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015937 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015938 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015939 .prepare_access = prepare_memory_access,
15940 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000015941 },
15942
Stefan Taunereb582572012-09-21 12:52:50 +000015943 {
15944 .vendor = "ST",
15945 .name = "M29W512B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015946 .bustype = BUS_PARALLEL,
Alan Greenfa3fcd32019-06-27 15:41:50 +100015947 .manufacture_id = ST_ID,
Stefan Taunereb582572012-09-21 12:52:50 +000015948 .model_id = ST_M29W512B,
15949 .total_size = 64,
15950 .page_size = 64 * 1024,
15951 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Stefan Tauner0554ca52013-07-25 22:54:25 +000015952 .tested = TEST_OK_PREW,
Stefan Taunereb582572012-09-21 12:52:50 +000015953 .probe = probe_jedec,
15954 .probe_timing = TIMING_ZERO,
15955 .block_erasers =
15956 {
15957 {
15958 .eraseblocks = { {64 * 1024, 1} },
15959 .block_erase = erase_chip_block_jedec,
15960 }
15961 },
15962 .write = write_jedec_1,
15963 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015964 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010015965 .prepare_access = prepare_memory_access,
15966 .finish_access = finish_memory_access,
Stefan Taunereb582572012-09-21 12:52:50 +000015967 },
Jeffrey A. Kentba7c9222010-02-01 05:49:46 +000015968
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015969 {
15970 .vendor = "ST",
15971 .name = "M50FLW040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000015972 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015973 .manufacture_id = ST_ID,
15974 .model_id = ST_M50FLW040A,
15975 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000015976 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000015977 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000015978 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000015979 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000015980 .block_erasers =
15981 {
15982 {
Sean Nelson329bde72010-01-19 16:39:19 +000015983 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000015984 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000015985 {64 * 1024, 5}, /* block */
15986 {4 * 1024, 16}, /* sector */
15987 {4 * 1024, 16}, /* sector */
15988 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000015989 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000015990 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000015991 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000015992 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000015993 }
15994 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000015995 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100015996 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000015997 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000015998 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010015999 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016000 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016001 },
16002
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016003 {
16004 .vendor = "ST",
16005 .name = "M50FLW040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016006 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016007 .manufacture_id = ST_ID,
16008 .model_id = ST_M50FLW040B,
16009 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016010 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016011 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016012 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016013 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016014 .block_erasers =
16015 {
16016 {
Sean Nelson329bde72010-01-19 16:39:19 +000016017 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016018 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016019 {4 * 1024, 16}, /* sector */
16020 {64 * 1024, 5}, /* block */
16021 {4 * 1024, 16}, /* sector */
16022 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016023 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016024 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016025 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016026 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016027 }
16028 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016029 .unlock = unlock_regspace2_uniform_64k,
Alan Greenc1863ca2019-06-27 15:08:03 +100016030 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016031 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016032 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016033 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016034 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016035 },
16036
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016037 {
16038 .vendor = "ST",
16039 .name = "M50FLW080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016040 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016041 .manufacture_id = ST_ID,
16042 .model_id = ST_M50FLW080A,
16043 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016044 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016045 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016046 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016047 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016048 .block_erasers =
16049 {
16050 {
Sean Nelson329bde72010-01-19 16:39:19 +000016051 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016052 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016053 {64 * 1024, 13}, /* block */
16054 {4 * 1024, 16}, /* sector */
16055 {4 * 1024, 16}, /* sector */
16056 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016057 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016058 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016059 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016060 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016061 }
16062 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016063 .printlock = printlock_regspace2_block_eraser_0,
16064 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016065 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016066 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016067 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016068 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016069 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016070 },
16071
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016072 {
16073 .vendor = "ST",
16074 .name = "M50FLW080B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016075 .bustype = BUS_FWH | BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016076 .manufacture_id = ST_ID,
16077 .model_id = ST_M50FLW080B,
16078 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016079 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016080 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016081 .probe = probe_82802ab,
Carl-Daniel Hailfinger08fa2f32010-01-10 01:34:00 +000016082 .probe_timing = TIMING_FIXME,
Sean Nelson56358aa2010-01-19 16:08:51 +000016083 .block_erasers =
16084 {
16085 {
Sean Nelson329bde72010-01-19 16:39:19 +000016086 .eraseblocks = {
Uwe Hermann431f4f72010-09-05 12:41:25 +000016087 {4 * 1024, 16}, /* sector */
Sean Nelson329bde72010-01-19 16:39:19 +000016088 {4 * 1024, 16}, /* sector */
16089 {64 * 1024, 13}, /* block */
16090 {4 * 1024, 16}, /* sector */
16091 },
Stefan Taunerbeaffd82013-09-12 08:29:06 +000016092 .block_erase = erase_sector_stm50,
Sean Nelson329bde72010-01-19 16:39:19 +000016093 }, {
Stefan Tauner6697f712014-08-06 15:09:15 +000016094 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016095 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016096 }
16097 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016098 .printlock = printlock_regspace2_block_eraser_0,
16099 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016100 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016101 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016102 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016103 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016104 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016105 },
16106
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016107 {
16108 .vendor = "ST",
16109 .name = "M50FW002",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016110 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016111 .manufacture_id = ST_ID,
16112 .model_id = ST_M50FW002,
16113 .total_size = 256,
Stefan Tauner4404f732013-09-12 08:28:56 +000016114 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016115 .tested = TEST_OK_PR,
Sean Nelson35727f72010-01-28 23:55:12 +000016116 .probe = probe_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016117 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016118 .block_erasers =
16119 {
16120 {
16121 .eraseblocks = {
16122 {64 * 1024, 3},
16123 {32 * 1024, 1},
16124 {8 * 1024, 2},
16125 {16 * 1024, 1},
16126 },
Sean Nelson28accc22010-03-19 18:47:06 +000016127 .block_erase = erase_block_82802ab,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016128 }, {
Stefan Tauner5c316f92015-02-08 21:57:52 +000016129 .eraseblocks = { {256 * 1024, 1} },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016130 .block_erase = NULL, /* Only in A/A mux mode */
Sean Nelson56358aa2010-01-19 16:08:51 +000016131 }
16132 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016133 .printlock = printlock_regspace2_block_eraser_0,
16134 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016135 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016136 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016137 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016138 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016139 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016140 },
16141
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016142 {
16143 .vendor = "ST",
16144 .name = "M50FW016",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016145 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016146 .manufacture_id = ST_ID,
16147 .model_id = ST_M50FW016,
16148 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016149 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016150 .tested = TEST_UNTESTED,
16151 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016152 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016153 .block_erasers =
16154 {
16155 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016156 .eraseblocks = { {64 * 1024, 32} },
Sean Nelson28accc22010-03-19 18:47:06 +000016157 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016158 }
16159 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016160 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016161 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016162 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016163 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016164 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016165 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016166 },
16167
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016168 {
16169 .vendor = "ST",
16170 .name = "M50FW040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016171 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016172 .manufacture_id = ST_ID,
16173 .model_id = ST_M50FW040,
16174 .total_size = 512,
Stefan Tauner4404f732013-09-12 08:28:56 +000016175 .page_size = 0,
Sean Nelson28accc22010-03-19 18:47:06 +000016176 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016177 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016178 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016179 .block_erasers =
16180 {
16181 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016182 .eraseblocks = { {64 * 1024, 8} },
Sean Nelson28accc22010-03-19 18:47:06 +000016183 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016184 }
16185 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016186 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016187 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016188 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016189 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016190 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016191 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016192 },
16193
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016194 {
16195 .vendor = "ST",
16196 .name = "M50FW080",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016197 .bustype = BUS_FWH, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016198 .manufacture_id = ST_ID,
16199 .model_id = ST_M50FW080,
16200 .total_size = 1024,
Stefan Tauner4404f732013-09-12 08:28:56 +000016201 .page_size = 0,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016202 .tested = TEST_OK_PR,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016203 .probe = probe_82802ab,
Paul Menzelc07a41c2011-06-19 17:23:55 +000016204 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
Sean Nelson56358aa2010-01-19 16:08:51 +000016205 .block_erasers =
16206 {
16207 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016208 .eraseblocks = { {64 * 1024, 16} },
Sean Nelson28accc22010-03-19 18:47:06 +000016209 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016210 }
16211 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016212 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson28accc22010-03-19 18:47:06 +000016213 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016214 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016215 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016216 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016217 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016218 },
16219
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016220 {
16221 .vendor = "ST",
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016222 .name = "M50LPW080",
16223 .bustype = BUS_LPC, /* A/A Mux */
16224 .manufacture_id = ST_ID,
16225 .model_id = ST_M50LPW080,
16226 .total_size = 1024,
16227 .page_size = 0,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016228 .tested = TEST_UNTESTED,
16229 .probe = probe_82802ab,
16230 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
16231 .block_erasers =
16232 {
16233 {
Stefan Tauner6697f712014-08-06 15:09:15 +000016234 .eraseblocks = { {64 * 1024, 16} },
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016235 .block_erase = erase_block_82802ab,
16236 }
16237 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016238 .unlock = unlock_regspace2_uniform_64k,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016239 .write = write_82802ab,
16240 .read = read_memmapped,
16241 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016242 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016243 .finish_access = finish_memory_access,
Stefan Tauner8c4602b2013-09-12 08:29:00 +000016244 },
16245
16246 {
16247 .vendor = "ST",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016248 .name = "M50LPW116",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000016249 .bustype = BUS_LPC, /* A/A Mux */
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016250 .manufacture_id = ST_ID,
16251 .model_id = ST_M50LPW116,
16252 .total_size = 2048,
Stefan Tauner4404f732013-09-12 08:28:56 +000016253 .page_size = 0,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016254 .tested = TEST_UNTESTED,
Sean Nelson35727f72010-01-28 23:55:12 +000016255 .probe = probe_82802ab,
Udu Ogahc04ee222009-09-05 01:31:32 +000016256 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000016257 .block_erasers =
16258 {
16259 {
16260 .eraseblocks = {
16261 {4 * 1024, 16},
16262 {64 * 1024, 30},
16263 {32 * 1024, 1},
16264 {8 * 1024, 2},
16265 {16 * 1024, 1},
16266 },
Sean Nelson28accc22010-03-19 18:47:06 +000016267 .block_erase = erase_block_82802ab,
Sean Nelson56358aa2010-01-19 16:08:51 +000016268 }
16269 },
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000016270 .printlock = printlock_regspace2_block_eraser_0,
16271 .unlock = unlock_regspace2_block_eraser_0,
Sean Nelson28accc22010-03-19 18:47:06 +000016272 .write = write_82802ab,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000016273 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000016274 .voltage = {3000, 3600}, /* Also has 12V fast program & erase */
Nico Huberb1974022023-01-12 13:13:12 +010016275 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016276 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000016277 },
16278
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000016279 {
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016280 .vendor = "ST",
16281 .name = "M95M02",
16282 .bustype = BUS_SPI,
16283 .manufacture_id = ST_ID,
16284 .model_id = ST_M95M02,
16285 .total_size = 256,
16286 .page_size = 256,
16287 .feature_bits = FEATURE_WRSR_WREN | FEATURE_NO_ERASE | FEATURE_ERASED_ZERO,
16288 .tested = TEST_OK_PREW,
Nico Huber54557862023-05-15 12:01:04 +020016289 .spi_cmd_set = SPI95,
Konstantin Grudnev3d8868c2019-07-23 00:48:54 +030016290 .probe = probe_spi_st95,
16291 .probe_timing = TIMING_ZERO,
16292 .block_erasers =
16293 {
16294 {
16295 .eraseblocks = { {256 * 1024, 1} },
16296 .block_erase = spi_block_erase_emulation,
16297 }
16298 },
16299
16300 .printlock = spi_prettyprint_status_register_bp1_srwd,
16301 .unlock = spi_disable_blockprotect_bp1_srwd,
16302 .write = spi_chip_write_256,
16303 .read = spi_chip_read,
16304 .voltage = {2500, 5500},
16305 },
16306
16307 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100016308 .vendor = "Sanyo",
16309 .name = "LE25FU106B",
16310 .bustype = BUS_SPI,
16311 .manufacture_id = SANYO_ID,
16312 .model_id = SANYO_LE25FU106B,
16313 .total_size = 128,
16314 .page_size = 256,
16315 .feature_bits = FEATURE_WRSR_WREN,
16316 .tested = TEST_UNTESTED,
16317 .probe = probe_spi_res2,
16318 .probe_timing = TIMING_ZERO,
16319 .block_erasers =
16320 {
16321 /* FIXME: Is this correct?
16322 {
16323 .eraseblocks = { {2 * 1024, 64} },
16324 .block_erase = spi_block_erase_d7,
16325 },*/
16326 {
16327 .eraseblocks = { {32 * 1024, 4} },
16328 .block_erase = spi_block_erase_d8,
16329 }, {
16330 .eraseblocks = { {128 * 1024, 1} },
16331 .block_erase = spi_block_erase_c7,
16332 }
16333 },
16334 .printlock = spi_prettyprint_status_register_bp1_srwd,
16335 .unlock = spi_disable_blockprotect_bp1_srwd,
16336 .write = spi_chip_write_256,
16337 .read = spi_chip_read,
16338 .voltage = {2300, 3600},
16339 },
16340
16341 {
16342 .vendor = "Sanyo",
16343 .name = "LE25FU206",
16344 .bustype = BUS_SPI,
16345 .manufacture_id = SANYO_ID,
16346 .model_id = SANYO_LE25FU206,
16347 .total_size = 256,
16348 .page_size = 256,
16349 .feature_bits = FEATURE_WRSR_WREN,
16350 .tested = TEST_UNTESTED,
16351 .probe = probe_spi_res2,
16352 .probe_timing = TIMING_ZERO,
16353 .block_erasers =
16354 {
16355 {
16356 .eraseblocks = { {4 * 1024, 64} },
16357 .block_erase = spi_block_erase_d7,
16358 }, {
16359 .eraseblocks = { {64 * 1024, 4} },
16360 .block_erase = spi_block_erase_d8,
16361 }, {
16362 .eraseblocks = { {256 * 1024, 1} },
16363 .block_erase = spi_block_erase_c7,
16364 }
16365 },
16366 .printlock = spi_prettyprint_status_register_bp1_srwd,
16367 .unlock = spi_disable_blockprotect_bp1_srwd,
16368 .write = spi_chip_write_256,
16369 .read = spi_chip_read,
16370 .voltage = {2300, 3600},
16371 },
16372
16373 {
16374 .vendor = "Sanyo",
16375 .name = "LE25FU206A",
16376 .bustype = BUS_SPI,
16377 .manufacture_id = SANYO_ID,
16378 .model_id = SANYO_LE25FU206A,
16379 .total_size = 256,
16380 .page_size = 256,
16381 .tested = TEST_UNTESTED,
16382 .probe = probe_spi_rdid,
16383 .probe_timing = TIMING_ZERO,
16384 .block_erasers =
16385 {
16386 {
16387 .eraseblocks = { {4 * 1024, 64} },
16388 .block_erase = spi_block_erase_20,
16389 }, {
16390 .eraseblocks = { {4 * 1024, 64} },
16391 .block_erase = spi_block_erase_d7,
16392 }, {
16393 .eraseblocks = { {64 * 1024, 4} },
16394 .block_erase = spi_block_erase_d8,
16395 }, {
16396 .eraseblocks = { {256 * 1024, 1} },
16397 .block_erase = spi_block_erase_60,
16398 }, {
16399 .eraseblocks = { {256 * 1024, 1} },
16400 .block_erase = spi_block_erase_c7,
16401 }
16402 },
16403 .printlock = spi_prettyprint_status_register_bp2_srwd,
16404 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16405 .write = spi_chip_write_256,
16406 .read = spi_chip_read,
16407 .voltage = {2300, 3600},
16408 },
16409
16410 {
16411 .vendor = "Sanyo",
16412 .name = "LE25FU406B",
16413 .bustype = BUS_SPI,
16414 .manufacture_id = SANYO_ID,
16415 .model_id = SANYO_LE25FU406B,
16416 .total_size = 512,
16417 .page_size = 256,
16418 .feature_bits = FEATURE_WRSR_WREN,
16419 .tested = TEST_OK_PREW,
16420 .probe = probe_spi_res2,
16421 .probe_timing = TIMING_ZERO,
16422 .block_erasers =
16423 {
16424 {
16425 .eraseblocks = { {4 * 1024, 128} },
16426 .block_erase = spi_block_erase_d7,
16427 }, {
16428 .eraseblocks = { {64 * 1024, 8} },
16429 .block_erase = spi_block_erase_d8,
16430 }, {
16431 .eraseblocks = { {512 * 1024, 1} },
16432 .block_erase = spi_block_erase_c7,
16433 }
16434 },
16435 .printlock = spi_prettyprint_status_register_bp2_srwd,
16436 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16437 .write = spi_chip_write_256,
16438 .read = spi_chip_read,
16439 .voltage = {2300, 3600},
16440 },
16441
16442 {
16443 .vendor = "Sanyo",
16444 .name = "LE25FU406C/LE25U40CMC",
16445 .bustype = BUS_SPI,
16446 .manufacture_id = SANYO_ID,
16447 .model_id = SANYO_LE25FU406C,
16448 .total_size = 512,
16449 .page_size = 256,
16450 .feature_bits = FEATURE_WRSR_WREN,
16451 .tested = TEST_OK_PREW,
16452 .probe = probe_spi_rdid,
16453 .probe_timing = TIMING_ZERO,
16454 .block_erasers =
16455 {
16456 {
16457 .eraseblocks = { {4 * 1024, 128} },
16458 .block_erase = spi_block_erase_20,
16459 }, {
16460 .eraseblocks = { {4 * 1024, 128} },
16461 .block_erase = spi_block_erase_d7,
16462 }, {
16463 .eraseblocks = { {64 * 1024, 8} },
16464 .block_erase = spi_block_erase_d8,
16465 }, {
16466 .eraseblocks = { {512 * 1024, 1} },
16467 .block_erase = spi_block_erase_60,
16468 }, {
16469 .eraseblocks = { {512 * 1024, 1} },
16470 .block_erase = spi_block_erase_c7,
16471 }
16472 },
16473 .printlock = spi_prettyprint_status_register_bp2_srwd,
16474 .unlock = spi_disable_blockprotect_bp2_srwd,
16475 .write = spi_chip_write_256,
16476 .read = spi_chip_read, /* Fast read (0x0B), dual read (0x3B) and dual I/O (0xBB) supported */
16477 .voltage = {2300, 3600},
16478 },
16479
16480 {
16481 .vendor = "Sanyo",
16482 .name = "LE25FW106",
16483 .bustype = BUS_SPI,
16484 .manufacture_id = SANYO_ID,
16485 .model_id = SANYO_LE25FW106,
16486 .total_size = 128,
16487 .page_size = 256,
16488 .feature_bits = FEATURE_WRSR_WREN,
16489 .tested = TEST_OK_PREW,
16490 .probe = probe_spi_res2,
16491 .probe_timing = TIMING_ZERO,
16492 .block_erasers =
16493 {
16494 {
16495 .eraseblocks = { {2 * 1024, 64} },
16496 .block_erase = spi_block_erase_d7,
16497 }, {
16498 .eraseblocks = { {32 * 1024, 4} },
16499 .block_erase = spi_block_erase_d8,
16500 }, {
16501 .eraseblocks = { {128 * 1024, 1} },
16502 .block_erase = spi_block_erase_c7,
16503 }
16504 },
16505 .printlock = spi_prettyprint_status_register_bp1_srwd, /* FIXME: Add ERSER error flag. */
16506 .unlock = spi_disable_blockprotect_bp1_srwd,
16507 .write = spi_chip_write_256,
16508 .read = spi_chip_read,
16509 .voltage = {2700, 3600},
16510 },
16511
16512 {
16513 .vendor = "Sanyo",
16514 .name = "LE25FW203A",
16515 .bustype = BUS_SPI,
16516 .manufacture_id = SANYO_ID,
16517 .model_id = SANYO_LE25FW203A,
16518 .total_size = 256,
16519 .page_size = 256,
16520 .tested = TEST_UNTESTED,
16521 .probe = probe_spi_rdid,
16522 .probe_timing = TIMING_ZERO,
16523 .block_erasers =
16524 {
16525 {
16526 .eraseblocks = { {256, 1024} },
16527 .block_erase = spi_block_erase_db,
16528 }, {
16529 .eraseblocks = { {64 * 1024, 4} },
16530 .block_erase = spi_block_erase_d8,
16531 }, {
16532 .eraseblocks = { {256 * 1024, 1} },
16533 .block_erase = spi_block_erase_c7,
16534 }
16535 },
16536 .printlock = spi_prettyprint_status_register_default_welwip,
16537 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16538 .write = spi_chip_write_256,
16539 .read = spi_chip_read,
16540 .voltage = {2700, 3600},
16541 },
16542
16543 {
16544 .vendor = "Sanyo",
16545 .name = "LE25FW403A",
16546 .bustype = BUS_SPI,
16547 .manufacture_id = SANYO_ID,
16548 .model_id = SANYO_LE25FW403A,
16549 .total_size = 512,
16550 .page_size = 256,
16551 .tested = TEST_UNTESTED,
16552 .probe = probe_spi_rdid,
16553 .probe_timing = TIMING_ZERO,
16554 .block_erasers =
16555 {
16556 {
16557 .eraseblocks = { {256, 2 * 1024} },
16558 .block_erase = spi_block_erase_db,
16559 }, {
16560 .eraseblocks = { {64 * 1024, 8} },
16561 .block_erase = spi_block_erase_d8,
16562 }, {
16563 .eraseblocks = { {512 * 1024, 1} },
16564 .block_erase = spi_block_erase_c7,
16565 }
16566 },
16567 .printlock = spi_prettyprint_status_register_default_welwip,
16568 .unlock = NULL, /* #WP pin write-protects lower 64kB. */
16569 .write = spi_chip_write_256,
16570 .read = spi_chip_read,
16571 .voltage = {2700, 3600},
16572 },
16573
16574 {
16575 .vendor = "Sanyo",
16576 .name = "LE25FW406A",
16577 .bustype = BUS_SPI,
16578 .manufacture_id = SANYO_ID,
16579 .model_id = SANYO_LE25FW406A,
16580 .total_size = 512,
16581 .page_size = 256,
16582 .feature_bits = FEATURE_WRSR_WREN,
16583 .tested = TEST_OK_PREW,
16584 .probe = probe_spi_res2,
16585 .probe_timing = TIMING_ZERO,
16586 .block_erasers =
16587 {
16588 {
16589 .eraseblocks = { {4 * 1024, 128} },
16590 .block_erase = spi_block_erase_d7,
16591 }, {
16592 .eraseblocks = { {64 * 1024, 8} },
16593 .block_erase = spi_block_erase_d8,
16594 }, {
16595 .eraseblocks = { {512 * 1024, 1} },
16596 .block_erase = spi_block_erase_c7,
16597 }
16598 },
16599 .printlock = spi_prettyprint_status_register_plain,
16600 .unlock = spi_disable_blockprotect,
16601 .write = spi_chip_write_256,
16602 .read = spi_chip_read,
16603 .voltage = {2700, 3600},
16604 },
16605
16606 {
16607 .vendor = "Sanyo",
16608 .name = "LE25FW418A",
16609 .bustype = BUS_SPI,
16610 .manufacture_id = SANYO_ID,
16611 .model_id = SANYO_LE25FW418A,
16612 .total_size = 512,
16613 .page_size = 256,
16614 .feature_bits = FEATURE_WRSR_WREN,
16615 .tested = TEST_UNTESTED,
16616 .probe = probe_spi_res2,
16617 .probe_timing = TIMING_ZERO,
16618 .block_erasers =
16619 {
16620 {
16621 .eraseblocks = { {4 * 1024, 128} },
16622 .block_erase = spi_block_erase_d7,
16623 }, {
16624 .eraseblocks = { {64 * 1024, 8} },
16625 .block_erase = spi_block_erase_d8,
16626 }, {
16627 .eraseblocks = { {512 * 1024, 1} },
16628 .block_erase = spi_block_erase_c7,
16629 }
16630 },
16631 .printlock = spi_prettyprint_status_register_bp2_srwd,
16632 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16633 .write = spi_chip_write_256,
16634 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16635 .voltage = {2700, 3600},
16636 },
16637
16638 {
16639 .vendor = "Sanyo",
16640 .name = "LE25FW806",
16641 .bustype = BUS_SPI,
16642 .manufacture_id = SANYO_ID,
16643 .model_id = SANYO_LE25FW806,
16644 .total_size = 1024,
16645 .page_size = 256,
16646 .feature_bits = FEATURE_WRSR_WREN,
16647 .tested = TEST_UNTESTED,
16648 .probe = probe_spi_res2,
16649 .probe_timing = TIMING_ZERO,
16650 .block_erasers =
16651 {
16652 {
16653 .eraseblocks = { {4 * 1024, 256} },
16654 .block_erase = spi_block_erase_20,
16655 }, {
16656 .eraseblocks = { {4 * 1024, 256} },
16657 .block_erase = spi_block_erase_d7,
16658 }, {
16659 .eraseblocks = { {64 * 1024, 16} },
16660 .block_erase = spi_block_erase_d8,
16661 }, {
16662 .eraseblocks = { {1024 * 1024, 1} },
16663 .block_erase = spi_block_erase_c7,
16664 }
16665 },
16666 .printlock = spi_prettyprint_status_register_bp2_srwd,
16667 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16668 .write = spi_chip_write_256,
16669 .read = spi_chip_read,
16670 .voltage = {2700, 3600},
16671 },
16672
16673 {
16674 .vendor = "Sanyo",
16675 .name = "LE25FW808",
16676 .bustype = BUS_SPI,
16677 .manufacture_id = SANYO_ID,
16678 .model_id = SANYO_LE25FW808,
16679 .total_size = 1024,
16680 .page_size = 256,
16681 .feature_bits = FEATURE_WRSR_WREN,
16682 .tested = TEST_UNTESTED,
16683 .probe = probe_spi_res2,
16684 .probe_timing = TIMING_ZERO,
16685 .block_erasers =
16686 {
16687 {
16688 .eraseblocks = { {8 * 1024, 128} },
16689 .block_erase = spi_block_erase_d7,
16690 }, {
16691 .eraseblocks = { {64 * 1024, 16} },
16692 .block_erase = spi_block_erase_d8,
16693 }, {
16694 .eraseblocks = { {1024 * 1024, 1} },
16695 .block_erase = spi_block_erase_c7,
16696 }
16697 },
16698 .printlock = spi_prettyprint_status_register_bp2_srwd,
16699 .unlock = spi_disable_blockprotect, /* #WP pin write-protects SRWP bit. */
16700 .write = spi_chip_write_256,
16701 .read = spi_chip_read, /* some quad-read supported ("HD_READ mode") */
16702 .voltage = {2700, 3600},
16703 },
16704
16705 {
16706 .vendor = "Sharp",
16707 .name = "LH28F008BJT-BTLZ1",
16708 .bustype = BUS_PARALLEL,
16709 .manufacture_id = SHARP_ID,
16710 .model_id = SHARP_LH28F008BJ__PB,
16711 .total_size = 1024,
16712 .page_size = 64 * 1024,
16713 .tested = TEST_OK_PREW,
16714 .probe = probe_82802ab,
16715 .probe_timing = TIMING_ZERO,
16716 .block_erasers =
16717 {
16718 {
16719 .eraseblocks = {
16720 {8 * 1024, 8},
16721 {64 * 1024, 15}
16722 },
16723 .block_erase = erase_block_82802ab,
16724 }, {
16725 .eraseblocks = { {1024 * 1024, 1} },
16726 .block_erase = erase_sector_49lfxxxc,
16727 }
16728 },
16729 .unlock = unlock_lh28f008bjt,
16730 .write = write_82802ab,
16731 .read = read_memmapped,
16732 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010016733 .prepare_access = prepare_memory_access,
16734 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016735 },
16736
16737 {
16738 .vendor = "Sharp",
16739 .name = "LHF00L04",
16740 .bustype = BUS_FWH, /* A/A Mux */
16741 .manufacture_id = SHARP_ID,
16742 .model_id = SHARP_LHF00L04,
16743 .total_size = 1024,
16744 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010016745 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016746 .tested = TEST_UNTESTED,
16747 .probe = probe_82802ab,
16748 .probe_timing = TIMING_ZERO,
16749 .block_erasers =
16750 {
16751 {
16752 .eraseblocks = {
16753 {64 * 1024, 15},
16754 {8 * 1024, 8}
16755 },
16756 .block_erase = erase_block_82802ab,
16757 }, {
16758 .eraseblocks = {
16759 {1024 * 1024, 1}
16760 },
16761 .block_erase = NULL, /* 30 D0, only in A/A mux mode */
16762 },
16763 },
16764 .unlock = unlock_regspace2_uniform_64k,
16765 .write = write_82802ab,
16766 .read = read_memmapped,
16767 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010016768 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010016769 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100016770 },
16771
16772 {
16773 .vendor = "Spansion",
16774 .name = "S25FL004A",
16775 .bustype = BUS_SPI,
16776 .manufacture_id = SPANSION_ID,
16777 .model_id = SPANSION_S25FL004A,
16778 .total_size = 512,
16779 .page_size = 256,
16780 .feature_bits = FEATURE_WRSR_WREN,
16781 .tested = TEST_UNTESTED,
16782 .probe = probe_spi_rdid,
16783 .probe_timing = TIMING_ZERO,
16784 .block_erasers =
16785 {
16786 {
16787 .eraseblocks = { {64 * 1024, 8} },
16788 .block_erase = spi_block_erase_d8,
16789 }, {
16790 .eraseblocks = { {512 * 1024, 1} },
16791 .block_erase = spi_block_erase_c7,
16792 }
16793 },
16794 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16795 .unlock = spi_disable_blockprotect,
16796 .write = spi_chip_write_256,
16797 .read = spi_chip_read,
16798 .voltage = {2700, 3600},
16799 },
16800
16801 {
16802 .vendor = "Spansion",
16803 .name = "S25FL008A",
16804 .bustype = BUS_SPI,
16805 .manufacture_id = SPANSION_ID,
16806 .model_id = SPANSION_S25FL008A,
16807 .total_size = 1024,
16808 .page_size = 256,
16809 .feature_bits = FEATURE_WRSR_WREN,
16810 .tested = TEST_OK_PRE,
16811 .probe = probe_spi_rdid,
16812 .probe_timing = TIMING_ZERO,
16813 .block_erasers =
16814 {
16815 {
16816 .eraseblocks = { {64 * 1024, 16} },
16817 .block_erase = spi_block_erase_d8,
16818 }, {
16819 .eraseblocks = { {1024 * 1024, 1} },
16820 .block_erase = spi_block_erase_c7,
16821 }
16822 },
16823 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16824 .unlock = spi_disable_blockprotect,
16825 .write = spi_chip_write_256,
16826 .read = spi_chip_read,
16827 .voltage = {2700, 3600},
16828 },
16829
16830 {
16831 .vendor = "Spansion",
16832 .name = "S25FL016A",
16833 .bustype = BUS_SPI,
16834 .manufacture_id = SPANSION_ID,
16835 .model_id = SPANSION_S25FL016A,
16836 .total_size = 2048,
16837 .page_size = 256,
16838 .feature_bits = FEATURE_WRSR_WREN,
16839 .tested = TEST_OK_PREW,
16840 .probe = probe_spi_rdid,
16841 .probe_timing = TIMING_ZERO,
16842 .block_erasers =
16843 {
16844 {
16845 .eraseblocks = { {64 * 1024, 32} },
16846 .block_erase = spi_block_erase_d8,
16847 }, {
16848 .eraseblocks = { {2 * 1024 * 1024, 1} },
16849 .block_erase = spi_block_erase_c7,
16850 }
16851 },
16852 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16853 .unlock = spi_disable_blockprotect,
16854 .write = spi_chip_write_256,
16855 .read = spi_chip_read,
16856 .voltage = {2700, 3600},
16857 },
16858
16859 {
16860 .vendor = "Spansion",
16861 .name = "S25FL032A/P",
16862 .bustype = BUS_SPI,
16863 .manufacture_id = SPANSION_ID,
16864 .model_id = SPANSION_S25FL032A,
16865 .total_size = 4096,
16866 .page_size = 256,
16867 .feature_bits = FEATURE_WRSR_WREN,
16868 .tested = TEST_OK_PREW,
16869 .probe = probe_spi_rdid,
16870 .probe_timing = TIMING_ZERO,
16871 .block_erasers =
16872 {
16873 {
16874 .eraseblocks = { {64 * 1024, 64} },
16875 .block_erase = spi_block_erase_d8,
16876 }, {
16877 .eraseblocks = { {4 * 1024 * 1024, 1} },
16878 .block_erase = spi_block_erase_c7,
16879 }
16880 },
16881 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16882 .unlock = spi_disable_blockprotect,
16883 .write = spi_chip_write_256,
16884 .read = spi_chip_read,
16885 .voltage = {2700, 3600},
16886 },
16887
16888 {
16889 .vendor = "Spansion",
16890 .name = "S25FL064A/P",
16891 .bustype = BUS_SPI,
16892 .manufacture_id = SPANSION_ID,
16893 .model_id = SPANSION_S25FL064A,
16894 .total_size = 8192,
16895 .page_size = 256,
16896 .feature_bits = FEATURE_WRSR_WREN,
16897 .tested = TEST_OK_PREW,
16898 .probe = probe_spi_rdid,
16899 .probe_timing = TIMING_ZERO,
16900 .block_erasers =
16901 {
16902 {
16903 .eraseblocks = { {64 * 1024, 128} },
16904 .block_erase = spi_block_erase_d8,
16905 }, {
16906 .eraseblocks = { {8 * 1024 * 1024, 1} },
16907 .block_erase = spi_block_erase_c7,
16908 }
16909 },
16910 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
16911 .unlock = spi_disable_blockprotect,
16912 .write = spi_chip_write_256,
16913 .read = spi_chip_read,
16914 .voltage = {2700, 3600},
16915 },
16916
16917 {
16918 .vendor = "Spansion",
16919 .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
16920 .bustype = BUS_SPI,
16921 .manufacture_id = SPANSION_ID,
16922 .model_id = SPANSION_S25FL216,
16923 .total_size = 2048,
16924 .page_size = 256,
16925 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (S25FL116K only) */
16926 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16927 .tested = TEST_UNTESTED,
16928 .probe = probe_spi_rdid,
16929 .probe_timing = TIMING_ZERO,
16930 .block_erasers =
16931 {
16932 {
16933 .eraseblocks = { {4 * 1024, 512} },
16934 .block_erase = spi_block_erase_20,
16935 }, {
16936 .eraseblocks = { {64 * 1024, 32} },
16937 .block_erase = spi_block_erase_d8,
16938 }, {
16939 .eraseblocks = { { 2048 * 1024, 1} },
16940 .block_erase = spi_block_erase_60,
16941 }, {
16942 .eraseblocks = { { 2048 * 1024, 1} },
16943 .block_erase = spi_block_erase_c7,
16944 }
16945 },
16946 .printlock = spi_prettyprint_status_register_bp3_srwd,
16947 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
16948 .write = spi_chip_write_256,
16949 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
16950 .voltage = {2700, 3600},
16951 },
16952
16953 {
16954 .vendor = "Spansion",
16955 .name = "S25FL127S-256kB", /* uniform 256kB sectors */
16956 .bustype = BUS_SPI,
16957 .manufacture_id = SPANSION_ID,
16958 .model_id = SPANSION_S25FL128,
16959 .total_size = 16384,
16960 .page_size = 512,
16961 /* supports 4B addressing */
16962 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16963 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16964 .tested = TEST_UNTESTED,
16965 .probe = probe_spi_rdid,
16966 .probe_timing = TIMING_ZERO,
16967 .block_erasers =
16968 {
16969 {
16970 .eraseblocks = { {256 * 1024, 64} },
16971 .block_erase = spi_block_erase_d8,
16972 }, {
16973 .eraseblocks = { { 16384 * 1024, 1} },
16974 .block_erase = spi_block_erase_60,
16975 }, {
16976 .eraseblocks = { { 16384 * 1024, 1} },
16977 .block_erase = spi_block_erase_c7,
16978 }
16979 },
16980 .printlock = spi_prettyprint_status_register_bp2_srwd,
16981 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
16982 .write = spi_chip_write_256, /* Multi I/O supported */
16983 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
16984 .voltage = {2700, 3600},
16985 },
16986
16987 {
16988 .vendor = "Spansion",
16989 .name = "S25FL127S-64kB", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
16990 .bustype = BUS_SPI,
16991 .manufacture_id = SPANSION_ID,
16992 .model_id = SPANSION_S25FL128,
16993 .total_size = 16384,
16994 .page_size = 256,
16995 /* supports 4B addressing */
16996 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
16997 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
16998 .tested = TEST_OK_PREW,
16999 /* FIXME: we should distinguish the configuration on probing time like we do for AT45DB chips */
17000 .probe = probe_spi_rdid,
17001 .probe_timing = TIMING_ZERO,
17002 .block_erasers =
17003 {
17004 {
17005 /* This chip supports erasing of 32 so-called "parameter sectors" with
17006 * opcode 0x20 which may be configured to be on top or bottom of the address
17007 * space. Trying to access an address outside these 4kB blocks does have no
17008 * effect on the memory contents, e.g.
17009 .eraseblocks = {
17010 {4 * 1024, 32},
17011 {64 * 1024, 254} // inaccessible
17012 },
17013 .block_erase = spi_block_erase_20,
17014 }, { */
17015 .eraseblocks = { { 64 * 1024, 256} },
17016 .block_erase = spi_block_erase_d8,
17017 }, {
17018 .eraseblocks = { { 16384 * 1024, 1} },
17019 .block_erase = spi_block_erase_60,
17020 }, {
17021 .eraseblocks = { { 16384 * 1024, 1} },
17022 .block_erase = spi_block_erase_c7,
17023 }
17024 },
17025 .printlock = spi_prettyprint_status_register_bp2_srwd,
17026 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17027 .write = spi_chip_write_256, /* Multi I/O supported */
17028 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17029 .voltage = {2700, 3600},
17030 },
17031
17032 {
17033 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017034 .name = "S25FL128L",
17035 .bustype = BUS_SPI,
17036 .manufacture_id = SPANSION_ID,
17037 .model_id = SPANSION_S25FL128L,
17038 .total_size = 16384,
17039 .page_size = 256,
17040 /* 4 x 256B Security Region (OTP) */
17041 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP,
17042 .tested = TEST_UNTESTED,
17043 .probe = probe_spi_rdid,
17044 .probe_timing = TIMING_ZERO,
17045 .block_erasers =
17046 {
17047 {
17048 .eraseblocks = { {4 * 1024, 4096} },
17049 .block_erase = spi_block_erase_20,
17050 }, {
17051 .eraseblocks = { {32 * 1024, 512} },
17052 .block_erase = spi_block_erase_52,
17053 }, {
17054 .eraseblocks = { {64 * 1024, 256} },
17055 .block_erase = spi_block_erase_d8,
17056 }, {
17057 .eraseblocks = { {16384 * 1024, 1} },
17058 .block_erase = spi_block_erase_60,
17059 }, {
17060 .eraseblocks = { {16384 * 1024, 1} },
17061 .block_erase = spi_block_erase_c7,
17062 }
17063 },
17064 .printlock = spi_prettyprint_status_register_bp2_srwd,
17065 .unlock = spi_disable_blockprotect_bp2_srwd,
17066 .write = spi_chip_write_256,
17067 .read = spi_chip_read, /* Fast read (0x0B) supported */
17068 .voltage = {2700, 3600},
17069 .reg_bits =
17070 {
17071 /*
17072 * Note: This chip has a read-only Status Register 2 that is not
17073 * counted here. Registers are mapped as follows:
17074 * STATUS1 ... Status Register 1
17075 * STATUS2 ... Configuration Register 1
17076 * STATUS3 ... Configuration Register 2
17077 */
17078 .srp = {STATUS1, 7, RW},
17079 .srl = {STATUS2, 0, RW},
17080 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
17081 .tb = {STATUS1, 5, RW},
17082 .sec = {STATUS1, 6, RW},
17083 .cmp = {STATUS2, 6, RW},
17084 .wps = {STATUS3, 2, RW},
17085 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017086 .wp_write_cfg = spi_wp_write_cfg,
17087 .wp_read_cfg = spi_wp_read_cfg,
17088 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017089 .decode_range = decode_range_spi25,
17090 },
17091
17092 {
17093 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017094 .name = "S25FL128P......0", /* uniform 64 kB sectors */
17095 .bustype = BUS_SPI,
17096 .manufacture_id = SPANSION_ID,
17097 .model_id = SPANSION_S25FL128,
17098 .total_size = 16384,
17099 .page_size = 256,
17100 .feature_bits = FEATURE_WRSR_WREN,
17101 .tested = TEST_OK_PREW,
17102 .probe = probe_spi_rdid,
17103 .probe_timing = TIMING_ZERO,
17104 .block_erasers =
17105 {
17106 {
17107 .eraseblocks = { {64 * 1024, 256} },
17108 .block_erase = spi_block_erase_20,
17109 }, {
17110 .eraseblocks = { {64 * 1024, 256} },
17111 .block_erase = spi_block_erase_d8,
17112 }, {
17113 .eraseblocks = { { 16384 * 1024, 1} },
17114 .block_erase = spi_block_erase_60,
17115 }, {
17116 .eraseblocks = { { 16384 * 1024, 1} },
17117 .block_erase = spi_block_erase_c7,
17118 }
17119 },
17120 .printlock = spi_prettyprint_status_register_bp3_srwd,
17121 .unlock = spi_disable_blockprotect_bp3_srwd,
17122 .write = spi_chip_write_256,
17123 .read = spi_chip_read, /* Fast read (0x0B) supported */
17124 .voltage = {2700, 3600},
17125 },
17126
17127 {
17128 .vendor = "Spansion",
17129 .name = "S25FL128P......1", /* uniform 256kB sectors */
17130 .bustype = BUS_SPI,
17131 .manufacture_id = SPANSION_ID,
17132 .model_id = SPANSION_S25FL128,
17133 .total_size = 16384,
17134 .page_size = 256,
17135 .feature_bits = FEATURE_WRSR_WREN,
17136 .tested = TEST_UNTESTED,
17137 .probe = probe_spi_rdid,
17138 .probe_timing = TIMING_ZERO,
17139 .block_erasers =
17140 {
17141 {
17142 .eraseblocks = { {256 * 1024, 64} },
17143 .block_erase = spi_block_erase_d8,
17144 }, {
17145 .eraseblocks = { { 16384 * 1024, 1} },
17146 .block_erase = spi_block_erase_c7,
17147 }
17148 },
17149 .printlock = spi_prettyprint_status_register_bp2_srwd,
17150 .unlock = spi_disable_blockprotect_bp2_srwd,
17151 .write = spi_chip_write_256,
17152 .read = spi_chip_read, /* Fast read (0x0B) supported */
17153 .voltage = {2700, 3600},
17154 },
17155
17156 {
17157 .vendor = "Spansion",
17158 .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17159 .bustype = BUS_SPI,
17160 .manufacture_id = SPANSION_ID,
17161 .model_id = SPANSION_S25FL128,
17162 .total_size = 16384,
17163 .page_size = 256,
17164 /* supports 4B addressing */
17165 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17166 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17167 .tested = TEST_OK_PREW,
17168 .probe = probe_spi_rdid,
17169 .probe_timing = TIMING_ZERO,
17170 .block_erasers =
17171 {
17172 {
17173 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17174 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17175 * have no effect on the memory contents, but sets a flag in the SR.
17176 .eraseblocks = {
17177 {4 * 1024, 32},
17178 {64 * 1024, 254} // inaccessible
17179 },
17180 .block_erase = spi_block_erase_20,
17181 }, { */
17182 .eraseblocks = { { 64 * 1024, 256} },
17183 .block_erase = spi_block_erase_d8,
17184 }, {
17185 .eraseblocks = { { 16384 * 1024, 1} },
17186 .block_erase = spi_block_erase_60,
17187 }, {
17188 .eraseblocks = { { 16384 * 1024, 1} },
17189 .block_erase = spi_block_erase_c7,
17190 }
17191 },
17192 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17193 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17194 .write = spi_chip_write_256, /* Multi I/O supported */
17195 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17196 .voltage = {2700, 3600},
17197 },
17198
17199 {
17200 .vendor = "Spansion",
17201 .name = "S25FL128S......1", /* uniform 256 kB sectors */
17202 .bustype = BUS_SPI,
17203 .manufacture_id = SPANSION_ID,
17204 .model_id = SPANSION_S25FL128,
17205 .total_size = 16384,
17206 .page_size = 512,
17207 /* supports 4B addressing */
17208 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
17209 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17210 .tested = TEST_UNTESTED,
17211 .probe = probe_spi_rdid,
17212 .probe_timing = TIMING_ZERO,
17213 .block_erasers =
17214 {
17215 {
17216 .eraseblocks = { {256 * 1024, 64} },
17217 .block_erase = spi_block_erase_d8,
17218 }, {
17219 .eraseblocks = { { 16384 * 1024, 1} },
17220 .block_erase = spi_block_erase_60,
17221 }, {
17222 .eraseblocks = { { 16384 * 1024, 1} },
17223 .block_erase = spi_block_erase_c7,
17224 }
17225 },
17226 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17227 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17228 .write = spi_chip_write_256, /* Multi I/O supported */
17229 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17230 .voltage = {2700, 3600},
17231 },
17232
17233 {
17234 .vendor = "Spansion",
17235 .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17236 .bustype = BUS_SPI,
17237 .manufacture_id = SPANSION_ID,
17238 .model_id = SPANSION_S25FL128,
17239 .total_size = 16384,
17240 .page_size = 256,
17241 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17242 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17243 .tested = TEST_OK_PREW,
17244 .probe = probe_spi_rdid,
17245 .probe_timing = TIMING_ZERO,
17246 .block_erasers =
17247 {
17248 {
17249 /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
17250 * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
17251 * effect on the memory contents, but sets a flag in the SR.
17252 .eraseblocks = {
17253 {4 * 1024, 32},
17254 {64 * 1024, 254} // inaccessible
17255 },
17256 .block_erase = spi_block_erase_20,
17257 }, { */
17258 /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
17259 .eraseblocks = {
17260 {8 * 1024, 16},
17261 {64 * 1024, 254} // inaccessible
17262 },
17263 .block_erase = spi_block_erase_40,
17264 }, { */
17265 .eraseblocks = { { 64 * 1024, 256} },
17266 .block_erase = spi_block_erase_d8,
17267 }, {
17268 .eraseblocks = { { 16384 * 1024, 1} },
17269 .block_erase = spi_block_erase_60,
17270 }, {
17271 .eraseblocks = { { 16384 * 1024, 1} },
17272 .block_erase = spi_block_erase_c7,
17273 }
17274 },
17275 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17276 .unlock = spi_disable_blockprotect_bp2_srwd,
17277 .write = spi_chip_write_256, /* Multi I/O supported */
17278 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17279 .voltage = {2700, 3600},
17280 },
17281
17282 {
17283 .vendor = "Spansion",
17284 .name = "S25FL129P......1", /* uniform 256 kB sectors */
17285 .bustype = BUS_SPI,
17286 .manufacture_id = SPANSION_ID,
17287 .model_id = SPANSION_S25FL128,
17288 .total_size = 16384,
17289 .page_size = 256,
17290 /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
17291 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17292 .tested = TEST_UNTESTED,
17293 .probe = probe_spi_rdid,
17294 .probe_timing = TIMING_ZERO,
17295 .block_erasers =
17296 {
17297 {
17298 .eraseblocks = { {256 * 1024, 64} },
17299 .block_erase = spi_block_erase_d8,
17300 }, {
17301 .eraseblocks = { { 16384 * 1024, 1} },
17302 .block_erase = spi_block_erase_60,
17303 }, {
17304 .eraseblocks = { { 16384 * 1024, 1} },
17305 .block_erase = spi_block_erase_c7,
17306 }
17307 },
17308 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
17309 .unlock = spi_disable_blockprotect_bp2_srwd,
17310 .write = spi_chip_write_256, /* Multi I/O supported */
17311 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17312 .voltage = {2700, 3600},
17313 },
17314
17315 {
17316 .vendor = "Spansion",
17317 .name = "S25FL132K",
17318 .bustype = BUS_SPI,
17319 .manufacture_id = SPANSION_ID,
17320 .model_id = SPANSION_S25FL132K,
17321 .total_size = 4096,
17322 .page_size = 256,
17323 /* OTP: 768B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17324 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17325 .tested = TEST_UNTESTED,
17326 .probe = probe_spi_rdid,
17327 .probe_timing = TIMING_ZERO,
17328 .block_erasers =
17329 {
17330 {
17331 .eraseblocks = { {4 * 1024, 1024} },
17332 .block_erase = spi_block_erase_20,
17333 }, {
17334 .eraseblocks = { {64 * 1024, 64} },
17335 .block_erase = spi_block_erase_d8,
17336 }, {
17337 .eraseblocks = { { 4096 * 1024, 1} },
17338 .block_erase = spi_block_erase_60,
17339 }, {
17340 .eraseblocks = { { 4096 * 1024, 1} },
17341 .block_erase = spi_block_erase_c7,
17342 }
17343 },
17344 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17345 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17346 .write = spi_chip_write_256,
17347 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17348 .voltage = {2700, 3600},
17349 },
17350
17351 {
17352 .vendor = "Spansion",
17353 .name = "S25FL164K",
17354 .bustype = BUS_SPI,
17355 .manufacture_id = SPANSION_ID,
17356 .model_id = SPANSION_S25FL164K,
17357 .total_size = 8192,
17358 .page_size = 256,
17359 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 */
17360 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
17361 .tested = TEST_OK_PREW,
17362 .probe = probe_spi_rdid,
17363 .probe_timing = TIMING_ZERO,
17364 .block_erasers =
17365 {
17366 {
17367 .eraseblocks = { {4 * 1024, 2048} },
17368 .block_erase = spi_block_erase_20,
17369 }, {
17370 .eraseblocks = { {64 * 1024, 128} },
17371 .block_erase = spi_block_erase_d8,
17372 }, {
17373 .eraseblocks = { { 8192 * 1024, 1} },
17374 .block_erase = spi_block_erase_60,
17375 }, {
17376 .eraseblocks = { { 8192 * 1024, 1} },
17377 .block_erase = spi_block_erase_c7,
17378 }
17379 },
17380 .printlock = spi_prettyprint_status_register_bp2_srwd, /* TODO: improve */
17381 .unlock = spi_disable_blockprotect_bp2_srwd, /* #WP pin write-protects SRWP bit. */
17382 .write = spi_chip_write_256,
17383 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17384 .voltage = {2700, 3600},
17385 },
17386
17387 {
17388 .vendor = "Spansion",
17389 .name = "S25FL204K",
17390 .bustype = BUS_SPI,
17391 .manufacture_id = SPANSION_ID,
17392 .model_id = SPANSION_S25FL204,
17393 .total_size = 512,
17394 .page_size = 256,
17395 .feature_bits = FEATURE_WRSR_WREN,
17396 .tested = TEST_OK_PR,
17397 .probe = probe_spi_rdid,
17398 .probe_timing = TIMING_ZERO,
17399 .block_erasers =
17400 {
17401 {
17402 .eraseblocks = { {4 * 1024, 128} },
17403 .block_erase = spi_block_erase_20,
17404 }, {
17405 .eraseblocks = { {64 * 1024, 8} },
17406 .block_erase = spi_block_erase_d8,
17407 }, {
17408 .eraseblocks = { { 512 * 1024, 1} },
17409 .block_erase = spi_block_erase_60,
17410 }, {
17411 .eraseblocks = { { 512 * 1024, 1} },
17412 .block_erase = spi_block_erase_c7,
17413 }
17414 },
17415 .printlock = spi_prettyprint_status_register_bp3_srwd,
17416 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17417 .write = spi_chip_write_256,
17418 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17419 .voltage = {2700, 3600},
17420 },
17421
17422 {
17423 .vendor = "Spansion",
17424 .name = "S25FL208K",
17425 .bustype = BUS_SPI,
17426 .manufacture_id = SPANSION_ID,
17427 .model_id = SPANSION_S25FL208,
17428 .total_size = 1024,
17429 .page_size = 256,
17430 .feature_bits = FEATURE_WRSR_WREN,
17431 .tested = TEST_OK_PREW,
17432 .probe = probe_spi_rdid,
17433 .probe_timing = TIMING_ZERO,
17434 .block_erasers =
17435 {
17436 {
17437 .eraseblocks = { {4 * 1024, 256} },
17438 .block_erase = spi_block_erase_20,
17439 }, {
17440 .eraseblocks = { {64 * 1024, 16} },
17441 .block_erase = spi_block_erase_d8,
17442 }, {
17443 .eraseblocks = { { 1024 * 1024, 1} },
17444 .block_erase = spi_block_erase_60,
17445 }, {
17446 .eraseblocks = { { 1024 * 1024, 1} },
17447 .block_erase = spi_block_erase_c7,
17448 }
17449 },
17450 .printlock = spi_prettyprint_status_register_bp3_srwd,
17451 .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
17452 .write = spi_chip_write_256,
17453 .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
17454 .voltage = {2700, 3600},
17455 },
17456
17457 {
17458 .vendor = "Spansion",
Nico Huberfffc48d2022-05-28 14:26:06 +020017459 .name = "S25FL256L",
17460 .bustype = BUS_SPI,
17461 .manufacture_id = SPANSION_ID,
17462 .model_id = SPANSION_S25FL256L,
17463 .total_size = 32768,
17464 .page_size = 256,
17465 /* 4 x 256B Security Region (OTP) */
17466 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT3 | FEATURE_OTP |
17467 FEATURE_4BA_ENTER | FEATURE_4BA_NATIVE,
17468 .tested = TEST_UNTESTED,
17469 .probe = probe_spi_rdid,
17470 .probe_timing = TIMING_ZERO,
17471 .block_erasers =
17472 {
17473 {
17474 .eraseblocks = { {4 * 1024, 8192} },
17475 .block_erase = spi_block_erase_21,
17476 }, {
17477 .eraseblocks = { {4 * 1024, 8192} },
17478 .block_erase = spi_block_erase_20,
17479 }, {
17480 .eraseblocks = { {32 * 1024, 1024} },
17481 .block_erase = spi_block_erase_53,
17482 }, {
17483 .eraseblocks = { {32 * 1024, 1024} },
17484 .block_erase = spi_block_erase_52,
17485 }, {
17486 .eraseblocks = { {64 * 1024, 512} },
17487 .block_erase = spi_block_erase_dc,
17488 }, {
17489 .eraseblocks = { {64 * 1024, 512} },
17490 .block_erase = spi_block_erase_d8,
17491 }, {
17492 .eraseblocks = { {32768 * 1024, 1} },
17493 .block_erase = spi_block_erase_60,
17494 }, {
17495 .eraseblocks = { {32768 * 1024, 1} },
17496 .block_erase = spi_block_erase_c7,
17497 }
17498 },
17499 .printlock = spi_prettyprint_status_register_bp3_srwd,
17500 .unlock = spi_disable_blockprotect_bp3_srwd,
17501 .write = spi_chip_write_256,
17502 .read = spi_chip_read, /* Fast read (0x0B) supported */
17503 .voltage = {2700, 3600},
17504 .reg_bits =
17505 {
17506 /*
17507 * Note: This chip has a read-only Status Register 2 that is not
17508 * counted here. Registers are mapped as follows:
17509 * STATUS1 ... Status Register 1
17510 * STATUS2 ... Configuration Register 1
17511 * STATUS3 ... Configuration Register 2
17512 */
17513 .srp = {STATUS1, 7, RW},
17514 .srl = {STATUS2, 0, RW},
17515 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
17516 .tb = {STATUS1, 6, RW},
17517 .cmp = {STATUS2, 6, RW},
17518 .wps = {STATUS3, 2, RW},
17519 },
Nico Huberaabb3e02023-01-13 00:22:30 +010017520 .wp_write_cfg = spi_wp_write_cfg,
17521 .wp_read_cfg = spi_wp_read_cfg,
17522 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huberfffc48d2022-05-28 14:26:06 +020017523 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010017524 .prepare_access = spi_prepare_4ba,
Nico Huberfffc48d2022-05-28 14:26:06 +020017525 },
17526
17527 {
17528 .vendor = "Spansion",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017529 .name = "S25FL256S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
17530 .bustype = BUS_SPI,
17531 .manufacture_id = SPANSION_ID,
17532 .model_id = SPANSION_S25FL256,
17533 .total_size = 32768,
17534 .page_size = 256,
17535 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber9bb8a322022-05-24 15:07:34 +020017536 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17537 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017538 .tested = TEST_OK_PREW,
17539 .probe = probe_spi_rdid,
17540 .probe_timing = TIMING_ZERO,
17541 .block_erasers =
17542 {
17543 {
17544 /* This chip supports erasing of the 32 so-called "parameter sectors" with
17545 * opcode 0x20. Trying to access an address outside these 4kB blocks does
17546 * have no effect on the memory contents, but sets a flag in the SR.
17547 .eraseblocks = {
17548 {4 * 1024, 32},
17549 {64 * 1024, 254} // inaccessible
17550 },
17551 .block_erase = spi_block_erase_20,
17552 }, { */
17553 .eraseblocks = { { 64 * 1024, 512} },
17554 .block_erase = spi_block_erase_dc,
17555 }, {
17556 .eraseblocks = { { 64 * 1024, 512} },
17557 .block_erase = spi_block_erase_d8,
17558 }, {
17559 .eraseblocks = { { 32768 * 1024, 1} },
17560 .block_erase = spi_block_erase_60,
17561 }, {
17562 .eraseblocks = { { 32768 * 1024, 1} },
17563 .block_erase = spi_block_erase_c7,
17564 }
17565 },
17566 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17567 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17568 .write = spi_chip_write_256, /* Multi I/O supported */
17569 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17570 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010017571 .prepare_access = spi_prepare_4ba,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017572 },
17573
17574 {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017575 .vendor = "Spansion",
17576 .name = "S25FL512S",
17577 .bustype = BUS_SPI,
17578 .manufacture_id = SPANSION_ID,
17579 .model_id = SPANSION_S25FL512,
17580 .total_size = 65536, /* 512 Mb (=> 64 MB)) */
17581 .page_size = 256,
17582 /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
Nico Huber26237922022-06-20 19:37:37 +020017583 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP |
17584 FEATURE_4BA_NATIVE | FEATURE_4BA_ENTER_EAR7 | FEATURE_4BA_EAR_1716,
17585 .tested = TEST_UNTESTED,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017586 .probe = probe_spi_rdid,
17587 .probe_timing = TIMING_ZERO,
17588 .block_erasers =
17589 {
17590 {
17591 .eraseblocks = { { 256 * 1024, 256} },
17592 .block_erase = spi_block_erase_dc,
17593 }, {
Nico Huberbb608ff2022-05-24 15:33:26 +020017594 .eraseblocks = { { 256 * 1024, 256} },
17595 .block_erase = spi_block_erase_d8,
17596 }, {
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017597 .eraseblocks = { { 65536 * 1024, 1} },
17598 .block_erase = spi_block_erase_60,
17599 }, {
17600 .eraseblocks = { { 65536 * 1024, 1} },
17601 .block_erase = spi_block_erase_c7,
17602 }
17603 },
17604 .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
17605 .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
17606 .write = spi_chip_write_256, /* Multi I/O supported, IGNORE for now */
17607 .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
17608 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010017609 .prepare_access = spi_prepare_4ba,
Bernhard Urban-Forster05c629b2020-02-02 21:29:48 +010017610 },
17611
17612 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017613 .vendor = "SyncMOS/MoselVitelic",
17614 .name = "{F,S,V}29C51001B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017615 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017616 .manufacture_id = SYNCMOS_MVC_ID,
17617 .model_id = SM_MVC_29C51001B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017618 .total_size = 128,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017619 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017620 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017621 .tested = TEST_UNTESTED,
17622 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017623 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017624 .block_erasers =
17625 {
17626 {
17627 .eraseblocks = { {512, 256} },
17628 .block_erase = erase_sector_jedec,
17629 }, {
17630 .eraseblocks = { {128 * 1024, 1} },
17631 .block_erase = erase_chip_block_jedec,
17632 },
17633 },
Sean Nelson35727f72010-01-28 23:55:12 +000017634 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017635 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017636 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017637 .prepare_access = prepare_memory_access,
17638 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017639 },
17640
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017641 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017642 .vendor = "SyncMOS/MoselVitelic",
17643 .name = "{F,S,V}29C51001T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017644 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017645 .manufacture_id = SYNCMOS_MVC_ID,
17646 .model_id = SM_MVC_29C51001T,
17647 .total_size = 128,
17648 .page_size = 512,
Sean Nelson35727f72010-01-28 23:55:12 +000017649 .feature_bits = FEATURE_EITHER_RESET,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017650 .tested = TEST_UNTESTED,
17651 .probe = probe_jedec,
17652 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17653 .block_erasers =
17654 {
17655 {
17656 .eraseblocks = { {512, 256} },
17657 .block_erase = erase_sector_jedec,
17658 }, {
17659 .eraseblocks = { {128 * 1024, 1} },
17660 .block_erase = erase_chip_block_jedec,
17661 },
17662 },
17663 .write = write_jedec_1,
17664 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017665 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017666 .prepare_access = prepare_memory_access,
17667 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017668 },
17669
17670 {
17671 .vendor = "SyncMOS/MoselVitelic",
17672 .name = "{F,S,V}29C51002B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017673 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017674 .manufacture_id = SYNCMOS_MVC_ID,
17675 .model_id = SM_MVC_29C51002B,
17676 .total_size = 256,
17677 .page_size = 512,
17678 .feature_bits = FEATURE_EITHER_RESET,
17679 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017680 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017681 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017682 .block_erasers =
17683 {
17684 {
17685 .eraseblocks = { {512, 512} },
17686 .block_erase = erase_sector_jedec,
17687 }, {
17688 .eraseblocks = { {256 * 1024, 1} },
17689 .block_erase = erase_chip_block_jedec,
17690 },
17691 },
Sean Nelson35727f72010-01-28 23:55:12 +000017692 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017693 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017694 .prepare_access = prepare_memory_access,
17695 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017696 },
17697
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017698 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017699 .vendor = "SyncMOS/MoselVitelic",
17700 .name = "{F,S,V}29C51002T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017701 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017702 .manufacture_id = SYNCMOS_MVC_ID,
17703 .model_id = SM_MVC_29C51002T,
17704 .total_size = 256,
17705 .page_size = 512,
17706 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000017707 .tested = TEST_OK_PREW,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017708 .probe = probe_jedec,
17709 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17710 .block_erasers =
17711 {
17712 {
17713 .eraseblocks = { {512, 512} },
17714 .block_erase = erase_sector_jedec,
17715 }, {
17716 .eraseblocks = { {256 * 1024, 1} },
17717 .block_erase = erase_chip_block_jedec,
17718 },
17719 },
17720 .write = write_jedec_1,
17721 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010017722 .prepare_access = prepare_memory_access,
17723 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017724 },
17725
17726 {
17727 .vendor = "SyncMOS/MoselVitelic",
17728 .name = "{F,S,V}29C51004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017729 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017730 .manufacture_id = SYNCMOS_MVC_ID,
17731 .model_id = SM_MVC_29C51004B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017732 .total_size = 512,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017733 .page_size = 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000017734 .feature_bits = FEATURE_EITHER_RESET,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017735 .tested = TEST_UNTESTED,
17736 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017737 .probe_timing = TIMING_ZERO,
Sean Nelson56358aa2010-01-19 16:08:51 +000017738 .block_erasers =
17739 {
17740 {
Mattias Mattsson4c066502010-07-29 20:01:13 +000017741 .eraseblocks = { {1024, 512} },
17742 .block_erase = erase_sector_jedec,
17743 }, {
17744 .eraseblocks = { {512 * 1024, 1} },
17745 .block_erase = erase_chip_block_jedec,
17746 },
17747 },
17748 .write = write_jedec_1,
17749 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017750 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017751 .prepare_access = prepare_memory_access,
17752 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017753 },
17754
17755 {
17756 .vendor = "SyncMOS/MoselVitelic",
17757 .name = "{F,S,V}29C51004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017758 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017759 .manufacture_id = SYNCMOS_MVC_ID,
17760 .model_id = SM_MVC_29C51004T,
17761 .total_size = 512,
17762 .page_size = 1024,
17763 .feature_bits = FEATURE_EITHER_RESET,
17764 .tested = TEST_UNTESTED,
17765 .probe = probe_jedec,
17766 .probe_timing = TIMING_ZERO,
17767 .block_erasers =
17768 {
17769 {
17770 .eraseblocks = { {1024, 512} },
17771 .block_erase = erase_sector_jedec,
17772 }, {
17773 .eraseblocks = { {512 * 1024, 1} },
17774 .block_erase = erase_chip_block_jedec,
17775 },
17776 },
17777 .write = write_jedec_1,
17778 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017779 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017780 .prepare_access = prepare_memory_access,
17781 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017782 },
17783
17784 {
17785 .vendor = "SyncMOS/MoselVitelic",
17786 .name = "{S,V}29C31004B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017787 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017788 .manufacture_id = SYNCMOS_MVC_ID,
17789 .model_id = SM_MVC_29C31004B,
17790 .total_size = 512,
17791 .page_size = 1024,
17792 .feature_bits = FEATURE_EITHER_RESET,
17793 .tested = TEST_UNTESTED,
17794 .probe = probe_jedec,
17795 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17796 .block_erasers =
17797 {
17798 {
17799 .eraseblocks = { {1024, 512} },
17800 .block_erase = erase_sector_jedec,
17801 }, {
17802 .eraseblocks = { {512 * 1024, 1} },
17803 .block_erase = erase_chip_block_jedec,
17804 },
17805 },
17806 .write = write_jedec_1,
17807 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017808 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017809 .prepare_access = prepare_memory_access,
17810 .finish_access = finish_memory_access,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017811 },
17812
17813 {
17814 .vendor = "SyncMOS/MoselVitelic",
17815 .name = "{S,V}29C31004T",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017816 .bustype = BUS_PARALLEL,
Mattias Mattsson4c066502010-07-29 20:01:13 +000017817 .manufacture_id = SYNCMOS_MVC_ID,
17818 .model_id = SM_MVC_29C31004T,
17819 .total_size = 512,
17820 .page_size = 1024,
17821 .feature_bits = FEATURE_EITHER_RESET,
17822 .tested = TEST_UNTESTED,
17823 .probe = probe_jedec,
17824 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
17825 .block_erasers =
17826 {
17827 {
17828 .eraseblocks = { {1024, 512} },
Sean Nelson56358aa2010-01-19 16:08:51 +000017829 .block_erase = erase_sector_jedec,
17830 }, {
17831 .eraseblocks = { {512 * 1024, 1} },
17832 .block_erase = erase_chip_block_jedec,
17833 },
17834 },
Sean Nelson35727f72010-01-28 23:55:12 +000017835 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000017836 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017837 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010017838 .prepare_access = prepare_memory_access,
17839 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000017840 },
17841
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017842 {
Uwe Hermanna106d152009-05-27 23:17:40 +000017843 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017844 .name = "TMS29F002RB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017845 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017846 .manufacture_id = TI_OLD_ID,
17847 .model_id = TI_TMS29F002RB,
17848 .total_size = 256,
17849 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000017850 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017851 .tested = TEST_UNTESTED,
17852 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017853 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017854 .block_erasers =
17855 {
17856 {
17857 .eraseblocks = {
17858 {16 * 1024, 1},
17859 {8 * 1024, 2},
17860 {32 * 1024, 1},
17861 {64 * 1024, 3},
17862 },
17863 .block_erase = erase_sector_jedec,
17864 }, {
17865 .eraseblocks = { {256 * 1024, 1} },
17866 .block_erase = erase_chip_block_jedec,
17867 },
17868 },
Sean Nelson35727f72010-01-28 23:55:12 +000017869 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017870 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017871 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017872 .prepare_access = prepare_memory_access,
17873 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017874 },
17875
17876 {
Uwe Hermanna106d152009-05-27 23:17:40 +000017877 .vendor = "TI",
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017878 .name = "TMS29F002RT",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017879 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017880 .manufacture_id = TI_OLD_ID,
17881 .model_id = TI_TMS29F002RT,
17882 .total_size = 256,
17883 .page_size = 16384, /* Non-uniform sectors */
Sean Nelson35727f72010-01-28 23:55:12 +000017884 .feature_bits = FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017885 .tested = TEST_UNTESTED,
17886 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000017887 .probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
Sean Nelson56358aa2010-01-19 16:08:51 +000017888 .block_erasers =
17889 {
17890 {
17891 .eraseblocks = {
17892 {64 * 1024, 3},
17893 {32 * 1024, 1},
17894 {8 * 1024, 2},
17895 {16 * 1024, 1},
17896 },
17897 .block_erase = erase_sector_jedec,
17898 }, {
17899 .eraseblocks = { {256 * 1024, 1} },
17900 .block_erase = erase_chip_block_jedec,
17901 },
17902 },
Sean Nelson35727f72010-01-28 23:55:12 +000017903 .write = write_jedec_1,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017904 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000017905 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010017906 .prepare_access = prepare_memory_access,
17907 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger09b4fb72009-05-26 21:26:23 +000017908 },
17909
17910 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000017911 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017912 .name = "W25P16",
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017913 .bustype = BUS_SPI,
17914 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017915 .model_id = WINBOND_NEX_W25P16,
17916 .total_size = 2048,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017917 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017918 .feature_bits = FEATURE_WRSR_WREN,
17919 .tested = TEST_UNTESTED,
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017920 .probe = probe_spi_rdid,
17921 .probe_timing = TIMING_ZERO,
17922 .block_erasers =
17923 {
17924 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017925 .eraseblocks = { {64 * 1024, 32} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017926 .block_erase = spi_block_erase_d8,
17927 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017928 .eraseblocks = { {2048 * 1024, 1} },
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017929 .block_erase = spi_block_erase_c7,
17930 }
17931 },
17932 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17933 .unlock = spi_disable_blockprotect,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017934 .write = spi_chip_write_256,
17935 .read = spi_chip_read, /* Fast read (0x0B) supported */
Stefan Tauner5e27b0b2014-09-09 23:03:32 +000017936 .voltage = {2700, 3600},
17937 },
17938
17939 {
17940 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100017941 .name = "W25P32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000017942 .bustype = BUS_SPI,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017943 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017944 .model_id = WINBOND_NEX_W25P32,
17945 .total_size = 4096,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017946 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017947 .feature_bits = FEATURE_WRSR_WREN,
17948 .tested = TEST_UNTESTED,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017949 .probe = probe_spi_rdid,
17950 .probe_timing = TIMING_ZERO,
17951 .block_erasers =
17952 {
17953 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017954 .eraseblocks = { {64 * 1024, 64} },
17955 .block_erase = spi_block_erase_d8,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017956 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100017957 .eraseblocks = { {4096 * 1024, 1} },
17958 .block_erase = spi_block_erase_c7,
17959 }
17960 },
17961 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
17962 .unlock = spi_disable_blockprotect,
17963 .write = spi_chip_write_256,
17964 .read = spi_chip_read, /* Fast read (0x0B) supported */
17965 .voltage = {2700, 3600},
17966 },
17967
17968 {
17969 .vendor = "Winbond",
17970 .name = "W25P80",
17971 .bustype = BUS_SPI,
17972 .manufacture_id = WINBOND_NEX_ID,
17973 .model_id = WINBOND_NEX_W25P80,
17974 .total_size = 1024,
17975 .page_size = 256,
17976 .feature_bits = FEATURE_WRSR_WREN,
17977 .tested = TEST_UNTESTED,
17978 .probe = probe_spi_rdid,
17979 .probe_timing = TIMING_ZERO,
17980 .block_erasers =
17981 {
17982 {
Rudolf Marekce1c7982010-04-20 19:34:31 +000017983 .eraseblocks = { {64 * 1024, 16} },
17984 .block_erase = spi_block_erase_d8,
17985 }, {
17986 .eraseblocks = { {1024 * 1024, 1} },
Rudolf Marekce1c7982010-04-20 19:34:31 +000017987 .block_erase = spi_block_erase_c7,
17988 }
17989 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000017990 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000017991 .unlock = spi_disable_blockprotect,
Rudolf Marekce1c7982010-04-20 19:34:31 +000017992 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100017993 .read = spi_chip_read, /* Fast read (0x0B) supported */
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017994 .voltage = {2700, 3600},
David Hendricksc4acec92010-06-24 11:39:57 +000017995 },
17996
17997 {
17998 .vendor = "Winbond",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000017999 .name = "W25Q128.V",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000018000 .bustype = BUS_SPI,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018001 .manufacture_id = WINBOND_NEX_ID,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018002 .model_id = WINBOND_NEX_W25Q128_V,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018003 .total_size = 16384,
18004 .page_size = 256,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018005 /* supports SFDP */
18006 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018007 /* QPI: only FV & JV..M versions */
18008 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020018009 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Edward O'Callaghana97e3532022-12-16 15:41:05 +110018010 .tested = TEST_OK_PREWB,
Antony Rheneus0fbba982011-05-26 14:28:51 +000018011 .probe = probe_spi_rdid,
18012 .probe_timing = TIMING_ZERO,
18013 .block_erasers =
18014 {
18015 {
18016 .eraseblocks = { {4 * 1024, 4096} },
18017 .block_erase = spi_block_erase_20,
18018 }, {
18019 .eraseblocks = { {32 * 1024, 512} },
18020 .block_erase = spi_block_erase_52,
18021 }, {
18022 .eraseblocks = { {64 * 1024, 256} },
18023 .block_erase = spi_block_erase_d8,
18024 }, {
18025 .eraseblocks = { {16 * 1024 * 1024, 1} },
18026 .block_erase = spi_block_erase_60,
18027 }, {
18028 .eraseblocks = { {16 * 1024 * 1024, 1} },
18029 .block_erase = spi_block_erase_c7,
18030 }
18031 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000018032 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Antony Rheneus0fbba982011-05-26 14:28:51 +000018033 .unlock = spi_disable_blockprotect,
18034 .write = spi_chip_write_256,
18035 .read = spi_chip_read,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018036 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018037 /* FIXME: Older versions (e.g. 25Q128BV) use WRSR_EXT and have no WPS. */
18038 .reg_bits =
18039 {
Nico Huber2133f592024-01-06 18:30:01 +010018040 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018041 .srp = {STATUS1, 7, RW},
18042 .srl = {STATUS2, 0, RW},
18043 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18044 .tb = {STATUS1, 5, RW},
18045 .sec = {STATUS1, 6, RW},
18046 .cmp = {STATUS2, 6, RW},
18047 .wps = {STATUS3, 2, RW},
18048 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018049 .wp_write_cfg = spi_wp_write_cfg,
18050 .wp_read_cfg = spi_wp_read_cfg,
18051 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020018052 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018053 },
18054
18055 {
18056 .vendor = "Winbond",
Patrick Rudolph34323492018-10-04 14:59:40 +020018057 .name = "W25Q128.V..M",
18058 .bustype = BUS_SPI,
18059 .manufacture_id = WINBOND_NEX_ID,
18060 .model_id = WINBOND_NEX_W25Q128_V_M,
18061 .total_size = 16384,
18062 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018063 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18064 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030018065 .tested = TEST_OK_PREWB,
Patrick Rudolph34323492018-10-04 14:59:40 +020018066 .probe = probe_spi_rdid,
18067 .probe_timing = TIMING_ZERO,
18068 .block_erasers =
18069 {
18070 {
18071 .eraseblocks = { {4 * 1024, 4096} },
18072 .block_erase = spi_block_erase_20,
18073 }, {
18074 .eraseblocks = { {32 * 1024, 512} },
18075 .block_erase = spi_block_erase_52,
18076 }, {
18077 .eraseblocks = { {64 * 1024, 256} },
18078 .block_erase = spi_block_erase_d8,
18079 }, {
18080 .eraseblocks = { {16 * 1024 * 1024, 1} },
18081 .block_erase = spi_block_erase_60,
18082 }, {
18083 .eraseblocks = { {16 * 1024 * 1024, 1} },
18084 .block_erase = spi_block_erase_c7,
18085 }
18086 },
Alan Greena1fc01d2019-09-23 17:12:44 +100018087 .printlock = spi_prettyprint_status_register_plain,
Patrick Rudolph34323492018-10-04 14:59:40 +020018088 .unlock = spi_disable_blockprotect,
18089 .write = spi_chip_write_256,
18090 .read = spi_chip_read,
18091 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018092 .reg_bits =
18093 {
Nico Huber2133f592024-01-06 18:30:01 +010018094 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018095 .srp = {STATUS1, 7, RW},
18096 .srl = {STATUS2, 0, RW},
18097 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18098 .tb = {STATUS1, 5, RW},
18099 .sec = {STATUS1, 6, RW},
18100 .cmp = {STATUS2, 6, RW},
18101 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018102 .wp_write_cfg = spi_wp_write_cfg,
18103 .wp_read_cfg = spi_wp_read_cfg,
18104 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018105 .decode_range = decode_range_spi25,
Patrick Rudolph34323492018-10-04 14:59:40 +020018106 },
18107
18108 {
18109 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018110 .name = "W25Q128.W",
18111 .bustype = BUS_SPI,
18112 .manufacture_id = WINBOND_NEX_ID,
18113 .model_id = WINBOND_NEX_W25Q128_W,
18114 .total_size = 16384,
18115 .page_size = 256,
18116 /* supports SFDP */
18117 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018118 /* QPI: only FW & JW..M versions */
18119 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018120 .tested = TEST_OK_PREW,
18121 .probe = probe_spi_rdid,
18122 .probe_timing = TIMING_ZERO,
18123 .block_erasers =
18124 {
18125 {
18126 .eraseblocks = { {4 * 1024, 4096} },
18127 .block_erase = spi_block_erase_20,
18128 }, {
18129 .eraseblocks = { {32 * 1024, 512} },
18130 .block_erase = spi_block_erase_52,
18131 }, {
18132 .eraseblocks = { {64 * 1024, 256} },
18133 .block_erase = spi_block_erase_d8,
18134 }, {
18135 .eraseblocks = { {16 * 1024 * 1024, 1} },
18136 .block_erase = spi_block_erase_60,
18137 }, {
18138 .eraseblocks = { {16 * 1024 * 1024, 1} },
18139 .block_erase = spi_block_erase_c7,
18140 }
18141 },
18142 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18143 .unlock = spi_disable_blockprotect,
18144 .write = spi_chip_write_256,
18145 .read = spi_chip_read,
18146 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018147 .reg_bits =
18148 {
Nico Huber2133f592024-01-06 18:30:01 +010018149 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018150 .srp = {STATUS1, 7, RW},
18151 .srl = {STATUS2, 0, RW},
18152 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18153 .tb = {STATUS1, 5, RW},
18154 .sec = {STATUS1, 6, RW},
18155 .cmp = {STATUS2, 6, RW},
18156 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018157 .wp_write_cfg = spi_wp_write_cfg,
18158 .wp_read_cfg = spi_wp_read_cfg,
18159 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018160 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018161 },
18162
18163 {
18164 .vendor = "Winbond",
Peichao Wang1a119492019-11-11 15:26:41 +080018165 .name = "W25Q128.JW.DTR",
18166 .bustype = BUS_SPI,
18167 .manufacture_id = WINBOND_NEX_ID,
18168 .model_id = WINBOND_NEX_W25Q128_DTR,
18169 .total_size = 16384,
18170 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010018171 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
18172 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Peichao Wang1a119492019-11-11 15:26:41 +080018173 .tested = TEST_OK_PREW,
18174 .probe = probe_spi_rdid,
18175 .probe_timing = TIMING_ZERO,
18176 .block_erasers =
18177 {
18178 {
18179 .eraseblocks = { {4 * 1024, 4096} },
18180 .block_erase = spi_block_erase_20,
18181 }, {
18182 .eraseblocks = { {32 * 1024, 512} },
18183 .block_erase = spi_block_erase_52,
18184 }, {
18185 .eraseblocks = { {64 * 1024, 256} },
18186 .block_erase = spi_block_erase_d8,
18187 }, {
18188 .eraseblocks = { {16 * 1024 * 1024, 1} },
18189 .block_erase = spi_block_erase_60,
18190 }, {
18191 .eraseblocks = { {16 * 1024 * 1024, 1} },
18192 .block_erase = spi_block_erase_c7,
18193 }
18194 },
18195 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18196 .unlock = spi_disable_blockprotect,
18197 .write = spi_chip_write_256,
18198 .read = spi_chip_read,
18199 .voltage = {1650, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018200 .reg_bits =
18201 {
Nico Huber2133f592024-01-06 18:30:01 +010018202 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018203 .srp = {STATUS1, 7, RW},
18204 .srl = {STATUS2, 0, RW},
18205 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18206 .tb = {STATUS1, 5, RW},
18207 .sec = {STATUS1, 6, RW},
18208 .cmp = {STATUS2, 6, RW},
18209 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018210 .wp_write_cfg = spi_wp_write_cfg,
18211 .wp_read_cfg = spi_wp_read_cfg,
18212 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018213 .decode_range = decode_range_spi25,
Peichao Wang1a119492019-11-11 15:26:41 +080018214 },
18215
18216 {
18217 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018218 .name = "W25Q16.V",
18219 .bustype = BUS_SPI,
18220 .manufacture_id = WINBOND_NEX_ID,
18221 .model_id = WINBOND_NEX_W25Q16_V,
18222 .total_size = 2048,
18223 .page_size = 256,
18224 /* supports SFDP */
18225 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018226 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018227 .tested = TEST_OK_PREW,
18228 .probe = probe_spi_rdid,
18229 .probe_timing = TIMING_ZERO,
18230 .block_erasers =
18231 {
18232 {
18233 .eraseblocks = { {4 * 1024, 512} },
18234 .block_erase = spi_block_erase_20,
18235 }, {
18236 .eraseblocks = { {32 * 1024, 64} },
18237 .block_erase = spi_block_erase_52,
18238 }, {
18239 .eraseblocks = { {64 * 1024, 32} },
18240 .block_erase = spi_block_erase_d8,
18241 }, {
18242 .eraseblocks = { {2 * 1024 * 1024, 1} },
18243 .block_erase = spi_block_erase_60,
18244 }, {
18245 .eraseblocks = { {2 * 1024 * 1024, 1} },
18246 .block_erase = spi_block_erase_c7,
18247 }
18248 },
Nico Huber2133f592024-01-06 18:30:01 +010018249 .reg_bits =
18250 {
18251 .qe = {STATUS2, 1, RW},
18252 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018253 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18254 .unlock = spi_disable_blockprotect,
18255 .write = spi_chip_write_256,
18256 .read = spi_chip_read,
18257 .voltage = {2700, 3600},
18258 },
18259
18260 {
18261 .vendor = "Winbond",
18262 .name = "W25Q16.W",
18263 .bustype = BUS_SPI,
18264 .manufacture_id = WINBOND_NEX_ID,
18265 .model_id = WINBOND_NEX_W25Q16_W,
18266 .total_size = 2048,
18267 .page_size = 256,
18268 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018269 /* QPI: only FW & JW..M versions .qpi_read_params = { 2, 4, 6, 8 } */
18270 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018271 .tested = TEST_UNTESTED,
18272 .probe = probe_spi_rdid,
18273 .probe_timing = TIMING_ZERO,
18274 .block_erasers =
18275 {
18276 {
18277 .eraseblocks = { {4 * 1024, 512} },
18278 .block_erase = spi_block_erase_20,
18279 }, {
18280 .eraseblocks = { {32 * 1024, 64} },
18281 .block_erase = spi_block_erase_52,
18282 }, {
18283 .eraseblocks = { {64 * 1024, 32} },
18284 .block_erase = spi_block_erase_d8,
18285 }, {
18286 .eraseblocks = { {2 * 1024 * 1024, 1} },
18287 .block_erase = spi_block_erase_60,
18288 }, {
18289 .eraseblocks = { {2 * 1024 * 1024, 1} },
18290 .block_erase = spi_block_erase_c7,
18291 }
18292 },
Nico Huber2133f592024-01-06 18:30:01 +010018293 .reg_bits =
18294 {
18295 .qe = {STATUS2, 1, RW},
18296 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018297 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18298 .unlock = spi_disable_blockprotect,
18299 .write = spi_chip_write_256,
18300 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010018301 .voltage = {1700, 1950},
Alan Green1f9cc7d2019-07-01 11:10:45 +100018302 },
18303
18304 {
18305 .vendor = "Winbond",
18306 .name = "W25Q20.W",
18307 .bustype = BUS_SPI,
18308 .manufacture_id = WINBOND_NEX_ID,
18309 .model_id = WINBOND_NEX_W25Q20_W,
18310 .total_size = 256,
18311 .page_size = 256,
18312 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018313 /* W25Q20EW: FEATURE_WRSR2 */
18314 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018315 .tested = TEST_UNTESTED,
18316 .probe = probe_spi_rdid,
18317 .probe_timing = TIMING_ZERO,
18318 .block_erasers =
18319 {
18320 {
18321 .eraseblocks = { {4 * 1024, 64} },
18322 .block_erase = spi_block_erase_20,
18323 }, {
18324 .eraseblocks = { {32 * 1024, 8} },
18325 .block_erase = spi_block_erase_52,
18326 }, {
18327 .eraseblocks = { {64 * 1024, 4} },
18328 .block_erase = spi_block_erase_d8,
18329 }, {
18330 .eraseblocks = { {256 * 1024, 1} },
18331 .block_erase = spi_block_erase_60,
18332 }, {
18333 .eraseblocks = { {256 * 1024, 1} },
18334 .block_erase = spi_block_erase_c7,
18335 }
18336 },
Nico Huber2133f592024-01-06 18:30:01 +010018337 .reg_bits =
18338 {
18339 .qe = {STATUS2, 1, RW},
18340 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100018341 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18342 .unlock = spi_disable_blockprotect,
18343 .write = spi_chip_write_256,
18344 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010018345 .voltage = {1700, 1950},
Alan Green1f9cc7d2019-07-01 11:10:45 +100018346 },
18347
18348 {
18349 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018350 .name = "W25Q256FV",
Boris Baykovaa6c3742016-06-11 18:29:01 +020018351 .bustype = BUS_SPI,
18352 .manufacture_id = WINBOND_NEX_ID,
18353 .model_id = WINBOND_NEX_W25Q256_V,
18354 .total_size = 32768,
18355 .page_size = 256,
18356 /* supports SFDP */
18357 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018358 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
18359 FEATURE_4BA_ENTER_WREN | FEATURE_4BA_EAR_C5C8 |
18360 FEATURE_4BA_READ | FEATURE_4BA_FAST_READ |
18361 FEATURE_QPI_SRP,
18362 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons3130cbd2018-09-30 19:32:30 +020018363 .tested = TEST_OK_PREW,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018364 .probe = probe_spi_rdid,
18365 .probe_timing = TIMING_ZERO,
18366 .block_erasers =
18367 {
18368 {
18369 .eraseblocks = { {4 * 1024, 8192} },
Nico Huber7a077222017-10-14 18:18:30 +020018370 .block_erase = spi_block_erase_20,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018371 }, {
18372 .eraseblocks = { {32 * 1024, 1024} },
Nico Huber7a077222017-10-14 18:18:30 +020018373 .block_erase = spi_block_erase_52,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018374 }, {
18375 .eraseblocks = { {64 * 1024, 512} },
Nico Huber7a077222017-10-14 18:18:30 +020018376 .block_erase = spi_block_erase_d8,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018377 }, {
18378 .eraseblocks = { {32 * 1024 * 1024, 1} },
18379 .block_erase = spi_block_erase_60,
18380 }, {
18381 .eraseblocks = { {32 * 1024 * 1024, 1} },
18382 .block_erase = spi_block_erase_c7,
18383 }
18384 },
18385 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18386 .unlock = spi_disable_blockprotect,
18387 .write = spi_chip_write_256,
18388 .read = spi_chip_read,
18389 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018390 .reg_bits =
18391 {
Nico Huber2133f592024-01-06 18:30:01 +010018392 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018393 .srp = {STATUS1, 7, RW},
18394 .srl = {STATUS2, 0, RW},
18395 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18396 .tb = {STATUS1, 6, RW},
18397 .cmp = {STATUS2, 6, RW},
18398 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018399 .wp_write_cfg = spi_wp_write_cfg,
18400 .wp_read_cfg = spi_wp_read_cfg,
18401 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018402 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018403 .prepare_access = spi_prepare_4ba,
Boris Baykovaa6c3742016-06-11 18:29:01 +020018404 },
18405
18406 {
18407 .vendor = "Winbond",
Nico Huber5215eab2022-05-23 15:13:07 +020018408 .name = "W25Q256JV_Q",
18409 .bustype = BUS_SPI,
18410 .manufacture_id = WINBOND_NEX_ID,
18411 .model_id = WINBOND_NEX_W25Q256_V,
18412 .total_size = 32768,
18413 .page_size = 256,
18414 /* supports SFDP */
18415 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018416 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Nico Huberddfbbe82023-12-21 16:31:27 +010018417 .tested = TEST_OK_PREW,
Nico Huber5215eab2022-05-23 15:13:07 +020018418 .probe = probe_spi_rdid,
18419 .probe_timing = TIMING_ZERO,
18420 .block_erasers =
18421 {
18422 {
18423 .eraseblocks = { {4 * 1024, 8192} },
18424 .block_erase = spi_block_erase_21,
18425 }, {
18426 .eraseblocks = { {4 * 1024, 8192} },
18427 .block_erase = spi_block_erase_20,
18428 }, {
18429 .eraseblocks = { {32 * 1024, 1024} },
18430 .block_erase = spi_block_erase_52,
18431 }, {
18432 .eraseblocks = { {64 * 1024, 512} },
18433 .block_erase = spi_block_erase_dc,
18434 }, {
18435 .eraseblocks = { {64 * 1024, 512} },
18436 .block_erase = spi_block_erase_d8,
18437 }, {
18438 .eraseblocks = { {32 * 1024 * 1024, 1} },
18439 .block_erase = spi_block_erase_60,
18440 }, {
18441 .eraseblocks = { {32 * 1024 * 1024, 1} },
18442 .block_erase = spi_block_erase_c7,
18443 }
18444 },
18445 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18446 .unlock = spi_disable_blockprotect,
18447 .write = spi_chip_write_256,
18448 .read = spi_chip_read,
18449 .voltage = {2700, 3600},
18450 .reg_bits =
18451 {
Nico Huber2133f592024-01-06 18:30:01 +010018452 .qe = {STATUS2, 1, RW},
Nico Huber5215eab2022-05-23 15:13:07 +020018453 .srp = {STATUS1, 7, RW},
18454 .srl = {STATUS2, 0, RW},
18455 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18456 .tb = {STATUS1, 6, RW},
18457 .cmp = {STATUS2, 6, RW},
18458 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018459 .wp_write_cfg = spi_wp_write_cfg,
18460 .wp_read_cfg = spi_wp_read_cfg,
18461 .wp_get_ranges = spi_wp_get_available_ranges,
Nico Huber5215eab2022-05-23 15:13:07 +020018462 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018463 .prepare_access = spi_prepare_4ba,
Nico Huber5215eab2022-05-23 15:13:07 +020018464 },
18465
18466 {
18467 .vendor = "Winbond",
David Hendricks49876792018-10-27 20:19:42 +000018468 .name = "W25Q256JV_M",
18469 .bustype = BUS_SPI,
18470 .manufacture_id = WINBOND_NEX_ID,
18471 .model_id = WINBOND_NEX_W25Q256JV_M,
18472 .total_size = 32768,
18473 .page_size = 256,
18474 /* supports SFDP */
18475 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018476 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
18477 FEATURE_4BA | FEATURE_QPI_SRP,
18478 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
David Hendricks49876792018-10-27 20:19:42 +000018479 .tested = TEST_OK_PREW,
18480 .probe = probe_spi_rdid,
18481 .probe_timing = TIMING_ZERO,
18482 .block_erasers =
18483 {
18484 {
18485 .eraseblocks = { {4 * 1024, 8192} },
18486 .block_erase = spi_block_erase_21,
18487 }, {
18488 .eraseblocks = { {4 * 1024, 8192} },
18489 .block_erase = spi_block_erase_20,
18490 }, {
18491 .eraseblocks = { {32 * 1024, 1024} },
18492 .block_erase = spi_block_erase_52,
18493 }, {
18494 .eraseblocks = { {64 * 1024, 512} },
18495 .block_erase = spi_block_erase_dc,
18496 }, {
18497 .eraseblocks = { {64 * 1024, 512} },
18498 .block_erase = spi_block_erase_d8,
18499 }, {
18500 .eraseblocks = { {32 * 1024 * 1024, 1} },
18501 .block_erase = spi_block_erase_60,
18502 }, {
18503 .eraseblocks = { {32 * 1024 * 1024, 1} },
18504 .block_erase = spi_block_erase_c7,
18505 }
18506 },
18507 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18508 .unlock = spi_disable_blockprotect,
18509 .write = spi_chip_write_256,
18510 .read = spi_chip_read,
18511 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018512 .reg_bits =
18513 {
Nico Huber2133f592024-01-06 18:30:01 +010018514 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018515 .srp = {STATUS1, 7, RW},
18516 .srl = {STATUS2, 0, RW},
18517 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18518 .tb = {STATUS1, 6, RW},
18519 .cmp = {STATUS2, 6, RW},
18520 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018521 .wp_write_cfg = spi_wp_write_cfg,
18522 .wp_read_cfg = spi_wp_read_cfg,
18523 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110018524 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018525 .prepare_access = spi_prepare_4ba,
David Hendricks49876792018-10-27 20:19:42 +000018526 },
18527
18528 {
18529 .vendor = "Winbond",
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018530 .name = "W25Q256JW",
el-coderon01209852020-04-29 12:12:53 +020018531 .bustype = BUS_SPI,
18532 .manufacture_id = WINBOND_NEX_ID,
18533 .model_id = WINBOND_NEX_W25Q256_W,
18534 .total_size = 32768,
18535 .page_size = 256,
18536 /* supports SFDP */
18537 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018538 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
18539 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
el-coderon01209852020-04-29 12:12:53 +020018540 .tested = TEST_OK_PREW,
18541 .probe = probe_spi_rdid,
18542 .probe_timing = TIMING_ZERO,
18543 .block_erasers =
18544 {
18545 {
18546 .eraseblocks = { {4 * 1024, 8192} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018547 .block_erase = spi_block_erase_21,
18548 }, {
18549 .eraseblocks = { {4 * 1024, 8192} },
el-coderon01209852020-04-29 12:12:53 +020018550 .block_erase = spi_block_erase_20,
18551 }, {
18552 .eraseblocks = { {32 * 1024, 1024} },
18553 .block_erase = spi_block_erase_52,
18554 }, {
18555 .eraseblocks = { {64 * 1024, 512} },
Patrick Rudolph8f5bd982020-08-26 09:15:53 +020018556 .block_erase = spi_block_erase_dc,
18557 }, {
18558 .eraseblocks = { {64 * 1024, 512} },
el-coderon01209852020-04-29 12:12:53 +020018559 .block_erase = spi_block_erase_d8,
18560 }, {
18561 .eraseblocks = { {32 * 1024 * 1024, 1} },
18562 .block_erase = spi_block_erase_60,
18563 }, {
18564 .eraseblocks = { {32 * 1024 * 1024, 1} },
18565 .block_erase = spi_block_erase_c7,
18566 }
18567 },
Nico Huber2133f592024-01-06 18:30:01 +010018568 .reg_bits =
18569 {
18570 .qe = {STATUS2, 1, RW},
18571 },
el-coderon01209852020-04-29 12:12:53 +020018572 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18573 .unlock = spi_disable_blockprotect,
18574 .write = spi_chip_write_256,
18575 .read = spi_chip_read,
18576 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +010018577 .prepare_access = spi_prepare_4ba,
el-coderon01209852020-04-29 12:12:53 +020018578 },
18579
18580 {
18581 .vendor = "Winbond",
David Hendricks31532602020-08-16 17:14:56 -070018582 .name = "W25Q256JW_DTR",
18583 .bustype = BUS_SPI,
18584 .manufacture_id = WINBOND_NEX_ID,
18585 .model_id = WINBOND_NEX_W25Q256_DTR,
18586 .total_size = 32768,
18587 .page_size = 256,
18588 /* supports SFDP */
18589 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018590 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
18591 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
18592 .dummy_cycles =
18593 {
18594 .qpi_read_params = {
18595 2, /* Datasheet Rev.K says 4 is the default, though.
18596 Will assume that the text is wrong, if not,
18597 we'll know why it doesn't work. */
18598 4, 6, 8
18599 },
18600 },
Kapil Porwal111c3802022-12-09 19:41:27 +053018601 .tested = TEST_OK_PREWB,
David Hendricks31532602020-08-16 17:14:56 -070018602 .probe = probe_spi_rdid,
18603 .probe_timing = TIMING_ZERO,
18604 .block_erasers =
18605 {
18606 {
18607 .eraseblocks = { {4 * 1024, 8192} },
18608 .block_erase = spi_block_erase_21,
18609 }, {
18610 .eraseblocks = { {4 * 1024, 8192} },
18611 .block_erase = spi_block_erase_20,
18612 }, {
18613 .eraseblocks = { {32 * 1024, 1024} },
18614 .block_erase = spi_block_erase_52,
18615 }, {
18616 .eraseblocks = { {64 * 1024, 512} },
18617 .block_erase = spi_block_erase_dc,
18618 }, {
18619 .eraseblocks = { {64 * 1024, 512} },
18620 .block_erase = spi_block_erase_d8,
18621 }, {
18622 .eraseblocks = { {32 * 1024 * 1024, 1} },
18623 .block_erase = spi_block_erase_60,
18624 }, {
18625 .eraseblocks = { {32 * 1024 * 1024, 1} },
18626 .block_erase = spi_block_erase_c7,
18627 }
18628 },
18629 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18630 .unlock = spi_disable_blockprotect,
18631 .write = spi_chip_write_256,
18632 .read = spi_chip_read,
18633 .voltage = {1700, 1950},
Kapil Porwal111c3802022-12-09 19:41:27 +053018634 .reg_bits =
18635 {
Nico Huber2133f592024-01-06 18:30:01 +010018636 .qe = {STATUS2, 1, RW},
Kapil Porwal111c3802022-12-09 19:41:27 +053018637 .srp = {STATUS1, 7, RW},
18638 .srl = {STATUS2, 0, RW},
18639 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
18640 .tb = {STATUS1, 6, RW},
18641 .cmp = {STATUS2, 6, RW},
18642 .wps = {STATUS3, 2, RW},
18643 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018644 .wp_write_cfg = spi_wp_write_cfg,
18645 .wp_read_cfg = spi_wp_read_cfg,
18646 .wp_get_ranges = spi_wp_get_available_ranges,
Kapil Porwal111c3802022-12-09 19:41:27 +053018647 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010018648 .prepare_access = spi_prepare_4ba,
David Hendricks31532602020-08-16 17:14:56 -070018649 },
18650
18651 {
18652 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018653 .name = "W25Q32BV/W25Q32CV/W25Q32DV",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018654 .bustype = BUS_SPI,
18655 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018656 .model_id = WINBOND_NEX_W25Q32_V,
18657 .total_size = 4096,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018658 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018659 /* supports SFDP */
18660 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018661 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018662 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018663 .probe = probe_spi_rdid,
18664 .probe_timing = TIMING_ZERO,
18665 .block_erasers =
18666 {
18667 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018668 .eraseblocks = { {4 * 1024, 1024} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018669 .block_erase = spi_block_erase_20,
18670 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018671 .eraseblocks = { {32 * 1024, 128} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018672 .block_erase = spi_block_erase_52,
18673 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018674 .eraseblocks = { {64 * 1024, 64} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018675 .block_erase = spi_block_erase_d8,
18676 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018677 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018678 .block_erase = spi_block_erase_60,
18679 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100018680 .eraseblocks = { {4 * 1024 * 1024, 1} },
18681 .block_erase = spi_block_erase_c7,
18682 }
18683 },
18684 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18685 .unlock = spi_disable_blockprotect,
18686 .write = spi_chip_write_256,
18687 .read = spi_chip_read,
18688 .voltage = {2700, 3600},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018689 .reg_bits =
18690 {
Nico Huber2133f592024-01-06 18:30:01 +010018691 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018692 .srp = {STATUS1, 7, RW},
18693 .srl = {STATUS2, 0, RW},
18694 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18695 .tb = {STATUS1, 5, RW},
18696 .sec = {STATUS1, 6, RW},
18697 .cmp = {STATUS2, 6, RW},
18698 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018699 .wp_write_cfg = spi_wp_write_cfg,
18700 .wp_read_cfg = spi_wp_read_cfg,
18701 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018702 .decode_range = decode_range_spi25,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018703 },
18704
18705 {
18706 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018707 .name = "W25Q32FV",
18708 .bustype = BUS_SPI,
18709 .manufacture_id = WINBOND_NEX_ID,
18710 .model_id = WINBOND_NEX_W25Q32_V,
18711 .total_size = 4096,
18712 .page_size = 256,
18713 /* supports SFDP */
18714 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018715 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018716 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010018717 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018718 .tested = TEST_OK_PREW,
18719 .probe = probe_spi_rdid,
18720 .probe_timing = TIMING_ZERO,
18721 .block_erasers =
18722 {
18723 {
18724 .eraseblocks = { {4 * 1024, 1024} },
18725 .block_erase = spi_block_erase_20,
18726 }, {
18727 .eraseblocks = { {32 * 1024, 128} },
18728 .block_erase = spi_block_erase_52,
18729 }, {
18730 .eraseblocks = { {64 * 1024, 64} },
18731 .block_erase = spi_block_erase_d8,
18732 }, {
18733 .eraseblocks = { {4 * 1024 * 1024, 1} },
18734 .block_erase = spi_block_erase_60,
18735 }, {
18736 .eraseblocks = { {4 * 1024 * 1024, 1} },
18737 .block_erase = spi_block_erase_c7,
18738 }
18739 },
18740 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18741 .unlock = spi_disable_blockprotect,
18742 .write = spi_chip_write_256,
18743 .read = spi_chip_read,
18744 .voltage = {2700, 3600},
18745 .reg_bits =
18746 {
Nico Huber2133f592024-01-06 18:30:01 +010018747 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018748 .srp = {STATUS1, 7, RW},
18749 .srl = {STATUS2, 0, RW},
18750 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18751 .tb = {STATUS1, 5, RW},
18752 .sec = {STATUS1, 6, RW},
18753 .cmp = {STATUS2, 6, RW},
18754 .wps = {STATUS3, 2, RW},
18755 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018756 .wp_write_cfg = spi_wp_write_cfg,
18757 .wp_read_cfg = spi_wp_read_cfg,
18758 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018759 .decode_range = decode_range_spi25,
18760 },
18761
18762 {
18763 .vendor = "Winbond",
18764 .name = "W25Q32JV",
18765 .bustype = BUS_SPI,
18766 .manufacture_id = WINBOND_NEX_ID,
18767 .model_id = WINBOND_NEX_W25Q32_V,
18768 .total_size = 4096,
18769 .page_size = 256,
18770 /* supports SFDP */
18771 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010018772 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018773 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18774 .tested = TEST_OK_PREW,
18775 .probe = probe_spi_rdid,
18776 .probe_timing = TIMING_ZERO,
18777 .block_erasers =
18778 {
18779 {
18780 .eraseblocks = { {4 * 1024, 1024} },
18781 .block_erase = spi_block_erase_20,
18782 }, {
18783 .eraseblocks = { {32 * 1024, 128} },
18784 .block_erase = spi_block_erase_52,
18785 }, {
18786 .eraseblocks = { {64 * 1024, 64} },
18787 .block_erase = spi_block_erase_d8,
18788 }, {
18789 .eraseblocks = { {4 * 1024 * 1024, 1} },
18790 .block_erase = spi_block_erase_60,
18791 }, {
18792 .eraseblocks = { {4 * 1024 * 1024, 1} },
18793 .block_erase = spi_block_erase_c7,
18794 }
18795 },
18796 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18797 .unlock = spi_disable_blockprotect,
18798 .write = spi_chip_write_256,
18799 .read = spi_chip_read,
18800 .voltage = {2700, 3600},
18801 .reg_bits =
18802 {
Nico Huber2133f592024-01-06 18:30:01 +010018803 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018804 .srp = {STATUS1, 7, RW},
18805 .srl = {STATUS2, 0, RW},
18806 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18807 .tb = {STATUS1, 5, RW},
18808 .sec = {STATUS1, 6, RW},
18809 .cmp = {STATUS2, 6, RW},
18810 .wps = {STATUS3, 2, RW},
18811 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018812 .wp_write_cfg = spi_wp_write_cfg,
18813 .wp_read_cfg = spi_wp_read_cfg,
18814 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018815 .decode_range = decode_range_spi25,
18816 },
18817
18818 {
18819 .vendor = "Winbond",
Angel Pons0d4354e2024-05-26 16:33:51 +020018820 .name = "W25Q32JV-.M",
18821 .bustype = BUS_SPI,
18822 .manufacture_id = WINBOND_NEX_ID,
18823 .model_id = WINBOND_NEX_W25Q32JV,
18824 .total_size = 4096,
18825 .page_size = 256,
18826 /* supports SFDP */
Nico Huber1412d9f2024-01-06 18:25:49 +010018827 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Angel Pons0d4354e2024-05-26 16:33:51 +020018828 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010018829 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Angel Pons0d4354e2024-05-26 16:33:51 +020018830 .tested = TEST_OK_PREW,
18831 .probe = probe_spi_rdid,
18832 .probe_timing = TIMING_ZERO,
18833 .block_erasers =
18834 {
18835 {
18836 .eraseblocks = { {4 * 1024, 1024} },
18837 .block_erase = spi_block_erase_20,
18838 }, {
18839 .eraseblocks = { {32 * 1024, 128} },
18840 .block_erase = spi_block_erase_52,
18841 }, {
18842 .eraseblocks = { {64 * 1024, 64} },
18843 .block_erase = spi_block_erase_d8,
18844 }, {
18845 .eraseblocks = { {4 * 1024 * 1024, 1} },
18846 .block_erase = spi_block_erase_60,
18847 }, {
18848 .eraseblocks = { {4 * 1024 * 1024, 1} },
18849 .block_erase = spi_block_erase_c7,
18850 }
18851 },
18852 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
18853 .unlock = spi_disable_blockprotect_bp2_srwd,
18854 .write = spi_chip_write_256,
18855 .read = spi_chip_read,
18856 .voltage = {2700, 3600},
18857 .reg_bits =
18858 {
Nico Huber2133f592024-01-06 18:30:01 +010018859 .qe = {STATUS2, 1, RW},
Angel Pons0d4354e2024-05-26 16:33:51 +020018860 .srp = {STATUS1, 7, RW},
18861 .srl = {STATUS2, 0, RW},
18862 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18863 .tb = {STATUS1, 5, RW},
18864 .sec = {STATUS1, 6, RW},
18865 .cmp = {STATUS2, 6, RW},
18866 .wps = {STATUS3, 2, RW},
18867 },
18868 .wp_write_cfg = spi_wp_write_cfg,
18869 .wp_read_cfg = spi_wp_read_cfg,
18870 .wp_get_ranges = spi_wp_get_available_ranges,
18871 .decode_range = decode_range_spi25,
18872 },
18873
18874 {
18875 .vendor = "Winbond",
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018876 .name = "W25Q32BW/W25Q32CW/W25Q32DW",
Alan Green1f9cc7d2019-07-01 11:10:45 +100018877 .bustype = BUS_SPI,
18878 .manufacture_id = WINBOND_NEX_ID,
18879 .model_id = WINBOND_NEX_W25Q32_W,
18880 .total_size = 4096,
18881 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018882 /* OTP: 1024B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018883 /* QPI: only DW version */
18884 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100018885 .tested = TEST_OK_PREW,
18886 .probe = probe_spi_rdid,
18887 .probe_timing = TIMING_ZERO,
18888 .block_erasers =
18889 {
18890 {
18891 .eraseblocks = { {4 * 1024, 1024} },
18892 .block_erase = spi_block_erase_20,
18893 }, {
18894 .eraseblocks = { {32 * 1024, 128} },
18895 .block_erase = spi_block_erase_52,
18896 }, {
18897 .eraseblocks = { {64 * 1024, 64} },
18898 .block_erase = spi_block_erase_d8,
18899 }, {
18900 .eraseblocks = { {4 * 1024 * 1024, 1} },
18901 .block_erase = spi_block_erase_60,
18902 }, {
18903 .eraseblocks = { {4 * 1024 * 1024, 1} },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000018904 .block_erase = spi_block_erase_c7,
18905 }
18906 },
18907 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18908 .unlock = spi_disable_blockprotect,
18909 .write = spi_chip_write_256,
18910 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010018911 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018912 .reg_bits =
18913 {
Nico Huber2133f592024-01-06 18:30:01 +010018914 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018915 .srp = {STATUS1, 7, RW},
18916 .srl = {STATUS2, 0, RW},
18917 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18918 .tb = {STATUS1, 5, RW},
18919 .sec = {STATUS1, 6, RW},
18920 .cmp = {STATUS2, 6, RW},
18921 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018922 .wp_write_cfg = spi_wp_write_cfg,
18923 .wp_read_cfg = spi_wp_read_cfg,
18924 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018925 .decode_range = decode_range_spi25,
18926 },
18927
18928 {
18929 .vendor = "Winbond",
18930 .name = "W25Q32FW",
18931 .bustype = BUS_SPI,
18932 .manufacture_id = WINBOND_NEX_ID,
18933 .model_id = WINBOND_NEX_W25Q32_W,
18934 .total_size = 4096,
18935 .page_size = 256,
18936 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010018937 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018938 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Nico Huber1412d9f2024-01-06 18:25:49 +010018939 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018940 .tested = TEST_OK_PREW,
18941 .probe = probe_spi_rdid,
18942 .probe_timing = TIMING_ZERO,
18943 .block_erasers =
18944 {
18945 {
18946 .eraseblocks = { {4 * 1024, 1024} },
18947 .block_erase = spi_block_erase_20,
18948 }, {
18949 .eraseblocks = { {32 * 1024, 128} },
18950 .block_erase = spi_block_erase_52,
18951 }, {
18952 .eraseblocks = { {64 * 1024, 64} },
18953 .block_erase = spi_block_erase_d8,
18954 }, {
18955 .eraseblocks = { {4 * 1024 * 1024, 1} },
18956 .block_erase = spi_block_erase_60,
18957 }, {
18958 .eraseblocks = { {4 * 1024 * 1024, 1} },
18959 .block_erase = spi_block_erase_c7,
18960 }
18961 },
18962 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
18963 .unlock = spi_disable_blockprotect,
18964 .write = spi_chip_write_256,
18965 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010018966 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018967 .reg_bits =
18968 {
Nico Huber2133f592024-01-06 18:30:01 +010018969 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018970 .srp = {STATUS1, 7, RW},
18971 .srl = {STATUS2, 0, RW},
18972 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
18973 .tb = {STATUS1, 5, RW},
18974 .sec = {STATUS1, 6, RW},
18975 .cmp = {STATUS2, 6, RW},
18976 .wps = {STATUS3, 2, RW},
18977 },
Nico Huberaabb3e02023-01-13 00:22:30 +010018978 .wp_write_cfg = spi_wp_write_cfg,
18979 .wp_read_cfg = spi_wp_read_cfg,
18980 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018981 .decode_range = decode_range_spi25,
18982 },
18983
18984 {
18985 .vendor = "Winbond",
18986 .name = "W25Q32JW...Q",
18987 .bustype = BUS_SPI,
18988 .manufacture_id = WINBOND_NEX_ID,
18989 .model_id = WINBOND_NEX_W25Q32_W,
18990 .total_size = 4096,
18991 .page_size = 256,
18992 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
18993 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010018994 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030018995 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
18996 .tested = TEST_OK_PREW,
18997 .probe = probe_spi_rdid,
18998 .probe_timing = TIMING_ZERO,
18999 .block_erasers =
19000 {
19001 {
19002 .eraseblocks = { {4 * 1024, 1024} },
19003 .block_erase = spi_block_erase_20,
19004 }, {
19005 .eraseblocks = { {32 * 1024, 128} },
19006 .block_erase = spi_block_erase_52,
19007 }, {
19008 .eraseblocks = { {64 * 1024, 64} },
19009 .block_erase = spi_block_erase_d8,
19010 }, {
19011 .eraseblocks = { {4 * 1024 * 1024, 1} },
19012 .block_erase = spi_block_erase_60,
19013 }, {
19014 .eraseblocks = { {4 * 1024 * 1024, 1} },
19015 .block_erase = spi_block_erase_c7,
19016 }
19017 },
19018 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19019 .unlock = spi_disable_blockprotect,
19020 .write = spi_chip_write_256,
19021 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019022 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019023 .reg_bits =
19024 {
19025 .srp = {STATUS1, 7, RW},
19026 .srl = {STATUS2, 0, RW},
19027 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19028 .tb = {STATUS1, 5, RW},
19029 .sec = {STATUS1, 6, RW},
19030 .cmp = {STATUS2, 6, RW},
19031 .wps = {STATUS3, 2, RW},
19032 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019033 .wp_write_cfg = spi_wp_write_cfg,
19034 .wp_read_cfg = spi_wp_read_cfg,
19035 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019036 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019037 },
19038
19039 {
19040 .vendor = "Winbond",
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019041 .name = "W25Q32JW...M",
19042 .bustype = BUS_SPI,
19043 .manufacture_id = WINBOND_NEX_ID,
19044 .model_id = WINBOND_NEX_W25Q32JW_M,
19045 .total_size = 4096,
19046 .page_size = 256,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019047 /* OTP: 768B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19048 /* QPI enable 0x38, disable 0xFF */
Nico Huber2133f592024-01-06 18:30:01 +010019049 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI_SRP |
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019050 FEATURE_WRSR2 | FEATURE_WRSR3 | FEATURE_WRSR_EXT2,
Nico Huber2133f592024-01-06 18:30:01 +010019051 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019052 .tested = TEST_OK_PREW,
19053 .probe = probe_spi_rdid,
19054 .probe_timing = TIMING_ZERO,
19055 .block_erasers =
19056 {
19057 {
19058 .eraseblocks = { {4 * 1024, 1024} },
19059 .block_erase = spi_block_erase_20,
19060 }, {
19061 .eraseblocks = { {32 * 1024, 128} },
19062 .block_erase = spi_block_erase_52,
19063 }, {
19064 .eraseblocks = { {64 * 1024, 64} },
19065 .block_erase = spi_block_erase_d8,
19066 }, {
19067 .eraseblocks = { {4 * 1024 * 1024, 1} },
19068 .block_erase = spi_block_erase_60,
19069 }, {
19070 .eraseblocks = { {4 * 1024 * 1024, 1} },
19071 .block_erase = spi_block_erase_c7,
19072 }
19073 },
19074 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19075 .unlock = spi_disable_blockprotect_bp2_srwd,
19076 .write = spi_chip_write_256,
19077 .read = spi_chip_read,
19078 .voltage = {1700, 1950},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019079 .reg_bits =
19080 {
Nico Huber2133f592024-01-06 18:30:01 +010019081 .qe = {STATUS2, 1, RW},
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019082 .srp = {STATUS1, 7, RW},
19083 .srl = {STATUS2, 0, RW},
19084 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19085 .tb = {STATUS1, 5, RW},
19086 .sec = {STATUS1, 6, RW},
19087 .cmp = {STATUS2, 6, RW},
19088 .wps = {STATUS3, 2, RW},
19089 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019090 .wp_write_cfg = spi_wp_write_cfg,
19091 .wp_read_cfg = spi_wp_read_cfg,
19092 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukb1fb3f72022-07-25 00:27:37 +030019093 .decode_range = decode_range_spi25,
Nikolai Artemiev6ae79b12021-05-08 17:31:23 +100019094 },
19095
19096 {
19097 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019098 .name = "W25Q40.V",
19099 .bustype = BUS_SPI,
19100 .manufacture_id = WINBOND_NEX_ID,
19101 .model_id = WINBOND_NEX_W25Q40_V,
19102 .total_size = 512,
19103 .page_size = 256,
19104 /* supports SFDP */
19105 /* OTP: 756B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019106 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019107 .tested = TEST_OK_PREW,
19108 .probe = probe_spi_rdid,
19109 .probe_timing = TIMING_ZERO,
19110 .block_erasers =
19111 {
19112 {
19113 .eraseblocks = { {4 * 1024, 128} },
19114 .block_erase = spi_block_erase_20,
19115 }, {
19116 .eraseblocks = { {32 * 1024, 16} },
19117 .block_erase = spi_block_erase_52,
19118 }, {
19119 .eraseblocks = { {64 * 1024, 8} },
19120 .block_erase = spi_block_erase_d8,
19121 }, {
19122 .eraseblocks = { {512 * 1024, 1} },
19123 .block_erase = spi_block_erase_60,
19124 }, {
19125 .eraseblocks = { {512 * 1024, 1} },
19126 .block_erase = spi_block_erase_c7,
19127 }
19128 },
Nico Huber2133f592024-01-06 18:30:01 +010019129 .reg_bits =
19130 {
19131 .qe = {STATUS2, 1, RW},
19132 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019133 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19134 .unlock = spi_disable_blockprotect,
19135 .write = spi_chip_write_256, /* Multi I/O supported */
Nico Huber2133f592024-01-06 18:30:01 +010019136 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019137 .voltage = {2700, 3600},
19138 },
19139
19140 {
19141 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019142 .name = "W25Q40BW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019143 .bustype = BUS_SPI,
19144 .manufacture_id = WINBOND_NEX_ID,
Nico Huber25683572018-03-30 13:50:13 +020019145 .model_id = WINBOND_NEX_W25Q40BW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019146 .total_size = 512,
19147 .page_size = 256,
19148 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019149 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Angel Pons3164a0c2018-09-30 20:26:06 +020019150 .tested = TEST_OK_PREW,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019151 .probe = probe_spi_rdid,
19152 .probe_timing = TIMING_ZERO,
19153 .block_erasers =
19154 {
19155 {
19156 .eraseblocks = { {4 * 1024, 128} },
19157 .block_erase = spi_block_erase_20,
19158 }, {
19159 .eraseblocks = { {32 * 1024, 16} },
19160 .block_erase = spi_block_erase_52,
19161 }, {
19162 .eraseblocks = { {64 * 1024, 8} },
19163 .block_erase = spi_block_erase_d8,
19164 }, {
19165 .eraseblocks = { {512 * 1024, 1} },
19166 .block_erase = spi_block_erase_60,
19167 }, {
19168 .eraseblocks = { {512 * 1024, 1} },
19169 .block_erase = spi_block_erase_c7,
19170 }
19171 },
Nico Huber2133f592024-01-06 18:30:01 +010019172 .reg_bits =
19173 {
19174 .qe = {STATUS2, 1, RW},
19175 },
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019176 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19177 .unlock = spi_disable_blockprotect,
19178 .write = spi_chip_write_256,
19179 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019180 .voltage = {1700, 1950},
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019181 },
19182
19183 {
19184 .vendor = "Winbond",
Nico Huber25683572018-03-30 13:50:13 +020019185 .name = "W25Q40EW",
19186 .bustype = BUS_SPI,
19187 .manufacture_id = WINBOND_NEX_ID,
19188 .model_id = WINBOND_NEX_W25Q40EW,
19189 .total_size = 512,
19190 .page_size = 256,
19191 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019192 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
19193 FEATURE_OTP | FEATURE_QPI_SRP,
19194 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green07b8a172019-09-23 16:47:05 +100019195 .tested = TEST_OK_PREW,
Nico Huber25683572018-03-30 13:50:13 +020019196 .probe = probe_spi_rdid,
19197 .probe_timing = TIMING_ZERO,
19198 .block_erasers =
19199 {
19200 {
19201 .eraseblocks = { {4 * 1024, 128} },
19202 .block_erase = spi_block_erase_20,
19203 }, {
19204 .eraseblocks = { {32 * 1024, 16} },
19205 .block_erase = spi_block_erase_52,
19206 }, {
19207 .eraseblocks = { {64 * 1024, 8} },
19208 .block_erase = spi_block_erase_d8,
19209 }, {
19210 .eraseblocks = { {512 * 1024, 1} },
19211 .block_erase = spi_block_erase_60,
19212 }, {
19213 .eraseblocks = { {512 * 1024, 1} },
19214 .block_erase = spi_block_erase_c7,
19215 }
19216 },
Nico Huber2133f592024-01-06 18:30:01 +010019217 .reg_bits =
19218 {
19219 .qe = {STATUS2, 1, RW},
19220 },
Nico Huber25683572018-03-30 13:50:13 +020019221 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19222 .unlock = spi_disable_blockprotect,
19223 .write = spi_chip_write_256,
19224 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019225 .voltage = {1650, 1950},
Nico Huber25683572018-03-30 13:50:13 +020019226 },
19227
Stanislav Sedovf5775442018-03-07 14:16:51 -080019228 {
19229 .vendor = "Winbond",
Joel Stanley55439612019-07-27 19:25:35 +093019230 .name = "W25Q512JV",
19231 .bustype = BUS_SPI,
19232 .manufacture_id = WINBOND_NEX_ID,
19233 .model_id = WINBOND_NEX_W25Q512JV,
19234 .total_size = 64 * 1024,
19235 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019236 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
19237 FEATURE_OTP | FEATURE_4BA | FEATURE_QIO,
Joel Stanley55439612019-07-27 19:25:35 +093019238 .tested = TEST_OK_PREW,
19239 .probe = probe_spi_rdid,
19240 .probe_timing = TIMING_ZERO,
19241 .block_erasers =
19242 {
19243 {
19244 .eraseblocks = { {4 * 1024, 16384} },
19245 .block_erase = spi_block_erase_21,
19246 }, {
19247 .eraseblocks = { {4 * 1024, 16384} },
19248 .block_erase = spi_block_erase_20,
19249 }, {
19250 .eraseblocks = { {32 * 1024, 2048} },
19251 .block_erase = spi_block_erase_52,
19252 }, {
19253 .eraseblocks = { {64 * 1024, 1024} },
19254 .block_erase = spi_block_erase_dc,
19255 }, {
19256 .eraseblocks = { {64 * 1024, 1024} },
19257 .block_erase = spi_block_erase_d8,
19258 }, {
19259 .eraseblocks = { {64 * 1024 * 1024, 1} },
19260 .block_erase = spi_block_erase_60,
19261 }, {
19262 .eraseblocks = { {64 * 1024 * 1024, 1} },
19263 .block_erase = spi_block_erase_c7,
19264 }
19265 },
Nico Huber2133f592024-01-06 18:30:01 +010019266 .reg_bits =
19267 {
19268 .qe = {STATUS2, 1, RW},
19269 },
Joel Stanley55439612019-07-27 19:25:35 +093019270 .printlock = spi_prettyprint_status_register_plain,
19271 .unlock = spi_disable_blockprotect,
19272 .write = spi_chip_write_256,
19273 .read = spi_chip_read,
19274 .voltage = {2700, 3600},
Nico Huberab6b18f2023-01-11 23:38:20 +010019275 .prepare_access = spi_prepare_4ba,
Joel Stanley55439612019-07-27 19:25:35 +093019276 },
19277
19278 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010019279 .vendor = "Winbond",
19280 .name = "W25Q512NW-IM",
19281 .bustype = BUS_SPI,
19282 .manufacture_id = WINBOND_NEX_ID,
19283 .model_id = WINBOND_NEX_W25Q512NW_IM,
19284 .total_size = 64 * 1024,
19285 .page_size = 256,
Nico Huber2133f592024-01-06 18:30:01 +010019286 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19287 FEATURE_OTP | FEATURE_4BA | FEATURE_QPI_SRP,
19288 .dummy_cycles =
19289 {
19290 /* Actually has 3 parameter bits, but higher values only help with DTR. */
19291 .qpi_read_params = { 2, 4, 6, 8 },
19292 },
Subrata Banikf5bffd92022-12-14 12:30:43 +053019293 .tested = TEST_OK_PREWB,
Felix Singer3c9bdb92022-12-15 23:30:16 +010019294 .probe = probe_spi_rdid,
19295 .probe_timing = TIMING_ZERO,
19296 .block_erasers =
Atul Dhudase2502dbd2021-09-21 10:02:20 +053019297 {
Felix Singer3c9bdb92022-12-15 23:30:16 +010019298 {
19299 .eraseblocks = { {4 * 1024, 16384} },
19300 .block_erase = spi_block_erase_21,
19301 }, {
19302 .eraseblocks = { {4 * 1024, 16384} },
19303 .block_erase = spi_block_erase_20,
19304 }, {
19305 .eraseblocks = { {32 * 1024, 2048} },
19306 .block_erase = spi_block_erase_52,
19307 }, {
19308 .eraseblocks = { {64 * 1024, 1024} },
19309 .block_erase = spi_block_erase_dc,
19310 }, {
19311 .eraseblocks = { {64 * 1024, 1024} },
19312 .block_erase = spi_block_erase_d8,
19313 }, {
19314 .eraseblocks = { {64 * 1024 * 1024, 1} },
19315 .block_erase = spi_block_erase_60,
19316 }, {
19317 .eraseblocks = { {64 * 1024 * 1024, 1} },
19318 .block_erase = spi_block_erase_c7,
19319 }
19320 },
19321 .unlock = spi_disable_blockprotect,
19322 .write = spi_chip_write_256,
19323 .read = spi_chip_read,
19324 .voltage = {1650, 1950},
Subrata Banikf5bffd92022-12-14 12:30:43 +053019325 .reg_bits =
19326 {
Nico Huber2133f592024-01-06 18:30:01 +010019327 .qe = {STATUS2, 1, RW},
Subrata Banikf5bffd92022-12-14 12:30:43 +053019328 .srp = {STATUS1, 7, RW},
19329 .srl = {STATUS2, 0, RW},
19330 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
19331 .tb = {STATUS1, 6, RW},
19332 .cmp = {STATUS2, 6, RW},
19333 .wps = {STATUS3, 2, RW},
19334 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019335 .wp_write_cfg = spi_wp_write_cfg,
19336 .wp_read_cfg = spi_wp_read_cfg,
19337 .wp_get_ranges = spi_wp_get_available_ranges,
Subrata Banikf5bffd92022-12-14 12:30:43 +053019338 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010019339 .prepare_access = spi_prepare_4ba,
Atul Dhudase2502dbd2021-09-21 10:02:20 +053019340 },
19341
19342 {
Joel Stanley55439612019-07-27 19:25:35 +093019343 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019344 .name = "W25Q64BV/W25Q64CV/W25Q64FV",
Stanislav Sedovf5775442018-03-07 14:16:51 -080019345 .bustype = BUS_SPI,
19346 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019347 .model_id = WINBOND_NEX_W25Q64_V,
19348 .total_size = 8192,
Stanislav Sedovf5775442018-03-07 14:16:51 -080019349 .page_size = 256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019350 /* supports SFDP */
19351 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019352 /* QPI: only FV version */
19353 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030019354 .tested = TEST_OK_PREWB,
Stanislav Sedovf5775442018-03-07 14:16:51 -080019355 .probe = probe_spi_rdid,
19356 .probe_timing = TIMING_ZERO,
19357 .block_erasers =
19358 {
19359 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019360 .eraseblocks = { {4 * 1024, 2048} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019361 .block_erase = spi_block_erase_20,
19362 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019363 .eraseblocks = { {32 * 1024, 256} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019364 .block_erase = spi_block_erase_52,
19365 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019366 .eraseblocks = { {64 * 1024, 128} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019367 .block_erase = spi_block_erase_d8,
19368 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019369 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019370 .block_erase = spi_block_erase_60,
19371 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019372 .eraseblocks = { {8 * 1024 * 1024, 1} },
Stanislav Sedovf5775442018-03-07 14:16:51 -080019373 .block_erase = spi_block_erase_c7,
19374 }
19375 },
19376 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19377 .unlock = spi_disable_blockprotect,
19378 .write = spi_chip_write_256,
19379 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019380 .voltage = {2700, 3600},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019381 .reg_bits =
19382 {
Nico Huber2133f592024-01-06 18:30:01 +010019383 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019384 .srp = {STATUS1, 7, RW},
19385 .srl = {STATUS2, 0, RW},
19386 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19387 .tb = {STATUS1, 5, RW},
19388 .sec = {STATUS1, 6, RW},
19389 .cmp = {STATUS2, 6, RW},
19390 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019391 .wp_write_cfg = spi_wp_write_cfg,
19392 .wp_read_cfg = spi_wp_read_cfg,
19393 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019394 .decode_range = decode_range_spi25,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019395 },
19396
19397 {
19398 .vendor = "Winbond",
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019399 .name = "W25Q64JV-.Q",
19400 .bustype = BUS_SPI,
19401 .manufacture_id = WINBOND_NEX_ID,
19402 .model_id = WINBOND_NEX_W25Q64_V,
19403 .total_size = 8192,
19404 .page_size = 256,
19405 /* supports SFDP */
19406 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019407 .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QIO |
Nico Huber3f3c1f32022-05-28 16:48:26 +020019408 FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019409 .tested = TEST_OK_PREW,
19410 .probe = probe_spi_rdid,
19411 .probe_timing = TIMING_ZERO,
19412 .block_erasers =
19413 {
19414 {
19415 .eraseblocks = { {4 * 1024, 2048} },
19416 .block_erase = spi_block_erase_20,
19417 }, {
19418 .eraseblocks = { {32 * 1024, 256} },
19419 .block_erase = spi_block_erase_52,
19420 }, {
19421 .eraseblocks = { {64 * 1024, 128} },
19422 .block_erase = spi_block_erase_d8,
19423 }, {
19424 .eraseblocks = { {8 * 1024 * 1024, 1} },
19425 .block_erase = spi_block_erase_60,
19426 }, {
19427 .eraseblocks = { {8 * 1024 * 1024, 1} },
19428 .block_erase = spi_block_erase_c7,
19429 }
19430 },
19431 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19432 .unlock = spi_disable_blockprotect,
19433 .write = spi_chip_write_256,
19434 .read = spi_chip_read,
19435 .voltage = {2700, 3600},
19436 .reg_bits =
19437 {
Nico Huber2133f592024-01-06 18:30:01 +010019438 .qe = {STATUS2, 1, RW},
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019439 .srp = {STATUS1, 7, RW},
19440 .srl = {STATUS2, 0, RW},
19441 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19442 .tb = {STATUS1, 5, RW},
19443 .sec = {STATUS1, 6, RW},
19444 .cmp = {STATUS2, 6, RW},
19445 .wps = {STATUS3, 2, RW},
19446 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019447 .wp_write_cfg = spi_wp_write_cfg,
19448 .wp_read_cfg = spi_wp_read_cfg,
19449 .wp_get_ranges = spi_wp_get_available_ranges,
Sergii Dmytrukd1af3072021-11-08 00:00:43 +020019450 .decode_range = decode_range_spi25,
19451 },
19452
19453 {
19454 .vendor = "Winbond",
19455 .name = "W25Q64JV-.M",
Simon Buhrow236a38c2021-11-05 11:48:30 +010019456 .bustype = BUS_SPI,
19457 .manufacture_id = WINBOND_NEX_ID,
19458 .model_id = WINBOND_NEX_W25Q64JV,
19459 .total_size = 8192,
19460 .page_size = 256,
19461 /* supports SFDP */
Nico Huber2133f592024-01-06 18:30:01 +010019462 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 | FEATURE_WRSR3 |
19463 FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010019464 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Simon Buhrow236a38c2021-11-05 11:48:30 +010019465 .tested = TEST_OK_PREW,
19466 .probe = probe_spi_rdid,
19467 .probe_timing = TIMING_ZERO,
19468 .block_erasers =
19469 {
19470 {
19471 .eraseblocks = { {4 * 1024, 2048} },
19472 .block_erase = spi_block_erase_20,
19473 }, {
19474 .eraseblocks = { {32 * 1024, 256} },
19475 .block_erase = spi_block_erase_52,
19476 }, {
19477 .eraseblocks = { {64 * 1024, 128} },
19478 .block_erase = spi_block_erase_d8,
19479 }, {
19480 .eraseblocks = { {8 * 1024 * 1024, 1} },
19481 .block_erase = spi_block_erase_60,
19482 }, {
19483 .eraseblocks = { {8 * 1024 * 1024, 1} },
19484 .block_erase = spi_block_erase_c7,
19485 }
19486 },
Nico Huber2133f592024-01-06 18:30:01 +010019487 .reg_bits =
19488 {
19489 .qe = {STATUS2, 1, RW},
19490 },
Simon Buhrow236a38c2021-11-05 11:48:30 +010019491 .printlock = spi_prettyprint_status_register_bp2_tb_bpl,
19492 .unlock = spi_disable_blockprotect_bp2_srwd,
19493 .write = spi_chip_write_256,
19494 .read = spi_chip_read,
19495 .voltage = {2700, 3600},
19496 },
19497
19498 {
19499 .vendor = "Winbond",
Nico Hubera358b142024-04-14 18:29:06 +020019500 .name = "W25Q64DW",
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019501 .bustype = BUS_SPI,
19502 .manufacture_id = WINBOND_NEX_ID,
19503 .model_id = WINBOND_NEX_W25Q64_W,
19504 .total_size = 8192,
19505 .page_size = 256,
19506 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019507 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QPI_SRP,
19508 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Nico Hubera358b142024-04-14 18:29:06 +020019509 .tested = TEST_OK_PREW,
19510 .probe = probe_spi_rdid,
19511 .probe_timing = TIMING_ZERO,
19512 .block_erasers =
19513 {
19514 {
19515 .eraseblocks = { {4 * 1024, 2048} },
19516 .block_erase = spi_block_erase_20,
19517 }, {
19518 .eraseblocks = { {32 * 1024, 256} },
19519 .block_erase = spi_block_erase_52,
19520 }, {
19521 .eraseblocks = { {64 * 1024, 128} },
19522 .block_erase = spi_block_erase_d8,
19523 }, {
19524 .eraseblocks = { {8 * 1024 * 1024, 1} },
19525 .block_erase = spi_block_erase_60,
19526 }, {
19527 .eraseblocks = { {8 * 1024 * 1024, 1} },
19528 .block_erase = spi_block_erase_c7,
19529 }
19530 },
19531 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19532 .unlock = spi_disable_blockprotect,
19533 .write = spi_chip_write_256,
19534 .read = spi_chip_read,
19535 .voltage = {1700, 1950}, /* Fast read (0x0B) and multi I/O supported */
19536 .reg_bits =
19537 {
19538 .srp = {STATUS1, 7, RW},
19539 .srl = {STATUS2, 0, RW},
19540 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19541 .tb = {STATUS1, 5, RW},
19542 .sec = {STATUS1, 6, RW},
19543 .cmp = {STATUS2, 6, RW},
19544 },
19545 .wp_write_cfg = spi_wp_write_cfg,
19546 .wp_read_cfg = spi_wp_read_cfg,
19547 .wp_get_ranges = spi_wp_get_available_ranges,
19548 .decode_range = decode_range_spi25,
19549 },
19550
19551 {
19552 .vendor = "Winbond",
19553 .name = "W25Q64FW/W25Q64JW...Q",
19554 .bustype = BUS_SPI,
19555 .manufacture_id = WINBOND_NEX_ID,
19556 .model_id = WINBOND_NEX_W25Q64_W,
19557 .total_size = 8192,
19558 .page_size = 256,
19559 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber1412d9f2024-01-06 18:25:49 +010019560 /* FEATURE_QPI_SRP (2, 4, 6, 8): only FW version */
Nico Hubera358b142024-04-14 18:29:06 +020019561 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
Nico Huber1412d9f2024-01-06 18:25:49 +010019562 FEATURE_OTP | FEATURE_QIO,
Sergii Dmytrukc74eac22022-10-06 18:17:58 +030019563 .tested = TEST_OK_PREWB,
Yung-Chieh Lob13d4e62013-06-09 14:00:46 +000019564 .probe = probe_spi_rdid,
19565 .probe_timing = TIMING_ZERO,
19566 .block_erasers =
19567 {
19568 {
19569 .eraseblocks = { {4 * 1024, 2048} },
19570 .block_erase = spi_block_erase_20,
19571 }, {
19572 .eraseblocks = { {32 * 1024, 256} },
19573 .block_erase = spi_block_erase_52,
19574 }, {
19575 .eraseblocks = { {64 * 1024, 128} },
19576 .block_erase = spi_block_erase_d8,
19577 }, {
19578 .eraseblocks = { {8 * 1024 * 1024, 1} },
19579 .block_erase = spi_block_erase_60,
19580 }, {
19581 .eraseblocks = { {8 * 1024 * 1024, 1} },
19582 .block_erase = spi_block_erase_c7,
19583 }
19584 },
19585 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19586 .unlock = spi_disable_blockprotect,
19587 .write = spi_chip_write_256,
19588 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019589 .voltage = {1700, 1950},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019590 .reg_bits =
19591 {
Nico Huber2133f592024-01-06 18:30:01 +010019592 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019593 .srp = {STATUS1, 7, RW},
19594 .srl = {STATUS2, 0, RW},
19595 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19596 .tb = {STATUS1, 5, RW},
19597 .sec = {STATUS1, 6, RW},
19598 .cmp = {STATUS2, 6, RW},
19599 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019600 .wp_write_cfg = spi_wp_write_cfg,
19601 .wp_read_cfg = spi_wp_read_cfg,
19602 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110019603 .decode_range = decode_range_spi25,
Antony Rheneus0fbba982011-05-26 14:28:51 +000019604 },
19605
19606 {
19607 .vendor = "Winbond",
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019608 .name = "W25Q64JW...M",
Scott Chao1bbc5012020-04-08 22:10:50 +080019609 .bustype = BUS_SPI,
19610 .manufacture_id = WINBOND_NEX_ID,
Nikolai Artemiev5fa05052021-05-14 15:26:47 +100019611 .model_id = WINBOND_NEX_W25Q64JW_M,
Scott Chao1bbc5012020-04-08 22:10:50 +080019612 .total_size = 8192,
19613 .page_size = 256,
19614 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
19615 /* QPI enable 0x38, disable 0xFF */
Nico Huber1412d9f2024-01-06 18:25:49 +010019616 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_WRSR3 |
19617 FEATURE_OTP | FEATURE_QPI_SRP,
19618 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Scott Chao1bbc5012020-04-08 22:10:50 +080019619 .tested = TEST_OK_PREW,
19620 .probe = probe_spi_rdid,
19621 .probe_timing = TIMING_ZERO,
19622 .block_erasers =
19623 {
19624 {
19625 .eraseblocks = { {4 * 1024, 2048} },
19626 .block_erase = spi_block_erase_20,
19627 }, {
19628 .eraseblocks = { {32 * 1024, 256} },
19629 .block_erase = spi_block_erase_52,
19630 }, {
19631 .eraseblocks = { {64 * 1024, 128} },
19632 .block_erase = spi_block_erase_d8,
19633 }, {
19634 .eraseblocks = { {8 * 1024 * 1024, 1} },
19635 .block_erase = spi_block_erase_60,
19636 }, {
19637 .eraseblocks = { {8 * 1024 * 1024, 1} },
19638 .block_erase = spi_block_erase_c7,
19639 }
19640 },
19641 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19642 .unlock = spi_disable_blockprotect,
19643 .write = spi_chip_write_256,
19644 .read = spi_chip_read,
Nico Huber1412d9f2024-01-06 18:25:49 +010019645 .voltage = {1700, 1950},
Evan Benn29c8b5d2022-09-13 16:01:10 +100019646 .reg_bits =
19647 {
Nico Huber2133f592024-01-06 18:30:01 +010019648 .qe = {STATUS2, 1, RW},
Evan Benn29c8b5d2022-09-13 16:01:10 +100019649 .srp = {STATUS1, 7, RW},
19650 .srl = {STATUS2, 0, RW},
19651 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
19652 .tb = {STATUS1, 5, RW},
19653 .sec = {STATUS1, 6, RW},
19654 .cmp = {STATUS2, 6, RW},
19655 .wps = {STATUS3, 2, RW},
19656 },
Nico Huberaabb3e02023-01-13 00:22:30 +010019657 .wp_write_cfg = spi_wp_write_cfg,
19658 .wp_read_cfg = spi_wp_read_cfg,
19659 .wp_get_ranges = spi_wp_get_available_ranges,
Evan Benn29c8b5d2022-09-13 16:01:10 +100019660 .decode_range = decode_range_spi25,
Scott Chao1bbc5012020-04-08 22:10:50 +080019661 },
19662
19663 {
19664 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019665 .name = "W25Q80.V",
Nico Huber70eed9f2017-04-24 22:19:27 +020019666 .bustype = BUS_SPI,
19667 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019668 .model_id = WINBOND_NEX_W25Q80_V,
19669 .total_size = 1024,
Nico Huber70eed9f2017-04-24 22:19:27 +020019670 .page_size = 256,
19671 /* supports SFDP */
19672 /* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019673 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
David Hendricks48729d32017-12-08 14:44:07 -080019674 .tested = TEST_OK_PREW,
Nico Huber70eed9f2017-04-24 22:19:27 +020019675 .probe = probe_spi_rdid,
19676 .probe_timing = TIMING_ZERO,
19677 .block_erasers =
19678 {
19679 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019680 .eraseblocks = { {4 * 1024, 256} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019681 .block_erase = spi_block_erase_20,
19682 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019683 .eraseblocks = { {32 * 1024, 32} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019684 .block_erase = spi_block_erase_52,
19685 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019686 .eraseblocks = { {64 * 1024, 16} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019687 .block_erase = spi_block_erase_d8,
19688 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019689 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019690 .block_erase = spi_block_erase_60,
19691 }, {
Alan Green1f9cc7d2019-07-01 11:10:45 +100019692 .eraseblocks = { {1024 * 1024, 1} },
Nico Huber70eed9f2017-04-24 22:19:27 +020019693 .block_erase = spi_block_erase_c7,
19694 }
19695 },
Nico Huber2133f592024-01-06 18:30:01 +010019696 .reg_bits =
19697 {
19698 .qe = {STATUS2, 1, RW},
19699 },
Nico Huber70eed9f2017-04-24 22:19:27 +020019700 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19701 .unlock = spi_disable_blockprotect,
19702 .write = spi_chip_write_256,
19703 .read = spi_chip_read,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019704 .voltage = {2700, 3600},
19705 },
19706
19707 {
19708 .vendor = "Winbond",
19709 .name = "W25Q80BW",
19710 .bustype = BUS_SPI,
19711 .manufacture_id = WINBOND_NEX_ID,
19712 .model_id = WINBOND_NEX_W25Q80BW,
19713 .total_size = 1024,
19714 .page_size = 256,
19715 /* OTP: 256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019716 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_OTP | FEATURE_QIO,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019717 .tested = TEST_OK_PREW,
19718 .probe = probe_spi_rdid,
19719 .probe_timing = TIMING_ZERO,
19720 .block_erasers =
19721 {
19722 {
19723 .eraseblocks = { {4 * 1024, 256} },
19724 .block_erase = spi_block_erase_20,
19725 }, {
19726 .eraseblocks = { {32 * 1024, 32} },
19727 .block_erase = spi_block_erase_52,
19728 }, {
19729 .eraseblocks = { {64 * 1024, 16} },
19730 .block_erase = spi_block_erase_d8,
19731 }, {
19732 .eraseblocks = { {1 * 1024 * 1024, 1} },
19733 .block_erase = spi_block_erase_60,
19734 }, {
19735 .eraseblocks = { {1 * 1024 * 1024, 1} },
19736 .block_erase = spi_block_erase_c7,
19737 }
19738 },
Nico Huber2133f592024-01-06 18:30:01 +010019739 .reg_bits =
19740 {
19741 .qe = {STATUS2, 1, RW},
19742 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019743 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19744 .unlock = spi_disable_blockprotect,
19745 .write = spi_chip_write_256,
19746 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019747 .voltage = {1700, 1950},
Alan Green1f9cc7d2019-07-01 11:10:45 +100019748 },
19749
19750 {
19751 .vendor = "Winbond",
19752 .name = "W25Q80EW",
19753 .bustype = BUS_SPI,
19754 .manufacture_id = WINBOND_NEX_ID,
19755 .model_id = WINBOND_NEX_W25Q80EW,
19756 .total_size = 1024,
19757 .page_size = 256,
19758 /* OTP: 3*256B total; read 0x48; write 0x42, erase 0x44, read ID 0x4B */
Nico Huber2133f592024-01-06 18:30:01 +010019759 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR_EXT2 | FEATURE_WRSR2 |
19760 FEATURE_OTP | FEATURE_QPI_SRP,
19761 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019762 .tested = TEST_OK_PREW,
19763 .probe = probe_spi_rdid,
19764 .probe_timing = TIMING_ZERO,
19765 .block_erasers =
19766 {
19767 {
19768 .eraseblocks = { {4 * 1024, 256} },
19769 .block_erase = spi_block_erase_20,
19770 }, {
19771 .eraseblocks = { {32 * 1024, 32} },
19772 .block_erase = spi_block_erase_52,
19773 }, {
19774 .eraseblocks = { {64 * 1024, 16} },
19775 .block_erase = spi_block_erase_d8,
19776 }, {
19777 .eraseblocks = { {1 * 1024 * 1024, 1} },
19778 .block_erase = spi_block_erase_60,
19779 }, {
19780 .eraseblocks = { {1 * 1024 * 1024, 1} },
19781 .block_erase = spi_block_erase_c7,
19782 }
19783 },
Nico Huber2133f592024-01-06 18:30:01 +010019784 .reg_bits =
19785 {
19786 .qe = {STATUS2, 1, RW},
19787 },
Alan Green1f9cc7d2019-07-01 11:10:45 +100019788 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19789 .unlock = spi_disable_blockprotect,
19790 .write = spi_chip_write_256,
19791 .read = spi_chip_read,
Nico Huber2133f592024-01-06 18:30:01 +010019792 .voltage = {1650, 1950},
Nico Huber70eed9f2017-04-24 22:19:27 +020019793 },
19794
19795 {
19796 .vendor = "Winbond",
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040019797 .name = "W25X05",
19798 .bustype = BUS_SPI,
19799 .manufacture_id = WINBOND_NEX_ID,
19800 .model_id = WINBOND_NEX_W25X05,
19801 .total_size = 64,
19802 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019803 /* FEATURE_FAST_READ_DIO since W25X05B */
19804 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Jacob Appelbaumebbdc022019-09-02 09:10:43 -040019805 .tested = TEST_OK_PREW,
19806 .probe = probe_spi_rdid,
19807 .probe_timing = TIMING_ZERO,
19808 .block_erasers =
19809 {
19810 {
19811 .eraseblocks = { {4 * 1024, 16} },
19812 .block_erase = spi_block_erase_20,
19813 }, {
19814 .eraseblocks = { {32 * 1024, 2} },
19815 .block_erase = spi_block_erase_52,
19816 }, {
19817 .eraseblocks = { {64 * 1024, 1} },
19818 .block_erase = spi_block_erase_d8,
19819 }
19820 },
19821 .printlock = spi_prettyprint_status_register_plain,
19822 .unlock = spi_disable_blockprotect,
19823 .write = spi_chip_write_256,
19824 .read = spi_chip_read,
19825 .voltage = {2300, 3600},
19826 },
19827
19828 {
19829 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019830 .name = "W25X10",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019831 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019832 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019833 .model_id = WINBOND_NEX_W25X10,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019834 .total_size = 128,
19835 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019836 /* FEATURE_FAST_READ_DIO since W25X10B */
19837 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunere34e3e82013-01-01 00:06:51 +000019838 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019839 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000019840 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019841 .block_erasers =
19842 {
19843 {
19844 .eraseblocks = { {4 * 1024, 32} },
19845 .block_erase = spi_block_erase_20,
19846 }, {
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019847 .eraseblocks = { {64 * 1024, 2} },
19848 .block_erase = spi_block_erase_d8,
19849 }, {
19850 .eraseblocks = { {128 * 1024, 1} },
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019851 .block_erase = spi_block_erase_c7,
19852 }
19853 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019854 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019855 .unlock = spi_disable_blockprotect,
Carl-Daniel Hailfinger8d497012009-05-09 02:34:18 +000019856 .write = spi_chip_write_256,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019857 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019858 .voltage = {2700, 3600},
FENG yu ningff692fb2008-12-08 18:15:10 +000019859 },
19860
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000019861 {
19862 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019863 .name = "W25X16",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019864 .bustype = BUS_SPI,
Hector Martina721ae22009-07-11 19:39:11 +000019865 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019866 .model_id = WINBOND_NEX_W25X16,
Hector Martina721ae22009-07-11 19:39:11 +000019867 .total_size = 2048,
19868 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019869 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner8179be52011-06-04 13:13:34 +000019870 .tested = TEST_OK_PREW,
Hector Martina721ae22009-07-11 19:39:11 +000019871 .probe = probe_spi_rdid,
19872 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019873 .block_erasers =
19874 {
19875 {
19876 .eraseblocks = { {4 * 1024, 512} },
19877 .block_erase = spi_block_erase_20,
19878 }, {
19879 .eraseblocks = { {32 * 1024, 64} },
19880 .block_erase = spi_block_erase_52,
19881 }, {
19882 .eraseblocks = { {64 * 1024, 32} },
19883 .block_erase = spi_block_erase_d8,
19884 }, {
19885 .eraseblocks = { {2 * 1024 * 1024, 1} },
19886 .block_erase = spi_block_erase_60,
19887 }, {
19888 .eraseblocks = { {2 * 1024 * 1024, 1} },
19889 .block_erase = spi_block_erase_c7,
19890 }
19891 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019892 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019893 .unlock = spi_disable_blockprotect,
Hector Martina721ae22009-07-11 19:39:11 +000019894 .write = spi_chip_write_256,
19895 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019896 .voltage = {2700, 3600},
Hector Martina721ae22009-07-11 19:39:11 +000019897 },
19898
19899 {
19900 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019901 .name = "W25X20",
19902 .bustype = BUS_SPI,
19903 .manufacture_id = WINBOND_NEX_ID,
19904 .model_id = WINBOND_NEX_W25X20,
19905 .total_size = 256,
19906 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019907 /* FEATURE_FAST_READ_DIO since W25X20B */
19908 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019909 .tested = TEST_OK_PREW,
19910 .probe = probe_spi_rdid,
19911 .probe_timing = TIMING_ZERO,
19912 .block_erasers =
19913 {
19914 {
19915 .eraseblocks = { {4 * 1024, 64} },
19916 .block_erase = spi_block_erase_20,
19917 }, {
19918 .eraseblocks = { {64 * 1024, 4} },
19919 .block_erase = spi_block_erase_d8,
19920 }, {
19921 .eraseblocks = { {256 * 1024, 1} },
19922 .block_erase = spi_block_erase_c7,
19923 }
19924 },
19925 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19926 .unlock = spi_disable_blockprotect,
19927 .write = spi_chip_write_256,
19928 .read = spi_chip_read,
19929 .voltage = {2700, 3600},
19930 },
19931
19932 {
19933 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000019934 .name = "W25X32",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000019935 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000019936 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000019937 .model_id = WINBOND_NEX_W25X32,
Zheng Bao1db2b752009-11-26 11:05:01 +000019938 .total_size = 4096,
19939 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019940 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Taunerc2eec2c2014-05-03 21:33:01 +000019941 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000019942 .probe = probe_spi_rdid,
19943 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000019944 .block_erasers =
19945 {
19946 {
19947 .eraseblocks = { {4 * 1024, 1024} },
19948 .block_erase = spi_block_erase_20,
19949 }, {
19950 .eraseblocks = { {32 * 1024, 128} },
19951 .block_erase = spi_block_erase_52,
19952 }, {
19953 .eraseblocks = { {64 * 1024, 64} },
19954 .block_erase = spi_block_erase_d8,
19955 }, {
19956 .eraseblocks = { {4 * 1024 * 1024, 1} },
19957 .block_erase = spi_block_erase_60,
19958 }, {
19959 .eraseblocks = { {4 * 1024 * 1024, 1} },
19960 .block_erase = spi_block_erase_c7,
19961 }
19962 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000019963 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000019964 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000019965 .write = spi_chip_write_256,
19966 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000019967 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000019968 },
19969
19970 {
19971 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100019972 .name = "W25X40",
19973 .bustype = BUS_SPI,
19974 .manufacture_id = WINBOND_NEX_ID,
19975 .model_id = WINBOND_NEX_W25X40,
19976 .total_size = 512,
19977 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020019978 /* FEATURE_FAST_READ_DIO since W25X40B */
19979 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100019980 .tested = TEST_OK_PREW,
19981 .probe = probe_spi_rdid,
19982 .probe_timing = TIMING_ZERO,
19983 .block_erasers =
19984 {
19985 {
19986 .eraseblocks = { {4 * 1024, 128} },
19987 .block_erase = spi_block_erase_20,
19988 }, {
19989 .eraseblocks = { {64 * 1024, 8} },
19990 .block_erase = spi_block_erase_d8,
19991 }, {
19992 .eraseblocks = { {512 * 1024, 1} },
19993 .block_erase = spi_block_erase_c7,
19994 }
19995 },
19996 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
19997 .unlock = spi_disable_blockprotect,
19998 .write = spi_chip_write_256,
19999 .read = spi_chip_read,
20000 .voltage = {2700, 3600},
20001 },
20002
20003 {
20004 .vendor = "Winbond",
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020005 .name = "W25X64",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020006 .bustype = BUS_SPI,
Zheng Bao1db2b752009-11-26 11:05:01 +000020007 .manufacture_id = WINBOND_NEX_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020008 .model_id = WINBOND_NEX_W25X64,
Zheng Bao1db2b752009-11-26 11:05:01 +000020009 .total_size = 8192,
20010 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020011 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020012 .tested = TEST_OK_PREW,
Zheng Bao1db2b752009-11-26 11:05:01 +000020013 .probe = probe_spi_rdid,
20014 .probe_timing = TIMING_ZERO,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020015 .block_erasers =
20016 {
20017 {
20018 .eraseblocks = { {4 * 1024, 2048} },
20019 .block_erase = spi_block_erase_20,
20020 }, {
20021 .eraseblocks = { {32 * 1024, 256} },
20022 .block_erase = spi_block_erase_52,
20023 }, {
20024 .eraseblocks = { {64 * 1024, 128} },
20025 .block_erase = spi_block_erase_d8,
20026 }, {
20027 .eraseblocks = { {8 * 1024 * 1024, 1} },
20028 .block_erase = spi_block_erase_60,
20029 }, {
20030 .eraseblocks = { {8 * 1024 * 1024, 1} },
20031 .block_erase = spi_block_erase_c7,
20032 }
20033 },
Stefan Tauner6ee37e22012-12-29 15:03:51 +000020034 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
Carl-Daniel Hailfinger29a1c662010-07-14 20:21:22 +000020035 .unlock = spi_disable_blockprotect,
Zheng Bao1db2b752009-11-26 11:05:01 +000020036 .write = spi_chip_write_256,
20037 .read = spi_chip_read,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020038 .voltage = {2700, 3600},
Zheng Bao1db2b752009-11-26 11:05:01 +000020039 },
20040
20041 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100020042 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020043 .name = "W25X80",
Alan Greenfa3fcd32019-06-27 15:41:50 +100020044 .bustype = BUS_SPI,
20045 .manufacture_id = WINBOND_NEX_ID,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020046 .model_id = WINBOND_NEX_W25X80,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020047 .total_size = 1024,
20048 .page_size = 256,
Nico Hubera26a3c62024-04-12 19:28:28 +020020049 /* FEATURE_FAST_READ_DIO since W25X80B */
20050 .feature_bits = FEATURE_WRSR_WREN | FEATURE_FAST_READ_DOUT,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020051 .tested = TEST_OK_PREW,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020052 .probe = probe_spi_rdid,
20053 .probe_timing = TIMING_ZERO,
20054 .block_erasers =
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020055 {
20056 {
Alan Green1f9cc7d2019-07-01 11:10:45 +100020057 .eraseblocks = { {4 * 1024, 256} },
20058 .block_erase = spi_block_erase_20,
20059 }, {
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020060 .eraseblocks = { {64 * 1024, 16} },
20061 .block_erase = spi_block_erase_d8,
20062 }, {
20063 .eraseblocks = { {1024 * 1024, 1} },
20064 .block_erase = spi_block_erase_c7,
20065 }
20066 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100020067 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
20068 .unlock = spi_disable_blockprotect,
20069 .write = spi_chip_write_256,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020070 .read = spi_chip_read,
Alan Greenfa3fcd32019-06-27 15:41:50 +100020071 .voltage = {2700, 3600},
David Hendricksc9ee0ed2018-02-11 17:40:53 -080020072 },
20073
Alan Greenf29ea362019-06-27 17:14:02 +100020074 /* W29EE011, W29EE012, W29C010M, W29C011A do not support probe_jedec according to the datasheet, but it works for newer(?) steppings. */
20075 {
Carl-Daniel Hailfinger2e88a9f2011-07-26 14:18:52 +000020076 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020077 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020078 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020079 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020080 .model_id = WINBOND_W29C010,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020081 .total_size = 128,
20082 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020083 .feature_bits = FEATURE_LONG_RESET,
David Hendricks567b7b82011-05-18 01:31:03 +000020084 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020085 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020086 .probe_timing = 10, /* used datasheet for the W29C011A */
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020087 .block_erasers =
20088 {
20089 {
20090 .eraseblocks = { {128 * 1024, 1} },
20091 .block_erase = erase_chip_block_jedec,
20092 }
20093 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020094 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020095 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020096 .prepare_access = prepare_memory_access,
20097 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020098 },
20099
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020100 {
20101 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020102 .name = "W29C010(M)/W29C011A/W29EE011/W29EE012-old",
20103 .bustype = BUS_PARALLEL,
20104 .manufacture_id = WINBOND_ID,
20105 .model_id = WINBOND_W29C010,
20106 .total_size = 128,
20107 .page_size = 128,
20108 .feature_bits = FEATURE_LONG_RESET,
20109 .tested = TEST_OK_PREW,
20110 .probe = probe_w29ee011,
20111 .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (w29ee011.c) */
20112 .block_erasers =
20113 {
20114 {
20115 .eraseblocks = { {128 * 1024, 1} },
20116 .block_erase = erase_chip_block_jedec,
20117 }
20118 },
20119 .write = write_jedec,
20120 .read = read_memmapped,
Nico Huber9eec4072023-01-12 01:17:30 +010020121 .prepare_access = prepare_memory_access,
20122 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020123 },
20124
20125 {
20126 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020127 .name = "W29C020(C)/W29C022",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020128 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020129 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020130 .model_id = WINBOND_W29C020,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020131 .total_size = 256,
20132 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020133 .feature_bits = FEATURE_LONG_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020134 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020135 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020136 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020137 .block_erasers =
20138 {
20139 {
20140 .eraseblocks = { {256 * 1024, 1} },
20141 .block_erase = erase_chip_block_jedec,
20142 }
20143 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020144 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020145 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020146 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020147 .prepare_access = prepare_memory_access,
20148 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020149 },
20150
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020151 {
20152 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020153 .name = "W29C040/P",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020154 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020155 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020156 .model_id = WINBOND_W29C040,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020157 .total_size = 512,
20158 .page_size = 256,
Sean Nelson35727f72010-01-28 23:55:12 +000020159 .feature_bits = FEATURE_LONG_RESET,
20160 .tested = TEST_UNTESTED,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020161 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020162 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020163 .block_erasers =
20164 {
20165 {
20166 .eraseblocks = { {512 * 1024, 1} },
20167 .block_erase = erase_chip_block_jedec,
20168 }
20169 },
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020170 .write = write_jedec,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020171 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020172 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020173 .prepare_access = prepare_memory_access,
20174 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020175 },
20176
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020177 {
20178 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020179 .name = "W29C512A/W29EE512",
20180 .bustype = BUS_PARALLEL,
20181 .manufacture_id = WINBOND_ID,
20182 .model_id = WINBOND_W29C512A,
20183 .total_size = 64,
20184 .page_size = 128,
20185 .feature_bits = FEATURE_LONG_RESET,
20186 .tested = TEST_OK_PREW,
20187 .probe = probe_jedec,
20188 .probe_timing = 10,
20189 .block_erasers =
20190 {
20191 {
20192 .eraseblocks = { {64 * 1024, 1} },
20193 .block_erase = erase_chip_block_jedec,
20194 }
20195 },
20196 .write = write_jedec,
20197 .read = read_memmapped,
20198 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020199 .prepare_access = prepare_memory_access,
20200 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020201 },
20202
20203 {
20204 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020205 .name = "W29GL032CB",
20206 .bustype = BUS_PARALLEL,
20207 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20208 .model_id = WINBOND_W29GL032CB,
20209 .total_size = 4096,
20210 .page_size = 128 * 1024, /* actual page size is 16 */
20211 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20212 .tested = TEST_UNTESTED,
20213 .probe = probe_jedec_29gl,
20214 .probe_timing = TIMING_ZERO,
20215 .block_erasers =
20216 {
20217 {
20218 .eraseblocks = {
20219 {8 * 1024, 8},
20220 {64 * 1024, 63},
20221 },
20222 .block_erase = erase_sector_jedec,
20223 }, {
20224 .eraseblocks = { {4 * 1024 * 1024, 1} },
20225 .block_erase = erase_chip_block_jedec,
20226 },
20227 },
20228 .write = write_jedec_1,
20229 .read = read_memmapped,
20230 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020231 .prepare_access = prepare_memory_access,
20232 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020233 },
20234
20235 {
20236 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020237 .name = "W29GL032CH/L",
20238 .bustype = BUS_PARALLEL,
20239 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20240 .model_id = WINBOND_W29GL032CHL,
20241 .total_size = 4096,
20242 .page_size = 128 * 1024, /* actual page size is 16 */
20243 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20244 .tested = TEST_UNTESTED,
20245 .probe = probe_jedec_29gl,
20246 .probe_timing = TIMING_ZERO,
20247 .block_erasers =
20248 {
20249 {
20250 .eraseblocks = { {64 * 1024, 64} },
20251 .block_erase = erase_sector_jedec,
20252 }, {
20253 .eraseblocks = { {4 * 1024 * 1024, 1} },
20254 .block_erase = erase_chip_block_jedec,
20255 },
20256 },
20257 .write = write_jedec_1,
20258 .read = read_memmapped,
20259 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020260 .prepare_access = prepare_memory_access,
20261 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020262 },
20263
20264 {
20265 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020266 .name = "W29GL032CT",
20267 .bustype = BUS_PARALLEL,
20268 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20269 .model_id = WINBOND_W29GL032CT,
20270 .total_size = 4096,
20271 .page_size = 128 * 1024, /* actual page size is 16 */
20272 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20273 .tested = TEST_UNTESTED,
20274 .probe = probe_jedec_29gl,
20275 .probe_timing = TIMING_ZERO,
20276 .block_erasers =
20277 {
20278 {
20279 .eraseblocks = {
20280 {64 * 1024, 63},
20281 {8 * 1024, 8},
20282 },
20283 .block_erase = erase_sector_jedec,
20284 }, {
20285 .eraseblocks = { {4 * 1024 * 1024, 1} },
20286 .block_erase = erase_chip_block_jedec,
20287 },
20288 },
20289 .write = write_jedec_1,
20290 .read = read_memmapped,
20291 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020292 .prepare_access = prepare_memory_access,
20293 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020294 },
20295
20296 {
20297 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020298 .name = "W29GL064CB",
20299 .bustype = BUS_PARALLEL,
20300 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20301 .model_id = WINBOND_W29GL064CB,
20302 .total_size = 8192,
20303 .page_size = 128 * 1024, /* actual page size is 16 */
20304 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20305 .tested = TEST_UNTESTED,
20306 .probe = probe_jedec_29gl,
20307 .probe_timing = TIMING_ZERO,
20308 .block_erasers =
20309 {
20310 {
20311 .eraseblocks = {
20312 {8 * 1024, 8},
20313 {64 * 1024, 127},
20314 },
20315 .block_erase = erase_sector_jedec,
20316 }, {
20317 .eraseblocks = { {8 * 1024 * 1024, 1} },
20318 .block_erase = erase_chip_block_jedec,
20319 },
20320 },
20321 .write = write_jedec_1,
20322 .read = read_memmapped,
20323 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020324 .prepare_access = prepare_memory_access,
20325 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020326 },
20327
20328 {
20329 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020330 .name = "W29GL064CH/L",
20331 .bustype = BUS_PARALLEL,
20332 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20333 .model_id = WINBOND_W29GL064CHL,
20334 .total_size = 8192,
20335 .page_size = 128 * 1024, /* actual page size is 16 */
20336 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20337 .tested = TEST_UNTESTED,
20338 .probe = probe_jedec_29gl,
20339 .probe_timing = TIMING_ZERO,
20340 .block_erasers =
20341 {
20342 {
20343 .eraseblocks = { {64 * 1024, 128} },
20344 .block_erase = erase_sector_jedec,
20345 }, {
20346 .eraseblocks = { {8 * 1024 * 1024, 1} },
20347 .block_erase = erase_chip_block_jedec,
20348 },
20349 },
20350 .write = write_jedec_1,
20351 .read = read_memmapped,
20352 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020353 .prepare_access = prepare_memory_access,
20354 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020355 },
20356
20357 {
20358 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020359 .name = "W29GL064CT",
20360 .bustype = BUS_PARALLEL,
20361 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20362 .model_id = WINBOND_W29GL064CT,
20363 .total_size = 8192,
20364 .page_size = 128 * 1024, /* actual page size is 16 */
20365 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20366 .tested = TEST_UNTESTED,
20367 .probe = probe_jedec_29gl,
20368 .probe_timing = TIMING_ZERO,
20369 .block_erasers =
20370 {
20371 {
20372 .eraseblocks = {
20373 {64 * 1024, 127},
20374 {8 * 1024, 8},
20375 },
20376 .block_erase = erase_sector_jedec,
20377 }, {
20378 .eraseblocks = { {8 * 1024 * 1024, 1} },
20379 .block_erase = erase_chip_block_jedec,
20380 },
20381 },
20382 .write = write_jedec_1,
20383 .read = read_memmapped,
20384 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020385 .prepare_access = prepare_memory_access,
20386 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020387 },
20388
20389 {
20390 .vendor = "Winbond",
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020391 .name = "W29GL128C",
20392 .bustype = BUS_PARALLEL,
20393 .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
20394 .model_id = WINBOND_W29GL128CHL,
20395 .total_size = 16384,
20396 .page_size = 128 * 1024, /* actual page size is 16 */
20397 .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
20398 .tested = TEST_UNTESTED,
20399 .probe = probe_jedec_29gl,
20400 .probe_timing = TIMING_ZERO,
20401 .block_erasers =
20402 {
20403 {
20404 .eraseblocks = { {128 * 1024, 128} },
20405 .block_erase = erase_sector_jedec,
20406 }, {
20407 .eraseblocks = { {16 * 1024 * 1024, 1} },
20408 .block_erase = erase_chip_block_jedec,
20409 },
20410 },
20411 .write = write_jedec_1,
20412 .read = read_memmapped,
20413 .voltage = {2700, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020414 .prepare_access = prepare_memory_access,
20415 .finish_access = finish_memory_access,
Stefan Tauner03a9c3c2014-08-03 14:15:14 +000020416 },
20417
20418 {
20419 .vendor = "Winbond",
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020420 .name = "W39F010",
20421 .bustype = BUS_PARALLEL,
20422 .manufacture_id = WINBOND_ID,
20423 .model_id = WINBOND_W39F010,
20424 .total_size = 128,
20425 .page_size = 4 * 1024,
20426 .feature_bits = FEATURE_EITHER_RESET,
20427 .tested = TEST_OK_PREW,
20428 .probe = probe_jedec,
20429 .probe_timing = 10,
20430 .block_erasers =
20431 {
20432 {
20433 .eraseblocks = { {4 * 1024, 32} },
20434 .block_erase = erase_block_jedec,
20435 }, {
20436 .eraseblocks = { {128 * 1024, 1} },
20437 .block_erase = erase_chip_block_jedec,
20438 }
20439 },
20440 .printlock = printlock_w39f010,
20441 .write = write_jedec_1,
20442 .read = read_memmapped,
20443 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020444 .prepare_access = prepare_memory_access,
20445 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020446 },
20447
20448 {
20449 .vendor = "Winbond",
20450 .name = "W39L010",
20451 .bustype = BUS_PARALLEL,
20452 .manufacture_id = WINBOND_ID,
20453 .model_id = WINBOND_W39L010,
20454 .total_size = 128,
20455 .page_size = 4 * 1024,
20456 .feature_bits = FEATURE_EITHER_RESET,
20457 .tested = TEST_UNTESTED,
20458 .probe = probe_jedec,
20459 .probe_timing = 10,
20460 .block_erasers =
20461 {
20462 {
20463 .eraseblocks = { {4 * 1024, 32} },
20464 .block_erase = erase_block_jedec,
20465 }, {
20466 .eraseblocks = { {128 * 1024, 1} },
20467 .block_erase = erase_chip_block_jedec,
20468 }
20469 },
20470 .printlock = printlock_w39l010,
20471 .write = write_jedec_1,
20472 .read = read_memmapped,
20473 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020474 .prepare_access = prepare_memory_access,
20475 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020476 },
20477
20478 {
20479 .vendor = "Winbond",
20480 .name = "W39L020",
20481 .bustype = BUS_PARALLEL,
20482 .manufacture_id = WINBOND_ID,
20483 .model_id = WINBOND_W39L020,
20484 .total_size = 256,
20485 .page_size = 4 * 1024,
20486 .feature_bits = FEATURE_EITHER_RESET,
20487 .tested = TEST_UNTESTED,
20488 .probe = probe_jedec,
20489 .probe_timing = 10,
20490 .block_erasers =
20491 {
20492 {
20493 .eraseblocks = { {4 * 1024, 64} },
20494 .block_erase = erase_block_jedec,
20495 }, {
20496 .eraseblocks = { {64 * 1024, 4} },
20497 .block_erase = erase_sector_jedec,
20498 }, {
20499 .eraseblocks = { {256 * 1024, 1} },
20500 .block_erase = erase_chip_block_jedec,
20501 }
20502 },
20503 .printlock = printlock_w39l020,
20504 .write = write_jedec_1,
20505 .read = read_memmapped,
20506 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020507 .prepare_access = prepare_memory_access,
20508 .finish_access = finish_memory_access,
Kyösti Mälkkic31243e2012-10-28 01:50:08 +000020509 },
20510
20511 {
20512 .vendor = "Winbond",
Michael Karcher19e0aac2011-03-06 17:58:05 +000020513 .name = "W39L040",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020514 .bustype = BUS_PARALLEL,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020515 .manufacture_id = WINBOND_ID,
20516 .model_id = WINBOND_W39L040,
20517 .total_size = 512,
20518 .page_size = 64 * 1024,
20519 .feature_bits = FEATURE_EITHER_RESET,
20520 .tested = TEST_OK_PR,
20521 .probe = probe_jedec,
20522 .probe_timing = 10,
20523 .block_erasers =
20524 {
20525 {
20526 .eraseblocks = { {4 * 1024, 128} },
20527 .block_erase = erase_block_jedec,
20528 }, {
20529 .eraseblocks = { {64 * 1024, 8} },
20530 .block_erase = erase_sector_jedec,
20531 }, {
20532 .eraseblocks = { {512 * 1024, 1} },
20533 .block_erase = erase_chip_block_jedec,
20534 }
20535 },
20536 .printlock = printlock_w39l040,
20537 .write = write_jedec_1,
20538 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020539 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020540 .prepare_access = prepare_memory_access,
20541 .finish_access = finish_memory_access,
Michael Karcher19e0aac2011-03-06 17:58:05 +000020542 },
20543
20544 {
20545 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020546 .name = "W39V040A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020547 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020548 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020549 .model_id = WINBOND_W39V040A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020550 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020551 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020552 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000020553 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020554 .probe = probe_jedec,
Stefan Tauner716e0982011-07-25 20:38:52 +000020555 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020556 .block_erasers =
20557 {
20558 {
20559 .eraseblocks = { {64 * 1024, 8} },
20560 .block_erase = erase_sector_jedec,
20561 }, {
20562 .eraseblocks = { {512 * 1024, 1} },
20563 .block_erase = erase_chip_block_jedec,
20564 }
20565 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020566 .printlock = printlock_w39v040a,
Sean Nelson35727f72010-01-28 23:55:12 +000020567 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020568 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020569 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020570 .prepare_access = prepare_memory_access,
20571 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020572 },
20573
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020574 {
20575 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020576 .name = "W39V040B",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020577 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020578 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020579 .model_id = WINBOND_W39V040B,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020580 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020581 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020582 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020583 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020584 .probe = probe_jedec,
Paul Menzel018d4822011-10-21 12:33:07 +000020585 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020586 .block_erasers =
20587 {
20588 {
20589 .eraseblocks = { {64 * 1024, 8} },
20590 .block_erase = erase_sector_jedec,
20591 }, {
20592 .eraseblocks = { {512 * 1024, 1} },
20593 .block_erase = erase_chip_block_jedec,
20594 }
20595 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020596 .printlock = printlock_w39v040b,
Sean Nelson35727f72010-01-28 23:55:12 +000020597 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020598 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020599 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020600 .prepare_access = prepare_memory_access,
20601 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020602 },
20603
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020604 {
20605 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020606 .name = "W39V040C",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020607 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020608 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020609 .model_id = WINBOND_W39V040C,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020610 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020611 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020612 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzel018d4822011-10-21 12:33:07 +000020613 .tested = TEST_OK_PREW,
Sean Nelson35727f72010-01-28 23:55:12 +000020614 .probe = probe_jedec,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020615 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020616 .block_erasers =
20617 {
20618 {
20619 .eraseblocks = { {64 * 1024, 8} },
20620 .block_erase = erase_sector_jedec,
20621 }, {
20622 .eraseblocks = { {512 * 1024, 1} },
20623 .block_erase = erase_chip_block_jedec,
20624 }
20625 },
Sean Nelson6e0b9122010-02-19 00:52:10 +000020626 .printlock = printlock_w39v040c,
Sean Nelson35727f72010-01-28 23:55:12 +000020627 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020628 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020629 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020630 .prepare_access = prepare_memory_access,
20631 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020632 },
20633
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020634 {
20635 .vendor = "Winbond",
20636 .name = "W39V040FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020637 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020638 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020639 .model_id = WINBOND_W39V040FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020640 .total_size = 512,
Sean Nelson72a9a022009-12-22 22:15:33 +000020641 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020642 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner23e10b82016-01-23 16:16:49 +000020643 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020644 .probe = probe_jedec,
Antony Rheneus0fbba982011-05-26 14:28:51 +000020645 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020646 .block_erasers =
20647 {
20648 {
20649 .eraseblocks = { {4 * 1024, 128} },
20650 .block_erase = erase_block_jedec,
20651 }, {
20652 .eraseblocks = { {64 * 1024, 8} },
20653 .block_erase = erase_sector_jedec,
20654 }, {
20655 .eraseblocks = { {512 * 1024, 1} },
20656 .block_erase = erase_chip_block_jedec,
20657 }
20658 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020659 .printlock = printlock_w39v040fa,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020660 .unlock = unlock_regspace2_uniform_64k,
Sean Nelson35727f72010-01-28 23:55:12 +000020661 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020662 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020663 .voltage = {3000, 3600},
Nico Huberb1974022023-01-12 13:13:12 +010020664 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020665 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020666 },
20667
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020668 {
20669 .vendor = "Winbond",
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020670 .name = "W39V040FB",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020671 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020672 .manufacture_id = WINBOND_ID,
20673 .model_id = WINBOND_W39V040B,
20674 .total_size = 512,
20675 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020676 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner0be072c2016-03-13 15:16:30 +000020677 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020678 .probe = probe_jedec,
Stefan Tauner0554ca52013-07-25 22:54:25 +000020679 .probe_timing = 10,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020680 .block_erasers =
20681 {
20682 {
20683 .eraseblocks = { {64 * 1024, 8} },
20684 .block_erase = erase_sector_jedec,
20685 }, {
20686 .eraseblocks = { {512 * 1024, 1} },
20687 .block_erase = erase_chip_block_jedec,
20688 }
20689 },
20690 .printlock = printlock_w39v040fb,
Carl-Daniel Hailfingeref3ac8a2014-08-03 13:05:34 +000020691 .unlock = unlock_regspace2_uniform_64k,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020692 .write = write_jedec_1,
20693 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020694 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020695 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020696 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020697 },
20698
20699 {
20700 .vendor = "Winbond",
20701 .name = "W39V040FC",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020702 .bustype = BUS_FWH,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020703 .manufacture_id = WINBOND_ID,
20704 .model_id = WINBOND_W39V040C,
20705 .total_size = 512,
20706 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020707 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauneraf2db612011-12-02 21:48:17 +000020708 .tested = TEST_OK_PREW,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020709 .probe = probe_jedec,
20710 .probe_timing = 10,
20711 .block_erasers =
20712 {
20713 {
20714 .eraseblocks = { {64 * 1024, 8} },
20715 .block_erase = erase_sector_jedec,
20716 }, {
20717 .eraseblocks = { {512 * 1024, 1} },
20718 .block_erase = erase_chip_block_jedec,
20719 }
20720 },
20721 .printlock = printlock_w39v040fc,
20722 .write = write_jedec_1,
20723 .read = read_memmapped,
Steven Zakulec7d257b42011-07-19 08:50:18 +000020724 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020725 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020726 .finish_access = finish_memory_access,
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020727 },
20728
20729 {
20730 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020731 .name = "W39V080A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020732 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020733 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020734 .model_id = WINBOND_W39V080A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020735 .total_size = 1024,
Sean Nelson72a9a022009-12-22 22:15:33 +000020736 .page_size = 64 * 1024,
Sean Nelson35727f72010-01-28 23:55:12 +000020737 .feature_bits = FEATURE_EITHER_RESET,
Paul Menzelac427b22012-02-16 21:07:07 +000020738 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020739 .probe = probe_jedec,
Paul Menzelac427b22012-02-16 21:07:07 +000020740 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020741 .block_erasers =
20742 {
20743 {
20744 .eraseblocks = { {64 * 1024, 16} },
20745 .block_erase = erase_sector_jedec,
20746 }, {
20747 .eraseblocks = { {1024 * 1024, 1} },
20748 .block_erase = erase_chip_block_jedec,
20749 }
20750 },
Carl-Daniel Hailfinger91882402010-12-05 16:33:59 +000020751 .printlock = printlock_w39v080a,
Sean Nelson35727f72010-01-28 23:55:12 +000020752 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020753 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020754 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020755 .prepare_access = prepare_memory_access,
20756 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020757 },
20758
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020759 {
20760 .vendor = "Winbond",
Alan Green1f9cc7d2019-07-01 11:10:45 +100020761 .name = "W39V080FA",
20762 .bustype = BUS_FWH,
20763 .manufacture_id = WINBOND_ID,
20764 .model_id = WINBOND_W39V080FA,
20765 .total_size = 1024,
20766 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020767 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020768 .tested = TEST_OK_PREW,
20769 .probe = probe_jedec,
20770 .probe_timing = 10,
20771 .block_erasers =
20772 {
20773 {
20774 .eraseblocks = { {64 * 1024, 16} },
20775 .block_erase = erase_sector_jedec,
20776 }, {
20777 .eraseblocks = { {1024 * 1024, 1} },
20778 .block_erase = erase_chip_block_jedec,
20779 }
20780 },
20781 .printlock = printlock_w39v080fa,
20782 .unlock = unlock_regspace2_uniform_64k,
20783 .write = write_jedec_1,
20784 .read = read_memmapped,
20785 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020786 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020787 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020788 },
20789
20790 {
20791 .vendor = "Winbond",
20792 .name = "W39V080FA (dual mode)",
20793 .bustype = BUS_FWH,
20794 .manufacture_id = WINBOND_ID,
20795 .model_id = WINBOND_W39V080FA_DM,
20796 .total_size = 512,
20797 .page_size = 64 * 1024,
Nico Huberb1974022023-01-12 13:13:12 +010020798 .feature_bits = FEATURE_EITHER_RESET,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020799 .tested = TEST_UNTESTED,
20800 .probe = probe_jedec,
20801 .probe_timing = 10,
20802 .block_erasers =
20803 {
20804 {
20805 .eraseblocks = { {64 * 1024, 8} },
20806 .block_erase = erase_sector_jedec,
20807 }, {
20808 .eraseblocks = { {512 * 1024, 1} },
20809 .block_erase = erase_chip_block_jedec,
20810 }
20811 },
20812 .printlock = printlock_w39v080fa_dual,
20813 .write = write_jedec_1,
20814 .read = read_memmapped,
20815 .voltage = {3000, 3600}, /* Also has 12V fast program */
Nico Huberb1974022023-01-12 13:13:12 +010020816 .prepare_access = prepare_memory_register_access,
Nico Huber9eec4072023-01-12 01:17:30 +010020817 .finish_access = finish_memory_access,
Alan Green1f9cc7d2019-07-01 11:10:45 +100020818 },
20819
20820 {
20821 .vendor = "Winbond",
Mattias Mattssona745cf42010-09-14 23:56:56 +000020822 .name = "W49F002U/N",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020823 .bustype = BUS_PARALLEL,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020824 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020825 .model_id = WINBOND_W49F002U,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020826 .total_size = 256,
20827 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020828 .feature_bits = FEATURE_EITHER_RESET,
Stefan Tauner716e0982011-07-25 20:38:52 +000020829 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020830 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020831 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020832 .block_erasers =
20833 {
20834 {
20835 .eraseblocks = {
20836 {128 * 1024, 1},
20837 {96 * 1024, 1},
20838 {8 * 1024, 2},
20839 {16 * 1024, 1},
20840 },
20841 .block_erase = erase_sector_jedec,
20842 }, {
20843 .eraseblocks = { {256 * 1024, 1} },
20844 .block_erase = erase_chip_block_jedec,
20845 }
20846 },
Sean Nelson35727f72010-01-28 23:55:12 +000020847 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020848 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020849 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020850 .prepare_access = prepare_memory_access,
20851 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020852 },
20853
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020854 {
20855 .vendor = "Winbond",
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020856 .name = "W49F020",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020857 .bustype = BUS_PARALLEL,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020858 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020859 .model_id = WINBOND_W49F020,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020860 .total_size = 256,
20861 .page_size = 128,
20862 .feature_bits = FEATURE_EITHER_RESET,
20863 .tested = TEST_OK_PROBE,
20864 .probe = probe_jedec,
20865 .probe_timing = 10,
20866 .block_erasers =
20867 {
20868 {
20869 .eraseblocks = { {256 * 1024, 1} },
20870 .block_erase = erase_chip_block_jedec,
20871 }
20872 },
20873 .write = write_jedec_1,
20874 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020875 .voltage = {4500, 5500},
Nico Huber9eec4072023-01-12 01:17:30 +010020876 .prepare_access = prepare_memory_access,
20877 .finish_access = finish_memory_access,
Carl-Daniel Hailfingerabebe6b2010-07-17 13:45:42 +000020878 },
20879
20880 {
20881 .vendor = "Winbond",
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020882 .name = "W49V002A",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020883 .bustype = BUS_LPC,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020884 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020885 .model_id = WINBOND_W49V002A,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020886 .total_size = 256,
20887 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020888 .feature_bits = FEATURE_EITHER_RESET,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020889 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020890 .probe = probe_jedec,
Cristian Măgherușan-Stanciu9932c7b2011-07-07 19:56:58 +000020891 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020892 .block_erasers =
20893 {
20894 {
20895 .eraseblocks = {
20896 {64 * 1024, 3},
20897 {32 * 1024, 1},
20898 {8 * 1024, 2},
20899 {16 * 1024, 1},
20900 },
20901 .block_erase = erase_sector_jedec,
20902 }, {
20903 .eraseblocks = { {256 * 1024, 1} },
20904 .block_erase = erase_chip_block_jedec,
20905 }
20906 },
Sean Nelson35727f72010-01-28 23:55:12 +000020907 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020908 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020909 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020910 .prepare_access = prepare_memory_access,
20911 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020912 },
20913
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020914 {
20915 .vendor = "Winbond",
20916 .name = "W49V002FA",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000020917 .bustype = BUS_FWH,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020918 .manufacture_id = WINBOND_ID,
Mattias Mattssona745cf42010-09-14 23:56:56 +000020919 .model_id = WINBOND_W49V002FA,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020920 .total_size = 256,
20921 .page_size = 128,
Sean Nelson35727f72010-01-28 23:55:12 +000020922 .feature_bits = FEATURE_EITHER_RESET,
Stefan Taunereb582572012-09-21 12:52:50 +000020923 .tested = TEST_OK_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020924 .probe = probe_jedec,
Udu Ogahc04ee222009-09-05 01:31:32 +000020925 .probe_timing = 10,
Sean Nelsoncfc35cd2010-01-19 03:24:55 +000020926 .block_erasers =
20927 {
20928 {
20929 .eraseblocks = {
20930 {64 * 1024, 3},
20931 {32 * 1024, 1},
20932 {8 * 1024, 2},
20933 {16 * 1024, 1},
20934 },
20935 .block_erase = erase_sector_jedec,
20936 }, {
20937 .eraseblocks = { {256 * 1024, 1} },
20938 .block_erase = erase_chip_block_jedec,
20939 }
20940 },
Sean Nelson35727f72010-01-28 23:55:12 +000020941 .write = write_jedec_1,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000020942 .read = read_memmapped,
Steven Zakuleccbe370e2011-06-03 07:26:31 +000020943 .voltage = {3000, 3600},
Nico Huber9eec4072023-01-12 01:17:30 +010020944 .prepare_access = prepare_memory_access,
20945 .finish_access = finish_memory_access,
FENG yu ningff692fb2008-12-08 18:15:10 +000020946 },
20947
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000020948 {
luke heef884232020-12-28 18:22:21 +080020949 .vendor = "XMC",
20950 .name = "XM25QH128C",
20951 .bustype = BUS_SPI,
20952 .manufacture_id = ST_ID,
20953 .model_id = XMC_XM25QH128C,
20954 .total_size = 16384,
20955 .page_size = 256,
Nico Huber1412d9f2024-01-06 18:25:49 +010020956 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
20957 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080020958 .tested = TEST_UNTESTED,
20959 .probe = probe_spi_rdid,
20960 .probe_timing = TIMING_ZERO,
20961 .block_erasers =
20962 {
20963 {
20964 .eraseblocks = { {4 * 1024, 4096} },
20965 .block_erase = spi_block_erase_20,
20966 }, {
20967 .eraseblocks = { {32 * 1024, 512} },
20968 .block_erase = spi_block_erase_52,
20969 }, {
20970 .eraseblocks = { {64 * 1024, 256} },
20971 .block_erase = spi_block_erase_d8,
20972 }, {
20973 .eraseblocks = { {16 * 1024 * 1024, 1} },
20974 .block_erase = spi_block_erase_60,
20975 }, {
20976 .eraseblocks = { {16 * 1024 * 1024, 1} },
20977 .block_erase = spi_block_erase_c7,
20978 }
20979 },
20980 .printlock = spi_prettyprint_status_register_plain,
20981 .unlock = spi_disable_blockprotect,
20982 .write = spi_chip_write_256,
20983 .read = spi_chip_read,
20984 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020985 .reg_bits =
20986 {
Nico Huber96786d02024-01-06 18:30:15 +010020987 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020988 .srp = {STATUS1, 7, RW},
20989 .srl = {STATUS2, 0, RW},
20990 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}},
20991 .tb = {STATUS1, 5, RW},
20992 .sec = {STATUS1, 6, RW},
20993 .cmp = {STATUS2, 6, RW},
20994 },
Nico Huberaabb3e02023-01-13 00:22:30 +010020995 .wp_write_cfg = spi_wp_write_cfg,
20996 .wp_read_cfg = spi_wp_read_cfg,
20997 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110020998 .decode_range = decode_range_spi25,
luke heef884232020-12-28 18:22:21 +080020999 },
21000
21001 {
21002 .vendor = "XMC",
21003 .name = "XM25QH256C",
21004 .bustype = BUS_SPI,
21005 .manufacture_id = ST_ID,
21006 .model_id = XMC_XM25QH256C,
21007 .total_size = 32768,
21008 .page_size = 256,
21009 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021010 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21011 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21012 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021013 .tested = TEST_UNTESTED,
21014 .probe = probe_spi_rdid,
21015 .probe_timing = TIMING_ZERO,
21016 .block_erasers =
21017 {
21018 {
21019 .eraseblocks = { {4 * 1024, 8192} },
21020 .block_erase = spi_block_erase_21,
21021 }, {
21022 .eraseblocks = { {4 * 1024, 8192} },
21023 .block_erase = spi_block_erase_20,
21024 }, {
21025 .eraseblocks = { {32 * 1024, 1024} },
21026 .block_erase = spi_block_erase_52,
21027 }, {
21028 .eraseblocks = { {64 * 1024, 512} },
21029 .block_erase = spi_block_erase_dc,
21030 }, {
21031 .eraseblocks = { {64 * 1024, 512} },
21032 .block_erase = spi_block_erase_d8,
21033 }, {
21034 .eraseblocks = { {32 * 1024 * 1024, 1} },
21035 .block_erase = spi_block_erase_60,
21036 }, {
21037 .eraseblocks = { {32 * 1024 * 1024, 1} },
21038 .block_erase = spi_block_erase_c7,
21039 }
21040 },
21041 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21042 .unlock = spi_disable_blockprotect,
21043 .write = spi_chip_write_256,
21044 .read = spi_chip_read,
21045 .voltage = {2700, 3600},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021046 .reg_bits =
21047 {
Nico Huber96786d02024-01-06 18:30:15 +010021048 .qe = {STATUS2, 1, RW},
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021049 .srp = {STATUS1, 7, RW},
21050 .srl = {STATUS2, 0, RW},
21051 .bp = {{STATUS1, 2, RW}, {STATUS1, 3, RW}, {STATUS1, 4, RW}, {STATUS1, 5, RW}},
21052 .tb = {STATUS1, 6, RW},
21053 },
Nico Huberaabb3e02023-01-13 00:22:30 +010021054 .wp_write_cfg = spi_wp_write_cfg,
21055 .wp_read_cfg = spi_wp_read_cfg,
21056 .wp_get_ranges = spi_wp_get_available_ranges,
Nikolai Artemievd32e18b2022-02-15 18:06:55 +110021057 .decode_range = decode_range_spi25,
Nico Huberab6b18f2023-01-11 23:38:20 +010021058 .prepare_access = spi_prepare_4ba,
luke heef884232020-12-28 18:22:21 +080021059 },
21060
21061 {
21062 .vendor = "XMC",
21063 .name = "XM25QH64C",
21064 .bustype = BUS_SPI,
21065 .manufacture_id = ST_ID,
21066 .model_id = XMC_XM25QH64C,
21067 .total_size = 8192,
21068 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021069 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021070 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021071 .tested = TEST_UNTESTED,
21072 .probe = probe_spi_rdid,
21073 .probe_timing = TIMING_ZERO,
21074 .block_erasers =
21075 {
21076 {
21077 .eraseblocks = { {4 * 1024, 2048} },
21078 .block_erase = spi_block_erase_20,
21079 }, {
21080 .eraseblocks = { {32 * 1024, 256} },
21081 .block_erase = spi_block_erase_52,
21082 }, {
21083 .eraseblocks = { {64 * 1024, 128} },
21084 .block_erase = spi_block_erase_d8,
21085 }, {
21086 .eraseblocks = { {8 * 1024 * 1024, 1} },
21087 .block_erase = spi_block_erase_60,
21088 }, {
21089 .eraseblocks = { {8 * 1024 * 1024, 1} },
21090 .block_erase = spi_block_erase_c7,
21091 }
21092 },
Nico Huber96786d02024-01-06 18:30:15 +010021093 .reg_bits =
21094 {
21095 .qe = {STATUS2, 1, RW},
21096 },
luke heef884232020-12-28 18:22:21 +080021097 .printlock = spi_prettyprint_status_register_plain,
21098 .unlock = spi_disable_blockprotect,
21099 .write = spi_chip_write_256,
21100 .read = spi_chip_read,
21101 .voltage = {2700, 3600},
21102 },
21103
21104 {
21105 .vendor = "XMC",
21106 .name = "XM25QU128C",
21107 .bustype = BUS_SPI,
21108 .manufacture_id = ST_ID,
21109 .model_id = XMC_XM25QU128C,
21110 .total_size = 16384,
21111 .page_size = 256,
21112 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021113 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021114 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021115 .tested = TEST_UNTESTED,
21116 .probe = probe_spi_rdid,
21117 .probe_timing = TIMING_ZERO,
21118 .block_erasers =
21119 {
21120 {
21121 .eraseblocks = { {4 * 1024, 4096} },
21122 .block_erase = spi_block_erase_20,
21123 }, {
21124 .eraseblocks = { {32 * 1024, 512} },
21125 .block_erase = spi_block_erase_52,
21126 }, {
21127 .eraseblocks = { {64 * 1024, 256} },
21128 .block_erase = spi_block_erase_d8,
21129 }, {
21130 .eraseblocks = { {16 * 1024 * 1024, 1} },
21131 .block_erase = spi_block_erase_60,
21132 }, {
21133 .eraseblocks = { {16 * 1024 * 1024, 1} },
21134 .block_erase = spi_block_erase_c7,
21135 }
21136 },
Nico Huber96786d02024-01-06 18:30:15 +010021137 .reg_bits =
21138 {
21139 .qe = {STATUS2, 1, RW},
21140 },
luke heef884232020-12-28 18:22:21 +080021141 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21142 .unlock = spi_disable_blockprotect,
21143 .write = spi_chip_write_256,
21144 .read = spi_chip_read,
21145 .voltage = {1650, 1950},
21146 },
21147
21148 {
21149 .vendor = "XMC",
21150 .name = "XM25QU256C",
21151 .bustype = BUS_SPI,
21152 .manufacture_id = ST_ID,
21153 .model_id = XMC_XM25QU256C,
21154 .total_size = 32768,
21155 .page_size = 256,
21156 /* supports SFDP */
Nico Huber96786d02024-01-06 18:30:15 +010021157 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP |
21158 FEATURE_4BA_WREN | FEATURE_QPI_SRP,
21159 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021160 .tested = TEST_UNTESTED,
21161 .probe = probe_spi_rdid,
21162 .probe_timing = TIMING_ZERO,
21163 .block_erasers =
21164 {
21165 {
21166 .eraseblocks = { {4 * 1024, 8192} },
21167 .block_erase = spi_block_erase_21,
21168 }, {
21169 .eraseblocks = { {4 * 1024, 8192} },
21170 .block_erase = spi_block_erase_20,
21171 }, {
21172 .eraseblocks = { {32 * 1024, 1024} },
21173 .block_erase = spi_block_erase_52,
21174 }, {
21175 .eraseblocks = { {64 * 1024, 512} },
21176 .block_erase = spi_block_erase_dc,
21177 }, {
21178 .eraseblocks = { {64 * 1024, 512} },
21179 .block_erase = spi_block_erase_d8,
21180 }, {
21181 .eraseblocks = { {32 * 1024 * 1024, 1} },
21182 .block_erase = spi_block_erase_60,
21183 }, {
21184 .eraseblocks = { {32 * 1024 * 1024, 1} },
21185 .block_erase = spi_block_erase_c7,
21186 }
21187 },
Nico Huber96786d02024-01-06 18:30:15 +010021188 .reg_bits =
21189 {
21190 .qe = {STATUS2, 1, RW},
21191 },
luke heef884232020-12-28 18:22:21 +080021192 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21193 .unlock = spi_disable_blockprotect,
21194 .write = spi_chip_write_256,
21195 .read = spi_chip_read,
21196 .voltage = {1650, 1950},
Nico Huberab6b18f2023-01-11 23:38:20 +010021197 .prepare_access = spi_prepare_4ba,
luke heef884232020-12-28 18:22:21 +080021198 },
21199
21200 {
21201 .vendor = "XMC",
21202 .name = "XM25QU64C",
21203 .bustype = BUS_SPI,
21204 .manufacture_id = ST_ID,
21205 .model_id = XMC_XM25QU64C,
21206 .total_size = 8192,
21207 .page_size = 256,
Nico Huber96786d02024-01-06 18:30:15 +010021208 .feature_bits = FEATURE_WRSR_WREN | FEATURE_WRSR2 | FEATURE_OTP | FEATURE_QPI_SRP,
Nico Huber1412d9f2024-01-06 18:25:49 +010021209 .dummy_cycles = { .qpi_read_params = { 2, 4, 6, 8 } },
luke heef884232020-12-28 18:22:21 +080021210 .tested = TEST_UNTESTED,
21211 .probe = probe_spi_rdid,
21212 .probe_timing = TIMING_ZERO,
21213 .block_erasers =
21214 {
21215 {
21216 .eraseblocks = { {4 * 1024, 2048} },
21217 .block_erase = spi_block_erase_20,
21218 }, {
21219 .eraseblocks = { {32 * 1024, 256} },
21220 .block_erase = spi_block_erase_52,
21221 }, {
21222 .eraseblocks = { {64 * 1024, 128} },
21223 .block_erase = spi_block_erase_d8,
21224 }, {
21225 .eraseblocks = { {8 * 1024 * 1024, 1} },
21226 .block_erase = spi_block_erase_60,
21227 }, {
21228 .eraseblocks = { {8 * 1024 * 1024, 1} },
21229 .block_erase = spi_block_erase_c7,
21230 }
21231 },
Nico Huber96786d02024-01-06 18:30:15 +010021232 .reg_bits =
21233 {
21234 .qe = {STATUS2, 1, RW},
21235 },
luke heef884232020-12-28 18:22:21 +080021236 .printlock = spi_prettyprint_status_register_plain,
21237 .unlock = spi_disable_blockprotect,
21238 .write = spi_chip_write_256,
21239 .read = spi_chip_read,
21240 .voltage = {1650, 1950},
21241 },
21242
21243 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100021244 .vendor = "Zetta Device",
21245 .name = "ZD25D20",
21246 .bustype = BUS_SPI,
21247 .manufacture_id = ZETTADEVICE_ID,
21248 .model_id = ZETTADEVICE_ZD25D20,
21249 .total_size = 256,
21250 .page_size = 256,
21251 .feature_bits = FEATURE_WRSR_WREN,
21252 .tested = TEST_UNTESTED,
21253 .probe = probe_spi_rdid,
21254 .probe_timing = TIMING_ZERO,
21255 .block_erasers =
David Hendricksa72d5a92018-02-11 17:58:44 -080021256 {
21257 {
21258 .eraseblocks = { {4 * 1024, 64} },
21259 .block_erase = spi_block_erase_20,
21260 }, {
21261 .eraseblocks = { {32 * 1024, 8} },
21262 .block_erase = spi_block_erase_52,
21263 }, {
21264 .eraseblocks = { {64 * 1024, 4} },
21265 .block_erase = spi_block_erase_d8,
21266 }, {
21267 .eraseblocks = { {256 * 1024, 1} },
21268 .block_erase = spi_block_erase_60,
21269 }, {
21270 .eraseblocks = { {256 * 1024, 1} },
21271 .block_erase = spi_block_erase_c7,
21272 }
21273 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100021274 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21275 .unlock = spi_disable_blockprotect,
21276 .write = spi_chip_write_256,
21277 .read = spi_chip_read,
21278 .voltage = {2700, 3600},
David Hendricksa72d5a92018-02-11 17:58:44 -080021279 },
21280
21281 {
Alan Greenfa3fcd32019-06-27 15:41:50 +100021282 .vendor = "Zetta Device",
21283 .name = "ZD25D40",
21284 .bustype = BUS_SPI,
21285 .manufacture_id = ZETTADEVICE_ID,
21286 .model_id = ZETTADEVICE_ZD25D40,
21287 .total_size = 512,
21288 .page_size = 256,
21289 .feature_bits = FEATURE_WRSR_WREN,
21290 .tested = TEST_UNTESTED,
21291 .probe = probe_spi_rdid,
21292 .probe_timing = TIMING_ZERO,
21293 .block_erasers =
nybashcbb46e22018-02-11 17:53:49 -080021294 {
21295 {
21296 .eraseblocks = { {4 * 1024, 128} },
21297 .block_erase = spi_block_erase_20,
21298 }, {
21299 .eraseblocks = { {32 * 1024, 16} },
21300 .block_erase = spi_block_erase_52,
21301 }, {
21302 .eraseblocks = { {64 * 1024, 8} },
21303 .block_erase = spi_block_erase_d8,
21304 }, {
21305 .eraseblocks = { {512 * 1024, 1} },
21306 .block_erase = spi_block_erase_60,
21307 }, {
21308 .eraseblocks = { {512 * 1024, 1} },
21309 .block_erase = spi_block_erase_c7,
21310 }
21311 },
Alan Greenfa3fcd32019-06-27 15:41:50 +100021312 .printlock = spi_prettyprint_status_register_plain, /* TODO: improve */
21313 .unlock = spi_disable_blockprotect,
21314 .write = spi_chip_write_256,
21315 .read = spi_chip_read,
21316 .voltage = {2700, 3600},
nybashcbb46e22018-02-11 17:53:49 -080021317 },
21318
Stefan Taunerac1b4c82012-02-17 14:51:04 +000021319 {
Alan Greendd592202019-08-23 10:11:37 +100021320 .vendor = "Unknown",
21321 .name = "SFDP-capable chip",
21322 .bustype = BUS_SPI,
21323 .manufacture_id = GENERIC_MANUF_ID,
21324 .model_id = SFDP_DEVICE_ID,
21325 .total_size = 0, /* set by probing function */
21326 .page_size = 0, /* set by probing function */
21327 .feature_bits = 0, /* set by probing function */
21328 /* We present our own "report this" text hence we do not */
21329 /* want the default "This flash part has status UNTESTED..." */
21330 /* text to be printed. */
21331 .tested = TEST_OK_PREW,
21332 .probe = probe_spi_sfdp,
21333 .block_erasers = {}, /* set by probing function */
21334 .unlock = spi_disable_blockprotect, /* is this safe? */
21335 .write = NULL, /* set by probing function */
21336 .read = spi_chip_read,
21337 /* FIXME: some vendor extensions define this */
21338 .voltage = {0},
21339 },
21340
21341 {
Carl-Daniel Hailfinger532c7172011-11-04 21:35:26 +000021342 .vendor = "Programmer",
21343 .name = "Opaque flash chip",
21344 .bustype = BUS_PROG,
21345 .manufacture_id = PROGMANUF_ID,
21346 .model_id = PROGDEV_ID,
21347 .total_size = 0,
21348 .page_size = 256,
21349 /* probe is assumed to work, rest will be filled in by probe */
21350 .tested = TEST_OK_PROBE,
21351 .probe = probe_opaque,
21352 /* eraseblock sizes will be set by the probing function */
21353 .block_erasers =
21354 {
21355 {
21356 .block_erase = erase_opaque,
21357 }
21358 },
21359 .write = write_opaque,
21360 .read = read_opaque,
21361 },
21362
21363 {
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000021364 .vendor = "AMIC",
21365 .name = "unknown AMIC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021366 .bustype = BUS_SPI,
Daniel Lenskidf90d3a2010-07-22 11:44:38 +000021367 .manufacture_id = AMIC_ID,
21368 .model_id = GENERIC_DEVICE_ID,
21369 .total_size = 0,
21370 .page_size = 256,
21371 .tested = TEST_BAD_PREW,
21372 .probe = probe_spi_rdid4,
21373 .probe_timing = TIMING_ZERO,
21374 .write = NULL,
21375 .read = NULL,
21376 },
21377
21378 {
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021379 .vendor = "Atmel",
21380 .name = "unknown Atmel SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021381 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021382 .manufacture_id = ATMEL_ID,
21383 .model_id = GENERIC_DEVICE_ID,
21384 .total_size = 0,
21385 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021386 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021387 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021388 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021389 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021390 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021391 },
21392
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021393 {
Carl-Daniel Hailfingerf792c7d2010-07-28 22:20:20 +000021394 .vendor = "Eon",
21395 .name = "unknown Eon SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021396 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021397 .manufacture_id = EON_ID_NOPREFIX,
21398 .model_id = GENERIC_DEVICE_ID,
21399 .total_size = 0,
21400 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021401 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021402 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021403 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021404 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021405 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021406 },
21407
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021408 {
21409 .vendor = "Macronix",
21410 .name = "unknown Macronix SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021411 .bustype = BUS_SPI,
Mattias Mattsson6eabe282010-09-15 23:31:03 +000021412 .manufacture_id = MACRONIX_ID,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021413 .model_id = GENERIC_DEVICE_ID,
21414 .total_size = 0,
21415 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021416 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021417 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021418 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021419 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021420 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021421 },
21422
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021423 {
21424 .vendor = "PMC",
21425 .name = "unknown PMC SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021426 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021427 .manufacture_id = PMC_ID,
21428 .model_id = GENERIC_DEVICE_ID,
21429 .total_size = 0,
21430 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021431 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021432 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021433 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021434 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021435 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021436 },
21437
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021438 {
21439 .vendor = "SST",
21440 .name = "unknown SST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021441 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021442 .manufacture_id = SST_ID,
21443 .model_id = GENERIC_DEVICE_ID,
21444 .total_size = 0,
21445 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021446 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021447 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021448 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021449 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021450 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021451 },
21452
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021453 {
21454 .vendor = "ST",
21455 .name = "unknown ST SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021456 .bustype = BUS_SPI,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021457 .manufacture_id = ST_ID,
21458 .model_id = GENERIC_DEVICE_ID,
21459 .total_size = 0,
21460 .page_size = 256,
Carl-Daniel Hailfinger42882fd2009-04-22 13:33:43 +000021461 .tested = TEST_BAD_PREW,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021462 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger2bc020b2009-06-05 13:46:17 +000021463 .probe_timing = TIMING_ZERO,
Stephan Guilloux5c5b5252009-01-08 03:40:17 +000021464 .write = NULL,
Carl-Daniel Hailfinger03b4e712009-05-08 12:49:03 +000021465 .read = NULL,
FENG yu ningff692fb2008-12-08 18:15:10 +000021466 },
Uwe Hermannfc425e82008-03-16 02:06:25 +000021467
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021468 {
Sean Nelson118e1d62009-11-24 02:08:11 +000021469 .vendor = "Sanyo",
21470 .name = "unknown Sanyo SPI chip",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021471 .bustype = BUS_SPI,
Sean Nelson118e1d62009-11-24 02:08:11 +000021472 .manufacture_id = SANYO_ID,
21473 .model_id = GENERIC_DEVICE_ID,
21474 .total_size = 0,
21475 .page_size = 256,
21476 .tested = TEST_BAD_PREW,
21477 .probe = probe_spi_rdid,
21478 .probe_timing = TIMING_ZERO,
Sean Nelson118e1d62009-11-24 02:08:11 +000021479 .write = NULL,
21480 .read = NULL,
21481 },
21482
21483 {
Stefan Taunereb582572012-09-21 12:52:50 +000021484 .vendor = "Winbond",
21485 .name = "unknown Winbond (ex Nexcom) SPI chip",
21486 .bustype = BUS_SPI,
21487 .manufacture_id = WINBOND_NEX_ID,
21488 .model_id = GENERIC_DEVICE_ID,
21489 .total_size = 0,
21490 .page_size = 256,
21491 .tested = TEST_BAD_PREW,
21492 .probe = probe_spi_rdid,
21493 .probe_timing = TIMING_ZERO,
21494 .write = NULL,
21495 .read = NULL,
21496 },
21497
21498 {
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021499 .vendor = "Generic",
21500 .name = "unknown SPI chip (RDID)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021501 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021502 .manufacture_id = GENERIC_MANUF_ID,
21503 .model_id = GENERIC_DEVICE_ID,
21504 .total_size = 0,
21505 .page_size = 256,
21506 .tested = TEST_BAD_PREW,
21507 .probe = probe_spi_rdid,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021508 .write = NULL,
21509 },
Stefan Tauneraf2db612011-12-02 21:48:17 +000021510
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021511 {
21512 .vendor = "Generic",
21513 .name = "unknown SPI chip (REMS)",
Carl-Daniel Hailfinger1a227952011-07-27 07:13:06 +000021514 .bustype = BUS_SPI,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021515 .manufacture_id = GENERIC_MANUF_ID,
21516 .model_id = GENERIC_DEVICE_ID,
21517 .total_size = 0,
21518 .page_size = 256,
21519 .tested = TEST_BAD_PREW,
21520 .probe = probe_spi_rems,
Carl-Daniel Hailfinger01d49ed2009-11-20 01:12:45 +000021521 .write = NULL,
21522 },
21523
Stefan Tauner96658be2014-05-26 22:05:31 +000021524 {0}
Stephan Guilloux72cf5652009-04-21 01:46:07 +000021525};
Stefan Tauner96658be2014-05-26 22:05:31 +000021526
21527const unsigned int flashchips_size = ARRAY_SIZE(flashchips);